Работа с временными метками является фундаментальной частью разработки любых учетных систем на платформе 1С:Предприятие. Часто перед разработчиком встает задача не просто сохранить дату документа, а представить её пользователю в специфическом виде, например, месяц и год для периодических отчетов или печатных форм. Стандартное отображение даты включает день, месяц, год и время, что не всегда удобно для восприятия агрегированных данных.
Для решения этой проблемы платформа предоставляет мощный механизм форматирования строк. Понимание того, как работает форматная строка и какие параметры она принимает, позволяет гибко управлять выводом информации. В этой статье мы детально разберем, как сконструировать вывод даты исключительно в формате «Месяц Год», избежав лишних символов и ошибок локализации.
Неправильная настройка формата может привести к тому, что вместо ожидаемого «Январь 2026» пользователь увидит техническое описание типа даты или дату в американском формате. Поэтому важно строго соблюдать синтаксис функции Формат и понимать различия между режимами отображения.
Синтаксис функции Формат и параметр ДФ
Основным инструментом преобразования значений типа Дата в строку является встроенная функция Формат. Она принимает два аргумента: само значение и строку описания формата. Именно второй аргумент определяет, как именно будет выглядеть результат. Для работы с датами ключевым параметром строки формата является ДФ (Дата Формат).
Параметр ДФ принимает строку-шаблон, состоящую из специальных символов-заполнителей. Каждый символ отвечает за определенную часть даты: год, месяц, день, час или минуту. Комбинируя эти символы, можно получить практически любой вариант отображения.
⚠️ Внимание: Использование неверных символов в параметре ДФ приведет к тому, что функция вернет пустую строку или выдаст ошибку выполнения. Всегда проверяйте синтаксис в справке по встроенному языку.
Для получения формата «Месяц Год» нам необходимо использовать комбинацию символов, отвечающих за полное название месяца и четырехзначный год. В платформе 1С за полный текстовый месяц отвечает символ М в определенном контексте или сочетание MMMM, а за год — YYYY. Однако, платформа также поддерживает локализацию, которая автоматически подставит название месяца на языке интерфейса пользователя.
Всегда передавайте в функцию Формат значение именно типа Дата. Если вы передадите строку, форматирование не сработает так, как ожидается.
Рассмотрим базовый пример построения строки формата. Если мы хотим увидеть «Январь 2026», шаблон должен выглядеть как "ДФ=MMMM YYYY". Платформа автоматически определит язык настроек пользователя и подставит соответствующее название месяца. Это критически важно для мультиязычных конфигураций, где один и тот же код должен работать и для русскоязычного, и для англоязычного интерфейса.
Коды месяцев и лет в форматной строке
Глубокое понимание кодов форматной строки позволяет управлять не только наличием месяца и года, но и их представлением. Вы можете выбрать между числовым отображением (01, 1) и текстовым (Январь, Jan). Для задачи «Месяц Год» текстовое представление обычно является приоритетным, так как оно более читаемо для человека в заголовках отчетов.
Символ M отвечает за месяц. Количество повторений этого символа влияет на вывод:
- 📅
M— номер месяца без ведущего нуля (1, 2.., 12). - 📅
MM— номер месяца с ведущим нулем (01, 02.., 12). - 📅
MMM— сокращенное название месяца (Янв, Фев, Мар). - 📅
MMMM— полное название месяца (Январь, Февраль, Март).
Аналогичная логика применяется к году. Символ Y (или Г в некоторых локалях, но Y универсальнее) управляет выводом года. Для формата «Месяц Год» нам почти всегда требуется четырехзначный год, чтобы избежать путаницы между веками. Использование YY может сократить год до двух знаков (24 вместо 2026), что не рекомендуется для официальной отчетности.
Таким образом, идеальная строка формата для нашей задачи выглядит так: "ДФ=MMMM YYYY". Обратите внимание на пробел между кодами месяца и года. Любой символ, не являющийся кодом формата (например, пробел, точка, дефис), выводится в результирующую строку как есть. Это позволяет легко менять разделители, например, на дефис: "ДФ=MMMM-YYYY".
Примеры кода на встроенном языке 1С
Рассмотрим практическое применение полученных знаний в коде модуля объекта или обработки. Предположим, у нас есть переменная ДатаДокумента, и нам нужно вывести период в виде строки для заголовка печатной формы. Мы используем функцию Формат непосредственно в месте вывода или при подготовке данных.
Вот пример корректного использования в коде:
ДатаОтчета = ТекущаяДата;
СтрокаПериода = Формат(ДатаОтчета,"ДФ=MMMM YYYY");
Сообщить(СтрокаПериода); // Выведет, например:"Октябрь 2023"
Если вам требуется более сложная логика, например, добавление префикса «Период:», это можно сделать конкатенацией строк или включением текста прямо в форматную строку. Однако, для надежности лучше использовать конкатенацию, чтобы избежать конфликтов с спецсимволами.
Также стоит упомянуть о функции НачалоПериода и КонецПериода. Часто формат «Месяц Год» используется для обозначения всего месяца. В таких случаях программисты часто берут дату начала месяца и форматируют её. Это гарантирует, что даже если дата равна 31 числу, название месяца останется верным.
☑️ Проверка форматирования даты
Особенности локализации и языка интерфейса
Одним из главных преимуществ платформы 1С:Предприятие является встроенная поддержка многоязычности. Функция форматирования автоматически учитывает язык, выбранный пользователем в настройках клиента. Если пользователь работает в английском интерфейсе, код MMMM вернет «October», а в русском — «Октябрь».
Это избавляет разработчика от необходимости писать громоздкие конструкции с условиями Если.. Тогда.. Иначе для определения языка. Вы пишете код один раз, и система сама адаптирует вывод. Это особенно важно для международных компаний, использующих единую базу данных.
Тем не менее, существуют ситуации, когда требуется жестко задать язык вывода, независимо от настроек пользователя. Например, при выгрузке данных в внешний файл, который будет обрабатываться системой, ожидающей только английский язык. В таких случаях используется параметр ЛФ (Язык Формата) в строке формата.
Пример принудительного указания английского языка:
Дата = ТекущаяДата;
// Принудительный вывод на английском, даже если у пользователя русский интерфейс
СтрокаEn = Формат(Дата,"ДФ=MMMM YYYY; ЛФ=en");
Сообщить(СтрокаEn); // Выведет:"October 2023"
⚠️ Внимание: Коды языков (en, ru, de и т.д.) должны быть указаны в нижнем регистре. Использование заглавных букв в параметре ЛФ может привести к игнорированию параметра.
Использование параметра ЛФ дает полный контроль над представлением данных, но требует осторожности. Убедитесь, что целевая система действительно ожидает данные на указанном языке, иначе могут возникнуть ошибки парсинга на стороне получателя.
Использование в запросах и СКД
Форматирование даты часто требуется не только в коде модулей, но и непосредственно в запросах к базе данных или в настройках Системы Компоновки Данных (СКД). В языке запросов 1С функция ФОРМАТ работает аналогично встроенному языку, позволяя формировать нужные представления прямо на уровне выборки данных.
В тексте запроса это выглядит следующим образом:
ВЫБРАТЬ
Документ.Ссылка,
ФОРМАТ(Документ.Дата,"ДФ=MMMM YYYY") КАК Период
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
Такой подход позволяет сразу получить готовые данные для отчета, не нагружая код обработки дополнительными циклами преобразования. В СКД настройка формата производится через окно редактирования поля. В свойствах поля в разделе «Форматная строка» необходимо указать тот же шаблон: ДФ=MMMM YYYY.
При использовании в СКД важно учитывать тип поля. Если поле имеет тип Дата, форматирование применится корректно. Если же тип поля Строка, а в него записана дата, функция форматирования может не сработать ожидаемым образом, так как она ожидает типизированное значение.
Почему в запросе формат возвращает пустоту?
Если в запросе поле имеет тип Неопределено или строка, функция ФОРМАТ может не сработать. Убедитесь, что исходное поле имеет тип Дата.
Частые ошибки и способы их решения
Несмотря на простоту синтаксиса, разработчики часто допускают типовые ошибки при работе с датами. Самая распространенная из них — попытка форматировать значение, которое уже является строкой. Функция Формат предназначена для преобразования типов Число, Дата, Булево и других примитивных типов в строку. Если передать ей строку, она просто вернет её обратно без изменений.
Еще одна ошибка связана с использованием устаревших или неверных кодов. В ранних версиях платформы синтаксис мог отличаться, но в современных релизах (8.3 и выше) стандартом является использование английских обозначений (M, Y, D, H). Использование русских букв (М, Г, Д) в параметре ДФ возможно, но менее универсально и может зависеть от конкретной локали системы.
Также стоит обратить внимание на экранирование спецсимволов. Если вы хотите вывести букву, которая совпадает с кодом формата (например, букву «М» в тексте «Мой отчет за» перед датой), её нужно взять в кавычки или использовать символ-разделитель, который не интерпретируется как код. Но в простом случае «Месяц Год» это не требуется, так как пробел является безопасным разделителем.
Ниже приведена таблица соответствия кодов для быстрой проверки:
| Код | Описание | Пример вывода |
|---|---|---|
M |
Номер месяца (1-12) | 5 |
MM |
Номер месяца с нулем (01-12) | 05 |
MMM |
Краткое имя месяца | Май |
MMMM |
Полное имя месяца | Май |
YYYY |
Четырехзначный год | 2026 |
Для формата «Месяц Год» всегда используйте связку кодов MMMM YYYY. Это гарантирует полное название месяца и четырехзначный год в любой локали.
Вопросы и ответы (FAQ)
Как получить формат «Месяц Год» на английском языке?
Для этого нужно добавить параметр ЛФ=en в строку формата. Пример: Формат(Дата,"ДФ=MMMM YYYY; ЛФ=en"). Это принудительно установит английский язык для вывода месяца независимо от настроек пользователя.
Почему вместо названия месяца выводится номер?
Скорее всего, вы использовали код MM вместо MMMM. Код MM отвечает за двузначный номер месяца (01, 02..). Для текстового названия необходимо использовать три или четыре буквы M (MMM или MMMM).
Можно ли использовать этот формат в макетах печатных форм?
Да, в макетах (табличный документ или область) можно использовать функцию Формат в выражениях полей. Синтаксис остается тем же: ДФ=MMMM YYYY. Это стандартная функция встроенного языка, доступная во всех подсистемах.
Как добавить слово"год" после цифры?
Вы можете добавить слово"год" прямо в строку формата, так как обычный текст выводится как есть. Пример: "ДФ=MMMM YYYY'год'". Кавычки внутри строки формата могут потребовать экранирования, поэтому проще сделать конкатенацию: Формат(Дата,"ДФ=MMMM YYYY") +" год".