В практике интеграции 1С:Предприятие с внешними системами через HTTP-запросы или REST API часто возникает задача передачи пустых ссылок — например, когда поле объекта не заполнено, но его необходимо отправить в теле запроса. Неправильная обработка таких случаев приводит к ошибкам парсинга, падению интеграций или некорректному формированию JSON/XML. Эта статья разбирает три проверенных способа передачи пустых ссылок в 1С, включая нюансы для платформ 8.3.20+ и типичные ошибки разработчиков.

Проблема усложняется тем, что стандартные механизмы ЗаписьJSON и ЗаписьXML по-разному интерпретируют Неопределено, NULL и пустые строки. Например, при сериализации объекта с незаполненным реквизитом СсылкаНаДокумент результат может варьироваться от пропуска поля до генерации невалидного JSON. Мы проанализируем каждый случай на примерах кода и покажем, как гарантированно передать "пустоту" так, чтобы внешняя система ее корректно обработала.

1. Что такое "пустая ссылка" в контексте 1С?

В 1С:Предприятие под пустой ссылкой понимают одно из трех состояний:

  • 🔹 Неопределено — значение не инициализировано (типично для необязательных реквизитов новых объектов).
  • 🔹 NULL — явное указание отсутствия значения (например, после вызова УстановитьПустоеЗначение()).
  • 🔹 Пустая строка"", часто используется в API для обозначения "нет данных".

Ключевое отличие: Неопределено и NULL — это разные типы данных в 1С. При сериализации в JSON через ЗаписьJSON:

  • 📌 Неопределено — поле пропускается в выходном JSON.
  • 📌 NULL — поле добавляется со значением null.
  • 📌 Пустая строка — поле добавляется как "".
📊 Какой тип "пустоты" вы чаще передаете в API?
Неопределено
NULL
Пустая строка
Зависит от ситуации

Внешние системы (например, Bitrix24, MoySklad или кастомизированные бэкенды) могут по-разному интерпретировать эти состояния. Например, некоторые API требуют явного null для сброса значения, а другие — ожидают пустую строку. Перед интеграцией уточните требования документации внешней системы!

2. Способ 1: Явная передача NULL через УстановитьПустоеЗначение()

Самый универсальный метод — использовать метод УстановитьПустоеЗначение(). Он преобразует значение в NULL, который при сериализации в JSON становится null. Пример:

ДанныеДляОтправки = Новый Структура();

ДанныеДляОтправки.Вставить("СсылкаНаДокумент");

// Устанавливаем NULL для поля

ДанныеДляОтправки.СсылкаНаДокумент = Неопределено;

УстановитьПустоеЗначение(ДанныеДляОтправки.СсылкаНаДокумент);

// Сериализуем в JSON

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

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

ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);

РезультатJSON = ЗаписьJSON.Закрыть();

Результат:

{

"СсылкаНаДокумент": null

}

Явно вызван метод УстановитьПустоеЗначение()|Поле добавлено в структуру/массив|Используется ЗаписьJSON с настройкой УстановитьСтроку()|Проверена совместимость с внешним API (принимает ли null)

-->

⚠️ Внимание: В версиях платформы 1С:Предприятие 8.3.18 и ниже метод УстановитьПустоеЗначение() может некорректно работать с динамическими списками. В таких случаях используйте обходной путь через ТипЗначенияРеквизита:

ТипРеквизита = ТипЗначенияРеквизита(ДанныеДляОтправки, "СсылкаНаДокумент");

ДанныеДляОтправки.СсылкаНаДокумент = ТипРеквизита.ПустоеЗначение();

3. Способ 2: Передача пустой строки для совместимости

Некоторые API (например, старые версии OData или SOAP-сервисы) не поддерживают null и требуют передачи пустой строки. В 1С это реализуется простой подменой:

Если ЗначениеЗаполнено(ДанныеДляОтправки.СсылкаНаДокумент) Тогда

ДанныеДляОтправки.СсылкаНаДокумент = ДанныеДляОтправки.СсылкаНаДокумент.УникальныйИдентификатор();

Иначе

ДанныеДляОтправки.СсылкаНаДокумент = "";

КонецЕсли;

При сериализации получим:

{

"СсылкаНаДокумент": ""

}

