Как правильно передать и отформатировать период в заголовке отчета 1С

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

При формировании печатных форм и отчетов в 1С:Предприятие часто возникает задача вывода периода, за который сформированы данные. На первый взгляд задача кажется простой — достаточно соединить строки. Однако на практике разработчики сталкиваются с проблемами некорректного отображения времени (например, 00:00:00), неудобным представлением дат или сложностями при работе с макетами. Разберем по шагам, как профессионально решить эту задачу, используя различные методы платформы 1С.

Метод 1: Прямая передача в параметр макета с форматированием

Рассмотрим ситуацию, когда в макете (MXL) создана область "Заголовок" и в ней определен параметр Заголовок. Самая распространенная ошибка начинающих разработчиков — попытка сложить дату со строкой напрямую. В этом случае 1С автоматически преобразует дату в строку системного формата, которая включает в себя время. Чтобы этого избежать, проанализируем использование функции Формат().

Функция Формат() позволяет превратить дату в строку нужного нам вида. Для вывода дат в отчетах чаще всего используются коды ДФ=dd.MM.yyyy (для краткой даты) или ДЛФ=DD (для даты прописью). Выясним причину, почему это лучше простого преобразования: мы полностью контролируем визуальный ряд, исключая лишние секунды и минуты.

Рассмотрим пример кода для формирования заголовка:


// Получаем область макета
Заг = Макет.ПолучитьОбласть("Заголовок");

// Формируем текстовую строку с использованием форматирования
ТекстЗаголовка = "Отчет по резервам РЦ за период с " 
               + Формат(ДатаНач, "ДФ=dd.MM.yyyy") 
               + " по " 
               + Формат(ДатаКон, "ДФ=dd.MM.yyyy") + ".";

// Устанавливаем значение параметра
Заг.Параметры.Заголовок = ТекстЗаголовка;

В данном примере мы используем переменную ДатаНач и ДатаКон. Важно помнить, что если вы работаете в модуле формы, обращаться к ним следует напрямую, не используя конструкцию ЭлементыФормы.ИмяРеквизита.Значение. Это делает код более чистым и производительным.

Метод 2: Использование встроенной функции ПредставлениеПериода

Проанализируем более элегантный способ, который предоставляет платформа 1С — функцию ПредставлениеПериода(). Этот метод идеально подходит для заголовков, так как он автоматически обрабатывает различные варианты дат. Например, если даты начала и конца совпадают, функция выведет одну дату. Если период охватывает ровно месяц — она напишет название месяца и год.

Рассмотрим, как это реализовать в коде:


// Формируем красивое представление периода
// Л=ru_RU указывает на использование русской локализации
СтрокаПериода = ПредставлениеПериода(ДатаНач, ДатаКон, "Л=ru_RU");

Заг = Макет.ПолучитьОбласть("Заголовок");
Заг.Параметры.Заголовок = "Отчет по резервам РЦ за " + СтрокаПериода;

Этот метод считается предпочтительным для "красивых" отчетов, так как платформа сама берет на себя склонение слов и форматирование интервалов. Пользователю гораздо приятнее видеть надпись "Январь 2024", чем "с 01.01.2024 по 31.01.2024".

Метод 3: Использование типа ячейки "Шаблон" в макете

Выясним, как можно упростить программный код, перенеся логику формирования строки непосредственно в макет. В редакторе табличного документа (макета) у каждой ячейки есть свойство "Заполнение". По умолчанию там стоит "Текст". Если мы переключим его на "Шаблон", мы сможем писать текст вперемешку с параметрами.

Разберем алгоритм настройки макета:

  1. Откройте макет отчета.
  2. В нужной ячейке напишите текст: Отчет по резервам за период с [ДатаНач] по [ДатаКон].
  3. В свойствах этой ячейки установите значение Заполнение: Шаблон.
  4. Обратите внимание, что имена в квадратных скобках автоматически станут параметрами этой области.

Теперь посмотрим на пример кода, который будет заполнять такой шаблон:


Заг = Макет.ПолучитьОбласть("Заголовок");

// Передаем отформатированные даты напрямую в параметры шаблона
Заг.Параметры.ДатаНач = Формат(ДатаНач, "ДФ=dd.MM.yyyy");
Заг.Параметры.ДатаКон = Формат(ДатаКон, "ДФ=dd.MM.yyyy");

// Выводим область в табличный документ
ТабДок.Вывести(Заг);

Использование шаблонов позволяет избежать громоздких конструкций вида "Текст" + Переменная + "Текст" в программном коде. Это значительно облегчает чтение кода и последующую поддержку отчета другими программистами.

Важные замечания по работе с данными формы

В ходе обсуждения на форуме возник вопрос: "а зачем через элементы формы добираться?". Это критически важный момент для качества кода. В 1С:Предприятии (особенно в обычных формах) начинающие программисты часто пишут ЭлементыФормы.ДатаНач.Значение. Посмотрим, почему это плохая практика:

Поэтому правильным подходом будет использование имен реквизитов формы или объекта напрямую: просто ДатаНач.

Обработка пустых или неопределенных дат

Проанализируем ситуацию, когда одна из дат может быть не заполнена. В 1С пустая дата — это '00010101000000'. Если вывести ее через Формат(), пользователь увидит 01.01.0001, что выглядит непрофессионально.

Рассмотрим пример правильной обработки таких случаев перед выводом в заголовок:


Если ЗначениеЗаполнено(ДатаНач) И ЗначениеЗаполнено(ДатаКон) Тогда
    ТекстПериода = ПредставлениеПериода(ДатаНач, ДатаКон);
ИначеЕсли ЗначениеЗаполнено(ДатаНач) Тогда
    ТекстПериода = "начиная с " + Формат(ДатаНач, "ДФ=dd.MM.yyyy");
ИначеЕсли ЗначениеЗаполнено(ДатаКон) Тогда
    ТекстПериода = "по " + Формат(ДатаКон, "ДФ=dd.MM.yyyy");
Иначе
    ТекстПериода = "за весь период";
КонецЕсли;

Заг.Параметры.Заголовок = "Отчет по резервам РЦ " + ТекстПериода;

Такой подход гарантирует, что заголовок вашего отчета всегда будет выглядеть корректно и понятно для конечного пользователя, независимо от того, какие фильтры он установил на форме.

← На главную