1с запрос проверка на пустое значение реквизита

В этой статье будут рассмотрены способы проверки на пустое значение в зависимости от типа проверяемого реквизита в запросе 1С 8.3, в том числе пустой ссылки.

запрос

Проверка на NULL

Значение NULL возвращается в том случае, когда реквизита попросту нет. Тип в этом случае будет тоже NULL. Например, вы объединяете две таблицы через левое соединение. В том случае, когда для левой таблицы не будет найдено ни одного значения в правой, вернется NULL.

Проверку на данное значение можно осуществить при помощи конструкции «ЕСТЬ NULL» и «ЕСТЬNULL()». В первом случае возвращается Истина или Ложь. Во втором случае можно сразу задать другое значение в том случае, когда возвращается NULL.

В приведенном ниже запросе 1С 8.3 будут возвращен список контактных лиц тех партнеров, у кого не задан сегмент.

ВЫБРАТЬ
КонтактныеЛицаПартнеров.Ссылка
ИЗ
Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СегментыПартнеров КАК СегментыПартнеров
ПО КонтактныеЛицаПартнеров.Владелец = СегментыПартнеров.Родитель
ГДЕ
СегментыПартнеров.Ссылка ЕСТЬ NULL

Пустая дата

Наша команда предоставляет услуги по консультированию, настройке и внедрению 1С.

Связаться с нами можно по телефону +7 499 350 29 00.

Услуги и цены можно увидеть по ссылке.

Будем рады помочь Вам!

Проверка значения на пустую дату производится путем сравнения с конструкцией ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0). Пример использования приведен ниже:

ВЫБРАТЬ
Встреча.Ссылка
ИЗ
Документ.Встреча КАК Встреча
ГДЕ
Встреча.Дата = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)

Пустая ссылка в запросе 1С

В случае, когда возвращаемый реквизит имеет ссылочный тип, например, это элемент какого-либо справочника, документа и т. п., используется следующая конструкция: ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка).

В приведенном ниже примере запрос выбирает всех партнеров, у которых не указан бизнес-регион.

ВЫБРАТЬ
Партнеры.Ссылка
ИЗ
Справочник.Партнеры КАК Партнеры
ГДЕ
Партнеры.БизнесРегион = ЗНАЧЕНИЕ(Справочник.БизнесРегионы.ПустаяСсылка)

Чтобы проверить на «ЗначениеЗаполнено» нужно сделать обратное условие:

Партнеры.БизнесРегион <> ЗНАЧЕНИЕ(Справочник.БизнесРегионы.ПустаяСсылка)

Пустая строка

Для проверки строковых типов производится сравнение с другим образцом. В данном случае – «».

Приведенный ниже запрос отберет всех партнеров с незаполненным наименованием.

ВЫБРАТЬ
Партнеры.Ссылка
ИЗ
Справочник.Партнеры КАК Партнеры
ГДЕ
Партнеры.Наименование = «»

В данной статье рассмотрены примеры работы с пустыми значениями в запросах 1С 8. Как указать пустую дату, пустую строку или пустую ссылку в языке запросов – читайте далее.

Содержание