Способ Результат в JSON Подходит для API Нюансы
УстановитьПустоеЗначение() null REST, GraphQL, современные системы Требует 1С 8.3.19+ для стабильной работы
Пустая строка "" "" SOAP, устаревшие системы Может конфликтовать с валидацией на стороне сервера
Пропуск поля Поле отсутствует API с необязательными полями Не подходит, если поле обязательно для схемы
ДанныеДляОтправки.СсылкаНаДокумент = "00000000-0000-0000-0000-000000000000";

-->

4. Способ 3: Кастомизация сериализации через обработчики

Для сложных случаев (например, когда нужно передавать null для одних полей и пустые строки для других) используйте кастомизированную сериализацию. Создайте процедуру, которая будет обрабатывать каждое поле индивидуально:

Процедура ПодготовитьДанныеДляAPI(Данные)

Для Каждого Поле Из Данные Цикл

Если ТипЗнч(Данные[Поле.Ключ]) = Тип("Строка") И ЗначениеЗаполнено(Данные[Поле.Ключ]) = Ложь Тогда

Данные[Поле.Ключ] = ""; // или NULL через УстановитьПустоеЗначение()

ИначеЕсли ТипЗнч(Данные[Поле.Ключ]) = Тип("Ссылка") И Данные[Поле.Ключ].Пустая() Тогда

УстановитьПустоеЗначение(Данные[Поле.Ключ]);

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Этот подход позволяет:

  • 🎯 Гибко настраивать формат "пустоты" для каждого поля.
  • 🎯 Обрабатывать вложенные структуры и массивы.
  • 🎯 Добавлять логику валидации перед отправкой.
Пример обработки вложенных объектов

Процедура ОбработатьВложенныеДанные(Данные)

Если ТипЗнч(Данные) = Тип("Структура") Тогда

Для Каждого Ключ Из Данные Цикл

Если ТипЗнч(Данные[Ключ]) = Тип("Структура") Или ТипЗнч(Данные[Ключ]) = Тип("Массив") Тогда

ОбработатьВложенныеДанные(Данные[Ключ]);

Иначе

Если Данные[Ключ] = Неопределено Тогда

Данные[Ключ] = "";

КонецЕсли;

КонецЕсли;

КонецЦикла;

ИначеЕсли ТипЗнч(Данные) = Тип("Массив") Тогда

Для Инд = 0 По Данные.ВГраница() Цикл

ОбработатьВложенныеДанные(Данные[Инд]);

КонецЦикла;

КонецЕсли;

КонецПроцедуры

5. Типичные ошибки и как их избежать

Ошибка №1: Игнорирование типа данных. Если поле в структуре объявлено как СсылкаНаСправочник.Контрагенты, а вы передаете пустую строку, сериализатор может выдать ошибку несоответствия типов. Всегда проверяйте тип:

Если ТипЗнч(Данные.Контрагент) <> Тип("СсылкаНаСправочник.Контрагенты") Тогда

ВызватьИсключение "Некорректный тип данных для поля 'Контрагент'";

КонецЕсли;

Ошибка №2: Неучет версий платформы. В 1С 8.3.15 и ниже метод ЗаписатьJSON() не поддерживает NULL для динамических свойств. Обходной путь:

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

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

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

Для Каждого Ключ Из Данные Цикл

Если Данные[Ключ] = Неопределено Тогда

ЗаписьJSON.ЗаписатьИмяСвойства(Ключ);

ЗаписьJSON.ЗаписатьNull();

Иначе

ЗаписатьJSON(ЗаписьJSON, Ключ, Данные[Ключ]);

КонецЕсли;

КонецЦикла;

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

💡

Всегда тестируйте сериализацию на реальных данных! Даже если код работает с пустыми ссылками в тестовом режиме, при интеграции с внешним API могут всплыть скрытые ошибки, связанные с кодировками или форматами данных.

⚠️ Внимание: При работе с OData-сервисами (например, в 1С:ERP или 1С:УТ) пустые ссылки могут передаваться в формате odata.null. Уточните этот момент в документации конкретного сервиса!

6. Практический пример: Интеграция с Bitrix24

Рассмотрим реальный кейс отправки данных о сделке в Bitrix24, где поле COMPANY_ID (ссылка на компанию) может быть пустым. Требования API:

  • 📌 Если компания не указана — передавать null.
  • 📌 Если компания удалена — передавать 0.

Решение на 1С:

ДанныеДляBitrix = Новый Структура();

ДанныеДляBitrix.Вставить("TITLE", "Новая сделка");

ДанныеДляBitrix.Вставить("COMPANY_ID");

// Логика заполнения

Если Сделка.Контрагент.Пустая() Тогда

