К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как из 1С передать значение NULL

Как передать NULL из 1С в запрос, SQL-базу и при обмене: параметры запроса, ЗначениеВСтрокуВнутр, внешние источники данных, типичные ошибки и проверка результата.

Во встроенном языке 1С нет прямого литерала NULL, как в SQL: вместо него используется значение Неопределено, пустые ссылки, пустые даты и строки. Однако во встроенном языке запросов NULL — полноценное значение, и его можно получать, сравнивать и передавать. Путаница между этими мирами — главная причина вопросов «как передать NULL из 1С».

На практике задача возникает в четырёх сценариях: передать NULL параметром в запрос 1С, записать NULL во внешнюю SQL-базу через ADO или внешние источники данных, отдать NULL в веб-сервис или HTTP-запрос и корректно обработать NULL, пришедший извне. Каждый сценарий решается своим способом, и универсальной команды «передать NULL» не существует.

Ниже разобраны рабочие приёмы для каждого случая с кодом, ограничениями и способами проверки результата. Примеры ориентированы на управляемые формы и обычное приложение без привязки к конкретной конфигурации.

Чем NULL отличается от Неопределено и пустых значений в 1С

NULL — это отсутствие значения в терминах теории баз данных. В языке запросов 1С NULL появляется, например, при левом соединении, когда подходящей записи не нашлось, или когда реквизит необязательного типа не заполнен на уровне СУБД. Проверка делается только через оператор ЕСТЬ NULL или функцию ЕСТЬNULL() — сравнение = NULL всегда даёт ложь.

Неопределено — значение встроенного языка, означающее «переменной ничего не присвоено». Пустая ссылка (Справочники.Номенклатура.ПустаяСсылка()), пустая дата ('00010101') и пустая строка — это заполненные значения, а не NULL. При записи в базу они сохраняются как вполне конкретные данные.

Ключевое следствие: нельзя «присвоить реквизиту NULL» при обычной записи объекта. Платформа при записи всегда подставляет значение по умолчанию для типа реквизита. NULL в полях типовых таблиц 1С встречается в основном в составных типах и в результатах соединений, а не как результат ручной очистки реквизита.

Как передать NULL параметром в запрос 1С

Самый частый случай — нужно, чтобы параметр запроса трактовался как NULL. Для этого параметру присваивается Неопределено: платформа передаёт его в запрос как NULL, и дальше работают стандартные операторы языка запросов.

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

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

"ВЫБРАТЬ

| Товары.Ссылка

|ИЗ

| Справочник.Товары КАК Товары

|ГДЕ

| Товары.Поставщик = &Поставщик

| ИЛИ &Поставщик ЕСТЬ NULL";

Запрос.УстановитьПараметр("Поставщик", Неопределено);

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

Такой приём удобен для необязательных отборов: если параметр не задан, условие &Поставщик ЕСТЬ NULL делает фильтр неактивным. Учтите, что присвоить параметру NULL «напрямую» нельзя — только через Неопределено. Если присвоить пустую ссылку, сравнение ЕСТЬ NULL вернёт ложь, потому что пустая ссылка — не NULL.

Второй способ — использовать литерал NULL прямо в тексте запроса, например в конструкции ВЫБОР КОГДА ... ТОГДА NULL ИНАЧЕ ... КОНЕЦ или при объединении выборок. Это полезно, когда NULL нужен как результат вычисления, а не как входной параметр.

Как записать NULL во внешнюю SQL-базу через ADO

При интеграции с MS SQL Server через COM-объект ADODB встречается обратная задача: нужно записать в поле внешней таблицы именно NULL, а не пустую строку или дату по умолчанию. Передача строки "" или Неопределено в текст команды приведёт к ошибке типов или к записи пустого значения.

