В практике интеграции 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. - 📌 Пустая строка — поле добавляется как
"".
Внешние системы (например, 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С (используйте
ПротоколHTTPили Fiddler). - 🔍 Сравните полученный JSON/XML с требованиями API (например, через JSONLint).
- 🔍 Убедитесь, что кодировка запроса — 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 для динамических свойств. Теперь Неопределено всегда пропускается. Решение:
- Явно устанавливайте
NULLчерезУстановитьПустоеЗначение(). - Или используйте кастомизированную сериализацию (см. Способ 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.Ложь— пропускаетНеопределено.