При работе с обменом данными через формат JSON часто возникает ситуация, когда стандартные механизмы платформы не справляются с «неидеальными» данными. Самая частая проблема: платформа 1С пытается принудительно преобразовать значение свойства JSON в тип Дата, используя метод ПрочитатьJSON, но если в ключе оказывается пустое значение или строка некорректного формата, система выдает ошибку: «Представление даты имеет неверный формат» или «Невозможно привести к формату даты». Давайте разберем, как обойти это ограничение и сделать ваш код устойчивым к ошибкам.
Метод ПрочитатьJSON при указании параметра ФорматДатыJSON ожидает, что в указанных свойствах будет находиться строка строго определенного формата. Если на вход попадает «пустышка», функция пытается ее обработать как дату, что приводит к исключению. Обычная попытка преобразовать строку через Дата(Строка) или Сред() в случае пустых значений также вызывает ошибку выполнения. Чтобы этого избежать, нам нужно перехватить процесс обработки свойства до того, как платформа упадет с ошибкой.
Наиболее профессиональный и надежный способ — это использование механизма функции восстановления. Этот подход позволяет гибко обрабатывать каждое значение, которое 1С встречает при разборе файла или строки JSON.
Для реализации этого метода нам потребуется выполнить следующие шаги:
Свойство, Значение и ДополнительныеПараметры.Дата(1, 1, 1), а если заполнено — применять преобразование.ПрочитатьJSON.Посмотрим, как это выглядит на практике в коде:
Функция ФункцияВосстановленияЧтения(Свойство, Значение, ДополнительныеПараметры) Экспорт
Если Свойство = "closedDate" Тогда
Результат = Дата(1, 1, 1);
Если ЗначениеЗаполнено(Значение) Тогда
Результат = ПрочитатьДатуJSON(Значение);
КонецЕсли;
Возврат Результат;
КонецЕсли;
// Можно добавить обработку других свойств
Возврат Значение;
КонецФункции
Далее, при считывании данных, мы вызываем ПрочитатьJSON, передавая имя нашей функции в качестве параметра:
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл("ПутьКФайлу.json");
Данные = ПрочитатьJSON(Чтение, Ложь, , , "ФункцияВосстановленияЧтения", ЭтотОбъект);
Чтение.Закрыть();
Если вы хотите избежать создания сложных функций восстановления или данные приходят в простом строковом формате ISO, можно считать JSON как обычные строки (без попытки автоматического восстановления даты), а затем уже в коде обработать их через XMLЗначение. Этот метод хорош тем, что он «прощает» многие огрехи формата.
Рассмотрим пример того, как это можно реализовать:
// Предположим, что при чтении мы получили строку "2022-01-01T23:59:59"
СтрокаДата = "2022-01-01T23:59:59";
Если Не ПустаяСтрока(СтрокаДата) Тогда
ПреобразованнаяДата = XMLЗначение(Тип("Дата"), СтрокаДата);
Иначе
ПреобразованнаяДата = Дата(1, 1, 1);
КонецЕсли;
Чтобы ваш код был стабильным, придерживайтесь следующих правил:
ПустаяСтрока() или ЗначениеЗаполнено() перед тем, как передавать его в парсер даты.Структуру или Соответствие как набор строк, а затем в цикле обработать каждое поле. Это защитит весь процесс от сбоя из-за одной единственной некорректной записи.ФорматДатыJSON.ISO чувствителен к наличию двоеточий в часовых поясах. Если формат нестандартный, лучше очистить строку от лишних символов перед преобразованием.Используя эти методы, вы сможете корректно обрабатывать даже самые «битые» файлы JSON, обеспечивая бесперебойную работу ваших интеграций и обменов данными.