К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как записать дату в XML в 1С

Как правильно записать дату в XML в 1С: функции XMLСтрока, Формат, ЗаписатьДатуJSON, формат ISO 8601, типичные ошибки и проверка результата.

При обмене данными через XML дата — одно из самых «капризных» значений: если записать её в привычном виде «31.12.2026», принимающая система может не распознать значение или интерпретировать его неверно. Стандарт XML Schema требует формат ISO 8601 — например, 2026-12-31T00:00:00, и платформа 1С умеет формировать такую строку штатными средствами.

В зависимости от способа записи XML (объектная модель XDTO, потоковая запись через ЗаписьXML, сериализация) применяются разные подходы: функция XMLСтрока(), метод ЗаписатьАтрибут() с типизированным значением или ручное форматирование через Формат(). Ниже разобраны все рабочие варианты с примерами кода и типичными ошибками.

Какой формат даты требует XML

Спецификация XML Schema определяет типы dateTime, date и time, основанные на стандарте ISO 8601. Дата и время записываются от большей единицы к меньшей: год, месяц, день, затем после литеры «T» — часы, минуты, секунды. Пример полного значения: 2026-03-15T14:30:00.

Дополнительно допускается указание часового пояса: 2026-03-15T14:30:00+03:00 или суффикс Z для времени UTC. Если часовой пояс не указан, значение считается «локальным» без привязки к зоне — это частый источник расхождений при обмене между системами в разных регионах.

Дробная часть секунд записывается через точку: 2026-03-15T14:30:00.123. Не все принимающие системы её поддерживают, поэтому перед обменом стоит уточнить требования контрагента по интеграции.

Запись даты функцией XMLСтрока

Самый простой способ получить корректное строковое представление даты — встроенная функция XMLСтрока(). Она преобразует значение примитивного типа в строку формата XML Schema и работает не только с датами, но и с булевыми значениями, числами, УникальныйИдентификатор.

ДатаДокумента = ТекущаяДатаСеанса();

СтрокаДляXML = XMLСтрока(ДатаДокумента);

// Результат: "2026-03-15T14:30:25"

ЗаписьXML.ЗаписатьНачалоЭлемента("Дата");

ЗаписьXML.ЗаписатьТекст(СтрокаДляXML);

ЗаписьXML.ЗаписатьКонецЭлемента();

Обратное преобразование выполняется функцией XMLЗначение(Тип("Дата"), СтрокаИзXML). Эта пара функций — стандартный способ ручной сериализации, и она гарантирует совместимость с любой системой, понимающей XML Schema.

Важно: XMLСтрока() не добавляет часовой пояс. Если принимающая сторона требует явную зону, её нужно формировать вручную или договариваться о том, что все даты передаются в UTC либо в едином согласованном поясе.

Запись даты через объект ЗаписьXML

При потоковой записи XML дата чаще всего попадает либо в текст элемента, либо в атрибут. Для атрибутов удобно сразу передавать строковое представление:

ЗаписьXML = Новый ЗаписьXML;

ЗаписьXML.УстановитьСтроку();

ЗаписьXML.ЗаписатьНачалоЭлемента("Документ");

ЗаписьXML.ЗаписатьАтрибут("Дата", XMLСтрока(Документ.Дата));

ЗаписьXML.ЗаписатьКонецЭлемента();

ТекстXML = ЗаписьXML.Закрыть();

// <Документ Дата="2026-03-15T14:30:00"/>

Если в XML нужна дата без времени (тип date), отсеките время вручную — функция XMLСтрока всегда выводит полное значение. Используйте Формат(Дата, "ДФ=yyyy-MM-dd"), который даст строку вида «2026-03-15», совместимую с типом date.

При записи пустой даты помните: XMLСтрока('00010101') вернёт «0001-01-01T00:00:00», и принимающая система может воспринять это как реальную дату. Корректнее вообще не выводить элемент, если дата не заполнена, либо использовать атрибут xsi:nil="true", если это предусмотрено схемой.

Порядок записи даты в XML
  1. 1
    Определите, куда попадёт дата: в текст элемента или в атрибут
  2. 2
    Преобразуйте значение через XMLСтрока(Дата) или Формат(Дата, "ДФ=yyyy-MM-dd") для даты без времени
  3. 3
    Проверьте, нужна ли пустая дата: если нет — пропустите элемент
  4. 4
    Запишите значение через ЗаписатьТекст или ЗаписатьАтрибут
  5. 5
    Откройте полученный XML и убедитесь, что строка соответствует ISO 8601

Сериализация даты через XDTO и СериализаторXDTO

Если обмен построен на фабрике XDTO, платформа сериализует даты автоматически по типам схемы: свойству с типом dateTime соответствует значение типа Дата, и в XML оно попадёт в правильном формате без ручного преобразования. Достаточно присвоить значение свойству объекта XDTO и записать его через ЗаписьXML в связке с фабрикой.

Для произвольных объектов конфигурации (документов, справочников) используется СериализаторXDTO. Метод ЗаписатьXML() сериализует объект целиком, включая все реквизиты типа Дата, в формате, который затем корректно читается методом ПрочитатьXML(). Это основа типовых механизмов обмена между конфигурациями 1С.

Ограничение подхода: формат вывода управляется платформой, и повлиять на него нельзя. Если внешняя система требует нестандартное представление даты (например, миллисекунды или явную зону), придётся либо менять тип свойства в схеме на string и форматировать вручную, либо отказаться от XDTO в пользу потоковой записи.

Нестандартные форматы и функция Формат

