При выводе данных о документе-основании (например, о счете на оплату) в печатную форму часто требуется получить представление вида «По счёту № 123 от 15 января 2024 г.». Однако разработчики регулярно сталкиваются с ситуацией, когда вместе с датой выводится время создания документа (например, 15.01.2024 14:30:00), несмотря на использование форматной строки ДФ.
Рассмотрим причины такого поведения платформы 1С:Предприятие и разберем по шагам, как правильно написать BSL-код для вывода красивой даты без времени.
В исходном коде частая ошибка заключается в том, что функция Формат() применяется напрямую к ссылке на документ:
// Ошибка: передается ссылка на документ
ТекСч = Формат(СведенияОДокументе.ДокументОснование, "ДФ='дд ММММ гггг'");
Особенность работы платформы 1С заключается в следующем: форматный параметр ДФ предназначен исключительно для значений типа Дата. Если в функцию Формат() передать объект типа ДокументСсылка, платформа игнорирует конструкцию ДФ и приводит ссылку к её стандартному строковому представлению, в которое включены и номер, и полная дата с временем.
Чтобы убрать время, необходимо передавать в функцию Формат() именно реквизит Дата документа, а номер и текстовый префикс объединять с помощью конкатенации строк.
Разберем рабочий вариант кода:
ТекСч = "По счёту № " + СведенияОДокументе.ДокументОснование.Номер
+ " от " + Формат(СведенияОДокументе.ДокументОснование.Дата, "ДФ='дд ММММ гггг'");
Разберем подробнее, как работают отдельные элементы этой конструкции:
СведенияОДокументе.ДокументОснование.Номер — получает номер документа-основания.СведенияОДокументе.ДокументОснование.Дата — обращается к конкретному реквизиту даты имеющему тип Дата."ДФ='дд ММММ гггг'" — спецификатор формата. Вывод дд обеспечивает двузначный день, ММММ выводит полное название месяца в правильном родительном падеже (например, «января»), а гггг выводит четырехзначный год.Для создания надежного и производительного кода при формировании печатных форм проанализируем дополнительные нюансы:
1. Оптимизация запросов (избавление от обращений через точку)
Обращение вида СведенияОДокументе.ДокументОснование.Дата в BSL-коде вызывает неявный запрос к базе данных. При массовом формировании печатных форм это может вызывать задержки. Правильным подходом является получение реквизитов Номер и Дата непосредственно в исходном запросе, сформировавшем структуру СведенияОДокументе.
2. Проверка заполнения ссылки
Чтобы избежать ошибок обращения к несуществующему объекту, перед обращением к реквизитам следует проверять заполнение основания с помощью функции ЗначениеЗаполнено():
Если ЗначениеЗаполнено(СведенияОДокументе.ДокументОснование) Тогда
ДатаДокумента = СведенияОДокументе.ДокументОснование.Дата;
НомерДокумента = СведенияОДокументе.ДокументОснование.Номер;
ТекСч = "По счёту № " + НомерДокумента + " от " + Формат(ДатаДокумента, "ДФ='дд ММММ гггг'");
КонецЕсли;
3. Удаление префиксов из номера
Стандартный номер документа в 1С часто содержит лидирующие нули и префиксы организации (например, 00БП-000123). Чтобы на печать выводился понятный номер 123, используйте функции Библиотеки Стандартных Подсистем (БСП):
НомерНаПечать = ПрефиксацияОбъектовКлиентСервер.УдалитьПрефиксыИзНомераКода(НомерДокумента);
Сформировать нужный формат можно без лишнего BSL-кода, настроив сам макет табличного документа:
По счёту № [НомерОснования] от [ДатаОснования; ДФ='дд ММММ гггг'].НомерОснования и ДатаОснования. Платформа самостоятельно отформатирует дату при подстановке.