Разработка и Конфигурация · 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", если это предусмотрено схемой.
- 1Определите, куда попадёт дата: в текст элемента или в атрибут
- 2Преобразуйте значение через XMLСтрока(Дата) или Формат(Дата, "ДФ=yyyy-MM-dd") для даты без времени
- 3Проверьте, нужна ли пустая дата: если нет — пропустите элемент
- 4Запишите значение через ЗаписатьТекст или ЗаписатьАтрибут
- 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
Универсально для потоковой записи, формат ISO 8601. Ограничение: всегда выводит время и не добавляет часовой пояс.
Автоматическая сериализация по схеме, минимум кода. Ограничение: формат не настраивается, нужна фабрика типов.
Полный контроль над строкой, подходит для нестандартных требований. Ограничение: ответственность за корректность формата на разработчике.
Чтение даты из 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").
Частые вопросы о записи даты в 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 и заранее согласуйте с принимающей стороной вопрос часовых поясов.