Обмен данными между внешними системами и 1С:Предприятие часто сталкивается с проблемой несовместимости форматов дат. JSON, как популярный формат передачи данных, хранит даты в виде строк (например, "2026-05-15T14:30:00Z"), тогда как 1С работает с собственным типом Дата. Неправильное преобразование может привести к ошибкам загрузки, сбоям в отчётах или некорректной обработке временных меток.
В этой статье разберём 4 основных способа конвертации JSON-дат в 1С: от ручного парсинга строк до автоматизированных решений с использованием встроенных функций и внешних библиотек. Особое внимание уделим типичным ошибкам (например, игнорированию часового пояса) и оптимизации для больших объёмов данных. Если вы интегрируете 1С с API, веб-сервисами или мобильными приложениями — этот материал поможет избежать распространённых проблем.
Почему стандартные методы 1С не работают с JSON-датами
Тип Дата в 1С имеет жёсткий внутренний формат, тогда как JSON передаёт даты в одном из трёх популярных вариантов:
- 📅 ISO 8601:
"2026-05-15T14:30:00+03:00"(с часовым поясом) - 🕒 Unix Timestamp:
1715773800(количество секунд с 1970 года) - 📄 Кастомный формат:
"15.05.2026 14:30"(зависит от API)
Проблема в том, что 1С не умеет автоматически распознавать эти форматы при чтении JSON через ЧтениеJSON. Например, если передать строку "2026-05-15" напрямую в переменную типа Дата, платформа выбросит ошибку "Неверный формат даты". Это связано с:
- 🔹 Отсутствием встроенного парсера для ISO-формата
- 🔹 Различием в разделителях (в 1С по умолчанию используется точка
., а не дефис-) - 🔹 Игнорированием часового пояса (1С по умолчанию работает с локальным временем сервера)
⚠️ Внимание: Если ваш JSON содержит даты в формате Timestamp, их сначала нужно преобразовать в читаемый вид (например, с помощью JavaScript или Python) перед загрузкой в 1С. Платформа не поддерживает прямую конвертацию числовых меток времени.
Метод 1: Ручной парсинг строки с использованием СтрЗаменить и Дата
Самый простой, но наименее универсальный способ — преобразовать строку даты в формат, понятный 1С, с помощью текстовых функций. Подходит для фиксированных форматов (например, когда API всегда отдаёт "YYYY-MM-DD").
Пример кода для формата "2026-05-15":
Функция JSONДатаВ1С(ЗначениеСтроки)
// Заменяем разделители и приводим к формату ДД.ММ.ГГГГ
СтрокаДата = СтрЗаменить(ЗначениеСтроки, "-", ".");
Возврат Дата(СтрокаДата);
КонецФункции
Для формата с временем ("2026-05-15T14:30:00") потребуется дополнительная обработка:
Функция JSONДатаВремяВ1С(ЗначениеСтроки)
ДатаЧасть = Лев(ЗначениеСтроки, 10); // "2026-05-15"
ВремяЧасть = Сред(ЗначениеСтроки, 12, 8); // "14:30:00"
// Преобразуем дату
Дата1С = Дата(СтрЗаменить(ДатаЧасть, "-", "."));
// Добавляем время
Возврат Дата1С + Время(ВремяЧасть);
КонецФункции
⚠️ Внимание: Этот метод не учитывает часовой пояс (зонаZили+03:00в ISO-формате). Если ваши данные привязаны к UTC, а сервер 1С работает в другом поясе, результат будет некорректным.
Используется фиксированный формат даты (без вариаций)
В данных нет часового пояса или он всегда одинаковый
Объём данных небольшой (до 1000 записей)
Нет необходимости обрабатывать null-значения-->
Метод 2: Использование Формат и СтрокаВДата для гибкой конвертации
Более надёжный подход — использовать функцию СтрокаВДата с явным указанием формата. Это позволяет обрабатывать даты в любом текстовом виде, включая нестандартные разделители.
Пример для формата "DD/MM/YYYY HH:mm":
Функция ПарсингДатыИзJSON(СтрокаДаты)
ФорматДаты = "DD/MM/YYYY HH:mm";
Попытка
Возврат СтрокаВДата(СтрокаДаты, ФорматДаты);
Исключение
// Обработка ошибки (например, запись в лог)
ЗаписатьЛог("Ошибка парсинга даты: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
Для ISO-формата ("2026-05-15T14:30:00Z") потребуется предварительная подготовка строки:
Функция ISOВДата1С(ISOСтрока)
// Удаляем букву "T" и заменяем "Z" на пустую строку
ОчищеннаяСтрока = СтрЗаменить(СтрЗаменить(ISOСтрока, "T", " "), "Z", "");
// Формат для 1С: "YYYY-MM-DD HH:mm:ss"
Возврат СтрокаВДата(ОчищеннаяСтрока, "YYYY-MM-DD HH:mm:ss");
КонецФункции
| Исходный формат JSON | Формат для СтрокаВДата |
Пример кода |
|---|---|---|
"2026-05-15" |
"YYYY-MM-DD" |
СтрокаВДата(Строка, "YYYY-MM-DD") |
"15.05.2026 14:30" |
"DD.MM.YYYY HH:mm" |
СтрокаВДата(Строка, "DD.MM.YYYY HH:mm") |
"2026/05/15" |
"YYYY/MM/DD" |
СтрокаВДата(Строка, "YYYY/MM/DD") |
"15-05-2026" |
"DD-MM-YYYY" |
СтрокаВДата(Строка, "DD-MM-YYYY") |
Если ваш JSON содержит даты в разных форматах, создайте универсальную функцию с проверкой шаблонов через регулярные выражения (доступно в 1С 8.3.14+).
Метод 3: Автоматическая конвертация с помощью ЧтениеJSON и обработчиков
Начиная с версии 1С:Предприятие 8.3.10, при чтении JSON можно использовать обработчики событий, которые автоматически преобразуют строковые даты в тип Дата. Это удобно для больших файлов, где ручной парсинг неэффективен.
Пример настройки обработчика:
Процедура ЗагрузитьJSONСДатами(ПутьКФайлу)
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ПолучитьСодержимоеФайла(ПутьКФайлу));
// Настраиваем обработчик для полей с датами
Чтение.ОбработчикПоля = Новый ОбработчикПоляJSONСДатой;
Результат = Чтение.Прочитать();
КонецПроцедуры
// Обработчик для автоматической конвертации
Процедура ОбработчикПоляJSONСДатой(Имя, Значение, Родитель) Экспорт
Если ТипЗнч(Значение) = Тип("Строка") И Найти(Значение, "-") > 0 Тогда
Попытка
// Пробуем преобразовать в дату
Родитель.Вставить(Имя, СтрокаВДата(Значение, "YYYY-MM-DD"));
Возврат Истина; // Поле обработано
Исключение
// Если не удалось - оставляем как строку
КонецПопытки;
КонецЕсли;
Возврат Ложь;
КонецПроцедуры
Преимущества метода:
- 🔄 Обрабатывает даты "на лету" без предварительного анализа структуры JSON
- 📊 Поддерживает вложенные объекты и массивы
- ⚡ Быстрее ручного парсинга для больших файлов (от 10 000 записей)
⚠️ Внимание: Обработчики событий в ЧтениеJSON работают медленнее, чем прямая загрузка, если дат в файле мало (менее 10%). В таких случаях целесообразнее использовать метод 1 или 2.
Метод 4: Внешние библиотеки для сложных форматов (UTC, миллисекунды)
Если ваш JSON содержит:
- 🕐 Миллисекунды (например,
1715773800123) - 🌍 Часовые пояса (например,
"2026-05-15T14:30:00+05:00") - 📅 Нестандартные календари (например, исламский или еврейский)
— то встроенных средств 1С будет недостаточно. В таких случаях используют:
- OneScript.JSON — библиотека с расширенной поддержкой дат (включая
Timestamp) - AddIn-компоненты на C# или C++ для высокопроизводительной обработки
- Внешние веб-сервисы (например, отправка даты на преобразование через HTTP-запрос)
Пример использования OneScript.JSON:
// Подключаем библиотеку (предварительно установите через опенсоурс-репозиторий)
ПодключитьВнешнююКомпоненту("Path\To\OneScript.JSON.dll");
JSON = Новый OneScriptJSON();
// Чтение JSON с автоматической конвертацией дат
Данные = JSON.Прочитать(ПолучитьСодержимоеФайла("data.json"));
// Даты уже в формате 1С, включая обработку UTC
Как установить OneScript.JSON?
1. Скачайте библиотеку с GitHub (https://github.com/oscript-library/json)
2. Разместите файл OneScript.JSON.dll в каталоге с базой 1С
3. Подключите через ПодключитьВнешнююКомпоненту в модуле
4. Используйте методы Прочитать() и Записать() для работы с JSON
Типичные ошибки и как их избежать
Даже опытные разработчики сталкиваются с проблемами при конвертации дат. Вот 5 самых распространённых ошибок и способы их решения:
-
Игнорирование часового пояса
🕒 Проблема: JSON передаёт дату в UTC (
"2026-05-15T14:30:00Z"), а 1С интерпретирует её как локальное время. Разница во временных зонах приводит к сдвигу на ±N часов.Решение: Используйте
ДобавитьСекунды()для корректировки:ДатаUTC = СтрокаВДата("2026-05-15T14:30:00", "YYYY-MM-DDTHH:mm:ss");ДатаЛокальная = ДатаUTC + ЧасовойПояс(); // ЧасовойПояс() возвращает смещение в секундах
-
Неверный разделитель даты
📅 Проблема: В JSON разделитель
-(дефис), а в 1С по умолчанию.(точка). При прямом присваивании возникает ошибка.Решение: Всегда используйте
СтрокаВДатас явным форматом илиСтрЗаменить. -
Null-значения
❌ Проблема: Поле даты в JSON равно
null, но код не обрабатывает этот случай.Решение: Добавьте проверку:
Если Значение = Null ТогдаВозврат Неопределено;
КонецЕсли;
Всегда тестируйте конвертацию дат на крайних значениях: минимальная дата (01.01.0001), максимальная (31.12.9999), а также переходы через полночь и смену часовых поясов.
Оптимизация для больших объёмов данных
Если вам нужно обработать JSON с тысячами записей (например, выгрузка истории заказов за год), ручные методы будут работать слишком медленно. Вот 3 способа ускорить процесс:
- 🚀 Пакетная обработка: Разбивайте JSON на части по 1000 записей и обрабатывайте их в фоновых заданиях.
- 📦 Предварительная конвертация: Преобразуйте даты во внешней системе (например, на стороне API или в Python-скрипте) перед загрузкой в 1С.
- 🔧 Кэширование: Сохраняйте уже обработанные даты в справочник или регистр сведений, чтобы не парсить их повторно.
Пример оптимизированного кода для пакетной обработки:
Процедура ОбработатьБольшойJSON(МассивДанныхJSON)
ДатыДляКонвертации = Новый Массив;
// Собираем все строки с датами в массив
Для Каждого Элемент Из МассивДанныхJSON Цикл
Если ТипЗнч(Элемент.ДатаСоздания) = Тип("Строка") Тогда
ДатыДляКонвертации.Добавить(Элемент.ДатаСоздания);
КонецЕсли;
КонецЦикла;
// Конвертируем пакетом
МассивДат1С = Новый Массив;
Для Каждого СтрокаДата Из ДатыДляКонвертации Цикл
МассивДат1С.Добавить(СтрокаВДата(СтрокаДата, "YYYY-MM-DD"));
КонецЦикла;
// Обновляем исходные данные
Индекс = 0;
Для Каждого Элемент Из МассивДанныхJSON Цикл
Если ТипЗнч(Элемент.ДатаСоздания) = Тип("Строка") Тогда
Элемент.ДатаСоздания = МассивДат1С[Индекс];
Индекс = Индекс + 1;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
⚠️ Внимание: При пакетной обработке следите за лимитами памяти 1С. Если массив дат превышает 100 000 элементов, разбейте его на подмассивы по 10 000 записей.
FAQ: Частые вопросы по конвертации дат JSON → 1С
Как обработать дату в формате Unix Timestamp (например, 1715773800)?
Unix Timestamp — это количество секунд с 1 января 1970 года. В 1С его можно преобразовать так:
Функция TimestampВДата1С(Секунды)
Возврат Дата(1970, 1, 1) + Секунды;
КонецФункции
Для миллисекунд (например, 1715773800123) сначала разделите на 1000:
Секунды = 1715773800123 / 1000;
Почему после конвертации дата в 1С отличается на 3 часа?
Это связано с часовым поясом. JSON часто передаёт даты в UTC (всемирное координированное время), а 1С по умолчанию использует локальное время сервера. Чтобы исправить:
- Узнайте смещение вашего часового пояса (например, для Москвы это +3 часа).
- Добавьте корректировку:
ДатаUTC = СтрокаВДата("2026-05-15T11:00:00", "YYYY-MM-DDTHH:mm:ss");ДатаЛокальная = ДатаUTC + 3 * 3600; // +3 часа в секундах
Или используйте функцию ЧасовойПояс() для автоматического расчёта.
Можно ли настроить 1С, чтобы она автоматически распознавала ISO-формат?
Нет, в стандартной поставке 1С нет встроенного парсера для ISO 8601. Однако вы можете:
- Создать общую функцию для конвертации и использовать её во всех обработках.
- Подключить внешнюю библиотеку (например, OneScript.JSON).
- Настроить предварительную обработку данных на стороне источника (например, в API).
Как обработать дату, если в JSON она может быть строкой, числом или null?
Используйте универсальную функцию с проверкой типов:
Функция УниверсальнаяКонвертацияДаты(Значение)
Если Значение = Null Тогда
Возврат Неопределено;
ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда
// Обработка Timestamp
Возврат Дата(1970, 1, 1) + Значение;
ИначеЕсли ТипЗнч(Значение) = Тип("Строка") Тогда
Попытка
Возврат СтрокаВДата(Значение, "YYYY-MM-DD");
Исключение
Возврат Неопределено; // или альтернативный формат
КонецПопытки;
КонецЕсли;
КонецФункции
Где в 1С хранить настройки форматов дат для разных JSON-источников?
Лучше всего использовать справочник "ФорматыОбменаДанными" с реквизитами:
Наименование— имя источника (например, "API Яндекс.Кассы")ФорматДаты— строка формата дляСтрокаВДата(например,"YYYY-MM-DD")СмещениеUTC— часовой пояс в часах (например,3для Москвы)
Пример обращения:
Формат = Справочники.ФорматыОбменаДанными.НайтиПоНаименованию("API Яндекс.Кассы").ФорматДаты;
Дата1С = СтрокаВДата(ДатаИзJSON, Формат);