Надёжный путь — использовать параметризованную команду ADODB.Command и присваивать параметру значение Null, доступное через COM-контекст. Прямое присвоение Неопределено параметру ADO в большинстве случаев также интерпретируется как NULL, но поведение зависит от версии провайдера, поэтому результат нужно проверять запросом к целевой таблице.

Команда = Новый COMОбъект("ADODB.Command");

Команда.ActiveConnection = Соединение;

Команда.CommandText =

"UPDATE Контрагенты SET ИНН = ? WHERE Код = ?";

ПарамИНН = Команда.CreateParameter("ИНН", 200, 1, 20);

ПарамИНН.Value = Неопределено; // будет передан NULL

Команда.Parameters.Append(ПарамИНН);

ПарамКод = Команда.CreateParameter("Код", 200, 1, 9);

ПарамКод.Value = КодКонтрагента;

Команда.Parameters.Append(ПарамКод);

Команда.Execute();

Альтернатива — сформировать SQL-текст с явным литералом NULL в нужной позиции: "UPDATE ... SET ИНН = NULL WHERE ...". Это проще, но требует аккуратной подстановки остальных значений, чтобы не допустить SQL-инъекций при конкатенации строк из пользовательского ввода.

Передача NULL через внешние источники данных

Механизм внешних источников данных (ВИД) позволяет работать с таблицами MS SQL и других СУБД почти как с объектами 1С. При записи через ВИД возникает нюанс: полю внешней таблицы нельзя присвоить Неопределено — платформа выдаст ошибку несоответствия типов.

Чтобы записать NULL, поле должно допускать NULL на стороне СУБД, а в 1С ему присваивается пустое значение соответствующего типа либо значение не записывается вовсе при вставке через SQL-запрос к источнику. Наиболее предсказуемый вариант — выполнять вставку и обновление произвольными запросами к внешнему источнику с явным NULL в тексте, а не через объектную модель ВИД.

При чтении из внешнего источника NULL приходит в 1С как Неопределено, и дальше его можно передать параметром во внутренний запрос или обработать функцией ЕСТЬNULL() уже в тексте запроса к ВИД.

Как передать NULL в JSON, XML и веб-сервисы

При обмене через HTTP или веб-сервисы NULL соответствует литерал null в JSON и отсутствующему либо пустому элементу в XML. В 1С для этого используется объектная модель JSON: если при записи через ЗаписьJSON значение свойства равно Неопределено, с настройками по умолчанию платформа сериализует его как null.

Запись = Новый ЗаписьJSON;

Запись.УстановитьСтроку();

Запись.ЗаписатьНачалоОбъекта();

Запись.ЗаписатьИмяСвойства("Комментарий");

Запись.ЗаписатьЗначение(Неопределено); // "Комментарий": null

Запись.ЗаписатьКонецОбъекта();

ТелоЗапроса = Запись.Закрыть();

При работе через ЗаписатьJSON с коллекциями поведение зависит от настроек сериализации: по умолчанию Неопределено преобразуется в null, но при использовании XDTO-сериализации пустые ссылки и пустые даты могут уйти как пустые строки. Если принимающая сторона строго различает null и "", проверьте фактическое тело запроса перед отправкой — например, выведя строку в журнал или файл на тестовом стенде.

В веб-сервисах на базе XDTO-пакетов NULL передаётся через необязательные свойства: если свойство не установлено, оно не попадает в XML, что эквивалентно отсутствию значения. Явный nil в XML формируется редко и требует настройки пакета.

Порядок действий при передаче NULL
  1. 1
    Определите приёмник: запрос 1С, внешняя SQL-база, JSON или веб-сервис
  2. 2
    Для запроса 1С передайте параметр со значением Неопределено и проверяйте его через ЕСТЬ NULL
  3. 3
    Для ADO используйте параметр команды со значением Неопределено или литерал NULL в тексте SQL
  4. 4
    Для JSON запишите значение Неопределено через ЗаписьJSON и проверьте итоговую строку
  5. 5
    Проверьте результат на стороне приёмника: запросом к таблице или разбором тела запроса