//любое пустое значение можно задать в виде параметра
//Ниже пример запроса, который возвращает пустые значения, переданные в качестве параметра
Запрос = Новый Запрос("ВЫБРАТЬ
|	&ПустаяДата КАК ПустаяДата,
|	&ПустаяСтрока КАК ПустаяСтрока,
|	&ПустаяСсылкаНаТовар КАК ПустаяСсылкаНаТовар,
|	&ПараметрNULL КАК ПараметрNULL,
|	&ПараметрНеопределено КАК ПараметрНеопределено");
Запрос.УстановитьПараметр("ПустаяДата", Дата(1,1,1));
Запрос.УстановитьПараметр("ПустаяСтрока", "");
Запрос.УстановитьПараметр("ПустаяСсылкаНаТовар", Справочники.Товары.ПустаяСсылка());
Запрос.УстановитьПараметр("ПараметрNULL", Null);
Запрос.УстановитьПараметр("ПараметрНеопределено", Неопределено);

Пустая дата в запросе 1С 8

//Кроме того, пустые значения можно задать непосредственно в запросе
//Для формирования пустой даты используется конструкция ДатаВремя(1,1,1)
//Пустая строка заключается в двойные кавычки
//Пустая ссылка устанавливается при помощи оператора Значение

// Запрос возвращает документы установки цен с пустой датой утверждения
Запрос = Новый Запрос("ВЫБРАТЬ
|	УстановкаЦен.Ссылка КАК Ссылка
|ИЗ
|	Документ.УстановкаЦен КАК УстановкаЦен
|ГДЕ
|	УстановкаЦен.ДатаУтверждения = ДАТАВРЕМЯ(1, 1, 1)");

Проверка на пустую строку в запросе 1С 8.3

//Запрос вернет все документы установки цен, где не заполнен комментарий
Запрос = Новый Запрос("ВЫБРАТЬ
|	УстановкаЦен.Ссылка КАК Ссылка
|ИЗ
|	Документ.УстановкаЦен КАК УстановкаЦен
|ГДЕ
|	УстановкаЦен.Комментарий = """"");

Пустая ссылка (Значение) в запросе 1С 8

// Запрос вернет все товары, у которых не заполнен основной поставщик
Запрос = Новый Запрос("ВЫБРАТЬ
|	Товары.Ссылка КАК Ссылка
|ИЗ
|	Справочник.Товары КАК Товары
|ГДЕ
|	Товары.ОсновнойПоставщик = Значение(Справочник.Контрагенты.ПустаяСсылка)");

Проверка на NULL в запросе

Значение типа NULL может появиться в результате использования соединений, либо при обращении к недоступным реквизитам (реквизиты групп у элементов и реквизиты элементов у групп будут иметь тип NULL)

//Запрос вернет все товары, по которым нет остатков на складе
Запрос = Новый Запрос("ВЫБРАТЬ
|	Товары.Ссылка КАК Ссылка
|ИЗ
|	Справочник.Товары КАК Товары
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
|		ПО ОстаткиТоваровОстатки.Товар = Товары.Ссылка
|ГДЕ
|	ОстаткиТоваровОстатки.Товар ЕСТЬ NULL");

На чтение 5 мин. Просмотров 3.5k. Опубликовано 15.12.2019

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1. Проверку того, что результат выполнения запроса не содержит строк следует выполнять с помощью метода Пустой . Поскольку на получение выборки из результата запроса (выгрузка его в таблицу значений) будет затрачиваться дополнительное время.

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;

Возврат НЕ Запрос.Выполнить().Пустой()

Методическая рекомендация (полезный совет)

2. В то же время если требуется выбрать (или выгрузить) результат запроса, то предварительный вызов метода Пустой не требуется.
Например, вместо:

РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда // избыточный вызов
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
.

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
.

Рассмотрим основные методы использования пустых значений в условиях запросов 1С 8.3.

Проверка на NULL

выполняется с помощью конструкции ЕСТЬ NULL, например:

ВЫБРАТЬ
ВнутренниеЗаказыОстатки.Заказчик,
ВнутренниеЗаказыОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.ВнутренниеЗаказы.Остатки КАК ВнутренниеЗаказыОстатки
ГДЕ
ВнутренниеЗаказыОстатки.КоличествоОстаток ЕСТЬ NULL

Получите 267 видеоуроков по 1С бесплатно:

Содержание

  1. Пустая дата в запросе 1С
  2. Пустая ссылка (значение) в запросе 1С 8.2 и 8.3
  3. Проверка на пустую строку в запросе 1С
  4. Проверка на NULL
  5. Пустая дата
  6. Пустая ссылка в запросе 1С
  7. Пустая строка

Пустая дата в запросе 1С

Пустая дата в запросе устанавливается конструкцией ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0), пример:

ВЫБРАТЬ
СчетНаОплатуПокупателю.Ссылка,
СчетНаОплатуПокупателю.ДатаОтгрузки
ИЗ
Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
ГДЕ
СчетНаОплатуПокупателю.ДатаОтгрузки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)

Пустая ссылка (значение) в запросе 1С 8.2 и 8.3

Для ссылочных значений (справочники, документы, перечисления, планы счетов и т.д) для проверки необходимо использовать конструкцию «ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка)». Например:

ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

Проверка на пустую строку в запросе 1С

В условиях для нахождения пустой строки необходимо использовать пустое значение строки — «», например:

Если Вы начинаете изучать 1С программирование, рекомендуем наш курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1

(0 голосов, в среднем: 0 из 5)

Поддержите нас, расскажите друзьям!

СПРОСИТЕ в комментариях!

Запрос1.Текст = «ВЫБРАТЬ
|РемонтныйЛист.Номер,
|РемонтныйЛистМатериалыЗамена.ДатаРемонта,
|РемонтныйЛист.Проведен,
|РемонтныйЛист.Водитель1,
|РемонтныйЛист.Водитель2,
|РемонтныйЛист.Водитель3,
|РемонтныйЛистМатериалыЗамена.КолвоЧасов
|ИЗ
|Документ.РемонтныйЛист.МатериалыЗамена КАК РемонтныйЛистМатериалыЗамена
|ЛЕВОЕ СОЕДИНЕНИЕ Документ.РемонтныйЛист КАК РемонтныйЛист
|ПО РемонтныйЛистМатериалыЗамена.Ссылка = РемонтныйЛист.Ссылка
|ГДЕ
//|РемонтныйЛистМатериалыЗамена.ДатаРемонта >= Значение(«ДатаНач») И РемонтныйЛистМатериалыЗамена.ДатаРемонта = Значение(“ДатаНач”)
ПРАВИЛЬНО
//|РемонтныйЛистМатериалыЗамена.ДатаРемонта >= &ДатаНач

НЕ ПРАВИЛЬНО
//|РемонтныйЛист.Водитель3 НЕ ЗНАЧЕНИЕ (РемонтныйЛист.Водитель3.ПустаяСсылка)
ПРАВИЛЬНО
//|РемонтныйЛист.Водитель3 <> Значение(Справочник.Водители.ПустаяСсылка)

Где «Водители» имя справочника, тип которого имеет реквизит «Водитель3» (возможно сотрудники или физические лица)

Синтаксис не правильный так как я тока учусь:) спасибо большое. но водитель это реквизит не справочника а документа. имеет ли это значение?
а еще подскажите пожалуйста как вот на основании этого же запроса заполнить ячейки в отчете на пересечении водителя и даты необходимо поставить колво часов сколько он был в ремонте

РемонтныйЛист.Водитель3 — Это реквизит
Значение(Справочник.Водители.ПустаяСсылка) — это значение, которое вы передаете что бы наложить отбор, а Справочник.Водители — это ТИП реквизита РемонтныйЛист.Водитель3.

В конечном счете суть условия какая? Отобрать только те позиции, для которых выражение будет равняться ИСТИНА.

С этим я уже разобралась. вы правы были что это реквизит справочника Физические лица.у меня теперь проблема в том что он ругается на РемонтныйЛист.Проведен = Истина

В этой статье будут рассмотрены способы проверки на пустое значение в зависимости от типа проверяемого реквизита в запросе 1С 8.3, в том числе пустой ссылки.

Проверка на NULL

Значение NULL возвращается в том случае, когда реквизита попросту нет. Тип в этом случае будет тоже NULL. Например, вы объединяете две таблицы через левое соединение. В том случае, когда для левой таблицы не будет найдено ни одного значения в правой, вернется NULL.

Проверку на данное значение можно осуществить при помощи конструкции «ЕСТЬ NULL» и «ЕСТЬNULL()». В первом случае возвращается Истина или Ложь. Во втором случае можно сразу задать другое значение в том случае, когда возвращается NULL.

В приведенном ниже запросе 1С 8.3 будут возвращен список контактных лиц тех партнеров, у кого не задан сегмент.

ВЫБРАТЬ
КонтактныеЛицаПартнеров.Ссылка
ИЗ
Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СегментыПартнеров КАК СегментыПартнеров
ПО КонтактныеЛицаПартнеров.Владелец = СегментыПартнеров.Родитель
ГДЕ
СегментыПартнеров.Ссылка ЕСТЬ NULL

Пустая дата

Проверка значения на пустую дату производится путем сравнения с конструкцией ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0). Пример использования приведен ниже:

ВЫБРАТЬ
Встреча.Ссылка
ИЗ
Документ.Встреча КАК Встреча
ГДЕ
Встреча.Дата = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)

Пустая ссылка в запросе 1С

В случае, когда возвращаемый реквизит имеет ссылочный тип, например, это элемент какого-либо справочника, документа и т. п., используется следующая конструкция: ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка).

В приведенном ниже примере запрос выбирает всех партнеров, у которых не указан бизнес-регион.

ВЫБРАТЬ
Партнеры.Ссылка
ИЗ
Справочник.Партнеры КАК Партнеры
ГДЕ
Партнеры.БизнесРегион = ЗНАЧЕНИЕ(Справочник.БизнесРегионы.ПустаяСсылка)

Чтобы проверить на «ЗначениеЗаполнено» нужно сделать обратное условие:

Пустая строка

Для проверки строковых типов производится сравнение с другим образцом. В данном случае – «».

Приведенный ниже запрос отберет всех партнеров с незаполненным наименованием.

ВЫБРАТЬ
Партнеры.Ссылка
ИЗ
Справочник.Партнеры КАК Партнеры
ГДЕ
Партнеры.Наименование = «»

запрос: проверка на пустое значение реквизита составного типа

Я
   серый КТУЛХУ

03.10.21 — 16:44

а не изобретен ли случайно (или неслучйно) коллективным разумом (или каким-нибудь неколлективным) способ проверить в запросе значение реквизита составного типа на пустое значение (которое может быть пустым значением любого доступного для этого реквизита типа!) — без перебора его в богато ветвящейся конструкции «ВЫБОР КОГДА ТОГДА КОГДА ТОГДА …» на равенство пустым значениям всех возможных типов?.. (а то ДАЖЕ использовав эту монструозную конструкцию — с дрожью думаешь о том, что же придется делать если вдруг в состав такого реквизита когда-нибудь добавится еще тип)…

на IS NULL / ISNULL() — не работает…

  

Партнерская программа EFSOL Oblako

   ДенисЧ

1 — 03.10.21 — 16:46

реквизит.Ссылка есть NULL

   ДенисЧ

2 — 03.10.21 — 16:46

Если там строк и чисел нет

   тук-тук

3 — 03.10.21 — 16:48

Неопределено

   ДенисЧ

4 — 03.10.21 — 16:49

(3) Зачёт не сдан, на переподготовку.

   серый КТУЛХУ

5 — 03.10.21 — 16:51

(1),(2): сам-то пробовал? годится только если тип не укахан. а если значение пустое с указанным типом — не работает (я же вроде про «IS NULL» упомянул — это то же самое что «есть NULL»)

я читал про такой способ — проверку на реальных данных с установленным непустым (агрегатным) типом реквизита — не работает.

(3) сам-то пробовал: (см.выше)

   ДенисЧ

6 — 03.10.21 — 16:53

(5) Ты не заметил .ссылка? О_о

   тук-тук

7 — 03.10.21 — 16:57

ЕСТЬNULL(СправочникИмя.РеквизитСоставной.Представление, Неопределено)=Неопределено

   hhhh

8 — 03.10.21 — 16:58

(0) вообще-то сейчас приняли за правило в перед записью проверять, если пустая ссылка, то принудительно туда писать НЕОПРЕДЕЛЕНО. Чтобы пустых ссылок в базе не было. А в запросе просто пишут ВЫБОР КОГДА реквизит = НЕОПРЕДЕЛЕНО ТОГДА

   серый КТУЛХУ

9 — 03.10.21 — 16:58

(6): таак. щя пойду перепроверю… благо запросы еще в консоли вроде сохранились (ну почти)).

   тук-тук

10 — 03.10.21 — 16:58

ЕСТЬNULL(СправочникИмя.РеквизитСоставной.Представление, Неопределено)=Неопределено — для выбранного типа

СправочникИмя.РеквизитСоставной = Неопределено — для невыбранного типа в реквизите

   ДенисЧ

11 — 03.10.21 — 16:58

(8) Правила существуют, чтобы их нарушать )))

   серый КТУЛХУ

12 — 03.10.21 — 16:59

(7) тоже не работает. потому что оно НЕ NULL

   Ненавижу 1С

13 — 03.10.21 — 17:16

Какая интересная тема

   vde69

14 — 03.10.21 — 17:26

для любых ссылочных типов:

ВЫБОР

КОГДА ЕСТЬNULL(а, Неопределено)=Неопределено ТОГДА ЛОЖЬ

КОГДА а.ссылка.Версия есть null ТОГДА ЛОЖЬ

ИНАЧЕ ИСТИНА

КонецВыбор

   серый КТУЛХУ

15 — 03.10.21 — 17:56

(1),(6): гут, работает. спасибо тебе. добрый человек (пойду в запрос поменяю дерево проверок на одно условие)

и тогда — сразу вопрос: это еще одно лазание «через точку» (.Ссылка) — не затормозит запрос? как-то оптимизировать в этом месте можно или нинада?

(14): Поле не найдено РеализацияТоваровУслуг.Сделка.Версия

КОГДА РеализацияТоваровУслуг.Сделка.<<?>>Версия IS NULL ТОГДА «авто-очистка!»

   серый КТУЛХУ

16 — 03.10.21 — 17:59

(15)+:

(14) та же байда со ссылкой:

КОГДА РеализацияТоваровУслуг.Сделка.Ссылка.<<?>>Версия IS NULL ТОГДА «авто-очистка!»

   ДенисЧ

17 — 03.10.21 — 18:05

(15) Затормозит.

Если нужно быстро, тогда используй (8)

   vde69

18 — 03.10.21 — 18:27

(16) тут вопрос будет если ссылка но битая…. или если ссылка но доступа нет….

   Ненавижу 1С

19 — 03.10.21 — 18:27

Еще есть тема написать универсальную функцию, которая по метаданным реквизита собирает все возможные пустые ссылки и неопределено в массив

и потом писать соответственно Реквизит В (&МассивПустыхСсылок)

а можно и не по метаданным, вообще все пустые ссылки и неопределено )))

   vde69

20 — 03.10.21 — 18:32

(19) я недавно в типовой видел похожую, в динамическом списке файлов есть параметр «пустойпользователь», туда суется похожий массив.

   серый КТУЛХУ

21 — 03.10.21 — 19:06

(17): наверное потому что .Ссылка будет дергать все таблицы. абыдна. ну да ладно, в (19) норм тема если тормоза полезут. хотя и там тоже — будет дергать все(!) таблицы документов, которые есть в составе…

спасибо, люди.

   Ненавижу 1С

22 — 03.10.21 — 19:09

(21) почему там будут дергаться все таблицы? ссылка, она как бы не требует ничего

   vde69

23 — 03.10.21 — 19:15

(22) (21) будет дергатся все таблицы, начиная с таблицы конфиг…

составной тип — зло, гораздо красивее выходит использование ПВХ, хотя то-же не сахар…

хотя без составных типов обойтись очень тяжело, у меня сейчас есть задачка похожая, я знаю, что сейчас делаю медленную телегу, но когда данных будет побольше вот тогда и буду переделывать

   pechkin

24 — 03.10.21 — 19:17

А пвх значит не составной тип?

   youalex

25 — 03.10.21 — 19:18

(0) если искомый тип ссылка конкретной таблицы то тупо джойн к этой таблице

   Ненавижу 1С

26 — 03.10.21 — 19:20

(23) ПВХ тоже самое — составной тип

а для обхода всех метаданных ничего кроме метаданных не надо, имхо

   youalex

27 — 03.10.21 — 19:20

(23) ПВХ в этом смысле ничем не лучше

   youalex

28 — 03.10.21 — 19:22

(25) + еще не факт что 1С задействует при этом нужный индекс при неактуальной статистике.

   pechkin

29 — 03.10.21 — 19:25

В (19) никаких лишних соединений не будет

   серый КТУЛХУ

30 — 03.10.21 — 19:27

(29): о.

Ок, спасибо.

   ГдеСобакаЗарыта

31 — 03.10.21 — 19:31

   Ненавижу 1С

32 — 03.10.21 — 19:55

Но думаю обход метаданных будет сложно организовать, надо будет обегать дерево, когда реквизит не прямо у таблицы берется, например:

ТоварыКОтбору.Распоряжение.ДокументОснование

где Распоряжение сам составного типа и у каждого из них ДокументОснование состоит из разных типов

   vde69

33 — 03.10.21 — 20:10

(32) для твоего случая следует создать и использовать «критерииОтбора», и хотя там нет никаких доп таблиц, но запросы строятся с учетом специфики составных полей, и с индексами там все хорошо будет

   Ненавижу 1С

34 — 03.10.21 — 20:38

(33) я не думаю, что он тут необходим и чем-то вообще поможет

   pechkin

35 — 03.10.21 — 20:47

(33) критерий отбора просто создает индекс по выбранным полям

   roman52

36 — 03.10.21 — 20:54

а вот интересно: были ли у кого-нибудь задачи, в которых нужны И Неопределено и пустые ссылки?

Т.е. когда нельзя пустую ссылку приводить к Неопределено.

Ну не знаю, например, если в реквизите Неопределено, то от пользователя доп.действий не требуется, а если в реквизите пустая ссылка определенного типа, то пользователь должен указать уже непустую ссылку этого типа.

   vde69

37 — 03.10.21 — 21:01

(36) да такие задачи бывают, обычно это связано с необходимостью работать с результатом например по индексу после разыменования (или что более правильно после джойна)

   Ненавижу 1С

38 — 03.10.21 — 21:05

(36) в типовой была тема, что если скидка применялась для всех (складов или договора) то нужно было ставить ссылку на пустой договор. Наверное осталось когда реквизит не был составным.

Мое мнение прежнее — тема надуманная. Не нужно их различать, а 1с просто неудачно модель выстроила. Имхо null там должен быть. Но имеем то, что имеем

   acanta

39 — 03.10.21 — 22:16

И поэтому в справочнике появились предопределенные значения ПоУмолчанию.

   серый КТУЛХУ

40 — 03.10.21 — 22:58

(32): нет, не сложно.

    СписокПустыхСсылок = Новый Массив;

    Для Каждого ТипИзСоставного Из Метаданные.Документы.РеализацияТоваровУслуг.Реквизиты.Сделка.Тип.Типы() Цикл

        ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипИзСоставного);

        Если Метаданные.Справочники.Содержит(ОбъектМетаданных)

            ИЛИ Метаданные.Документы.Содержит(ОбъектМетаданных)

            ИЛИ Метаданные.Перечисления.Содержит(ОбъектМетаданных)

            ИЛИ Метаданные.Задачи.Содержит(ОбъектМетаданных)

            ИЛИ Метаданные.БизнесПроцессы.Содержит(ОбъектМетаданных)

            ИЛИ Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных)

            ИЛИ Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных)

            ИЛИ Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных)

            ИЛИ Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных)

            Тогда

            СписокПустыхСсылок.Добавить(Новый(ТипИзСоставного));

        КонецЕсли;

    КонецЦикла;

    ЗапросПроверкаПоСпискуПустыхСсылок.Параметры.Вставить(«ПустыеСделки», СписокПустыхСсылок);

(код «с запасом»)

   серый КТУЛХУ

41 — 03.10.21 — 23:05

в общем сделал тестовое сравнение времени запросов с проверкой на пустые значения составных реквизитов (все типы в составе агрегатные, всего 29 типов документов в реквизите Сделка м.б.):

1-е место по скорости: проверка на вхождение в список пустых значений всех типов для составного типа (реквизита), включая время составления списка по метаданным — см.(40)

2-е место — с развесистым деревом типа:

ВЫБОР КОГДА РеализацияТоваровУслуг.Сделка = ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка) ТОГДА

  КОГДА РеализацияТоваровУслуг.Сделка = ЗНАЧЕНИЕ(Документ.СчетНаОплатуПокупателю.ПустаяСсылка) ТОГДА

  …

КОНЕЦ

— в 1.2 — 1.5 раз медленнее варианта 1

3-е место — с проверкой на .Ссылка IS NULL — в 3.2 — 3.5 раз медленнее варианта 1

вусем спасибо, надеюсь мои тесты кому-нибудь пригодятся (в качестве благодарности за продуктивный обмен мнениями по интересующему меня вопросу).

   Ненавижу 1С

42 — 03.10.21 — 23:13

(40) вы это сделали скажем так для поля

Документы.РеализацияТоваровУслуг.Сделка

Я же говорил про ситуацию

Документы.РеализацияТоваровУслуг.Сделка.ДокументОснование

Причем:

Сделка сама по себе составной тип и ДокументОснование составной, причем состав типов разный у разных типов сделок

Вообще вложенность точек может быть длиннее

   Ненавижу 1С

43 — 03.10.21 — 23:15

(40) теперь это надо функцией оформить для общего случая и будет ОК

   Ненавижу 1С

44 — 03.10.21 — 23:17

А если вместо (40) сделать универсальный список ВСЕХ пустых? Понятно, что список длиннее будет, но зато его готовить не надо долго. Вообще в параметры сеанса можно запихнуть

   серый КТУЛХУ

45 — 03.10.21 — 23:40

(44): угу, мысль хорошая…

(ну кроме элементарных типов — они-то пустые даже — не совсем пустые как бы, особняком от агрегатных стоят, да и при желании в виде прямой формулы легко получаются)

   серый КТУЛХУ

46 — 03.10.21 — 23:45

(42): а давайте на «ты». я с начал интернетов, фидо, чатов-форумов еще, и как-то привык. что доброжелательное и уважительное общение — это как раз на «ты»; а «вы»-канье — это уже демостративное дистанцирование с как минимум оттенком неодобрения.

(ну, кроме естественной ниши для «вы» — деловой переписки, переписки с публичными фигурами и с теми, с кем в реале знаком и на «вы» общаешься).

   TormozIT

47 — 04.10.21 — 00:37

Если устроит генератор выражения проверки условия «Значение заполнено» для поля любого составного типа, то «Конструктор запроса (ИР)» умеет это делать.

Правда для булева типа он работает не так как встроенный язык — значение «Ложь» считает незаполненным. Мне так показалось логичнее.

https://i.imgur.com/5N9fbrP.png

   серый КТУЛХУ

48 — 04.10.21 — 01:14

(47): спасибо. только я так понимаю это типа автоматическая генерация в сам текст запроса того самого развесистого дерева со сравнением по типам — нет? если «да» то это немного не то, я как раз про универсальный (не зависящий от состава допустимых типов реквизита) условие(сравнение) спрашивал.

(ага, ложь в качестве незаполненного кажется весьма логичной интерпретацией)

   Конструктор1С

49 — 04.10.21 — 09:22

Совершенно незачем дёргать метаданные для этой задачи. Выручит СхемаЗапроса

   Конструктор1С

50 — 04.10.21 — 09:22

Функция ПустыеЗначенияПоляСоставногоТипа(ПутьКТаблице, ИмяПоля)

    
    ТекстЗапроса = СтрШаблон(«ВЫБРАТЬ %1 ИЗ %2», ИмяПоля, ПутьКТаблице);

    
    СхемаЗапроса = Новый СхемаЗапроса;

    СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса);

    
    ОписаниеТиповПоля = СхемаЗапроса.ПакетЗапросов[0].Колонки[0].ТипЗначения;

    
    ПустыеЗначения = Новый Массив;

    ПустыеЗначения.Добавить(Неопределено);

    
    Для каждого ТипЗначения Из ОписаниеТиповПоля.Типы() Цикл

        
        МассивТипов = Новый Массив;

        МассивТипов.Добавить(ТипЗначения);

        
        ОписаниеТипа = Новый ОписаниеТипов(МассивТипов);

        
        Значение = ОписаниеТипа.ПривестиЗначение(Неопределено);

        
        ПустыеЗначения.Добавить(Значение)

    
    КонецЦикла;

    
    Возврат ПустыеЗначения;

    
КонецФункции

   Конструктор1С

51 — 04.10.21 — 09:31

(40) а если в составе окажется примитивный тип?

   Ненавижу 1С

52 — 04.10.21 — 09:35

(50) это таже рефлексия, вид с другой стороны

   Конструктор1С

53 — 04.10.21 — 09:41

(52) тока схема запроса легче справляется. На шальном поле с типом ЛюбаяСсылка или хотя бы ДокументСсылка перебор всех метаданных может вылиться в значительное время. СхемаЗапроса моментально выплюнет все необходимые типы

   серый КТУЛХУ

54 — 04.10.21 — 13:05

(51): см.(47), и — у примитивных типов данных де-факто не бывает пустых значений. 0, «», «01.01.01», Ложь/Истина — не пустые значения. для всех этих типов пустое значение — нетипизированное Неопределено, а оно охватывается в коде простым условием.

   Ненавижу 1С

55 — 04.10.21 — 13:09

(53) вы прилагательными не говорите, вы количественные тесты приведите

   серый КТУЛХУ

56 — 04.10.21 — 13:09

(53): нет. перебор метаданных не «выливается в значительное время». проверено на практике, замер для (41) — там для этого варианта (п.1) «включая время составления списка по метаданным» по не очень маленькому списку ~30 типов.

не веришь — сделай хронометраж, и покажи — как мерял и что получилось.

   серый КТУЛХУ

57 — 04.10.21 — 13:09

(55): опередил заразюка )))

   серый КТУЛХУ

58 — 04.10.21 — 13:18

прим.: и — мне тоже для тестирования — в (50) как убрать элементарные (неагрегатны) типы из списка (пропустить при составлении списка) — дай код с этой оговоркой, пжалст.

   H A D G E H O G s

59 — 04.10.21 — 13:22

(1) Херовое решение.

   серый КТУЛХУ

60 — 04.10.21 — 13:40

(59): как насчет (41)?

   серый КТУЛХУ

61 — 04.10.21 — 13:53

(53):

// на обсуждаемом реквизите (Документ.РеализацияТоваровУслуг.Сделка) составного типа (29 типов):

Функция ЭтоАгрегатныйТип(ТипЗначения)

    ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗначения);

    Возврат    Метаданные.Справочники.Содержит(ОбъектМетаданных)

        ИЛИ Метаданные.Документы.Содержит(ОбъектМетаданных)

        ИЛИ Метаданные.Перечисления.Содержит(ОбъектМетаданных)

        ИЛИ Метаданные.Задачи.Содержит(ОбъектМетаданных)

        ИЛИ Метаданные.БизнесПроцессы.Содержит(ОбъектМетаданных)

        ИЛИ Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных)

        ИЛИ Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных)

        ИЛИ Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных)

        ИЛИ Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных);

КонецФункции

Функция ПустыеЗначенияПоляСоставногоТипаПоСхемеЗапроса(ПутьКТаблице, ИмяПоля)

    ТекстЗапроса = «ВЫБРАТЬ » + ИмяПоля + » ИЗ » + ПутьКТаблице;

    СхемаЗапроса = Новый СхемаЗапроса;

    СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса);

    ОписаниеТиповПоля = СхемаЗапроса.ПакетЗапросов[0].Колонки[0].ТипЗначения;

    ПустыеЗначения = Новый Массив;

    ПустыеЗначения.Добавить(Неопределено);

    Для Каждого ТипЗначения Из ОписаниеТиповПоля.Типы() Цикл

        Если ЭтоАгрегатныйТип(ТипЗначения) Тогда

            МассивТипов = Новый Массив;

            МассивТипов.Добавить(ТипЗначения);

            ОписаниеТипа = Новый ОписаниеТипов(МассивТипов);

            Значение = ОписаниеТипа.ПривестиЗначение(Неопределено);

            ПустыеЗначения.Добавить(Значение)

        КонецЕсли;

    КонецЦикла;

    Возврат ПустыеЗначения;

КонецФункции

Функция ПустыеЗначенияПоляСоставногоТипаИзМетаданных(ТипДанных, ВидДанных, ИмяПоля)

    ПустыеЗначения = Новый Массив;

    Для Каждого ТипЗначения Из Метаданные[ТипДанных][ВидДанных].Реквизиты[ИмяПоля].Тип.Типы() Цикл

        ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗначения);

        Если ЭтоАгрегатныйТип(ТипЗначения) Тогда

            ПустыеЗначения.Добавить(Новый(ТипЗначения));

        КонецЕсли;

    КонецЦикла;

    Возврат ПустыеЗначения;

КонецФункции

    ТаймерыПолученияПустыхСсылок = Новый Структура(«ПоСхемеЗапроса, ПоМетаданным», 0, 0);

    КоличествоТестов = 100;

    
    СписокПустыхСсылок = ПустыеЗначенияПоляСоставногоТипаПоСхемеЗапроса(«Документ.РеализацияТоваровУслуг», «Сделка»);

    СписокПустыхСсылок = Неопределено;

    ТаймерыПолученияПустыхСсылок.ПоСхемеЗапроса = ТекущаяУниверсальнаяДатаВМиллисекундах();

    Для СчетчикТестов = 1 По КоличествоТестов Цикл;

        СписокПустыхСсылок = ПустыеЗначенияПоляСоставногоТипаПоСхемеЗапроса(«Документ.РеализацияТоваровУслуг», «Сделка»);

        СписокПустыхСсылок = Неопределено;

    КонецЦикла;

    ТаймерыПолученияПустыхСсылок.ПоСхемеЗапроса = ТекущаяУниверсальнаяДатаВМиллисекундах() — ТаймерыПолученияПустыхСсылок.ПоСхемеЗапроса;

    Сообщить(«Составление списка пустых значений по Схеме запроса: миллсекунд = » + ТаймерыПолученияПустыхСсылок.ПоСхемеЗапроса + » / » + КоличествоТестов);

    
    СписокПустыхСсылок = ПустыеЗначенияПоляСоставногоТипаИзМетаданных(«Документы»,»РеализацияТоваровУслуг», «Сделка»);

    СписокПустыхСсылок = Неопределено;

    ТаймерыПолученияПустыхСсылок.ПоМетаданным = ТекущаяУниверсальнаяДатаВМиллисекундах();

    Для СчетчикТестов = 1 По КоличествоТестов Цикл;

        СписокПустыхСсылок = ПустыеЗначенияПоляСоставногоТипаИзМетаданных(«Документы»,»РеализацияТоваровУслуг», «Сделка»);

        СписокПустыхСсылок = Неопределено;

    КонецЦикла;

    ТаймерыПолученияПустыхСсылок.ПоМетаданным = ТекущаяУниверсальнаяДатаВМиллисекундах() — ТаймерыПолученияПустыхСсылок.ПоМетаданным;

    Сообщить(«Составление списка пустых значений по Метаданным: миллсекунд = » + ТаймерыПолученияПустыхСсылок.ПоМетаданным + » / » + КоличествоТестов);

результат:

Составление списка пустых значений по Схеме запроса: миллсекунд = 220 / 100

Составление списка пустых значений по Метаданным: миллсекунд = 179 / 100

(да и как-то короче и понятнее кажется код по Метаданным)

   H A D G E H O G s

62 — 04.10.21 — 14:01

Лучше всего через составной тип

    Запрос=Новый Запрос;

    Запрос.Текст=

    «ВЫБРАТЬ

    |    ДатыСоздания.ДатаСоздания КАК ДатаСоздания

    |ИЗ

    |    РегистрСведений.ДатыСоздания КАК ДатыСоздания

    |ГДЕ

    |    НЕ ДатыСоздания.СкладскойДокумент В (НЕОПРЕДЕЛЕНО, &МассивПустыхСкладскихДокументов)»;

    МассивПустыхСкладскихДокументов=Новый Массив;

    Для Каждого Тип Из Метаданные.ОпределяемыеТипы.СкладскиеДокументы.Тип.Типы() Цикл

        МассивПустыхСкладскихДокументов.Добавить(Новый(Тип));

    КонецЦикла;

    Запрос.УстановитьПараметр(«МассивПустыхСкладскихДокументов»,МассивПустыхСкладскихДокументов);

    Результат=Запрос.Выполнить().Выгрузить();

Но с типовыми конечно так не получится

   H A D G E H O G s

63 — 04.10.21 — 14:02

(62) Пардон

через составной тип-> через определяемый тип

   pechkin

64 — 04.10.21 — 14:15

(62) в конкретном случае можно напрямую к метаданным реквизита регистра обратиться, без всяких опрпделяемых типов

   H A D G E H O G s

65 — 04.10.21 — 14:24

(64) Да, это гораздо лучше!

   Конструктор1С

66 — 04.10.21 — 14:39

(58) можно приводить тип к строке и проверять

ИмяТипаXML = XMLТип(ПроверяемыйТип).ИмяТипа;

На выходе

CatalogRef.Номенклатура

DocumentRef.ПриходнаяНакладная

вот по подстроке «Ref.» можно ориентироваться. Соответственно, без Ref это какой-то примитивный тип.

   pechkin

67 — 04.10.21 — 14:42

(66) это быстрее? строки в 1с не быстро работают

   Конструктор1С

68 — 04.10.21 — 16:05

(67) гораздо быстрее обращения к метаданным. XMLТип() скорее всего завязано на движок обмена данными 1с, поэтому хорошо оптимизировано

   TormozIT

69 — 04.10.21 — 19:07

(53) Ну это очень смелое утверждение. Я много раз проверял — схема запроса также буксует на широких по составу описаниях типов полей, как и остальные механизмы платформы. И это вполне ожидаемо.

   TormozIT

70 — 04.10.21 — 19:11

(69) + Если конечно сравнивать с буквальным перебором метаданных, то выигрыш будет только первый раз за счет разовой загрузки метаданных. Супертип ЛюбаяСсылка развернется в массив типов без загрузки всех метаданных в память.

  

Конструктор1С

71 — 05.10.21 — 06:44

(69) не также она буксует, значительно быстрее отрабатывает

Содержание:

1.       Тип значения Null

2.       Методы Есть Null и ЕстьNull 

1.    Тип значения Null

Тип значения Null – это переменная или поле с отсутствующим значением. Если реквизит объекта имеет один определенный тип, например тип «Справочник.Договоры», то незаполненное значение будет равно пустой ссылке в запросе «Справочник.Договоры.ПустаяСсылка». Если реквизит имеет мультитип, то незаполненное значение данного реквизита будет равно значению «Неопределено», так как используемые в этом реквизите типы известны, но неизвестно, какой из пустых типов нужно использовать в данном случае. Для примера, в документе «ЗаказКлиента» реквизит «ДокументОснование» может быть и «ЗаданиеТорговомуПредставителю» и «КоммерческоеПредложениеКлиенту». В случаях же, когда вообще неизвестно, какие типы мы хотим получить, значением свойства является Null. В качестве примера, в котором в запросе есть Null, можно рассмотреть левое соединение таблиц, когда в присоединяемой таблице отсутствуют значения, удовлетворяющие условию соединения.

Пример кода: присоединение к таблице контрагентов таблицы договоров

Рис. 1 Левое соединение таблиц

Если у контрагента отсутствует договор, то при выполнении запроса получим следующие значения:

Как видим в запросе в 1С есть Null и это отображается пустой строкой.

В запросе сравнение любого значения с типом значения Null дает результат Ложь. Даже условие Null = Null является ложным.  

2.    Методы Есть Null и ЕстьNull

Для правильной обработки данных ситуаций созданы такие методы, как:

·         Есть Null – это выражение условия, проверяющее, является ли выбранное значение типом значения Null. При проверке следует применять его. Сравнение вида (ДоговорКонтрагента.Ссылка = Null) не даст корректного результата.


Пример кода:


Рис. 2 Пример кода для проверки типа значения Null

Для корректной работы запроса обязательно следует отслеживать места, где есть Null в запросе 1С, и заменять данное значение на какой-то определенный тип.

·         ЕстьNull
Этот метод позволяет менять значение Null на нужное нам значение.

Пример кода для запроса в 1С с ЕстьNull

Рис. 3 Код для ЕстьNull в запросе

Отсутствующую строку с помощью метода ЕстьNull в 1С можно заменить на пустую строку, отсутствующую цифру на ноль, ссылку на пустую ссылку, дату на пустую дату. Например ЕстьNull(“ДоговорыКонтрагентов.Номер”, “”), ЕстьNull(“ДоговорыКонтрагентов.СуммаДоговора”, 0), ЕстьNull(“ДоговорыКонтрагентов.Партнер”, Значение(Справочник.Партнеры.ПустаяСсылка)), ЕстьNull(“ДоговорыКонтрагентов.Дата”, ДАТАВРЕМЯ(1,1,1,0,0,0)).

Тип значения Null также может уже содержаться в используемом в запросе реквизите, попав туда в результате некорректной записи программным кодом, смене типа реквизита в конфигураторе либо при неправильном обмене данными между базами. В этих случаях тоже можно воспользоваться выражением ЕстьNull в запросе, но лучше исправлять такие реквизиты.

Специалист компании «Кодерлайн»

Александр Суворов

Пустая ссылка в запросе в 1С

В языке запросов 1С часто требуется проверить: является ли значение пустой ссылкой.
Пустая ссылка — это такое значение ссылочных объектов, когда оно имеет этот же тип, но само значение не выбрано.

На языке программирования 1С данное значение можно получить через менеджеры объекта.

Например:

  • Перечисления.Пол.ПустаяСсылка(),
  • Справочники.Организации.ПустаяСсылка(),
  • ПланыСчетов.Хозрасчетный.ПустаяСсылка(),
  • ПредопредленноеЗначение(«ПланСчетов.Хозрасчетный.ПустаяСсылка»)

Альтернативой сравнению с пустой ссылкой имеется метод Пустая() у значения ссылочного типа:
Например:
булКонтрагентВыбран = ВыбКонтрагент.Пустая();

Быстрый переход

  • Как же в запросе 1С сравнить на пустое значение
    • 1.Если требуется получить значение пустого типа.
    • 2. Если требуется сравнить со значением не составного типа:
    • 3. Если требуется проверка составного значения:

Как же в запросе 1С сравнить на пустое значение

Для этого у нас есть несколько вариантов в зависимости от требований задачи:

1.Если требуется получить значение пустого типа.

Воспользуемся функцией ЗНАЧЕНИЕ()

Выбрать
    ЗНАЧЕНИЕ (Перечисление.Пол.ПустаяСсылка)//Без вопроса в единственном числе

Либо через переданный в запрос параметр:
Выбрать
    &ПустойПараметрНужногоТипа

2. Если требуется сравнить со значением не составного типа:

Выбрать
    Значение(Перечисление.Пол.ПустаяСсылка)<>Значение(Перечисление.Пол.Мужской) как ЭтоБулевоИстина

или

Выбрать
       Выбор когда &ПустойПараметрНужногоТипа ИЛИ Значение(Перечисление.Пол.Мужской) Тогда Истина Иначе Ложь Конец как ЭтоНеЖенскийПол

3. Если требуется проверка составного значения:

В этом случае значение

  • может быть неопределенного типа (очищено или ни разу не выбрано)
  • пустой ссылкой любого из типов (выбран тип, но не выбрано значение)
  • выбранным значением любого из типов (выбрано значение)

В этом случае обычно первые два варианта считаются пустым значением, но пустыми ссылками являются только вторые. 

//Мы инициализировали массив заполненных значений и сравнили его с пустым

Выбрать

     Выбор когда ЗНАЧЕНИЕ(Значение(Перечисление.Пол.ПустаяСсылка) в (Значение(Перечисление.Пол.Мужской),Значение(Перечисление.Пол.Женский)) ИЛИ Есть NULL Тогда Истина Иначе Ложь конец ЗначениеПустое

//Мы инициализировали массив пустых ссылок и проверили вхождение в него нашего «неизвестного» значения

Выбрать

Выбор когда ЗНАЧЕНИЕ(Значение(Перечисление.Пол.Мужской) в (Значение(Перечисление.Пол.ПустаяСсылка),Значение(Справочник.Контрагенты.ПустаяСсылка)) Тогда Истина Иначе Ложь конец ЗначениеПустое

Также мы можем передать массив параметром

Выбрать Выбор когда ЗНАЧЕНИЕ(Значение(Перечисление.Пол.ПустаяСсылка) в (&МассивВсехПустыхСсылок) Тогда Истина Иначе Ложь конец ЗначениеПустое

Как получить значение ЛюбаяСсылка? 

Еще про перечисление в запросе 1С.

Можно дурачить всех все время, — при условии, что реклама ведется правильно, а расходы на нее достаточно велики.

Главная » Статьи 1с » 1С как в запросе проверить на пустую ссылку

Пустая ссылка, дата или строка в запросе 1С 8.3 и 8.2

18.07.2017

В этой статье будут рассмотрены способы проверки на пустое значение в зависимости от типа проверяемого реквизита в запросе 1С 8.3, в том числе пустой ссылки.

Проверка на NULL

Значение NULL возвращается в том случае, когда реквизита попросту нет. Тип в этом случае будет тоже NULL. Например, вы объединяете две таблицы через левое соединение. В том случае, когда для левой таблицы не будет найдено ни одного значения в правой, вернется NULL.

Проверку на данное значение можно осуществить при помощи конструкции «ЕСТЬ NULL» и «ЕСТЬNULL()». В первом случае возвращается Истина или Ложь. Во втором случае можно сразу задать другое значение в том случае, когда возвращается NULL.

В приведенном ниже запросе 1С 8.3 будут возвращен список контактных лиц тех партнеров, у кого не задан сегмент.

ВЫБРАТЬ КонтактныеЛицаПартнеров.Ссылка ИЗ Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СегментыПартнеров КАК СегментыПартнеров ПО КонтактныеЛицаПартнеров.Владелец = СегментыПартнеров.Родитель ГДЕ

СегментыПартнеров.Ссылка ЕСТЬ NULL

Пустая дата

Проверка значения на пустую дату производится путем сравнения с конструкцией ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0). Пример использования приведен ниже:

ВЫБРАТЬ Встреча.Ссылка ИЗ Документ.Встреча КАК Встреча ГДЕ

Встреча.Дата = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)

Пустая ссылка в запросе 1С

В случае, когда возвращаемый реквизит имеет ссылочный тип, например, это элемент какого-либо справочника, документа и т. п., используется следующая конструкция: ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка).

В приведенном ниже примере запрос выбирает всех партнеров, у которых не указан бизнес-регион.

ВЫБРАТЬ Партнеры.Ссылка ИЗ Справочник.Партнеры КАК Партнеры ГДЕ

Партнеры.БизнесРегион = ЗНАЧЕНИЕ(Справочник.БизнесРегионы.ПустаяСсылка)

Чтобы проверить на «ЗначениеЗаполнено» нужно сделать обратное условие:

Партнеры.БизнесРегион ЗНАЧЕНИЕ(Справочник.БизнесРегионы.ПустаяСсылка)

Пустая строка

Для проверки строковых типов производится сравнение с другим образцом. В данном случае – «».

Приведенный ниже запрос отберет всех партнеров с незаполненным наименованием.

ВЫБРАТЬ Партнеры.Ссылка ИЗ Справочник.Партнеры КАК Партнеры ГДЕ

Партнеры.Наименование = «»

1s83.info

Пустая ссылка, дата или строка в запросе 1С 8.3

Рассмотрим основные методы использования пустых значений в условиях запросов 1С 8.3.

Проверка на NULL

выполняется с помощью конструкции ЕСТЬ NULL, например:

ВЫБРАТЬ ВнутренниеЗаказыОстатки.Заказчик, ВнутренниеЗаказыОстатки.КоличествоОстаток ИЗ РегистрНакопления.ВнутренниеЗаказы.Остатки КАК ВнутренниеЗаказыОстатки ГДЕ ВнутренниеЗаказыОстатки.КоличествоОстаток ЕСТЬ NULL

Получите 267 видеоуроков по 1С бесплатно:

Пустая дата в запросе 1С

Пустая дата в запросе устанавливается конструкцией ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0), пример:

ВЫБРАТЬ СчетНаОплатуПокупателю.Ссылка, СчетНаОплатуПокупателю.ДатаОтгрузки ИЗ Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю ГДЕ СчетНаОплатуПокупателю.ДатаОтгрузки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)

Пустая ссылка (значение) в запросе 1С 8.2 и 8.3

Для ссылочных значений (справочники, документы, перечисления, планы счетов и т.д) для проверки необходимо использовать конструкцию «ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка)». Например:

ВЫБРАТЬ Номенклатура.Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

Проверка на пустую строку в запросе 1С

В условиях для нахождения пустой строки необходимо использовать пустое значение строки — «», например:

ВЫБРАТЬ Банки.Ссылка ИЗ Справочник.Банки КАК Банки ГДЕ Банки.Код = «»

Будет полезно — рубрикатор статей по языку запросов 1С.

Если Вы начинаете изучать 1С программирование, рекомендуем наш курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Остались вопросы?

СПРОСИТЕ в комментариях!

programmist1s.ru

Проверка на пустую ссылку, дату или строку в запросе 1С

В 1С не встроены разработчиками средства определения пустых ссылок, дат или строк. Рассмотрим, как проверить на пустую ссылку, дату или строку в запросе 1С.

Определить нулевые данные можно путем использования специальных операторов.

Язык заданий

Информацию из базы данных 1С запрашивают (а потом получают) с помощью такого инструмента, как язык запросов (Query, англ.). Они составляются на латинице и кириллице. А одним из ключевых слов-команд (операторов) при получении информации является слово-команда ВЫБРАТЬ (SELECT, англ.) в сочетании с некоторыми конструкциями. Приведём примеры построения интересующих нас по теме запрашиваемых заданий:

Проверка на содержание NULL

Такое задание выполняется оператором ВЫБРАТЬ в сочетании с конструкцией «ЕСТЬ NULL»:

SELECTЗаказыОстатки.Заказчик,ЗаказыОстатки.КоличествоОстатокИЗРегистрНакопления.Заказы.Остатки КАК ЗаказыОстаткиГДЕ

ЗаказыОстатки.КоличествоОстаток ЕСТЬ NULL

Контроль даты

Пустая дата в запросе 1С вносится построением «ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)»:

SELECTСчетВходящийПоставщика.Link,СчетВходящийПоставщика.ДатаПриходаИЗДокумент. СчетВходящийПоставщика КАК СчетВходящийПоставщикаГДЕ

СчетВходящийПоставщика.ДатаПрихода = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)

Ссылочная проверка

Проверка несуществующих внутриссылочных значений (на планы счетов, справочники и пр.) производится с использованием конструкции «VALUE(Справочник.Имя…ПустаяСсылка)»:

SELECTПланСчетов.СсылкаИЗСправочник.ПланСчетов КАК ПланСчетовГДЕ

ПланСчетов = VALUE(Справочник.ПланСчетов.ПустаяСсылка)

Проверка строки

Пустота в строках обнаруживается с применением пробела в кавычках «»:

SELECTПокупатели.LinkИЗСправочник.Покупатели КАК ПокупателиГДЕ

Покупатели.Код = «»

Ещё о битых и обычных линках

«Битой» считается ссылка (Link, англ.), ведущая (указывающая) на несуществующий элемент. Под несуществующим понимают такой, которого нет в базе данных. Полезно о таких линках знать хотя бы для того, чтобы получать от системы уведомления в более понятной форме. Да и запись, удаление и открытие нереальных объектов не имеет смысла.

Платформы 1С не обладают внутренними средствами чтобы их отсечь. Ещё нужно понимать, что вне «битых» в системе живут специальные «пустые линки», которые следует различать одни от других.Это можно выяснить и без запросов к базе данных:

В системе 1С-7.7

Для «битой» — методом Link.Selected() и функцией ПустоеЗначение() возвращается ноль. Для  «пустой» — в первом случае ноль, а во втором — единица. Для «нормальной» — единица и ноль. Получается, в 1С-7.7 «битая» — не является несуществующим значением, которое не считается выбранным.

В системе 1С-8.x

Всё по-другому — в обоих случаях (для «битых» и «обычных») метод возвращает Ложь, а функция — Истину. Решение такое: Для «битой» методом Ссылка.ПолучитьОбъект() возвращается функция «Неопределено». Для «пустой» — выбрасывается «Ошибка метода контекста». Для «нормальной» — возвращается значение согласно документации; Выходит, в 1С-8.х «битая» — не будет несуществующей функцией ссылочного типа, которая возвращает Неопределённое значение объекта.

Откуда они берутся

При переходе по несуществующему адресу битой линки пользователю в лучшем случае показано уведомление о том, что объект не найден, в худшем — изображение страницы сервера. Наихудшей их чертой является скрытость. Отсюда — сложность в проверке их корректности. Во время работы с конфигурацией она постоянно дорабатывается, обновляется. Какие-то объекты подлежат удалению, изменяется структура. А ссылка на удалённый элемент остаётся в конструкциях и алгоритмах. Таким образом, несуществующие адреса остаются в системе после удаления самого элемента (вместе с адресом).

В сегодняшней публикации было рассмотрено специальное построение запросов. Приведены примеры конструкций. Это пригодится вам в работе при поиске пустых значений.

Оставляйте свои комментарии.

nastroyvse.ru

Пустая ссылка в запросе в 1С

В языке запросов 1С часто требуется проверить: является ли значение пустой ссылкой. Пустая ссылка — это такое значение ссылочных объектов, когда оно имеет этот же тип, но само значение не выбрано.

На языке программирования 1С данное значение можно получить через менеджеры объекта.

Например:

  • Перечисления.Пол.ПустаяСсылка(),
  • Справочники.Организации.ПустаяСсылка(),
  • ПланыСчетов.Хозрасчетный.ПустаяСсылка(),
  • ПредопредленноеЗначение(«ПланСчетов.Хозрасчетный.ПустаяСсылка»)

Альтернативой сравнению с пустой ссылкой имеется метод Пустая() у значения ссылочного типа:Например:

булКонтрагентВыбран = ВыбКонтрагент.Пустая();

Как же в запросе 1С сравнить на пустое значение

Для этого у нас есть несколько вариантов в зависимости от требований задачи:

1.Если требуется получить значение пустого типа.

Воспользуемся функцией ЗНАЧЕНИЕ()

Выбрать     ЗНАЧЕНИЕ (Перечисление.Пол.ПустаяСсылка)//Без вопроса в единственном числе

Либо через переданный в запрос параметр:Выбрать    &ПустойПараметрНужногоТипа

2. Если требуется сравнить со значением не составного типа:

Выбрать    Значение(Перечисление.Пол.ПустаяСсылка)Значение(Перечисление.Пол.Мужской) как ЭтоБулевоИстина

или

Выбрать       Выбор когда &ПустойПараметрНужногоТипа ИЛИ Значение(Перечисление.Пол.Мужской) Тогда Истина Иначе Ложь Конец как ЭтоНеЖенскийПол

3. Если требуется проверка составного значения:

В этом случае значение

  • может быть неопределенного типа (очищено или ни разу не выбрано)
  • пустой ссылкой любого из типов (выбран тип, но не выбрано значение)
  • выбранным значением любого из типов (выбрано значение)

В этом случае обычно первые два варианта считаются пустым значением, но пустыми ссылками являются только вторые. 

//Мы инициализировали массив заполненных значений и сравнили его с пустым

Выбрать

     Выбор когда ЗНАЧЕНИЕ(Значение(Перечисление.Пол.ПустаяСсылка) в (Значение(Перечисление.Пол.Мужской),Значение(Перечисление.Пол.Женский)) ИЛИ Есть NULL Тогда Истина Иначе Ложь конец ЗначениеПустое

//Мы инициализировали массив пустых ссылок и проверили вхождение в него нашего «неизвестного» значения

Выбрать

Выбор когда ЗНАЧЕНИЕ(Значение(Перечисление.Пол.Мужской) в (Значение(Перечисление.Пол.ПустаяСсылка),Значение(Справочник.Контрагенты.ПустаяСсылка)) Тогда Истина Иначе Ложь конец ЗначениеПустое

Также мы можем передать массив параметром

Выбрать Выбор когда ЗНАЧЕНИЕ(Значение(Перечисление.Пол.ПустаяСсылка) в (&МассивВсехПустыхСсылок) Тогда Истина Иначе Ложь конец ЗначениеПустое

Как получить значение ЛюбаяСсылка? 

Еще про перечисление в запросе 1С.

Реклама — виновница того, что народ выбрал себе в вожди Гитлера. Реклама призвана убеждать граждан, что ситуация нормальна, когда она катастрофически ненормальна.

— Фредерик Бегбедер

capitally.ru


Смотрите также

Понравилась статья? Поделить с друзьями:
  • Автомагазин на лещинского в минске время работы
  • 1с изменение реквизита документа при проведении
  • Абсолют банк воронцовское отделение часы работы
  • Акции китайских компаний автомобильных компаний
  • Автомагазины в первоуральске адреса часы работы