Проверка на заполненность в запросе реквизита составного типа |
Я |
08.02.07 — 09:03
например выбираю «Возвраты товаров от покупателей», там есть реквизит составного типа,поставить Сделка <> &ПустаяСсылка(а в параметрах указать ссылку на пустой документ «ЗаказыПокупателей») не будет правильным , т.к Сделка может быть еще доком «Реализация», что делать ?
1 — 08.02.07 — 09:03
2 — 08.02.07 — 09:11
…
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ПО ВозвратТоваровОтПокупателя.Контрагент = РеализацияТоваровУслуг.Контрагент
И (ВозвратТоваровОтПокупателя.Сделка = РеализацияТоваровУслуг.Сделка
ИЛИ ВозвратТоваровОтПокупателя.Сделка = РеализацияТоваровУслуг.Ссылка)
И (ВозвратТоваровОтПокупателя.Сделка ССЫЛКА Документ.РеализацияТоваровУслуг
ИЛИ ВозвратТоваровОтПокупателя.Сделка ССЫЛКА Документ.ЗаказПокупателя)
ГДЕ
ВозвратТоваровОтПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон
И РеализацияТоваровУслуг.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Сделка <> НЕОПРЕДЕЛЕНО // не срабатывает, т.к определено , но с пустой ссылкой
3 — 08.02.07 — 09:12
т.е могут быть ситуации , когда это поле не заполнено, но тип определен и приведен соответственно или заполенно
4 — 08.02.07 — 09:45
NULL?
5 — 08.02.07 — 09:49
не нул, не нул ?
ВЫБРАТЬ РАЗЛИЧНЫЕ
ВозвратТоваровОтПокупателя.Ссылка КАК Возврат,
ВозвратТоваровОтПокупателя.Дата КАК ДатаВозвртата,
ВозвратТоваровОтПокупателя.Организация КАК ОрганизацияВозврата,
ВозвратТоваровОтПокупателя.СуммаДокумента КАК СуммаВозврата,
ВозвратТоваровОтПокупателя.Контрагент КАК Контрагент,
РеализацияТоваровУслуг.Ссылка КАК Реализация,
РеализацияТоваровУслуг.СуммаДокумента КАК СуммаРеализации,
РеализацияТоваровУслуг.Дата КАК ДатаРеализации,
ВЫРАЗИТЬ(РАЗНОСТЬДАТ(РеализацияТоваровУслуг.Дата, ВозвратТоваровОтПокупателя.Дата, СЕКУНДА) / (24 * 60 * 60) КАК ЧИСЛО(3, 0)) КАК РазностьМеждуВозвратомИРеализацией,
ВозвратТоваровОтПокупателя.СкладОрдер КАК СкладВозврата,
РеализацияТоваровУслуг.Склад КАК СкладРеализации,
ВозвратТоваровОтПокупателя.Сделка КАК ОснованиеВозврата
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ПО ВозвратТоваровОтПокупателя.Контрагент = РеализацияТоваровУслуг.Контрагент
И (ВозвратТоваровОтПокупателя.Сделка ССЫЛКА Документ.ЗаказПокупателя)
И ВозвратТоваровОтПокупателя.Сделка = РеализацияТоваровУслуг.Сделка
ГДЕ
ВозвратТоваровОтПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон
И РеализацияТоваровУслуг.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Сделка <> &ПустойЗаказ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВозвратТоваровОтПокупателя.Ссылка,
ВозвратТоваровОтПокупателя.Дата,
ВозвратТоваровОтПокупателя.Организация,
ВозвратТоваровОтПокупателя.СуммаДокумента,
ВозвратТоваровОтПокупателя.Контрагент,
РеализацияТоваровУслуг.Ссылка,
РеализацияТоваровУслуг.СуммаДокумента,
РеализацияТоваровУслуг.Дата,
ВЫРАЗИТЬ(РАЗНОСТЬДАТ(РеализацияТоваровУслуг.Дата, ВозвратТоваровОтПокупателя.Дата, СЕКУНДА) / (24 * 60 * 60) КАК ЧИСЛО(3, 0)),
ВозвратТоваровОтПокупателя.СкладОрдер,
РеализацияТоваровУслуг.Склад,
ВозвратТоваровОтПокупателя.Сделка
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ПО ВозвратТоваровОтПокупателя.Сделка = РеализацияТоваровУслуг.Ссылка
И ВозвратТоваровОтПокупателя.Контрагент = РеализацияТоваровУслуг.Контрагент
И (ВозвратТоваровОтПокупателя.Сделка ССЫЛКА Документ.РеализацияТоваровУслуг)
ГДЕ
ВозвратТоваровОтПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ВозвратТоваровОтПокупателя.Проведен = ИСТИНА
И РеализацияТоваровУслуг.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Сделка <> &ПустаяРеализация
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВозвратТоваровОтПокупателя.Ссылка,
ВозвратТоваровОтПокупателя.Дата,
ВозвратТоваровОтПокупателя.Организация,
ВозвратТоваровОтПокупателя.СуммаДокумента,
ВозвратТоваровОтПокупателя.Контрагент,
NULL,
NULL,
NULL,
NULL,
ВозвратТоваровОтПокупателя.СкладОрдер,
NULL,
NULL
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ГДЕ
ВозвратТоваровОтПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ВозвратТоваровОтПокупателя.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Сделка ССЫЛКА Документ.ЗаказПокупателя
И ВозвратТоваровОтПокупателя.Сделка = &ПустойЗаказ
ИТОГИ
СУММА(СуммаВозврата),
СУММА(СуммаРеализации)
ПО
ОБЩИЕ,
Контрагент
6 — 08.02.07 — 09:52
только вот еще одно НО, как обойти тот факт, что если по одному заказу у нас было более одной реализации — в текущем решении задваиваются некоторые строки
7 — 08.02.07 — 09:52
Если у тебя сделка — документ можно сделать так: Сделка.Дата ЕСТЬ NULL
8 — 08.02.07 — 09:53
(7) можно и так :), а по 6 пункту
9 — 08.02.07 — 09:56
(7) не прокатило
10 — 08.02.07 — 09:57
(9) тогда Сделка.Дата=&ПустаяДата
Запрос.УстановитьПараметр(«ПустаяДата»,’00010101′);
11 — 08.02.07 — 09:58
попробуй поменять
И ВозвратТоваровОтПокупателя.Сделка <> НЕОПРЕДЕЛЕНО // не срабатывает, т.к определено , но с пустой ссылкой
на
И ВозвратТоваровОтПокупателя.Сделка.Ссылка ЕСТЬ NULL
12 — 08.02.07 — 09:59
секундочку …
13 — 08.02.07 — 09:59
(6) во внутреннем запросе группировать реализации по заказу.
14 — 08.02.07 — 10:03
(11) не прокатило, вот ведь какая штука у одного и второго дока поле Сделка не заполенено(имеет тип ДокументСсылка.ЗаказаПокупателя), один выводится в отчет , у которого в структуре подчиненности нет ничего, а другой не выводится , у которого есть в структуре и заказ и релизация — что это ???
15 — 08.02.07 — 10:07
(10) вообще не выводит те возвраты, которые с пустыми сделками
16 — 08.02.07 — 10:07
попробуй так
И ВозвратТоваровОтПокупателя.Сделка.Ссылка НЕ В (&СписокСсылок)
СписокСсылок = Новый СписокЗначений;
СписокСсылок.Добавить(Пустаяссылкадокумента1);
…
СписокСсылок.Добавить(ПустаяссылкадокументаN);
Запрос.УстановитьПараметр(«СпискоСсылок»,СписокСсылок)
17 — 08.02.07 — 10:08
(15) для этих добавляешь усливе на NULL как в (7)
18 — 08.02.07 — 10:11
(16) точно, е мое :))
(17) секундочку … ща попробую
19 — 08.02.07 — 10:13
(17),(16) по (11) что можно сказать
20 — 08.02.07 — 10:14
+(19) по (14) извиняюсь
21 — 08.02.07 — 10:15
делаю все в консоли запросов и поэтому пока с типами не определюсь не составляю отчет (14) пункт не могу понять как так получается
22 — 08.02.07 — 10:18
платформа 16, 10.2.11.3 переделанная не в части среды выполнения запроса
23 — 08.02.07 — 10:23
выложи окончательный запрос
24 — 08.02.07 — 10:31
ВЫБРАТЬ РАЗЛИЧНЫЕ
ВозвратТоваровОтПокупателя.Ссылка КАК Возврат,
ВозвратТоваровОтПокупателя.Дата КАК ДатаВозвртата,
ВозвратТоваровОтПокупателя.Организация КАК ОрганизацияВозврата,
ВозвратТоваровОтПокупателя.СуммаДокумента КАК СуммаВозврата,
ВозвратТоваровОтПокупателя.Контрагент КАК Контрагент,
РеализацияТоваровУслуг.Ссылка КАК Реализация,
РеализацияТоваровУслуг.СуммаДокумента КАК СуммаРеализации,
РеализацияТоваровУслуг.Дата КАК ДатаРеализации,
ВЫРАЗИТЬ(РАЗНОСТЬДАТ(РеализацияТоваровУслуг.Дата, ВозвратТоваровОтПокупателя.Дата, СЕКУНДА) / (24 * 60 * 60) КАК ЧИСЛО(3, 0)) КАК РазностьМеждуВозвратомИРеализацией,
ВозвратТоваровОтПокупателя.СкладОрдер КАК СкладВозврата,
РеализацияТоваровУслуг.Склад КАК СкладРеализации,
ВозвратТоваровОтПокупателя.Сделка КАК ОснованиеВозврата
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ПО ВозвратТоваровОтПокупателя.Контрагент = РеализацияТоваровУслуг.Контрагент
И (ВозвратТоваровОтПокупателя.Сделка ССЫЛКА Документ.ЗаказПокупателя)
И ВозвратТоваровОтПокупателя.Сделка = РеализацияТоваровУслуг.Сделка
ГДЕ
ВозвратТоваровОтПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон
И РеализацияТоваровУслуг.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Сделка <> &ПустойЗаказ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВозвратТоваровОтПокупателя.Ссылка,
ВозвратТоваровОтПокупателя.Дата,
ВозвратТоваровОтПокупателя.Организация,
ВозвратТоваровОтПокупателя.СуммаДокумента,
ВозвратТоваровОтПокупателя.Контрагент,
РеализацияТоваровУслуг.Ссылка,
РеализацияТоваровУслуг.СуммаДокумента,
РеализацияТоваровУслуг.Дата,
ВЫРАЗИТЬ(РАЗНОСТЬДАТ(РеализацияТоваровУслуг.Дата, ВозвратТоваровОтПокупателя.Дата, СЕКУНДА) / (24 * 60 * 60) КАК ЧИСЛО(3, 0)),
ВозвратТоваровОтПокупателя.СкладОрдер,
РеализацияТоваровУслуг.Склад,
ВозвратТоваровОтПокупателя.Сделка
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ПО ВозвратТоваровОтПокупателя.Сделка = РеализацияТоваровУслуг.Ссылка
И ВозвратТоваровОтПокупателя.Контрагент = РеализацияТоваровУслуг.Контрагент
И (ВозвратТоваровОтПокупателя.Сделка ССЫЛКА Документ.РеализацияТоваровУслуг)
ГДЕ
ВозвратТоваровОтПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ВозвратТоваровОтПокупателя.Проведен = ИСТИНА
И РеализацияТоваровУслуг.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Сделка <> &ПустаяРеализация
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВозвратТоваровОтПокупателя.Ссылка,
ВозвратТоваровОтПокупателя.Дата,
ВозвратТоваровОтПокупателя.Организация,
ВозвратТоваровОтПокупателя.СуммаДокумента,
ВозвратТоваровОтПокупателя.Контрагент,
NULL,
NULL,
NULL,
NULL,
ВозвратТоваровОтПокупателя.СкладОрдер,
NULL,
NULL
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ГДЕ
ВозвратТоваровОтПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ВозвратТоваровОтПокупателя.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Сделка ССЫЛКА Документ.ЗаказПокупателя
И (ВозвратТоваровОтПокупателя.Сделка = &ПустойЗаказ
ИЛИ ВозвратТоваровОтПокупателя.Сделка.Ссылка = НЕОПРЕДЕЛЕНО)// проверял в обработке Сообщить(ТипЗнч(дВозврат.Сделка)); выдавала НЕОПРЕДЕЛЕНО , а тут не срабатывает на те возвраты , у которых ТипЗнч(Сделка) = НЕОПРЕДЕЛЕНО
ИТОГИ
СУММА(СуммаВозврата),
СУММА(СуммаРеализации)
ПО
ОБЩИЕ,
Контрагент
25 — 08.02.07 — 10:39
там где у тебя стоит
И РеализацияТоваровУслуг.Проведен = ИСТИНА
убери «= Истина» и попробуй
26 — 08.02.07 — 10:42
(25) Должна быть так, как не буду же я реализации выводить непроведенными, по последнему
27 — 08.02.07 — 10:44
все этот вопрос закрыл перевыбором «пустого» дока, хотя не понятно, как там вообще неопределено затесалось
28 — 08.02.07 — 10:45
(27) вернее не как оно там оказалось, а почему не реагировало на поиск по «неопределено»
29 — 08.02.07 — 10:45
помоему ты не понял
замени
И РеализацияТоваровУслуг.Проведен = ИСТИНА
на просто
И РеализацияТоваровУслуг.Проведен
30 — 08.02.07 — 10:53
(29) ИМХО никакой разницы, попробовал — ничего, вот ведь какая штука создал копию возврата по одному исследуемому контрагенту, в обработке дает тип ДокументСсылка.ЗаказПокупателя а в отчет где условие на пустой заказ не выводится
31 — 08.02.07 — 11:01
проверяй по частям
возми ту часть запроса и убери условие на пустую ссылку
добавь условие на контрагента
посмотри что вернет и от этого пляши
32 — 08.02.07 — 11:03
ВЫБРАТЬ
ВозвратТоваровОтПокупателя.Ссылка,
ВозвратТоваровОтПокупателя.Дата,
ВозвратТоваровОтПокупателя.Контрагент,
ВозвратТоваровОтПокупателя.СуммаДокумента
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ГДЕ
ВозвратТоваровОтПокупателя.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Контрагент = &Абдрашитов
И ВозвратТоваровОтПокупателя.Сделка = &ПустойЗаказ
отдельный запрос срабатывает, вообще не пойму — крышу уже срывает ((((
33 — 08.02.07 — 11:06
что то ты его сильно упростил
оставь ВСЕ условия кроме проверки на пустой заказ
DK_L
34 — 08.02.07 — 11:39
(33) Извиняюсь покорнейше, с датой ступил ДатаКон — все работает
В этой статье будут рассмотрены способы проверки на пустое значение в зависимости от типа проверяемого реквизита в запросе 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. Как в запросе проверить заполнение реквизита с составным типом данных
Описание ошибки:
В общем-то откровенно это вопиющей ошибкой не назовешь, но выполнению задачи воспрепятствовало изрядно. Поэтому бросился уточнять, как же в 1С 8 «как в запросе проверить заполнение составной тип данных».
Найденные решения:
Задача была простой — нужно было в запросе выполнять условие при проверке заполнения реквизита документа, который имел составной тип данных, т.е. в реквизите можно было указать разные типы документов. Каковым, к примеру, является реквизит «Сделка» документа «Реализация товаров и услуг» конфигурации 1С: Управление торговлей 8 ред. 10.3.
Был составлен запрос с условием, но условие определенно не хотело работать, данные выводимые в консоли запросов, были неверными. Условие: Реализации.Ссылка.Сделка <> NULL не срабатывало, равно как и Реализации.Ссылка.Сделка <> НЕОПРЕДЕЛЕНО
Поиск решения в интернете подсказал на одной изстраниц обсуждения форума сайта www.forum.mista.ru, что в таком случае слудет дополнительно обратиться к ссылке составного реквизита:
Внимание было обращено на эту мелочь, и приведение текста запроса к виду: Реализации.Ссылка.Сделка.Ссылка <> НЕОПРЕДЕЛЕНО дало положительный рабочий результат.
Оцените, помогло ли Вам предоставленное описание решения ошибки?
© www.azhur-c.ru 2014-2020. Все права защищены. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу.
06-02-2017
Журавлев А.С.
(Сайт www.azhur-c.ru)
0
1С 8.x : Условия сравнения и проверки в Запросах. Отбор не заполненного значения
Как задать отбор по Типу документа?
Как указать условие для отбора не определенного значения?
Как в языке запросов 1С отобрать не заполненное значение?
Какое условие указать в запросе после ключевого слова «ГДЕ», когда нужно сделать отбор по не заполненным полям?
Код 1C v 8.х
Запрос.Текст =
"ВЫБРАТЬ
| усЕдиницыХранения.Ссылка
|ИЗ
| Справочник.усЕдиницыХранения КАК усЕдиницыХранения"
// Пример 1. сравнение с не заполненным булевым значением:
|ГДЕ
| усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны = Ложь
// Пример 2. но если это булево определено, то лучше так: // условие на отрицательное булево:
|ГДЕ
| НЕ усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны
// Пример 3. выборка по условию не заполненного поля, имеющего тип "справочник конкретного типа"
|ГДЕ
| усЕдиницыХранения.АктивнаяОбластьОтбора = ЗНАЧЕНИЕ(Справочник.усОбластиОтбора.ПустаяСсылка)
// Пример 3а. выборка по условию не заполненного поля, имеющего тип "документ конкретного типа"
|ГДЕ
| НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент.ПустаяСсылка)
// Пример 3б. выборка по условию не заполненного поля, имеющего тип "документы разных типов" (составное поле)
|ГДЕ
| (НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент1.ПустаяСсылка)
| ИЛИ НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент2.ПустаяСсылка)
| ИЛИ ...(и т.д. - последовательно перечисляем условия для всех возможных типов этого составного поля))
// Пример 4. или наоборот, если нужно выбрать заполненное значение типа "строка", то поможет условие:
|ГДЕ
| усЕдиницыХранения.Наименование > """"
// Пример 5. если нужно выбрать документы конкретного типа, при составном типе данных, например в регистре "ВыполняемыеЗадания" ресурс "Задание" имеет составной тип, среди значений которого возможен документ "Отбор"
|ГДЕ
| ВЫРАЗИТЬ(РегистрСведенийВыполняемыеЗадания.Задание КАК Документ.Отбор) ССЫЛКА Документ.Отбор
// Пример 5а. Еще аналогичный пример, когда нужно выбрать документы конкретного типа
| ВЫБОР
| КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.ПоступлениеТоваровУслуг) ССЫЛКА Документ.ПоступлениеТоваровУслуг
| ТОГДА ""ПоступлениеТоваровУслуг""
| КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.РеализацияТоваровУслуг) ССЫЛКА Документ.РеализацияТоваровУслуг
| ТОГДА ""РеализацияТоваровУслуг""
| ИНАЧЕ """"
| КОНЕЦ КАК ВидДокумента
// Пример 6. выбор по условию не определенного значения:
|ГДЕ
| СохраненныеНастройки.Пользователь = НЕОПРЕДЕЛЕНО
// Пример 7. выбор по виду движения "Приход" регистра накопления, "Расход" - аналогично):
|ГДЕ
| РегТоварыВРознице.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
// Пример 8. Как в запросе указать, что выполнять запрос не нужно (например, нужно программно в зависимости от какого-то
// условия вернуть пустой результат запроса -
// Запрос.Текст = СтрЗаменить(Запрос.Текст, "ГДЕ Док.Ссылка = &ДокументСсылка", "ГДЕ ЛОЖЬ");).
// Для этого достаточно добавить условие "Где Ложь".
// Кстати, независимо от объема запрашиваемых в выборке данных, такой запрос будет выполнен мгновенно.
|ГДЕ ЛОЖЬ
// Пример 9. Проверка на то, что результат выполнения запроса содержит данные:
Если НЕ Запрос.Выполнить().Пустой() Тогда
// Пример 10. выбор по условию не заполненной даты:
|ГДЕ
| тбСтроки.ДатаОтмены = ДАТАВРЕМЯ(1, 1, 1)
источник
Бывает необходимо получить в запросе пустую ссылку на какой-то объект или выбрать объекты с незаполненным реквизитом, установив отбор по пустой ссылке. Разберем в статье разные варианты получение и отбора по пустой ссылке, а также способы проверки на заполненность. В этой заметке во всех примерах будет устанавливаться отбор или сравнение на пустую ссылку в справочнике и пустую ссылку в документе.
Отбор по пустой ссылке
Для указания пустой ссылки в запросе можно использовать несколько способов:
Пустая ссылка через установить параметр
В примере устанавливаем пустую ссылку с помощью функции запроса УстановитьПараметр.
Запрос = Новый Запрос(" | ... | ГДЕ РеквизитСправочника = &ПустаяСсылкаСправочник | И РеквизитДокумента = &ПустаяСсылкаДокумент)"; Запрос.УстановитьПараметр("ПустаяСсылкаСправочник",Справочники.Номенклатура.ПустаяСсылка()); Запрос.УстановитьПараметр("ПустаяСсылкаДокумент",Документы.ЗаказКлиента.ПустаяСсылка());
Пустая ссылка в запросе
Пустую ссылку можно указать в запросе или в соединении, с помощью команды ЗНАЧЕНИЕ.
Запрос = Новый Запрос(" | ... | ГДЕ РеквизитСправочника = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) | И РеализацияТоваровУслуг.ДокументОснование = ЗНАЧЕНИЕ(Документ.Заказ.ПустаяСсылка)
Отбор объектов с не заполненными ссылками
Иногда в объекте может быть не пустая ссылка, а не заполненное значение в запросе отобрать их можно, с помощью оператора ЕСТЬ NULL.
Запрос = Новый Запрос(" | ... | ГДЕ ТоварыНаСкладах.Регистратор.ДокументОснование.Ссылка ЕСТЬ NULL";
Отбор объектов с заполненными значениями. Обратная ситуация и с ней есть особенности. В этом случае нужно использовать оператор “ЕСТЬ НЕ NULL”, а не ставить НЕ в начало условия.
Запрос = Новый Запрос(" | ... | ГДЕ РеализацияТоваровУслуг.Сделка.Ссылка ЕСТЬ НЕ NULL";
Получение пустого значения в запросе
Получение пустой ссылки в запросе аналогично отбору по пустой ссылке, работает по формуле:
- ЗНАЧЕНИЕ(Справочник.НаименованиеСправочника.ПустаяСсылка)
- ЗНАЧЕНИЕ(Документ.НаименованиеДокумента.ПустаяСсылка)
Запрос.Текст = "ВЫБРАТЬ | ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) КАК ПустаяСсылкаНоменклатура, | ЗНАЧЕНИЕ(Документ.ЗаказКлиента.ПустаяСсылка) КАК ПустаяСсылкаЗаказ, | """" КАК ПустаяСтрока, | 0 КАК Число0, | Истина КАК БулевоИстина, | Ложь КАК БулевоЛожь, |ИЗ | РегистрСведений.Расш1_ТестовыйРегистр КАК Расш1_ТестовыйРегистр |";
Материалы по теме:
- Про пустые значения на ИТС – ссылка
- Больше материалов по программирование на 1с – ссылка
Как в языке запросов 1С отобрать не заполненное значение. Какое условие указать в запросе после ключевого слова «ГДЕ», когда нужно сделать отбор по не заполненным полям?
Есть запрос:
Запрос.Текст = "ВЫБРАТЬ | усЕдиницыХранения.Ссылка |ИЗ | Справочник.усЕдиницыХранения КАК усЕдиницыХранения
Требуется отобрать по условию, что у справочника усЕдиницыХранения реквизит РазрешитьОтборИзРезервнойЗоны пустой
Реквизит РазрешитьОтборИзРезервнойЗоны имеет тип булево
Вариант 1. сравнение с не заполненным булевым значением:
|ГДЕ | усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны = Ложь
Вариант 2. Если это булево определено, то лучше так:
// условие на отрицательное булево значение: |ГДЕ | НЕ усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны
Требуется отобрать по условию, что у справочника усЕдиницыХранения реквизит АктивнаяОбластьОтбора пустой
Реквизит АктивнаяОбластьОтбора имеет тип Справочник.усОбластиОтбора
// Пример 3. выборка по условию не заполненного поля, имеющего тип "справочник конкретного типа" |ГДЕ | усЕдиницыХранения.АктивнаяОбластьОтбора = ЗНАЧЕНИЕ(Справочник.усОбластиОтбора.ПустаяСсылка)
Требуется отобрать по условию, что у регистра сведений НашРегистрСведений реквизит Документ пустой
Реквизит Документ имеет тип Документ.НашДокумент1
// Пример 3а. выборка по условию не заполненного поля, имеющего тип "документ конкретного типа" |ГДЕ | НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент.ПустаяСсылка)
Требуется отобрать по условию, что у регистра сведений НашРегистрСведений реквизит Документ пустой
Реквизит Документ имеет составной тип значения: Документ.НашДокумент1, Документ.НашДокумент2 и т.д.
// Пример 3б. выборка по условию не заполненного поля, имеющего тип "документы разных типов" (составное поле) |ГДЕ | (НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент1.ПустаяСсылка) | ИЛИ НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент2.ПустаяСсылка) | ИЛИ ...(и т.д. - последовательно перечисляем условия для всех возможных типов этого составного поля))
Требуется отобрать по условию, что реквизит не пустой (заполнен хоть чем-то)
Тип значения реквизита — Строка.
// Пример 4. или наоборот, если нужно выбрать заполненное значение типа "строка", то поможет условие: |ГДЕ | усЕдиницыХранения.Наименование > """"
Допустим требуется отобрать данные, при условии, что реквизит Задание регистра сведений ВыполняемыеЗадания содержит какой-либо Документ.Отбор
Реквизит Задание имеет составной тип значения: Документ.Отбор, Документ.Поступление и т.д.
// Пример 5. если нужно выбрать документы конкретного типа, при составном типе данных, например в регистре "ВыполняемыеЗадания" ресурс "Задание" имеет составной тип, среди значений которого возможен документ "Отбор" |ГДЕ | ВЫРАЗИТЬ(РегистрСведенийВыполняемыеЗадания.Задание КАК Документ.Отбор) ССЫЛКА Документ.Отбор
Еще аналогичный пример, когда нужно выбрать документы конкретного типа
// Пример 5а. Еще аналогичный пример, когда нужно выбрать документы конкретного типа | ВЫБОР | КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.ПоступлениеТоваровУслуг) ССЫЛКА Документ.ПоступлениеТоваровУслуг | ТОГДА ""ПоступлениеТоваровУслуг"" | КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.РеализацияТоваровУслуг) ССЫЛКА Документ.РеализацияТоваровУслуг | ТОГДА ""РеализацияТоваровУслуг"" | ИНАЧЕ """" | КОНЕЦ КАК ВидДокумента
Отобрать по условию не определенного значения:
// Пример 6. выбор по условию не определенного значения: |ГДЕ | СохраненныеНастройки.Пользователь = НЕОПРЕДЕЛЕНО
Отобрать по условию, что вид движения — Приход
// Пример 7. выбор по виду движения "Приход" регистра накопления, "Расход" - аналогично): |ГДЕ | РегТоварыВРознице.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
Как в запросе указать, что выполнять запрос не нужно (например, нужно программно, в зависимости от какого-то условия, вернуть пустой результат запроса: Запрос.Текст = СтрЗаменить(Запрос.Текст, «ГДЕ Док.Ссылка = &ДокументСсылка», «ГДЕ ЛОЖЬ»);).
Для этого достаточно добавить условие «Где Ложь». Кстати, независимо от объема запрашиваемых в выборке данных, такой запрос будет выполнен мгновенно.
// Пример 8. Не исполнять запрос: |ГДЕ ЛОЖЬ
Проверка на то, что результат выполнения запроса содержит данные:
// Пример 9. Проверка на то, что результат выполнения запроса содержит данные: Если НЕ Запрос.Выполнить().Пустой() Тогда
Отобрать записи с не заполненной датой (реквизит ДатаОтмены имеет тип Дата)
// Пример 10. выбор по условию не заполненной даты: |ГДЕ | тбСтроки.ДатаОтмены = ДАТАВРЕМЯ(1, 1, 1)
Next Post
-
SQL Server
-
v8
-
Программисту 1C
Установка 1С: Предприятие. Установка 1С:Предприятия 8 в варианте «клиент-сервер» (на SQLServer) (1С)
Вт Май 18 , 2010
Вопрос Как установить 1С: Предприятие в клиент-серверном варианте. Раздел содержит практические рекомендации по решению проблем, возникающих при установке и настройке клиент-серверного варианта 1С:Предприятия 8. При подготовке раздела учтен опыт партнеров и пользователей, которым в процессе установки 1С:Предприятия потребовалась дополнительная настройка различных служб Microsoft Windows. Более подробно с материалом можно ознакомиться […]
В 1С проверка на пустое значение осуществляется специальной функцией. Что бы проверить заполнен ли имеющийся у вас реквизит или переменная следует использовать функцию из глобального контекста ЗначениеЗаполнено(<Значение>).
В 1С 8 значение считается заполненным (не пустым) если оно отличается от значения по умолчанию для данного типа. Например для ссылочного типа значение по умолчанию — это Пустая ссылка (данного справочника, документа и т.п.). Также пустыми являются переменные и реквизиты содержащие значения Null и Неопределено.
1с проверка на пустое значение. Примеры
Пример 1:
Переменная = Справочники.Номенклатура.ПустаяСсылка();
Проверка = ЗначениеЗаполнено(Переменная);
В данном случае переменная Проверка будет содержать значение Ложь. Также функцию ЗначениеЗаполнено(<Значение>). можно использовать напрямую в условиях.
Пример 1.1
Если ЗначениеЗаполнено(Переменная) Тогда
Сообщить("Значение в переменной не является пустым!");
КонецЕсли;
Пример2:
Переменная = Документы.АвансовыйОтчет.НайтиПоНомеру("000000001");
Проверка = ЗначениеЗаполнено(Переменная);
В данном примере, если документ Авансовый отчет с номером 000000001 существует, то в переменной Проверка будет содержаться значение Истина, иначе Ложь.
Использовать функцию ЗначениеЗаполнено нельзя для переменных мутабельных типов, таких как Таблица значений, Дерево значений и т.п. Функция работает для всех конфигураций.
Как же проверить, что в 1с таблица значений пустая? Для этого используется метод Количество(), с его помощью можно проверить сколько строк содержится в таблице значений.
Пример 3. Пусть МояТаблица — таблица значений определенная выше в коде.
Если МояТаблица.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Этим же методом можно определить заполненность дерева значений и выборки результата запроса.
Пример 4. Пусть МоеДерево — дерево значений определенное выше в коде.
Если МоеДерево.Строки.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Как видите, в дереве значений мы проверяем наличие строк первого уровня, если их нет, то дерево пустое.
Пример 5. Пусть Запрос — запрос к базе данных 1С 8, определенный выше.
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество() = 0 Тогда
Возврат Ложь;
Иначе
Выборка.Следующий();
...
На этом описание основных приемов, при помощи которых осуществляется в 1с проверка на пустое значение, закончено. Если вы хотите узнать, как сделать проверку на пустое значение в запросе, прочитайте следующие статьи: Проверка на null в запросе и Проверка на Неопределено в запросе