Проверка результата и типичные ошибки

Главный критерий успеха — приёмник получил именно отсутствие значения, а не пустую строку, ноль или дату 01.01.0001. Для SQL-базы проверка делается запросом SELECT ... WHERE Поле IS NULL, для JSON — визуальным разбором тела, для запроса 1С — конструкцией ЕСТЬ NULL в тестовом запросе.

Типичные ошибки
01
Сравнение параметра через = NULL вместо ЕСТЬ NULL — условие никогда не срабатывает, отбор молча возвращает пустой результат
02
Передача пустой ссылки или пустой строки вместо Неопределено — приёмник сохраняет конкретное пустое значение, а не NULL
03
Конкатенация пользовательских данных в SQL-текст ради вставки NULL — риск SQL-инъекции и порчи внешней базы
04
Ожидание, что реквизит объекта 1С можно очистить до NULL обычной записью — платформа подставит значение по умолчанию для типа

Ещё одна ловушка — соединения в запросах. Если NULL пришёл из левого соединения, а затем результат выгружается в таблицу значений, в колонке окажется Неопределено. При последующей передаче этой таблицы как параметра другого запроса значения снова станут NULL, что может неожиданно изменить логику отборов. Явно нормализуйте такие поля через ЕСТЬNULL(Поле, ЗначениеПоУмолчанию), если NULL вам не нужен.

Контрольные точки

Как проверить результат

Параметр запроса 1С
Норма

Условие &Параметр ЕСТЬ NULL срабатывает при Неопределено

Тревожный признак

Условие не срабатывает — передана пустая ссылка или строка

Поле во внешней SQL-таблице
Норма

SELECT ... WHERE Поле IS NULL находит запись

Тревожный признак

Поле содержит пустую строку или 01.01.0001

Тело JSON-запроса
Норма

Свойство сериализовано как null без кавычек

Тревожный признак

Свойство ушло как пустая строка или отсутствует вопреки ожиданию приёмника

FAQ

Можно ли присвоить реквизиту справочника значение NULL?

Нет. При записи объекта платформа всегда сохраняет значение, соответствующее типу реквизита: пустую ссылку, пустую строку, ноль или пустую дату. NULL в таблицах 1С возникает только в составных типах на уровне СУБД и в результатах соединений запросов.

Почему условие «Реквизит = NULL» в запросе не работает?

По стандарту SQL любое сравнение с NULL даёт неопределённый результат, поэтому равенство никогда не выполняется. Используйте оператор ЕСТЬ NULL или функцию ЕСТЬNULL(Реквизит, ЗначениеЗамены) для подмены NULL конкретным значением.

Что приходит в 1С вместо NULL при чтении из внешней базы?

При чтении через ADO NULL обычно превращается в Неопределено, при чтении через внешние источники данных — тоже в Неопределено. Дальше это значение можно передать параметром запроса, где оно снова станет NULL.

Как в JSON передать null, а не пустую строку?

Используйте ЗаписьJSON и передавайте в ЗаписатьЗначение значение Неопределено — оно сериализуется как null. Если применяете ЗаписатьJSON для структуры, убедитесь, что не выполняется преобразование Неопределено в пустую строку до сериализации.

Можно ли передать NULL в COM-соединение с другой базой 1С?

В другой базе 1С действуют те же правила: NULL существует только внутри запросов. Через COM передайте Неопределено как параметр запроса в удалённой базе — внутри её запроса значение будет интерпретировано как NULL.

Итог

Что важно запомнить

NULL в 1С живёт внутри языка запросов: туда его передают через параметр со значением Неопределено или литерал NULL в тексте. Во внешнюю SQL-базу NULL уходит через параметры ADO или явный литерал в SQL, в JSON — через сериализацию Неопределено. Проверяйте результат на стороне приёмника: пустая строка и пустая ссылка — это не NULL.