Работа с форматом JSON в платформе 1С:Предприятие 8.3 стала стандартом де-факто для интеграции с веб-сервисами и внешними системами. Однако при десериализации данных (преобразовании строки JSON в объекты 1С) программисты часто сталкиваются с неочевидными нюансами, особенно когда речь идет о типах данных Дата. В этой статье мы подробно разберем, как корректно считывать несколько полей с датами, проанализируем типичные ошибки синтаксиса и рассмотрим альтернативные методы обработки данных.
В формате JSON не существует отдельного типа данных для даты. Даты передаются либо как строки (в формате ISO 8601), либо как числа (миллисекунды). Чтобы 1С поняла, что конкретную строку нужно превратить в объект типа Дата, а не оставлять ее строкой, в функции ПрочитатьJSON предусмотрен специальный параметр ИменаСвойствСоЗначениямиДата. Трудности возникают тогда, когда таких свойств несколько, например, dateStart и dateEnd.
Рассмотрим по шагам, как решить эту задачу и каких ошибок следует избегать.
Самый простой способ — передать в функцию список имен свойств одной строкой, разделяя их запятыми. Проанализируем пример кода, который часто вызывает затруднения:
// Ошибочный вариант
МассивДанных = ПрочитатьJSON(ЧтениеJSON,, "dateStart, dateEnd", JSONDateFormat.ISO);
На первый взгляд код выглядит логично, но именно здесь кроется ловушка. Платформа 1С воспринимает строку буквально. Если после запятой стоит пробел, система будет искать в JSON свойство с именем " dateEnd" (с пробелом в начале). Естественно, такого ключа в данных нет, и преобразование во вторую дату не произойдет — значение останется строкой.
Правильный вариант написания:
// Правильный вариант без пробелов
МассивДанных = ПрочитатьJSON(ЧтениеJSON,, "dateStart,dateEnd", JSONDateFormat.ISO);
Выясним причину успеха: убрав пробел, мы передали четкие идентификаторы полей. Теперь встроенная функция 1С сможет сопоставить ключи в JSON-файле со списком и корректно применить форматирование JSONDateFormat.ISO к обоим полям.
Чтобы избежать ошибок, связанных с человеческим фактором и опечатками в строках, мы рекомендуем использовать Массив. Это более надежный и «чистый» с точки зрения разработки способ. Платформа официально поддерживает передачу массива строк в качестве параметра ИменаСвойствСоЗначениямиДата.
Разберем пример реализации этого метода:
// Создаем список полей, которые должны стать датами
СписокДат = Новый Массив;
СписокДат.Добавить("dateStart");
СписокДат.Добавить("dateEnd");
СписокДат.Добавить("dateUpdate");
// Читаем JSON, передавая массив
Результат = ПрочитатьJSON(ЧтениеJSON, Ложь, СписокДат, JSONDateFormat.ISO);
Рассмотрим преимущества этого подхода:
Важно понимать важную особенность механизма автоматического преобразования: он работает рекурсивно. Если вы указали в списке имя "Date", платформа будет искать это имя на всех уровнях вложенности вашего JSON-дерева. Если у вас есть массив объектов, и в каждом объекте есть поле "Date", все они будут преобразованы в тип 1С Дата.
Однако будьте осторожны: если в одной части JSON поле "Value" содержит дату, а в другой — произвольный текст, указание этого имени в списке приведет к тому, что 1С попытается преобразовать текст в дату. Если формат не совпадет, ошибка не возникнет, но значение останется строкой, что может привести к путанице при дальнейшей обработке.
Иногда даты приходят в нестандартном виде, или формат даты в одном файле различается для разных полей. В таких ситуациях стандартного перечисления имен может быть недостаточно. Рассмотрим альтернативный механизм — использование ФункцииОбработкиДанных.
Это callback-функция, которая вызывается для каждого прочитанного значения. Проанализируем, как это работает:
// Функция-обработчик
Функция ОбработкаЧтенияJSON(Свойство, Значение, ДополнительныеПараметры) Экспорт
Если Свойство = "dateStart" Или Свойство = "dateEnd" Тогда
// Здесь можно реализовать произвольный алгоритм парсинга
Попытка
Возврат Дата(СтрЗаменить(Значение, "T", ""));
Исключение
Возврат Значение; // Если не дата, возвращаем как есть
КонецПопытки;
КонецЕсли;
Возврат Значение;
КонецФункции
// Вызов чтения с обработчиком (второй параметр)
Результат = ПрочитатьJSON(ЧтениеJSON, "ОбработкаЧтенияJSON",, JSONDateFormat.ISO);
Использование обработчика позволяет гибко управлять процессом десериализации, игнорируя или преобразуя данные на лету, независимо от того, какие настройки формата указаны в глобальных параметрах функции ПрочитатьJSON.
Проанализируем основные форматы, которые поддерживает 1С через перечисление JSONDateFormat:
"YYYY-MM-DDTHH:mm:ss". Это стандарт для большинства современных систем. Если символ T отсутствует, автоматическое преобразование может дать сбой.new Date(миллисекунды)."\/Date(миллисекунды)\/", характерный для старых систем на базе .NET.Важный совет: Если вы сами формируете JSON на стороне 1С для последующего чтения этой же системой, всегда используйте метод ЗаписатьJSON. Платформа автоматически сериализует даты в канонический вид, который легче всего прочитать обратно без лишних «бубнов».
Подводя итог, можно сказать, что чтение нескольких дат из JSON в 1С — задача простая, если знать синтаксические особенности платформы. Основной секрет кроется в отсутствии пробелов при перечислении имен в строке. Однако для профессиональной разработки мы рекомендуем использовать массивы имен или функции-обработчики. Это сделает ваш код устойчивым к изменениям и легким в поддержке.