Как убрать время из даты документа-основания при формировании строки печатной формы в 1С?

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

При выводе данных о документе-основании (например, о счете на оплату) в печатную форму часто требуется получить представление вида «По счёту № 123 от 15 января 2024 г.». Однако разработчики регулярно сталкиваются с ситуацией, когда вместе с датой выводится время создания документа (например, 15.01.2024 14:30:00), несмотря на использование форматной строки ДФ.

Рассмотрим причины такого поведения платформы 1С:Предприятие и разберем по шагам, как правильно написать BSL-код для вывода красивой даты без времени.

Выясним причину проблемы

В исходном коде частая ошибка заключается в том, что функция Формат() применяется напрямую к ссылке на документ:


// Ошибка: передается ссылка на документ
ТекСч = Формат(СведенияОДокументе.ДокументОснование, "ДФ='дд ММММ гггг'");

Особенность работы платформы 1С заключается в следующем: форматный параметр ДФ предназначен исключительно для значений типа Дата. Если в функцию Формат() передать объект типа ДокументСсылка, платформа игнорирует конструкцию ДФ и приводит ссылку к её стандартному строковому представлению, в которое включены и номер, и полная дата с временем.

Решение проблемы в коде BSL

Чтобы убрать время, необходимо передавать в функцию Формат() именно реквизит Дата документа, а номер и текстовый префикс объединять с помощью конкатенации строк.

Разберем рабочий вариант кода:


ТекСч = "По счёту № " + СведенияОДокументе.ДокументОснование.Номер 
      + " от " + Формат(СведенияОДокументе.ДокументОснование.Дата, "ДФ='дд ММММ гггг'");

Разберем подробнее, как работают отдельные элементы этой конструкции:

  1. СведенияОДокументе.ДокументОснование.Номер — получает номер документа-основания.
  2. СведенияОДокументе.ДокументОснование.Дата — обращается к конкретному реквизиту даты имеющему тип Дата.
  3. "ДФ='дд ММММ гггг'" — спецификатор формата. Вывод дд обеспечивает двузначный день, ММММ выводит полное название месяца в правильном родительном падеже (например, «января»), а гггг выводит четырехзначный год.

Важные рекомендации и оптимизация кода

Для создания надежного и производительного кода при формировании печатных форм проанализируем дополнительные нюансы:

1. Оптимизация запросов (избавление от обращений через точку)
Обращение вида СведенияОДокументе.ДокументОснование.Дата в BSL-коде вызывает неявный запрос к базе данных. При массовом формировании печатных форм это может вызывать задержки. Правильным подходом является получение реквизитов Номер и Дата непосредственно в исходном запросе, сформировавшем структуру СведенияОДокументе.

2. Проверка заполнения ссылки
Чтобы избежать ошибок обращения к несуществующему объекту, перед обращением к реквизитам следует проверять заполнение основания с помощью функции ЗначениеЗаполнено():


Если ЗначениеЗаполнено(СведенияОДокументе.ДокументОснование) Тогда
    ДатаДокумента = СведенияОДокументе.ДокументОснование.Дата;
    НомерДокумента = СведенияОДокументе.ДокументОснование.Номер;
    ТекСч = "По счёту № " + НомерДокумента + " от " + Формат(ДатаДокумента, "ДФ='дд ММММ гггг'");
КонецЕсли;

3. Удаление префиксов из номера
Стандартный номер документа в 1С часто содержит лидирующие нули и префиксы организации (например, 00БП-000123). Чтобы на печать выводился понятный номер 123, используйте функции Библиотеки Стандартных Подсистем (БСП):


НомерНаПечать = ПрефиксацияОбъектовКлиентСервер.УдалитьПрефиксыИзНомераКода(НомерДокумента);

Альтернативный вариант: форматирование прямо в макете

Сформировать нужный формат можно без лишнего BSL-кода, настроив сам макет табличного документа:

  1. Установите для ячейки макета тип заполнения Шаблон.
  2. В тексте ячейки укажите выражение в квадратных скобках: По счёту № [НомерОснования] от [ДатаОснования; ДФ='дд ММММ гггг'].
  3. В BSL-коде передайте в параметры области макета отдельные значения НомерОснования и ДатаОснования. Платформа самостоятельно отформатирует дату при подстановке.
← На главную