УстановитьПустоеЗначение(ДанныеДляBitrix.COMPANY_ID);

ИначеЕсли Сделка.Контрагент.ЭтоГруппа() Тогда

ДанныеДляBitrix.COMPANY_ID = 0; // Для удаленных/групповых элементов

Иначе

ДанныеДляBitrix.COMPANY_ID = Сделка.Контрагент.УникальныйИдентификатор();

КонецЕсли;

Результат для пустой ссылки:

{

"TITLE": "Новая сделка",

"COMPANY_ID": null

}

💡

Для отладки интеграций с Bitrix24 используйте постман или инструмент 1С:Линк — они позволяют увидеть "сырой" запрос до отправки и ответ сервера.

7. Отладка и диагностика ошибок

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

  1. 🔍 Проверьте лог запросов на стороне 1С (используйте ПротоколHTTP или Fiddler).
  2. 🔍 Сравните полученный JSON/XML с требованиями API (например, через JSONLint).
  3. 🔍 Убедитесь, что кодировка запроса — UTF-8 (в 1С настройте ЗаголовкиHTTP.Вставить("Content-Type", "application/json; charset=utf-8")).

Типичные сообщения об ошибках и их причины:

Ошибка Причина Решение
400 Bad Request: Invalid JSON Некорректный формат null (например, передается строка "null" вместо JSON-значения). Используйте УстановитьПустоеЗначение() вместо ручного задания строки.
500 Internal Server Error Сервер не ожидает null для обязательного поля. Замените null на пустую строку или значение по умолчанию.
Поле 'field' не может быть пустым API требует явного значения (даже если логически поле пустое). Передайте заведомо несуществующий идентификатор (например, "00000000-0000-0000-0000-000000000000").

FAQ: Частые вопросы по передаче пустых ссылок

Можно ли передать пустую ссылку без сериализации в JSON?

Да, если вы используете SOAP или XML-веб-сервисы. В XML пустая ссылка передается как:

<СсылкаНаДокумент xsi:nil="true"/>

Для этого в 1С настройте ЗаписьXML с параметром УстановитьNilЗначения(Истина).

Почему после обновления 1С до 8.3.22 перестали передаваться пустые ссылки?

В версии 8.3.22 изменилась логика работы ЗаписьJSON для динамических свойств. Теперь Неопределено всегда пропускается. Решение:

  1. Явно устанавливайте NULL через УстановитьПустоеЗначение().
  2. Или используйте кастомизированную сериализацию (см. Способ 3).
Как передать пустую ссылку в массиве объектов?

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

МассивДанных = Новый Массив();

Элемент = Новый Структура("Наименование, Ссылка", "Товар 1", Справочники.Номенклатура.НайтиПоНаименованию("Товар 1"));

МассивДанных.Добавить(Элемент);

Элемент = Новый Структура("Наименование, Ссылка", "Пустой товар", Неопределено);

УстановитьПустоеЗначение(Элемент.Ссылка);

МассивДанных.Добавить(Элемент);

Результат:

[

{"Наименование": "Товар 1", "Ссылка": "123e4567-e89b-12d3-a456-426614174000"},

{"Наименование": "Пустой товар", "Ссылка": null}

]

Чем отличается ПустаяСсылка() от Неопределено?

Метод ПустаяСсылка() возвращает ссылку на несуществующий объект (например, для справочника), тогда как Неопределено — это отсутствие значения как такового. Пример:

Ссылка1 = Справочники.Контрагенты.ПустаяСсылка(); // Ссылка на "пустого" контрагента

Ссылка2 = Неопределено; // Значение не инициализировано

При сериализации:

  • ПустаяСсылка()"00000000-0000-0000-0000-000000000000" (если настройка СериализоватьПустыеСсылки включена).
  • Неопределено → поле пропускается.
Как передать пустую ссылку в HTTP-запросе через 1С:HTTPСервис?

При использовании 1С:HTTPСервиса (например, для REST API) настройте параметры сериализации в модуле сервиса:

ПараметрыОтвета = Новый ПараметрыЗаписиJSON(Истина, Ложь, Истина); // СериализоватьNULL, НеСериализоватьНеопределено, ДатыВISO

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

Ответ.УстановитьСтроку(ПараметрыОтвета);

ЗаписатьJSON(Ответ, Данные);

Возврат Ответ.Закрыть();

Где:

  • Истина в ПараметрыЗаписиJSON — включает сериализацию NULL.
  • Ложь — пропускает Неопределено.