Как правильно прочитать несколько полей даты из JSON в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Работа с форматом JSON в платформе 1С:Предприятие 8.3 стала стандартом де-факто для интеграции с веб-сервисами и внешними системами. Однако при десериализации данных (преобразовании строки JSON в объекты 1С) программисты часто сталкиваются с неочевидными нюансами, особенно когда речь идет о типах данных Дата. В этой статье мы подробно разберем, как корректно считывать несколько полей с датами, проанализируем типичные ошибки синтаксиса и рассмотрим альтернативные методы обработки данных.

Суть проблемы: почему даты не всегда распознаются

В формате JSON не существует отдельного типа данных для даты. Даты передаются либо как строки (в формате ISO 8601), либо как числа (миллисекунды). Чтобы 1С поняла, что конкретную строку нужно превратить в объект типа Дата, а не оставлять ее строкой, в функции ПрочитатьJSON предусмотрен специальный параметр ИменаСвойствСоЗначениямиДата. Трудности возникают тогда, когда таких свойств несколько, например, dateStart и dateEnd.

Рассмотрим по шагам, как решить эту задачу и каких ошибок следует избегать.

Решение 1: Использование строки с перечислением имен (Осторожно с пробелами!)

Самый простой способ — передать в функцию список имен свойств одной строкой, разделяя их запятыми. Проанализируем пример кода, который часто вызывает затруднения:


// Ошибочный вариант
МассивДанных = ПрочитатьJSON(ЧтениеJSON,, "dateStart, dateEnd", JSONDateFormat.ISO);

На первый взгляд код выглядит логично, но именно здесь кроется ловушка. Платформа 1С воспринимает строку буквально. Если после запятой стоит пробел, система будет искать в JSON свойство с именем " dateEnd" (с пробелом в начале). Естественно, такого ключа в данных нет, и преобразование во вторую дату не произойдет — значение останется строкой.

Правильный вариант написания:


// Правильный вариант без пробелов
МассивДанных = ПрочитатьJSON(ЧтениеJSON,, "dateStart,dateEnd", JSONDateFormat.ISO);

Выясним причину успеха: убрав пробел, мы передали четкие идентификаторы полей. Теперь встроенная функция 1С сможет сопоставить ключи в JSON-файле со списком и корректно применить форматирование JSONDateFormat.ISO к обоим полям.

Решение 2: Использование массива имен (Рекомендуемый способ)

Чтобы избежать ошибок, связанных с человеческим фактором и опечатками в строках, мы рекомендуем использовать Массив. Это более надежный и «чистый» с точки зрения разработки способ. Платформа официально поддерживает передачу массива строк в качестве параметра ИменаСвойствСоЗначениямиДата.

Разберем пример реализации этого метода:


// Создаем список полей, которые должны стать датами
СписокДат = Новый Массив;
СписокДат.Добавить("dateStart");
СписокДат.Добавить("dateEnd");
СписокДат.Добавить("dateUpdate");

// Читаем JSON, передавая массив
Результат = ПрочитатьJSON(ЧтениеJSON, Ложь, СписокДат, JSONDateFormat.ISO);

Рассмотрим преимущества этого подхода:

  1. Надежность: Исключаются проблемы с лишними пробелами или невидимыми символами разделителей.
  2. Читаемость: Код становится более структурированным, особенно если список дат велик.
  3. Динамичность: Вы можете формировать список полей программно в зависимости от условий обмена.

Глобальный поиск имен и вложенность

Важно понимать важную особенность механизма автоматического преобразования: он работает рекурсивно. Если вы указали в списке имя "Date", платформа будет искать это имя на всех уровнях вложенности вашего JSON-дерева. Если у вас есть массив объектов, и в каждом объекте есть поле "Date", все они будут преобразованы в тип 1С Дата.

Однако будьте осторожны: если в одной части JSON поле "Value" содержит дату, а в другой — произвольный текст, указание этого имени в списке приведет к тому, что 1С попытается преобразовать текст в дату. Если формат не совпадет, ошибка не возникнет, но значение останется строкой, что может привести к путанице при дальнейшей обработке.

Решение 3: Использование функции-обработчика для сложных случаев

Иногда даты приходят в нестандартном виде, или формат даты в одном файле различается для разных полей. В таких ситуациях стандартного перечисления имен может быть недостаточно. Рассмотрим альтернативный механизм — использование ФункцииОбработкиДанных.

Это callback-функция, которая вызывается для каждого прочитанного значения. Проанализируем, как это работает:


// Функция-обработчик
Функция ОбработкаЧтенияJSON(Свойство, Значение, ДополнительныеПараметры) Экспорт
    Если Свойство = "dateStart" Или Свойство = "dateEnd" Тогда
        // Здесь можно реализовать произвольный алгоритм парсинга
        Попытка
            Возврат Дата(СтрЗаменить(Значение, "T", "")); 
        Исключение
            Возврат Значение; // Если не дата, возвращаем как есть
        КонецПопытки;
    КонецЕсли;
    Возврат Значение;
КонецФункции

// Вызов чтения с обработчиком (второй параметр)
Результат = ПрочитатьJSON(ЧтениеJSON, "ОбработкаЧтенияJSON",, JSONDateFormat.ISO);

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

Особенности форматов ISO и Microsoft

Проанализируем основные форматы, которые поддерживает 1С через перечисление JSONDateFormat:

Важный совет: Если вы сами формируете JSON на стороне 1С для последующего чтения этой же системой, всегда используйте метод ЗаписатьJSON. Платформа автоматически сериализует даты в канонический вид, который легче всего прочитать обратно без лишних «бубнов».

Заключение

Подводя итог, можно сказать, что чтение нескольких дат из JSON в 1С — задача простая, если знать синтаксические особенности платформы. Основной секрет кроется в отсутствии пробелов при перечислении имен в строке. Однако для профессиональной разработки мы рекомендуем использовать массивы имен или функции-обработчики. Это сделает ваш код устойчивым к изменениям и легким в поддержке.

← На главную