При разработке интерфейсов и отчетов в 1С часто возникает задача вывода даты или периода в удобном для пользователя виде. Например, вместо сухой даты 01.05.2023 мы хотим видеть «Май 2023 г.». В системе 1С:Предприятие для этих целей существует мощный инструмент — функция ПредставлениеПериода(). Разберем подробно, как с ней работать, какие ошибки часто совершают новички и как создать универсальную функцию для форматирования.
Рассмотрим типичную ситуацию, с которой сталкиваются новички при изучении программирования на 1С. Основная сложность заключается в смешивании типов данных. Посмотрим на пример кода, который часто приводит к ошибкам:
Функция МояДата(ВыводимДату)
Если ДатаНачала = ТекДата Тогда
ДатаНачала = НачалоДня(Формат(ТекДата, "ДЛФ=ДД"));
КонецЕсли;
// ...
КонецФункции
В данном фрагменте кода кроется критическая ошибка. Функция Формат() всегда возвращает значение типа Строка. В то же время функции НачалоДня(), НачалоМесяца() или ДатаНачала() ожидают на вход параметр типа Дата. Попытка передать строку в функцию обработки даты приведет к ошибке выполнения. Кроме того, переменная ТекДата внутри функции будет недоступна, если она не передана как параметр или не определена глобально.
Функция ПредставлениеПериода() — это «интеллектуальный» механизм глобального контекста. В отличие от жесткой маски функции Формат(), она анализирует переданный интервал и самостоятельно подбирает наиболее подходящее текстовое описание. Проанализируем правильный подход к решению задачи:
Разберем рабочий пример кода, который преобразует текущую дату в название месяца и года:
ТекДата = ТекущаяДата();
НачДата = НачалоМесяца(ТекДата);
КонДата = КонецМесяца(ТекДата);
РезультатТекст = ПредставлениеПериода(НачДата, КонДата, "ФП = Истина");
Сообщить(РезультатТекст); // Выведет, например: "Май 2019 г."
В этом примере мы сначала получаем границы полного месяца с помощью НачалоМесяца() и КонецМесяца(), а затем передаем их функции. Параметр "ФП = Истина" (Полный Период) гарантирует, что система постарается вывести максимально подробное описание.
Для того чтобы использовать этот механизм многократно, логично вынести логику в отдельную функцию. Посмотрим на итоговое решение, которое позволяет передать любую дату и получить её красивое представление:
Процедура ПриНачалеРаботыСистемы()
ТекДата = ТекущаяДата();
// Вызываем нашу функцию
ТекстовоеЗначение = ПолучитьТекстПериода(ТекДата);
Сообщить("Текущий месяц: " + ТекстовоеЗначение);
КонецПроцедуры
Функция ПолучитьТекстПериода(ВхДата)
// Определяем границы месяца для переданной даты
НачалоПериода = НачалоМесяца(ВхДата);
КонецПериода = КонецМесяца(ВхДата);
// Формируем строковое представление
// Добавление пустой строки "" + гарантирует приведение к типу Строка
Результат = "" + ПредставлениеПериода(НачалоПериода, КонецПериода, "ФП = Истина");
Возврат Результат;
КонецФункции
Многие программисты задаются вопросом: зачем использовать сложную функцию, если можно применить Формат(Дата, "ДФ='ММММ гггг'")? Проанализируем ситуацию подробнее:
Функция Формат() работает по жесткой маске. Если вы укажете вывод месяца, она всегда будет выводить месяц, даже если в интервале всего два дня. Это может ввести пользователя в заблуждение.
Функция ПредставлениеПериода() обладает встроенной логикой:
Это делает ПредставлениеПериода() незаменимой для финансовых отчетов и динамических заголовков, где важно соблюдать точность терминологии.
Рассмотрим продвинутые возможности функции, которые помогут сделать ваши приложения еще более профессиональными:
ПредставлениеПериода(Д1, Д2, "Л=en_US") вернет «January 2023» вместо «Январь 2023 г.». Это критически важно для международных компаний.'00010101'), функция сформирует текст «с ...» или «по ...». Рассмотрим пример:
// Период без ограничения окончания
Текст = ПредставлениеПериода(ТекущаяДата(), '00010101', "ФП = Истина");
// Вернет: "с 22.05.2019"
Таким образом, использование ПредставлениеПериода() является стандартом качественной разработки в 1С. Она обеспечивает правильное склонение (именительный падеж), автоматическое определение типа периода (месяц, квартал, год) и легко подстраивается под языковые настройки системы.