На практике встречаются системы, ожидающие дату в собственном формате: «dd.MM.yyyy», «yyyyMMdd», количество секунд с начала эпохи Unix. В таких случаях строку формируют функцией Формат() с параметром форматной строки:

// Только дата, ISO-совместимо

СтрокаДаты = Формат(Дата, "ДФ=yyyy-MM-dd");

// Компактный формат для имён файлов и ключей

СтрокаКлюча = Формат(Дата, "ДФ=yyyyMMddHHmmss");

// Unix time (секунды с 01.01.1970 UTC)

UnixTime = Дата - Дата(1970, 1, 1, 0, 0, 0);

При ручном форматировании критично зафиксировать форматную строку в коде и в документации на обмен. Разнобой «dd.MM.yyyy» против «MM/dd/yyyy» — классическая причина того, что 3 марта превращается в 9 марта или выгрузка падает с ошибкой преобразования.

Способы записи даты в XML

XMLСтрока()

Универсально для потоковой записи, формат ISO 8601. Ограничение: всегда выводит время и не добавляет часовой пояс.

XDTO / СериализаторXDTO

Автоматическая сериализация по схеме, минимум кода. Ограничение: формат не настраивается, нужна фабрика типов.

Формат() с ДФ

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

Чтение даты из XML и проверка результата

При чтении используйте XMLЗначение(Тип("Дата"), СтрокаЗначения) — функция вернёт значение типа Дата либо вызовет исключение, если строка не соответствует формату. Оборачивайте преобразование в попытку, если источник данных не контролируется:

Попытка

ДатаДокумента = XMLЗначение(Тип("Дата"), СтрокаИзXML);

Исключение

ДатаДокумента = Дата(1, 1, 1);

// зафиксировать ошибку в журнале обмена

КонецПопытки;

После загрузки проверьте результат контрольными точками: дата не пустая, год находится в разумном диапазоне, время не «съехало» на величину часового пояса. При массовой загрузке полезно сверить несколько документов с источником вручную.

Контрольные точки

Как проверить результат

Строка даты в файле
Норма

Вид 2026-03-15T14:30:00 или 2026-03-15

Тревожный признак

31.12.2026 или пустая строка там, где дата обязательна

Значение после загрузки
Норма

Тип Дата, год и время совпадают с источником

Тревожный признак

Дата 01.01.0001 или смещение на несколько часов

Пустые даты
Норма

Элемент отсутствует или помечен xsi:nil

Тревожный признак

В файле 0001-01-01T00:00:00 как реальное значение

Типичные ошибки и ограничения

Самая распространённая ошибка — запись даты функцией Строка(Дата) или неявным преобразованием. Результат зависит от региональных настроек сеанса: на одном сервере получится «15.03.2026 14:30:00», на другом — «03/15/2026». Такой XML не проходит валидацию по схеме и не читается сторонними системами.

Вторая группа проблем связана с часовыми поясами. ТекущаяДатаСеанса() возвращает время сервера или сеанса, а принимающая система может ожидать UTC. Если обмен идёт между часовыми поясами, договоритесь о едином представлении и при необходимости используйте УниверсальноеВремя() или явное смещение зоны.

Третья типичная ситуация — перепутанные типы date и dateTime в схеме. Если схема ожидает date, значение с временем «2026-03-15T14:30:00» не пройдёт валидацию; отсекайте время через Формат(Дата, "ДФ=yyyy-MM-dd").

Типичные ошибки
01
Запись через Строка(Дата) — формат зависит от региональных настроек сервера и ломает обмен
02
Выгрузка пустой даты как 0001-01-01T00:00:00 — принимающая система трактует её как реальную
03
Игнорирование часового пояса — время смещается на разницу зон между системами
04
Отправка даты со временем в поле типа date — схема отклоняет значение при валидации

Частые вопросы о записи даты в XML из 1С

Чем XMLСтрока отличается от Формат при записи даты?

XMLСтрока всегда возвращает формат XML Schema (ISO 8601) и не настраивается. Формат с параметром ДФ позволяет задать произвольное представление, включая дату без времени, но корректность строки контролирует разработчик.

Как записать в XML только дату без времени?

Используйте Формат(Дата, "ДФ=yyyy-MM-dd") — получится строка вида «2026-03-15», соответствующая типу date в XML Schema. Функция XMLСтрока для этого не подходит: она всегда добавляет время.

Как передать часовой пояс в дате XML?

Штатная XMLСтрока пояс не выводит. Сформируйте строку вручную: Формат(Дата, "ДФ=yyyy-MM-ddTHH:mm:ss") плюс суффикс смещения вида "+03:00", либо договоритесь передавать все значения в UTC с суффиксом Z.

Что делать, если принимающая система ждёт дату «дд.мм.гггг»?

Используйте Формат(Дата, "ДФ=dd.MM.yyyy") и зафиксируйте этот формат в описании обмена. Учтите, что такое значение не валидируется стандартными типами XML Schema, поэтому в схеме поле должно быть строковым.

Как записать дату в XML, если она не заполнена?

Лучше не выводить элемент вовсе. Если схема требует наличия элемента, используйте пустой элемент с атрибутом xsi:nil="true" и пространством имён xsi. Записывать 0001-01-01 как «пустышку» не стоит — внешние системы воспримут её как данные.

Почему после загрузки время сместилось на несколько часов?

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

Итог

Что важно запомнить

Стандартный формат даты в XML — ISO 8601 (2026-03-15T14:30:00). Для потоковой записи используйте XMLСтрока(), для XDTO сериализация автоматическая, для нестандартных требований — Формат(). Не выгружайте пустые даты как 0001-01-01 и заранее согласуйте с принимающей стороной вопрос часовых поясов.