При обмене данными с внешними сервисами, использующими PHP или другие языки, часто возникают требования к жесткой структуре JSON-файла. В платформе 1С стандартные механизмы сериализации (через ЗаписатьJSON с использованием Структура) не гарантируют сохранение порядка следования ключей, так как коллекции 1С оптимизированы для быстрого поиска. Рассмотрим, как решить эту задачу и добиться нужного формата.
Для создания объектов, содержащих ключи-цифры или специфические имена, которые не всегда удобно описывать через Структура, используем Соответствие. Это позволяет избежать ограничений платформы на именование полей и упрощает вложенную структуру.
Рассмотрим пример формирования вложенной структуры с массивами данных:
// Создаем соответствие для корневого объекта
Соответствие = Новый Соответствие;
Соответствие.Вставить("Header", "АБП1");
// Создаем массив для вложенных данных
МассивПараметров = Новый Массив;
// Добавляем элементы в массив
СоответствиеПараметров = Новый Соответствие;
СоответствиеПараметров.Вставить("id", "Оплата труда");
МассивПараметров.Добавить(СоответствиеПараметров);
// Заполняем остальные параметры
СоответствиеПараметров = Новый Соответствие;
СоответствиеПараметров.Вставить("id", "2000");
МассивПараметров.Добавить(СоответствиеПараметров);
// Привязываем массив к ключу внутри соответствия
Соответствие.Вставить("1", МассивПараметров);
// Записываем результат
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Соответствие);
Результат = ЗаписьJSON.Закрыть();
Если для принимающей стороны критически важно, чтобы поле Header всегда шло первым, а вложенные массивы строго следовали за ним, используем объект ЗаписьJSON напрямую, записывая каждое свойство последовательно.
Этот метод является наиболее надежным, так как исключает случайную перестановку полей платформой 1С при сериализации коллекции:
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписьJSON.ЗаписатьНачалоМассива();
// Начинаем описание объекта
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства("Header");
ЗаписьJSON.ЗаписатьЗначение("АБП");
ЗаписьJSON.ЗаписатьИмяСвойства("0");
ЗаписьJSON.ЗаписатьНачалоМассива();
// ... запись элементов массива ...
ЗаписьJSON.ЗаписатьКонецМассива();
ЗаписьJSON.ЗаписатьКонецОбъекта();
ЗаписьJSON.ЗаписатьКонецМассива();
Результат = ЗаписьJSON.Закрыть();
СокрЛП() или Строка(), иначе числовое поле может быть интерпретировано иначе.Соответствие для формирования структуры, проверяйте, чтобы ключи не дублировались, так как это делает JSON невалидным для большинства парсеров.ЗаписатьJSON), помните, что все ключи и строковые значения должны быть обернуты в двойные кавычки. Использование одинарных кавычек не соответствует стандарту JSON и может вызвать ошибку на принимающей стороне.ЗаписьJSON по умолчанию использует кодировку UTF-8, которая является стандартом для веб-обменов.Используя сочетание Массив и Соответствие, вы сможете гибко настроить структуру любой сложности. Если же автоматическая сериализация не дает нужного порядка элементов, переходите к потоковой записи через ЗаписатьИмяСвойства, что даст вам полный контроль над итоговым текстом сообщения.