В процессе разработки отчетов и печатных форм в системе 1С:Предприятие часто возникает задача вывода интервала дат в понятном человекочитаемом виде. Например, вместо двух отдельных колонок «Дата начала» и «Дата окончания» пользователю удобнее видеть одну строку вида «01.01.2024 - 31.01.2024». Несмотря на кажущуюся простоту, существует несколько способов реализации этой задачи, каждый из которых имеет свои нюансы в зависимости от того, где именно формируется строка: в запросе, в коде или в Системе компоновки данных (СКД).
В этой статье мы подробно разберем все доступные инструменты, проанализируем ситуацию с использованием функций платформы и выясним, какой метод является наиболее оптимальным для различных сценариев.
Наиболее эффективным и простым способом, который выбрал автор темы, является использование встроенной функции компоновки данных ПредставлениеПериода. Рассмотрим подробнее, как это настроить в схеме компоновки данных.
Для реализации этого метода нам необходимо выполнить следующие шаги:
ПериодСтрокой.
ПредставлениеПериода(ДатаНачала, ДатаОкончания, "ФП = Истина; ДЛФ=DD")
Разберем по шагам, что означают параметры в этой форматной строке:
Истина заставляет систему всегда выводить обе даты интервала, даже если они кратны стандартным периодам (месяцу, кварталу). Если этот параметр не указать, 1С может автоматически заменить «01.01.2024 - 31.01.2024» на строку «Январь 2024», что не всегда соответствует задаче.DD указывает на использование краткого формата даты (только числа). Если использовать D, то месяц будет выведен прописью.Преимущество этого метода заключается в том, что платформа берет на себя всю работу по локализации и форматированию, избавляя программиста от ручного склеивания строк.
Если задача стоит вне рамок СКД (например, в модуле объекта при формировании печатной формы или в обработке), мы можем воспользоваться функцией Формат. Рассмотрим ситуацию, когда нам нужно получить строку в коде 1С.
Самый простой и читаемый вариант — использование функции СтрШаблон в сочетании с Формат. Это позволяет избежать нагромождения плюсов при конкатенации строк. Посмотрим на пример:
Дата1 = '17240201'; // 01.02.1724
Дата2 = '18320525'; // 25.05.1832
ПредставлениеИнтервала = СтрШаблон("%1 - %2",
Формат(Дата1, "ДФ=dd.MM.yyyy"),
Формат(Дата2, "ДФ=dd.MM.yyyy"));
// Результат: "01.02.1724 - 25.05.1832"
Важный момент: Мы используем конструкцию ДФ=dd.MM.yyyy, чтобы гарантировать вывод дня и месяца двумя цифрами (с лидирующими нулями) и года четырьмя цифрами. Это обеспечивает единообразие отображения независимо от региональных настроек операционной системы пользователя.
В современных конфигурациях, таких как ERP, УТ 11 или БП 3.0, разработчику доступен мощный инструментарий БСП. Проанализируем возможности общего модуля СтроковыеФункцииКлиентСервер.
Часто требуется не просто вывести даты через тире, а сформировать «красивый» текст для юридических документов. В БСП существуют функции, которые позволяют склонять месяцы и грамотно оформлять интервалы. Например, использование объекта СтандартныйПериод позволяет получить представление периода одной командой:
ПериодОтчета = Новый СтандартныйПериод;
ПериодОтчета.ДатаНачала = НачалоМесяца(ТекущаяДата());
ПериодОтчета.ДатаОкончания = КонецМесяца(ТекущаяДата());
ТекстПериода = Строка(ПериодОтчета);
// Вернет, например: "Январь 2024 г." или "01.01.2024 - 31.01.2024" в зависимости от заполнения
Иногда возникают ситуации, когда данные нужно подготовить именно на уровне СУБД, не прибегая к постобработке. Однако, как верно отмечено в сообщениях форума, в языке запросов 1С отсутствует прямая функция преобразования числа в строку с форматированием. Рассмотрим, как можно обойти это ограничение, если использование СКД невозможно.
Для выделения компонентов даты и преобразования их в строку нам придется использовать конструкцию ПРЕДСТАВЛЕНИЕ или сложные математические операции. Но стоит помнить, что ПРЕДСТАВЛЕНИЕ в запросе возвращает тип Строка только при выполнении запроса в коде через Выполнить().Выгрузить(). Внутри самого SQL-запроса это поле может вести себя специфично.
Пример формирования дня с лидирующим нулем в запросе:
ВЫБОР
КОГДА ДЕНЬ(&Дата) < 10
ТОГДА "0" + ПРЕДСТАВЛЕНИЕ(ДЕНЬ(&Дата))
ИНАЧЕ ПОДСТРОКА(ПРЕДСТАВЛЕНИЕ(ДЕНЬ(&Дата)), 1, 2)
КОНЕЦ
Как мы видим, такой подход крайне громоздкий. Для получения полноценной строки «дд.мм.гггг» запрос разрастется на десятки строк. Именно поэтому опытные разработчики рекомендуют переносить вопросы представления данных на уровень СКД или программного кода.
При формировании строкового периода крайне важно предусмотреть проверку на «пустые» значения (01.01.0001). Если одна из дат не заполнена, стандартная функция ПредставлениеПериода может выдать неинтуитивный результат.
Проанализируем ситуацию в программном коде перед выводом:
Если НЕ ЗначениеЗаполнено(ДатаНачала) И НЕ ЗначениеЗаполнено(ДатаОкончания) Тогда
Результат = "Период не задан";
ИначеЕсли НЕ ЗначениеЗаполнено(ДатаНачала) Тогда
Результат = СтрШаблон "по %1", Формат(ДатаОкончания, "ДФ=dd.MM.yyyy"));
ИначеЕсли НЕ ЗначениеЗаполнено(ДатаОкончания) Тогда
Результат = СтрШаблон "с %1", Формат(ДатаНачала, "ДФ=dd.MM.yyyy"));
Иначе
Результат = ПредставлениеПериода(ДатаНачала, ДатаОкончания, "ФП=Истина");
КонецЕсли;
Такой подход делает интерфейс более дружелюбным к пользователю и исключает появление «нулевых» дат в отчетах.
Разберем еще одну частую ошибку: путаницу между представлением границ (то, что требовалось автору) и длительностью периода. Если вам нужно получить строку «3 месяца 5 дней», то вышеописанные функции не помогут. В этом случае следует использовать функцию запроса РАЗНОСТЬДАТ или программные методы расчета разницы между моментами времени с последующим вызовом функций БСП для склонения существительных.
Подводя итог, можно сказать: если вы работаете в СКД — используйте ПредставлениеПериода. Если в коде — Формат или СтрШаблон. Старайтесь избегать формирования строк дат непосредственно в текстах запросов, так как это усложняет поддержку кода и снижает его производительность.