Как исправить ошибку некорректного формата даты при выгрузке отчетов в 1С:ЗУП?

Программист 1С v8.3 (Обычные формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При формировании регламентированной отчетности и выгрузке данных в электронном виде пользователи и разработчики могут столкнуться с ситуацией, когда дата рождения физического лица или дата документа формируется с ошибками. Например, вместо стандартного представления даты в формате 13.11.1964 в результирующий XML-файл выгружается строка вида ДатаРожд="13.11.64 0" или дата обрезается до формата с двузначным годом ДД.ММ.ГГ. Разберем причины возникновения такой неполадки и детально рассмотрим варианты ее устранения.

Причины некорректного формирования даты

Проанализируем механизм, из-за которого происходит сбой представления даты в результирующем файле:

  1. Зависимость от региональных установок сеанса и операционной системы. Если в программном коде регламентированного отчета используется неявное приведение типа даты к строке или вызов функции Формат() с локальным шаблоном ДЛФ=Д, платформа 1С ориентируется на текущие настройки региональных стандартов. Если в операционной системе пользователя или в параметрах базы краткий формат даты настроен как дд.ММ.гг, платформа преобразует дату без указания века.
  2. Смещение символов при парсинге строк. В некоторых типовых алгоритмах выгрузки конфигураций прошлых поколений (в частности, в 1С:ЗУП 2.5) строка даты обрабатывается с фиксированным смещением позиций символов (рассчитанным на 10 знаков формата ДД.ММ.ГГГГ). При получении укороченной 8-значной даты (13.11.64) алгоритм захватывает следующие за ней символы времени или пробелы, что приводит к появлению артефактов вида 13.11.64 0.

Способ 1. Настройка региональных установок информационной базы через Конфигуратор

Самый быстрый и надежный способ решить проблему глобально для всех пользователей без изменения программного кода — зафиксировать единые региональные стандарты на уровне самой базы данных. Выполним следующие шаги:

  1. Запустим информационную базу в режиме Конфигуратор с административными правами.
  2. В главном меню откроем раздел Администрирование и выберем пункт Региональные установки информационной базы....
  3. Снимем флаг Использовать региональные установки текущего сеанса (если он был активен).
  4. В поле Язык (страна) укажем Русский (Россия).
  5. Проверим шаблоны форматирования даты: формат краткой даты должен быть строго задан с четырехзначным годом (dd.MM.yyyy или дд.ММ.гггг).
  6. Нажмем кнопку ОК для сохранения настроек.

После применения параметров перезапустим сеанс «1С:Предприятия» в пользовательском режиме и повторно сформируем файл выгрузки регламентированного отчета.

Способ 2. Проверка региональных стандартов операционной системы

Если параметры базы зависят от локали сеанса, необходимо скорректировать настройки операционной системы Windows:

  1. Откроем Панель управления и перейдем в раздел Часы и регион (или Региональные стандарты).
  2. На вкладке Форматы убедимся, что в поле Краткая дата выбран формат с четырехзначным годом (dd.MM.yyyy).
  3. Если база работает в клиент-серверном варианте и отчет формируется в фоновом задании на стороне сервера, аналогичные настройки необходимо проверить и применить для учетной записи, от имени которой запущена служба сервера «1С:Предприятия» (например, usr1cv8 или SYSTEM).

Способ 3. Передача параметра локализации сеанса при запуске

Если нет возможности изменить общесистемные параметры, можно явно указать платформе код локализации для конкретного рабочего места. Для этого в окне запуска «1С:Предприятия» выделим нужную базу, нажмем кнопку Изменить и в поле Дополнительные параметры запуска допишем ключ:

/VL ru_RU

Способ 4. Доработка программного кода выгрузки

Если регламентированный отчет является внешним или конфигурация снята с поддержки, наилучшим решением будет устранение неявного форматирования в коде обработки выгрузки. Заменим зависимые от локали функции явным указанием формата даты.

Посмотрим на пример вызова, который может давать сбой:


// Нежелательный вариант: формат зависит от настроек сеанса
СтрокаДаты = Формат(ФизЛицоДатаРождения, "ДЛФ=Д");

Исправим код, применив жесткое форматирование без привязки к локальным стандартам пользователя:


// Корректный вариант: формат строго зафиксирован
СтрокаДаты = Формат(ФизЛицоДатаРождения, "ДФ=dd.MM.yyyy");

Использование явной форматной строки "ДФ=dd.MM.yyyy" гарантирует получение даты ровно из 10 символов с четырехзначным годом независимо от конфигурации клиентской машины и параметров сеанса.

← На главную