Присвоить значение null 1c
Здравствуйте.
В продолжение о примитивных типах данных, так недавно рассматривали Работу со строками 1С, а сегодня поговорим о типе NULL.
Тип NULL – литерал, в котором может содержаться лишь одно значение это значение “NULL”.
NULL — Не равен пустой ссылке, пробелу или Типу Неопределено.
Применяется при работе с БД (при соединении таблиц), используется для определения отсутствующего значения при работе с БД.
Значение типа NULL можно получить присвоив переменной это значение:
Переменная =NULL.
Значения типа NULL образуются в результате соединений когда элементу из одной таблицы по условию не находится соответствующего элемента из другой. Значение типа NULL имею специфические особенности:
— сравнение значения NULL с любым другим аргументом всегда возвращает ложь;
Для определения значения NULL используется конструкция ЕСТЬ NULL (is NULL).
Для преобразования типа NULL используется функция ЕСТЬNULL (isNULL).
Для того, чтобы в результате запроса отсечь поля, содержащие значения NULL применяются следующие конструкции: — is not NULL — not is NULL
В запросах рекомендуют всегда использовать функцию ЕСТЬNULL()
Примеры
Пример проверки значения на NULL
Пример функции ЕСТЬNULL ()
Возвращаемое значение функции ЕСТЬNULL () : значение первого параметра, в случае, если первый параметр не содержит значение NULL, противном случае значение второго параметра. Второй параметр будет преобразован к типу первого параметра в случае, если тип первого параметра является строкой или числом.
С уважением 1С Программер.
Оставляйте свои комментарий, мне интересно ваше мнение.
Постовой: Любите путешествовать по выходным, туры в Финляндию из Санкт-Петербурга на автобусе. Вы сможете узнать о прекрасном санкт петербурге и лаппееранте . Рейсы в Лаппеенранту каждый день на микроавтобусе, Индивидуально составленный маршрут, мы доставляем вас от дома к дому
Понятие "пустых" значений
В 1С:Предприятии 8 отсутствует такое понятие как "пустое" значение.
Существует значение Неопределено (типа Неопределено ). Оно применяется в основном как значение по умолчанию реквизитов (а также колонок таблиц значений и т.д.), имеющих составной тип. То есть, если в некотором реквизите могут содержаться значения более чем одного типа, то по умолчанию этот реквизит будет иметь значение Неопределено . Соответственно можно присвоить такому реквизиту значение Неопределено , как значение, обозначающее, отсутствие значения какого-либо другого из доступных типов. Такое значение будет иметь и объявленная переменная модуля пока ей не присвоили какое-либо значение. Заметим, что в объекте ОписаниеТипов фактически присутствует тип Неопределено , если в нем содержится более одного типа, так как если могут храниться значения двух типов, то всегда может быть и значение Неопределено . Таким образом, значение Неопределено обозначает отсутствие значения какого-либо определенного типа.
Существует значение Null (типа Null ). Оно обозначает отсутствие значения в выборке полученной из базы данных. Например, при выполнении левого и правого соединения поля невыбранных записей будут иметь значения Null . Кроме того, значение типа Null будут иметь реквизиты иерархического справочника для элементов-групп, если в метаданных указано, что этот реквизит используется только для элементов не являющихся группами. Аналогично и для элементов, значения Null будут иметь реквизиты доступные только для групп.
Заметим, что и значение Неопределено и значение Null имеют соответствующие типы и используются в специальных (описанных выше) случаях, а не в качестве "пустых" значений каких-либо типов.
Для большинства типов существуют значения по умолчанию, то есть значения, устанавливаемые системой в реквизите (колонке таблицы значений и т.д.) если для него задан соответствующий тип. Например, для числа – пустым значением является 0, для строки – строка, не содержащая ни одного символа, для даты – дата начала отсчета ('00010101').
Для типов ссылок на объекты базы данных существуют значения пустых ссылок. Их можно получить у соответствующих менеджеров вызовом метода ПустаяСсылка() . Именно это значение является значением по умолчанию для соответствующих типов. Заметим, что если реквизит имеет составной тип, включающий тип ссылки на объект базы данных, то данному реквизиту можно присвоить как значение Неопределено , так и значение соответствующей пустой ссылки. Соответственно в этих двух случаях будут храниться два разных значения. Решения, какое значение присваивать зависит от прикладного смысла. Например, если реквизит может иметь значения двух ссылочных типов и, исходя из значений других реквизитов, очевидно, что в нем должно быть значение определенного (одного из этих двух) ссылочного типа, но конкретная ссылка еще не выбрана пользователем, то можно присвоить значение пустой ссылки соответствующего типа. Например, это необходимо для того, чтобы поле ввода позволило бы пользователю ввести значение необходимого типа. А если, исходя из значений других реквизитов, этот реквизит вообще не должен быть заполнен, то тогда ему нужно присвоить значение Неопределено .
В 1С:Предприятии 8 используется понятие "незаполненного значения". Оно применяется для различных сервисных возможностей. Например, у измерений регистров можно установить свойство Запрет незаполненных значений . Тогда система при записи будет автоматически проверять заполнено соответствующее измерение или нет. Так же существуют свойства АвтоОтметкаНезаполненного и свойство АвтоВыборНезаполненного . Они управляют соответственно автоматическим подчеркиванием незаполненного значения и автоматическим началом выбора незаполненного значения.
Во всех случаях для проверки того заполнено значение или нет, используется единый принцип. Значение считается незаполненным, если оно равно значению по умолчанию для своего типа. Соответственно незаполненными значениями будет число 0, строка, не содержащая символов, пустая ссылка на элемент справочника и т.д.
Для строкового типа существует встроенная функция ПустаяСтрока() , однако, не следует считать, что он проверяет, является ли строковое значение значением по умолчанию. Данный метод проверяет, что строка не содержит ни одного значащего символа. При этом строка может содержать незначащие символы, такие как "пробел", "неразрывный пробел" и т.д.
для определения принадлежности элемента справочника определенным папкам, то надо иметь в виду некоторые особенности.
В коде вы можете спокойно брать родителя любого уровня и будете получать просто пустую ссылку, если вышестоящего родителя нет.
- это пустая ссылка.
В запросе всё немного не так.
Родитель корневого элемента будет пустая ссылка, а все вышестоящие родители будут равны NULL.
Такой запросец (имитирует обращение к предку второго уровня коренвого элемента, т.к. предок первого уровня это пустая ссылка)
Что интересно, SQL запрос
тоже вернет NULL.
Хотя, казалось бы, он эквивалентен запросу
который приводит к ошибке.
Дальше еще интереснее.
Вот такой незамысловатый запрос
вернет 1, ну действительно, вроде логично. Хотя операции сравнения с NULL вегда возвращают ЛОЖЬ и необходимо использовать конструкцию ЕСТЬ NULL.
Но с какого-то перепугу
Кстати, если в двух последних запросах В заменить на В ИЕРАРХИИ, то первый запрос так и будет возвращать 1, а второй запрос начнет сыпать ошибку.
Подводя итог: обращение к родителям вышестоящего уровня в запросе может привести к псевдо-NULL значениям, которые ведут себя не совсем как NULL. Хотя для них операция ЕСТЬ NULL будет истина. Чтоб оградить себя от подобных казусов, все обращения к "дедам", "прадедам" и т.д. элементов справочников следует заключать в конструкцию ISNULL.
P.S. Не благодарите за ваше острое желание проверить тексты запросов, содержащих Родитель.Родитель
Специальные предложения
Это ересь, за которую надо сжигать на кострах.
Любая операция сравнения двух значений, в которой участвует хотя бы одно значение NULL, дает результат, аналогичный значению Ложь.
Prog1CZUP31; Восьмой; Evil Beaver; JohnyDeath; c1nil; kuzyara; GusevNA; denis_aka_wolf; Yashazz; kuntashov; Magnastrag; awk; vano-ekt; + 13 – Ответить
(0), Справочник.Родитель.Родитель в запросе, если Справочник.Родитель = NULL не есть тоже самое что NULL.Родитель, хотя бы потому что происходит следующее:
текст запроса вроде
Преобразуется в запрос вида
все это называется "неявное соединение"
(2) vandalsvq, понятно,но что мешало при левом соединении использовать isnull, было бы логично видеть пустую ссылку
Хотя, казалось бы, он эквивалентен запросу
ВЫБРАТЬ
(ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)).Родитель
вернет NULL.
Что интересно, SQL запрос
ВЫБРАТЬ
(ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)).Родитель.Родитель
тоже вернет NULL.
Хотя, казалось бы, он эквивалентен запросу
ВЫБРАТЬ
(ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)).Родитель
вернет NULL.
Хотя, казалось бы, он эквивалентен запросу
И получается, что автор имел ввиду не то что ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) это NULL а то что ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)).Родитель это NULL.
А что касается самой публикации: мне вроде ни разу не приходилось пользоваться конструкцией Родитель.Родитель.Родитель. т.к. я обычно пользуюсь конструкцией:
(5) klinval, (6) vano-ekt,
А если нужно выбрать элементы внутри папки, лежащие ровно на заданной глубине иерархии?
(7) значит у вас неверно выстроена архитектура приложения. Запросы не должны зависеть от данных которые они собирают. Это чуть ли не аксиома.
В идеале запрос надо писать так чтобы не было ни одной идеи смотреть данные.
(10) Xershi, группировка по иерархии не помогает? Настройками вывести на форму чтобы сохранили какие уровни нужны тоже? Или задачу более подробно опишите.
А вообще хорошая архитектура - это сложно, так же сложно как удобная форма, особенно когда речь идет про 1С )))))
(8) Evil Beaver,
полезные вещи вообще редко нравятся (рыбий жир, манная каша, закаливание, гимнстика по утрам)
что еще за "псевдо-NULL"? жесть. Эдгар Кодд должен был перевернуться в гробу со своим третьим правилом реляционных СУБД.
Да, и еще. Напомню, если кто не знает, одно из правил операций с NULL :
Любая операция сравнения с NULL (даже операция «NULL = NULL»), даёт в результате значение «неизвестность» (UNKNOWN). Окончательный результат при этом зависит от полного логического выражения в соответствии с таблицей истинности логических операций. Если сравнение с NULL есть вся логическая операция целиком (а не её часть), то результат её аналогичен FALSE (выражение вида IF <что-то>= NULL THEN ELSE END IF всегда будет приводить к выполнению действия 2).что-то>
NULL – отсутствующие значения.
Не путать с нулевым значением! NULL – это не число, не равно пробелу, пустой ссылке, Неопределено.
NULL – типообразующее значение, т.е. есть тип NULL и единственное значение этого типа.
NULL значения появляются в запросе в следующих ситуациях:
а) Внешнее соединение, при котором не было найдено соответствующей записи в другой таблице (при левом – во второй, при правом – в первой, при полном – в обоих)
б) Обращение к реквизитам элементов для группы и наоборот.
в) NULL в списке полей выборки (ВЫБРАТЬ)
г) Обращение к реквизитам для битой ссылки
ЕСТЬ NULL используется в операторе ВЫБРАТЬ (как бы проверя, что значение это есть пустое ( Значение ЕСТЬ NULL )):
Код 1C v 8.х
еще пример:
Код 1C v 8.х
Функция ЕСТЬNULL (значение, РезультатЕслиNULL) возвращает значение своего первого параметра, в случае если он не равен NULL, и значение второго параметра в противном случае
Является свернутым ВЫБОР…КОНЕЦ, но ЕСТЬNULL предпочтительнее.
Код 1C v 8.х
еще пример:
Код 1C v 8.х
В данном примере получаются все элементы справочника номенклатуры, после чего, для каждой номенклатуры из регистра накопления получаются текущие остатки. Т.к. для номенклатуры, по которой отсутствуют остатки, виртуальная таблица остатков не запись вернет, то в результате соединения в поле "УчетНоменклатурыОстатки.КоличествоОстаток" будут значения NULL для номенклатуры, по которой не было остатков. Для того чтобы вместо значения NULL в результате запроса присутствовало значение 0, мы использовали функцию ЕСТЬNULL(), которая осуществит желаемую замену.
ЕСТЬNULL отличается от ВЫБОР по следующим причинам:
а) При ЕСТЬNULL лучше читается запрос (проще)
б) При ЕСТЬNULL, если проверяется сложное выражение, то работает быстрее, поскольку вычисляется один раз
в) При ЕСТЬNULL выражение замены приводится к типу проверяемого выражения, если оно имеет тип Строка (длина) или Число (разрядность).
Нельзя проверять значения на NULL обычным равенством, потому что в SQL действует трехзначная логика – Истина, Ложь, NULL, и результатом такого сравнения будет UNKNOWN, что в 1С 8.0 аналогично ЛОЖЬ.
NULL <> 0, поэтому при левых внешних соединениях спр. Номенклатура с таблицами остатков, цен, Контрагентов со взаиморасчетами при отсутствии таких записей там будет NULL, который не равен 0. Лучшее решение – ЕСТЬNULL
Похожие FAQ
Еще в этой же категории
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ Нарастающий итог в запросе 23
Необходимо использовать левое соединение таблицы с самой собой. ВЫБРАТЬ Обороты.Период, Обороты.Номенклатура, Обороты.Количество ПОМЕСТИТЬ ВТдвижения ИЗ РегистрНакопления.Обороты КАК Обороты ; //////////////////////////////////////////////// Полезные сведения о языке запросов 1С 8.х 22
В статье приведены полезные приемы при работе с запросами 1С v.8.2, а также сведения, которые не так хорошо известны о языке запросов. Я не стремлюсь дать полное описание языка запросов, а хочу остановиться лишь на некоторых моментах, которые для ко Оператор ПОДОБНО 19
ПОДОБНО - Оператор проверки строки на подобие шаблону. Аналог LIKE в SQL. Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если з Как в запросе получить Вид (тип) Документа? 15
Столкнулся с задачей, нужно было выбрать все документы по выплате и сгруппировать их по типу документа! Перелистав все ЖКК и интернет, понял что простого способа получить Вид документа в запросе нет :( Пришлось сделать так: Запрос = Новый Запрос; Посмотреть все в категории Запросы
NULL – отсутствующие значения.
Не путать с нулевым значением! NULL – это не число, не равно пробелу, пустой ссылке, Неопределено.
NULL – типообразующее значение, т.е. есть тип NULL и единственное значение этого типа.
NULL значения появляются в запросе в следующих ситуациях:
а) Внешнее соединение, при котором не было найдено соответствующей записи в другой таблице (при левом – во второй, при правом – в первой, при полном – в обоих)
б) Обращение к реквизитам элементов для группы и наоборот.
в) NULL в списке полей выборки (ВЫБРАТЬ)
г) Обращение к реквизитам для битой ссылки
ЕСТЬ NULL используется в операторе ВЫБРАТЬ (как бы проверя, что значение это есть пустое ( Значение ЕСТЬ NULL )):
Код 1C v 8.х
еще пример:
Код 1C v 8.х
Функция ЕСТЬNULL (значение, РезультатЕслиNULL) возвращает значение своего первого параметра, в случае если он не равен NULL, и значение второго параметра в противном случае
Является свернутым ВЫБОР…КОНЕЦ, но ЕСТЬNULL предпочтительнее.
Код 1C v 8.х
еще пример:
Код 1C v 8.х
В данном примере получаются все элементы справочника номенклатуры, после чего, для каждой номенклатуры из регистра накопления получаются текущие остатки. Т.к. для номенклатуры, по которой отсутствуют остатки, виртуальная таблица остатков не запись вернет, то в результате соединения в поле "УчетНоменклатурыОстатки.КоличествоОстаток" будут значения NULL для номенклатуры, по которой не было остатков. Для того чтобы вместо значения NULL в результате запроса присутствовало значение 0, мы использовали функцию ЕСТЬNULL(), которая осуществит желаемую замену.
ЕСТЬNULL отличается от ВЫБОР по следующим причинам:
а) При ЕСТЬNULL лучше читается запрос (проще)
б) При ЕСТЬNULL, если проверяется сложное выражение, то работает быстрее, поскольку вычисляется один раз
в) При ЕСТЬNULL выражение замены приводится к типу проверяемого выражения, если оно имеет тип Строка (длина) или Число (разрядность).
Нельзя проверять значения на NULL обычным равенством, потому что в SQL действует трехзначная логика – Истина, Ложь, NULL, и результатом такого сравнения будет UNKNOWN, что в 1С 8.0 аналогично ЛОЖЬ.
NULL <> 0, поэтому при левых внешних соединениях спр. Номенклатура с таблицами остатков, цен, Контрагентов со взаиморасчетами при отсутствии таких записей там будет NULL, который не равен 0. Лучшее решение – ЕСТЬNULL
Похожие FAQ
Еще в этой же категории
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ Нарастающий итог в запросе 23
Необходимо использовать левое соединение таблицы с самой собой. ВЫБРАТЬ Обороты.Период, Обороты.Номенклатура, Обороты.Количество ПОМЕСТИТЬ ВТдвижения ИЗ РегистрНакопления.Обороты КАК Обороты ; //////////////////////////////////////////////// Полезные сведения о языке запросов 1С 8.х 22
В статье приведены полезные приемы при работе с запросами 1С v.8.2, а также сведения, которые не так хорошо известны о языке запросов. Я не стремлюсь дать полное описание языка запросов, а хочу остановиться лишь на некоторых моментах, которые для ко Оператор ПОДОБНО 19
ПОДОБНО - Оператор проверки строки на подобие шаблону. Аналог LIKE в SQL. Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если з Как в запросе получить Вид (тип) Документа? 15
Столкнулся с задачей, нужно было выбрать все документы по выплате и сгруппировать их по типу документа! Перелистав все ЖКК и интернет, понял что простого способа получить Вид документа в запросе нет :( Пришлось сделать так: Запрос = Новый Запрос; Посмотреть все в категории Запросы
Читайте также: