При формировании печатных форм и отчетов в 1С:Предприятие часто возникает задача вывода периода, за который сформированы данные. На первый взгляд задача кажется простой — достаточно соединить строки. Однако на практике разработчики сталкиваются с проблемами некорректного отображения времени (например, 00:00:00), неудобным представлением дат или сложностями при работе с макетами. Разберем по шагам, как профессионально решить эту задачу, используя различные методы платформы 1С.
Рассмотрим ситуацию, когда в макете (MXL) создана область "Заголовок" и в ней определен параметр Заголовок. Самая распространенная ошибка начинающих разработчиков — попытка сложить дату со строкой напрямую. В этом случае 1С автоматически преобразует дату в строку системного формата, которая включает в себя время. Чтобы этого избежать, проанализируем использование функции Формат().
Функция Формат() позволяет превратить дату в строку нужного нам вида. Для вывода дат в отчетах чаще всего используются коды ДФ=dd.MM.yyyy (для краткой даты) или ДЛФ=DD (для даты прописью). Выясним причину, почему это лучше простого преобразования: мы полностью контролируем визуальный ряд, исключая лишние секунды и минуты.
Рассмотрим пример кода для формирования заголовка:
// Получаем область макета
Заг = Макет.ПолучитьОбласть("Заголовок");
// Формируем текстовую строку с использованием форматирования
ТекстЗаголовка = "Отчет по резервам РЦ за период с "
+ Формат(ДатаНач, "ДФ=dd.MM.yyyy")
+ " по "
+ Формат(ДатаКон, "ДФ=dd.MM.yyyy") + ".";
// Устанавливаем значение параметра
Заг.Параметры.Заголовок = ТекстЗаголовка;
В данном примере мы используем переменную ДатаНач и ДатаКон. Важно помнить, что если вы работаете в модуле формы, обращаться к ним следует напрямую, не используя конструкцию ЭлементыФормы.ИмяРеквизита.Значение. Это делает код более чистым и производительным.
Проанализируем более элегантный способ, который предоставляет платформа 1С — функцию ПредставлениеПериода(). Этот метод идеально подходит для заголовков, так как он автоматически обрабатывает различные варианты дат. Например, если даты начала и конца совпадают, функция выведет одну дату. Если период охватывает ровно месяц — она напишет название месяца и год.
Рассмотрим, как это реализовать в коде:
// Формируем красивое представление периода
// Л=ru_RU указывает на использование русской локализации
СтрокаПериода = ПредставлениеПериода(ДатаНач, ДатаКон, "Л=ru_RU");
Заг = Макет.ПолучитьОбласть("Заголовок");
Заг.Параметры.Заголовок = "Отчет по резервам РЦ за " + СтрокаПериода;
Этот метод считается предпочтительным для "красивых" отчетов, так как платформа сама берет на себя склонение слов и форматирование интервалов. Пользователю гораздо приятнее видеть надпись "Январь 2024", чем "с 01.01.2024 по 31.01.2024".
Выясним, как можно упростить программный код, перенеся логику формирования строки непосредственно в макет. В редакторе табличного документа (макета) у каждой ячейки есть свойство "Заполнение". По умолчанию там стоит "Текст". Если мы переключим его на "Шаблон", мы сможем писать текст вперемешку с параметрами.
Разберем алгоритм настройки макета:
Отчет по резервам за период с [ДатаНач] по [ДатаКон].Теперь посмотрим на пример кода, который будет заполнять такой шаблон:
Заг = Макет.ПолучитьОбласть("Заголовок");
// Передаем отформатированные даты напрямую в параметры шаблона
Заг.Параметры.ДатаНач = Формат(ДатаНач, "ДФ=dd.MM.yyyy");
Заг.Параметры.ДатаКон = Формат(ДатаКон, "ДФ=dd.MM.yyyy");
// Выводим область в табличный документ
ТабДок.Вывести(Заг);
Использование шаблонов позволяет избежать громоздких конструкций вида "Текст" + Переменная + "Текст" в программном коде. Это значительно облегчает чтение кода и последующую поддержку отчета другими программистами.
В ходе обсуждения на форуме возник вопрос: "а зачем через элементы формы добираться?". Это критически важный момент для качества кода. В 1С:Предприятии (особенно в обычных формах) начинающие программисты часто пишут ЭлементыФормы.ДатаНач.Значение. Посмотрим, почему это плохая практика:
ЭлементыФормы перестанет работать, и такой код придется переписывать целиком.Поэтому правильным подходом будет использование имен реквизитов формы или объекта напрямую: просто ДатаНач.
Проанализируем ситуацию, когда одна из дат может быть не заполнена. В 1С пустая дата — это '00010101000000'. Если вывести ее через Формат(), пользователь увидит 01.01.0001, что выглядит непрофессионально.
Рассмотрим пример правильной обработки таких случаев перед выводом в заголовок:
Если ЗначениеЗаполнено(ДатаНач) И ЗначениеЗаполнено(ДатаКон) Тогда
ТекстПериода = ПредставлениеПериода(ДатаНач, ДатаКон);
ИначеЕсли ЗначениеЗаполнено(ДатаНач) Тогда
ТекстПериода = "начиная с " + Формат(ДатаНач, "ДФ=dd.MM.yyyy");
ИначеЕсли ЗначениеЗаполнено(ДатаКон) Тогда
ТекстПериода = "по " + Формат(ДатаКон, "ДФ=dd.MM.yyyy");
Иначе
ТекстПериода = "за весь период";
КонецЕсли;
Заг.Параметры.Заголовок = "Отчет по резервам РЦ " + ТекстПериода;
Такой подход гарантирует, что заголовок вашего отчета всегда будет выглядеть корректно и понятно для конечного пользователя, независимо от того, какие фильтры он установил на форме.