При разработке или редактировании печатных форм в 1С:Зарплата и Управление Персоналом 3.1 программисты часто сталкиваются с ситуацией, когда стандартные поля даты (например, дата рождения сотрудника или дата выдачи паспорта) выводятся вместе со временем в формате 01.01.1980 0:00:00. В официальных документах такой формат недопустим. В данной статье мы подробно разберем все способы приведения даты к надлежащему виду, проанализируем работу форматных строк и выясним, почему стандартные настройки макета иногда не срабатывают.
Самый надежный и гибкий способ управления представлением данных — использование встроенной функции 1С Формат() непосредственно в момент формирования структуры данных для печати. Рассмотрим ситуацию, когда данные извлекаются из выборки или массива и помещаются в структуру ДанныеПечати.
Проанализируем стандартный подход. Вместо прямой вставки значения, которое имеет тип Дата, нам необходимо обернуть его в функцию форматирования. Посмотрим на пример кода:
// Вместо обычного присвоения:
// ДанныеПечати.Вставить("ДатаРождения", ДанныеФизическогоЛица[0].ДатаРождения);
// Используем локальный формат даты:
ДанныеПечати.Вставить("ДатаРождения", Формат(ДанныеФизическогоЛица[0].ДатаРождения, "ДЛФ=Д"));
Разберем, что означают эти параметры:
Если нам требуется строгий формат, не зависящий от настроек сервера, мы можем использовать параметр ДФ (Форматная строка). Рассмотрим пример:
// Формат: ДД.ММ.ГГГГ (01.01.2023)
ДанныеПечати.Вставить("ДокументДатаВыдачи", Формат(ДанныеФизическогоЛица[0].ДокументДатаВыдачи, "ДФ=dd.MM.yyyy"));
// Формат с полным названием месяца:
ДанныеПечати.Вставить("ДокументДатаВыдачи", Формат(ДанныеФизическогоЛица[0].ДокументДатаВыдачи, "ДФ='d MMMM yyyy \"г.\"'"));
Важный нюанс: В форматной строке ДФ регистр символов критичен. MM (прописные) — это месяц, а mm (строчные) — это минуты. Ошибка в регистре приведет к некорректному выводу данных.
Иногда программисты предпочитают задавать формат вывода непосредственно в макете, чтобы не перегружать код. Выясним, почему этот метод может не работать.
Рассмотрим алгоритм настройки макета:
ДатаРождения).Однако, как показывает практика обсуждений, этот способ часто игнорируется системой. Проанализируем причину. Если в свойстве ячейки Заполнение установлено значение Шаблон (например, текст в ячейке выглядит как Сотрудник [Работник] родился [ДатаРождения]), то настройки формата самой ячейки применяться не будут. В случае шаблона 1С воспринимает всё содержимое как строку, и дата вставляется в своем стандартном строковом представлении. В такой ситуации поможет только предварительное форматирование в коде (как в Методе 1).
Для тех, кто боится ошибиться в написании параметров ДФ или ДЛФ, в среде разработки 1С предусмотрен визуальный помощник. Рассмотрим, как им воспользоваться:
Напишем в коде Формат(НужнаяДата, ""), установим курсор внутри пустых кавычек и нажмем правую кнопку мыши. В контекстном меню выберем пункт "Конструктор форматной строки". Этот инструмент позволяет визуально выбрать нужный вариант представления даты, а система сама сгенерирует правильный код. Это исключает опечатки в кавычках или регистрах символов.
Иногда данные из запроса приходят уже в строковом виде. В этом случае функция Формат() не сработает, так как она предназначена только для типов Дата или Число. Выясним, как поступить в такой ситуации.
Если мы уверены, что строка всегда имеет стандартный вид (например, "2023-05-10 00:00:00"), мы можем применить функции работы со строками, чтобы "отрезать" лишнее время:
// Берем первые 10 символов строки (ГГГГ.ММ.ДД)
ДатаСтрокой = ДанныеФизическогоЛица[0].ДатаРождения;
ДанныеПечати.Вставить("ДатаРождения", Лев(ДатаСтрокой, 10));
Однако этот метод считается "плохим тоном" в разработке на 1С. Правильнее будет сначала преобразовать строку в дату, а затем применить стандартное форматирование:
ТекущаяДата = Дата(ДанныеФизическогоЛица[0].ДатаРождения);
ДанныеПечати.Вставить("ДатаРождения", Формат(ТекущаяДата, "ДЛФ=Д"));
Часто вместе с датами в печатных формах требуется выводить денежные суммы прописью. Для этого в 1С используется функция ЧислоПрописью(). Рассмотрим пример её реализации, который часто требуется в дополнение к кадровым документам в ЗУП:
СуммаОклада = 55000.50;
ПараметрыПредмета = "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2";
Результат = ЧислоПрописью(СуммаОклада, "Л = ru_RU", ПараметрыПредмета);
// Результат: "Пятьдесят пять тысяч рублей пятьдесят копеек"
ДанныеПечати.Вставить("ОкладПрописью", Результат);
Здесь важно правильно указать ПараметрыПредмета. Это строка, в которой через запятую перечисляются наименования целой и дробной частей в разных склонениях, их род (м — мужской, ж — женский) и количество знаков после запятой.
Подводя итог, можно сказать, что для решения проблемы вывода времени в датах в ЗУП 3.1 наиболее эффективным является сочетание программного форматирования через Формат(Дата, "ДЛФ=Д") и внимательного контроля типа данных (Дата или Строка) в исходной выборке. Это гарантирует корректное отображение документов вне зависимости от настроек макета или региональных параметров системы.