Рассмотрим основные методы использования пустых значений в условиях запросов 1С 8.3.
Проверка на NULL
выполняется с помощью конструкции ЕСТЬ NULL, например:
ВЫБРАТЬ
ВнутренниеЗаказыОстатки.Заказчик,
ВнутренниеЗаказыОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.ВнутренниеЗаказы.Остатки КАК ВнутренниеЗаказыОстатки
ГДЕ
ВнутренниеЗаказыОстатки.КоличествоОстаток ЕСТЬ NULL
Получите 267 видеоуроков по 1С бесплатно:
- Пустая дата в запросе 1С
- Пустая ссылка (значение) в запросе 1С 8.2 и 8.3
- Проверка на пустую строку в запросе 1С
- Пустая дата
- Пустая ссылка в запросе 1С
- Пустая строка
- Как же в запросе 1С сравнить на пустое значение
- 1.Если требуется получить значение пустого типа.
- 2. Если требуется сравнить со значением не составного типа:
- 3. Если требуется проверка составного значения:
- Виды пустых значений
- Работа с пустыми значениями в запросе
- Практические примеры
- Проверка на содержание NULL
- Контроль даты
- Ссылочная проверка
- Проверка строки
- Ещё о битых и обычных линках
- В системе 1С-7.7
- В системе 1С-8.x
- Откуда они берутся
- 1с проверка на пустое значение. Примеры
- Автор 1С
- 21 thoughts on “ Хитрости запросов: сравнения и проверки в запросах 1С. Отбор не заполненного значения. Отбор в запросе документов конкретного типа при составном типе и т.п. ( 1С: 8.1: Язык программирования: Запросы) ”
Пустая дата в запросе 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. Мы работаем в Москве и области.
- 5
- 4
- 3
- 2
- 1
(0 голосов, в среднем: 0 из 5)
Поддержите нас, расскажите друзьям!
СПРОСИТЕ в комментариях!
Запрос1.Текст = «ВЫБРАТЬ
|РемонтныйЛист.Номер,
|РемонтныйЛистМатериалыЗамена.ДатаРемонта,
|РемонтныйЛист.Проведен,
|РемонтныйЛист.Водитель1,
|РемонтныйЛист.Водитель2,
|РемонтныйЛист.Водитель3,
|РемонтныйЛистМатериалыЗамена.КолвоЧасов
|ИЗ
|Документ.РемонтныйЛист.МатериалыЗамена КАК РемонтныйЛистМатериалыЗамена
|ЛЕВОЕ СОЕДИНЕНИЕ Документ.РемонтныйЛист КАК РемонтныйЛист
|ПО РемонтныйЛистМатериалыЗамена.Ссылка = РемонтныйЛист.Ссылка
|ГДЕ
//|РемонтныйЛистМатериалыЗамена.ДатаРемонта >= Значение(«ДатаНач») И РемонтныйЛистМатериалыЗамена.ДатаРемонта = Значение(“ДатаНач”)
ПРАВИЛЬНО
//|РемонтныйЛистМатериалыЗамена.ДатаРемонта >= &ДатаНач
НЕ ПРАВИЛЬНО
//|РемонтныйЛист.Водитель3 НЕ ЗНАЧЕНИЕ (РемонтныйЛист.Водитель3.ПустаяСсылка)
ПРАВИЛЬНО
//|РемонтныйЛист.Водитель3 <> Значение(Справочник.Водители.ПустаяСсылка)
Где «Водители» имя справочника, тип которого имеет реквизит «Водитель3» (возможно сотрудники или физические лица)
Синтаксис не правильный так как я тока учусь:) спасибо большое. но водитель это реквизит не справочника а документа. имеет ли это значение?
а еще подскажите пожалуйста как вот на основании этого же запроса заполнить ячейки в отчете на пересечении водителя и даты необходимо поставить колво часов сколько он был в ремонте
РемонтныйЛист.Водитель3 — Это реквизит
Значение(Справочник.Водители.ПустаяСсылка) — это значение, которое вы передаете что бы наложить отбор, а Справочник.Водители — это ТИП реквизита РемонтныйЛист.Водитель3.
В конечном счете суть условия какая? Отобрать только те позиции, для которых выражение будет равняться ИСТИНА.
С этим я уже разобралась. вы правы были что это реквизит справочника Физические лица.у меня теперь проблема в том что он ругается на РемонтныйЛист.Проведен = Истина
В этой статье будут рассмотрены способы проверки на пустое значение в зависимости от типа проверяемого реквизита в , в том числе пустой ссылки.
Значение NULL возвращается в том случае, когда реквизита попросту нет. Тип в этом случае будет тоже NULL. Например, вы объединяете две таблицы через левое соединение. В том случае, когда для левой таблицы не будет найдено ни одного значения в правой, вернется NULL.
Проверку на данное значение можно осуществить при помощи конструкции «ЕСТЬ NULL» и « ». В первом случае возвращается Истина или Ложь. Во втором случае можно сразу задать другое значение в том случае, когда возвращается NULL.
В приведенном ниже запросе 1С 8.3 будут возвращен список контактных лиц тех партнеров, у кого не задан сегмент.
ВЫБРАТЬ
КонтактныеЛицаПартнеров.Ссылка
ИЗ
Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СегментыПартнеров КАК СегментыПартнеров
ПО КонтактныеЛицаПартнеров.Владелец = СегментыПартнеров.Родитель
ГДЕ
СегментыПартнеров.Ссылка ЕСТЬ NULL
Пустая дата
Проверка значения на пустую дату производится путем сравнения с конструкцией ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0). Пример использования приведен ниже:
Пустая ссылка в запросе 1С
В случае, когда возвращаемый реквизит имеет ссылочный тип, например, это элемент какого-либо справочника, документа и т. п., используется следующая конструкция: ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка).
В приведенном ниже примере запрос выбирает всех партнеров, у которых не указан бизнес-регион.
Чтобы проверить на «ЗначениеЗаполнено» нужно сделать обратное условие:
Пустая строка
Для проверки строковых типов производится сравнение с другим образцом. В данном случае – «».
Приведенный ниже запрос отберет всех партнеров с незаполненным наименованием.
В языке запросов 1С часто требуется проверить: является ли значение пустой ссылкой.
Пустая ссылка — это такое значение ссылочных объектов, когда оно имеет этот же тип, но само значение не выбрано.
На языке программирования 1С данное значение можно получить через менеджеры объекта.
- Перечисления.Пол.ПустаяСсылка(),
- Справочники.Организации.ПустаяСсылка(),
- ПланыСчетов.Хозрасчетный.ПустаяСсылка(),
- ПредопредленноеЗначение(«ПланСчетов.Хозрасчетный.ПустаяСсылка»)
Как же в запросе 1С сравнить на пустое значение
Для этого у нас есть несколько вариантов в зависимости от требований задачи:
1.Если требуется получить значение пустого типа.
Воспользуемся функцией ЗНАЧЕНИЕ()
Выбрать
ЗНАЧЕНИЕ (Перечисление.Пол.ПустаяСсылка)//Без вопроса в единственном числе
Либо через переданный в запрос параметр:
Выбрать
&ПустойПараметрНужногоТипа
2. Если требуется сравнить со значением не составного типа:
Выбрать
Значение(Перечисление.Пол.ПустаяСсылка)<>Значение(Перечисление.Пол.Мужской) как ЭтоБулевоИстина
Выбрать
Выбор когда &ПустойПараметрНужногоТипа ИЛИ Значение(Перечисление.Пол.Мужской) Тогда Истина Иначе Ложь Конец как ЭтоНеЖенскийПол
3. Если требуется проверка составного значения:
В этом случае значение
- может быть неопределенного типа (очищено или ни разу не выбрано)
- пустой ссылкой любого из типов (выбран тип, но не выбрано значение)
- выбранным значением любого из типов (выбрано значение)
В этом случае обычно первые два варианта считаются пустым значением, но пустыми ссылками являются только вторые.
//Мы инициализировали массив заполненных значений и сравнили его с пустым
Выбор когда ЗНАЧЕНИЕ(Значение(Перечисление.Пол.ПустаяСсылка) в (Значение(Перечисление.Пол.Мужской),Значение(Перечисление.Пол.Женский)) ИЛИ Есть NULL Тогда Истина Иначе Ложь конец ЗначениеПустое
//Мы инициализировали массив пустых ссылок и проверили вхождение в него нашего «неизвестного» значения
Выбор когда ЗНАЧЕНИЕ(Значение(Перечисление.Пол.Мужской) в (Значение(Перечисление.Пол.ПустаяСсылка),Значение(Справочник.Контрагенты.ПустаяСсылка)) Тогда Истина Иначе Ложь конец ЗначениеПустое
Также мы можем передать массив параметром
Выбрать Выбор когда ЗНАЧЕНИЕ(Значение(Перечисление.Пол.ПустаяСсылка) в (&МассивВсехПустыхСсылок) Тогда Истина Иначе Ложь конец ЗначениеПустое
Про перечисление в запросе 1С.
В ходе работы с запросами любому программисту приходится так или иначе взаимодействовать с пустыми значениями. Что мы понимаем под пустым значением?
Пустое значение – это или отсутствие значения, или значение по умолчанию для типа данных. С примитивными типами все довольно просто: значением по умолчанию является некое начальное значение, служащее точкой отсчета.
Виды пустых значений
Рассмотрим типы пустых значений, которые могут встретиться или потребоваться в запросе.
- Для типа Число – пустым значением является ноль – 0.
- Для типа Строка – пустая строка – «».
- Для типа Дата – первое января первого года – 01.01.0001 00:00:00. Именно с этой даты ведется отсчет времени в 1С.*
- Для типа Булево – значением по умолчанию, технически, является Ложь, но логически оба значения типа являются заполненными. Поэтому принятие решения о том пустое значение Ложь или нет, основывается на логике конкретного алгоритма.
*Будьте внимательны, вне 1С существуют различные системы счисления дат с разными точками отсчета.
Отсутствующее значение в полном смысле соответствует только типу Null. Этот тип содержит лишь одно значение, которое обозначает отсутствие значения.
Похожий на него тип Неопределено тоже содержит лишь одно значение, но Неопределено означает не отсутствие данных, а лишь невозможность определить значение по умолчанию для типа. Неопределено является значением по умолчанию для составных, в том числе не определенных явно, типов. Например, значение в новой строке таблицы значений в колонке, для которой тип не определен явно.
Со ссылочными типами намного меньше неопределенности. Все ссылочные типы предусматривают пустое значение. Пустое значение — это та же самая ссылка с указанием типа данных, но без уникального идентификатора конкретного значения. Благодаря этому мы можем обращаться с пустой ссылкой как с обычной и применять к ней все предусмотренные платформой методы, работая с ней как с полноценным значением.
Работа с пустыми значениями в запросе
Независимо от того, необходимо ли вам явно ввести в результат запроса пустое значение или сравнить с ним существующие значения, необходимо знать, каким образом описывать пустые значения в запросе.
Типы Число, Строка, Булево описываются в запросе как во встроенном языке:
ВЫБРАТЬ 0 КАК ПримерТипаЧисло, "Привет мир" КАК ПримерТипаСтрока, Истина КАК ПримерТипаБулево
Неопределено, являясь по существу примитивным типом, описывается аналогично:
Выбрать Партии.Период Из РегистрНакопления.Партии Как Партии Где Остатки.ДокументПартии = Неопределено
Пустые ссылочные значения определяются немного сложнее. У всех ссылочных объектов предусмотрено предопределенное служебное значение ПустаяСсылка. Благодаря этому есть возможность единым способом выбрать пустую ссылку – через функцию Значение:
Выбрать Значение (Справочник.Номенклатура.ПустаяСсылка) Как Пустая Номенклатура
Возможности работы со значениями типа Null несколько богаче. Как и другие примитивные типы, Null описывается так же, как во встроенном языке. Помимо этого, предусмотрены специальный оператор Есть Null и функция ЕстьNull.
- Оператор Есть Null позволяет создать логическое выражение сравнивающее выбранное значение со значением Null.
- Функция ЕстьNull возвращает первый аргумент, если он не равен Null, и второй аргумент в обратном случае.
Выражения, определяющие пустые значения, можно использовать в любых разделах запроса поддерживающих выражения. Например, вы можете добавить пустую ссылку в секцию Выбрать или проверку на Null в Условие.
Практические примеры
С использованием функции Значение
Выбрать Товары.Ссылка Как Номенклатура, Товары.Ссылка = Значение(Справочник.Номенклатура.ПустаяСсылка) Как ЭтаСсылкаПустая Из втТовары Как втТовары
С использованием оператора Есть Null
Выбрать Товары.Ссылка Как Номенклатура, Товары.Ссылка Есть Null Как ЭтаСсылкаПустая Из втТовары Как втТовары
Null при левом или полном соединении
Проверка на Null
Пример демонстрирует частую практическую ситуацию, когда при левом соединении, для первой таблицы не находится соответствия во второй. В этом случае все поля второй таблицы будут равны Null.
Выбрать втТовары.Ссылка Как Номенклатура, Остатки.КоличествоОстаток Как Количество, Остатки.КоличествоОстаток Есть Null Как НетОстатка Из втТовары как втТовары Левое Соединение РегистрНакопления.ТоварыНаСкладах.Остатки Как Остатки По втТовары.Ссылка = Остатки.Номенклатура
Модификация предыдущего запроса для демонстрации часто встречающейся методики по получению каких-либо значений по умолчанию, взамен отсутствующих. В данном примере с использованием функции ЕстьNull, производится замена отсутствующего значения остатка, на логически правильное 0.
Выбрать втТовары.Ссылка Как Номенклатура, ЕстьNull (Остатки.КоличествоОстаток, 0) Как Количество Из втТовары как втТовары Левое Соединение РегистрНакопления.ТоварыНаСкладах.Остатки Как Остатки По втТовары.Ссылка = Остатки.Номенклатура
В рамках этой статьи мы рассмотрели различные типы пустых значений и их свойства, изучили способы определения различных типов пустых значений в запросах, а в практической части убедились в простоте применения рассмотренного материала.
Средства определения пустых ссылок, дат или строк. Рассмотрим, как проверить на пустую ссылку, дату или строку в запросе 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
Покупатели.Link
ИЗ
Справочник.Покупатели КАК Покупатели
ГДЕ
Покупатели.Код = «»
Ещё о битых и обычных линках
«Битой» считается ссылка (Link, англ.), ведущая (указывающая) на несуществующий элемент. Под несуществующим понимают такой, которого нет в базе данных. Полезно о таких линках знать хотя бы для того, чтобы получать от системы уведомления в более понятной форме. Да и запись, удаление и открытие нереальных объектов не имеет смысла.
Платформы 1С не обладают внутренними средствами чтобы их отсечь. Ещё нужно понимать, что вне «битых» в системе живут специальные «пустые линки», которые следует различать одни от других.
Это можно выяснить и без запросов к базе данных:
В системе 1С-7.7
Для «битой» — методом Link.Selected() и функцией ПустоеЗначение() возвращается ноль. Для «пустой» — в первом случае ноль, а во втором — единица. Для «нормальной» — единица и ноль. Получается, в 1С-7.7 «битая» — не является несуществующим значением, которое не считается выбранным.
В системе 1С-8.x
Всё по-другому — в обоих случаях (для «битых» и «обычных») метод возвращает Ложь, а функция — Истину. Решение такое: Для «битой» методом Ссылка.ПолучитьОбъект() возвращается функция «Неопределено». Для «пустой» — выбрасывается «Ошибка метода контекста». Для «нормальной» — возвращается значение согласно документации; Выходит, в 1С-8.х «битая» — не будет несуществующей функцией ссылочного типа, которая возвращает Неопределённое значение объекта.
Откуда они берутся
При переходе по несуществующему адресу битой линки пользователю в лучшем случае показано уведомление о том, что объект не найден, в худшем — изображение страницы сервера. Наихудшей их чертой является скрытость. Отсюда — сложность в проверке их корректности. Во время работы с конфигурацией она постоянно дорабатывается, обновляется. Какие-то объекты подлежат удалению, изменяется структура. А ссылка на удалённый элемент остаётся в конструкциях и алгоритмах. Таким образом, несуществующие адреса остаются в системе после удаления самого элемента (вместе с адресом).
В сегодняшней публикации было рассмотрено специальное построение запросов. Приведены примеры конструкций. Это пригодится вам в работе при поиске пустых значений.
В 1С проверка на пустое значение осуществляется специальной функцией. Что бы проверить заполнен ли имеющийся у вас реквизит или переменная следует использовать функцию из глобального контекста ЗначениеЗаполнено( ) .
В 1С 8 значение считается заполненным (не пустым) если оно отличается от значения по умолчанию для данного типа. Например для ссылочного типа значение по умолчанию — это Пустая ссылка (данного справочника, документа и т.п.). Также пустыми являются переменные и реквизиты содержащие значения Null и Неопределено .
1с проверка на пустое значение. Примеры
Переменная = Справочники.Номенклатура.ПустаяСсылка(); Проверка = ЗначениеЗаполнено(Переменная);
В данном случае переменная Проверка будет содержать значение Ложь . Также функцию ЗначениеЗаполнено( ) . можно использовать напрямую в условиях.
Если ЗначениеЗаполнено(Переменная) Тогда Сообщить("Значение в переменной не является пустым!"); КонецЕсли;
Переменная = Документы.АвансовыйОтчет.НайтиПоНомеру("000000001"); Проверка = ЗначениеЗаполнено(Переменная);
В данном примере, если документ Авансовый отчет с номером 000000001 существует, то в переменной Проверка будет содержаться значение Истина , иначе Ложь .
Использовать функцию ЗначениеЗаполнено нельзя для переменных мутабельных типов, таких как Таблица значений , Дерево значений и т.п. Функция работает для всех конфигураций.
Как же проверить, что в 1с таблица значений пустая? Для этого используется метод Количество() , с его помощью можно проверить сколько строк содержится в таблице значений.
Пример 3. Пусть МояТаблица — таблица значений определенная выше в коде.
Если МояТаблица.Количество() = 0 Тогда Возврат; КонецЕсли;
Этим же методом можно определить заполненность дерева значений и выборки результата запроса.
Пример 4. Пусть МоеДерево — дерево значений определенное выше в коде.
Если МоеДерево.Строки.Количество() = 0 Тогда Возврат; КонецЕсли;
Как видите, в дереве значений мы проверяем наличие строк первого уровня, если их нет, то дерево пустое.
Пример 5. Пусть Запрос — запрос к базе данных 1С 8, определенный выше.
Как в языке запросов 1С отобрать не заполненное значение. Какое условие указать в запросе после ключевого слова «ГДЕ», когда нужно сделать отбор по не заполненным полям?
Есть запрос:
Требуется отобрать по условию, что у справочника усЕдиницыХранения реквизит РазрешитьОтборИзРезервнойЗоны пустой
Реквизит РазрешитьОтборИзРезервнойЗоны имеет тип булево
Вариант 1. сравнение с не заполненным булевым значением:
Вариант 2. Если это булево определено, то лучше так:
Требуется отобрать по условию, что у справочника усЕдиницыХранения реквизит АктивнаяОбластьОтбора пустой
Реквизит АктивнаяОбластьОтбора имеет тип Справочник.усОбластиОтбора
Требуется отобрать по условию, что у регистра сведений НашРегистрСведений реквизит Документ пустой
Реквизит Документ имеет тип Документ.НашДокумент1
Требуется отобрать по условию, что у регистра сведений НашРегистрСведений реквизит Документ пустой
Реквизит Документ имеет составной тип значения: Документ.НашДокумент1, Документ.НашДокумент2 и т.д.
Требуется отобрать по условию, что реквизит не пустой (заполнен хоть чем-то)
Тип значения реквизита — Строка.
Допустим требуется отобрать данные, при условии, что реквизит Задание регистра сведений ВыполняемыеЗадания содержит какой-либо Документ.Отбор
Реквизит Задание имеет составной тип значения: Документ.Отбор, Документ.Поступление и т.д.
Еще аналогичный пример, когда нужно выбрать документы конкретного типа
Отобрать по условию не определенного значения:
Отобрать по условию, что вид движения — Приход
Как в запросе указать, что выполнять запрос не нужно (например, нужно программно, в зависимости от какого-то условия, вернуть пустой результат запроса: Запрос.Текст = СтрЗаменить(Запрос.Текст, «ГДЕ Док.Ссылка = &ДокументСсылка», «ГДЕ ЛОЖЬ»);).
Для этого достаточно добавить условие «Где Ложь». Кстати, независимо от объема запрашиваемых в выборке данных, такой запрос будет выполнен мгновенно.
Проверка на то, что результат выполнения запроса содержит данные:
Отобрать записи с не заполненной датой (реквизит ДатаОтмены имеет тип Дата)
Автор 1С
21 thoughts on “ Хитрости запросов: сравнения и проверки в запросах 1С. Отбор не заполненного значения. Отбор в запросе документов конкретного типа при составном типе и т.п. ( 1С: 8.1: Язык программирования: Запросы) ”
Если проверка на не заполненную строку (недавно у меня была задача отсечь) поэтому условие сработало
|ГДЕ усЕдиницыХранения.АктивнаяОбластьОтбора > «»»»
Спасибо, Евгений. Добавляю это предложение в текст статьи
Если тип значения не известен, например Реквизит составного типа, или имеет тип Любая Ссылка?
Составной тип можно проверить через конкатенацию: ИЛИ, ИЛИ, ИЛИ… перечисляя по очереди внутри конструкции ЗНАЧЕНИЕ(…) все допустимые типы. Про любую ссылку — надо подумать. Есть идеи?
А еще можно использовать конструкцию вида
НашРегистрСведений.Документ В(ЗНАЧЕНИЕ(Документ.НашДокумент1.ПустаяСсылка), ЗНАЧЕНИЕ(Документ.НашДокумент2.ПустаяСсылка), …)
Привет из будущего 🙂
Т.е. указываем
|ГДЕ
| усЕдиницыХранения.АктивнаяОбластьОтбора = ЗНАЧЕНИЕ(Справочник.усОбластиОтбора.ПустаяСсылка)
| ИЛИ усЕдиницыХранения.АктивнаяОбластьОтбора = ЗНАЧЕНИЕ(Справочник.усДругойСправочник.ПустаяСсылка)»;
А как указать, если тип в этом реквизите совсем не задан (не выбирался, и равен Неопределено)? ЕСТЬ NULL не прокатывает..
Если в операции «ГДЕ» нужно каким-то определенным образом учесть не определенное значение, то (в зависимости от смысла ограничения) можно использовать что-то вроде такого:
|ГДЕ
| ВЫБОР
| КОГДА &ОбластьПодпитки = НЕОПРЕДЕЛЕНО
| ТОГДА ИСТИНА
| ИНАЧЕ тбПолучатели.ОбластьПодпитки = &ОбластьПодпитки
| КОНЕЦ
или такого:
|ГДЕ
| И СохраненныеНастройки.Пользователь = НЕОПРЕДЕЛЕНО
Т.е. условие зависит от того, что именно все-таки нужно.
Добавлен Пример 5. если нужно выбрать документы конкретного типа, при составном типе данных, например в регистре «ВыполняемыеЗадания» ресурс «Задание» имеет составной тип, среди значений которого возможен документ «Отбор»
Я использовал такое выражение, для выборки строк, где не заполнен реквизит Документ. Этот реквизит составного типа.
ГДЕ
(НЕ РегистрСведений.ИмяРегистра.Документ ЕСТЬ NULL)
Baduin, для проверки на незаполнненное поле типа «документ» подходят примеры 3а и 3б, т.е. Вы ошибаетесь, условие «ЕСТЬ NULL» не подходит для проверки на то, что значение просто не заполнено.
«ЕСТЬ NULL» подойдет только в двух случаях:
1. Этим условием проверяется наличие битой ссылки (см. http://www.1c-h.ru/?p=935)
2. Значением NULL заполняются поля присоединяемых в запросе таблиц, когда по условию соединения запроса отсутствуют подходящие значения.
Вероятно, у вас выполняется соединение в запросе? Что-то вроде этого:
…
РегистрСведений.Документ,
…
ИЗ …
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИмяРегистра КАК РегистрСведений
Суть «ЕСТЬ NULL» в том, что берутся строки, в которых по условию соединения нет подходящего Документа
Т.е. предположим, есть две таблицы:
Параметр1 |
Х |
У |
Z |
И есть Таблица2:
Параметр2 | Документ |
Х | Док1 |
Z | Док2 |
При левом присоединении Таблицы2 к Таблице1 по условию
Параметр1 = Параметр2
Параметр | Документ |
Х | Док1 |
У | NULL |
Z | Док2 |
Т.е., как видите, для значения «У» Таблицы 1 не нашлось подходящего Документа. Теперь если выбрать из этой результирующей таблицы строки по условию, что Документ ЕСТЬ NULL, то получим таблицу:
Параметр | Документ |
У | NULL |
А если выбрать по условию НЕ Документ ЕСТЬ NULL, то получим таблицу:
Параметр | Документ |
Х | Док1 |
Z | Док2 |
Таким образом, причина попадания или непопадания в результат запроса конкретной строки не в том, что документ не заполнен в исходной таблице, а в том, что не подобралось документа по условию соединения. Т.е., как видите, это несколько другая задача.
А зачем используется такая конструкция:
ВЫРАЗИТЬ(РегистрСведенийВыполняемыеЗадания.Задание КАК Документ.Отбор) ССЫЛКА Документ.Отбор
Я всегда пользовался:
РегистрСведенийВыполняемыеЗадания.Задание ССЫЛКА Документ.Отбор
И это великолепно работает. ВЫРАЗИТЬ тут в лучшем случае — не будет обрабатываться. В Худшем — создаст дополнительную ненужную нагрузку.
Или от меня ускользнула некая непостижимая моему разумению житейская мудрость?
«ВЫРАЗИТЬ» используется во всех случаях, когда исходное значение может оказаться не того типа, который нужен, например, в указанном примере «Задание» — измерение составного типа и может содержать не только документы «Отбор», но и другие виды документов.
См. так же http://www.1c-h.ru/?p=1553 или http://www.1c-h.ru/?p=89 — другие примеры применения(и обоснвания применения) метода «ВЫРАЗИТЬ».
так а для чего вы тогда где поставили вы и сравниваете тип вашего документа с отбором,а тут вы сначала приводите к значению отбора ,пытаетесь а потом сравниваете..
Решал вопрос с незаполненными полями в регистрах вот таким образом :
Работает отлично, побочных эфектов пока не наблюдаю 🙂
Спасибо за комментарий!
Один минус все же есть — в необходимости самой передачи параметра 🙂
Может быть полезной бесплатная он-лайн консоль изучения запросов: http://www.its22.ru/zaprosi-1s-8
Не сочтите за рекламу. Спасибо.
Пример 3б. выборка по условию не заполненного поля, имеющего тип «документы разных типов» (составное поле)
|ГДЕ
| (НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент1.ПустаяСсылка)
| ИЛИ НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент2.ПустаяСсылка)
| ИЛИ …(и т.д. — последовательно перечисляем условия для всех возможных типов этого составного поля))
———————————————————————————————————————————————-
За такой быдлокод сразу кол в дневник и линейкой по пальцам….
Каждое ИЛИ создает неявное соединение таблиц. Дядя гугл детальней расскажет вам о данном косяке запросов в 1С.
Альтернатива например:
|ГДЕ
| НашРегистрСведений.Документ В (ЗНАЧЕНИЕ(Документ.НашДокумент1.ПустаяСсылка), ЗНАЧЕНИЕ(Документ.НашДокумент2.ПустаяСсылка) , и т.д.)