Обмен данными между внешними системами и 1С:Предприятие часто сталкивается с проблемой несовместимости форматов дат. JSON, как популярный формат передачи данных, хранит даты в виде строк (например, "2026-05-15T14:30:00Z"), тогда как работает с собственным типом Дата. Неправильное преобразование может привести к ошибкам загрузки, сбоям в отчётах или некорректной обработке временных меток.

В этой статье разберём 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С. Платформа не поддерживает прямую конвертацию числовых меток времени.
📊 Какой формат дат чаще встречается в ваших JSON-файлах?
ISO 8601 (2026-05-15T14:30:00Z)
Unix Timestamp (1715773800)
Кастомный (15.05.2026)
Другой

Метод 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С будет недостаточно. В таких случаях используют:

  1. OneScript.JSON — библиотека с расширенной поддержкой дат (включая Timestamp)
  2. AddIn-компоненты на C# или C++ для высокопроизводительной обработки
  3. Внешние веб-сервисы (например, отправка даты на преобразование через 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 самых распространённых ошибок и способы их решения:

  1. Игнорирование часового пояса

    🕒 Проблема: JSON передаёт дату в UTC ("2026-05-15T14:30:00Z"), а 1С интерпретирует её как локальное время. Разница во временных зонах приводит к сдвигу на ±N часов.

    Решение: Используйте ДобавитьСекунды() для корректировки:

    ДатаUTC = СтрокаВДата("2026-05-15T14:30:00", "YYYY-MM-DDTHH:mm:ss");
    

    ДатаЛокальная = ДатаUTC + ЧасовойПояс(); // ЧасовойПояс() возвращает смещение в секундах

  2. Неверный разделитель даты

    📅 Проблема: В JSON разделитель - (дефис), а в 1С по умолчанию . (точка). При прямом присваивании возникает ошибка.

    Решение: Всегда используйте СтрокаВДата с явным форматом или СтрЗаменить.

  3. 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С по умолчанию использует локальное время сервера. Чтобы исправить:

  1. Узнайте смещение вашего часового пояса (например, для Москвы это +3 часа).
  2. Добавьте корректировку:
    Дата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, Формат);