При разработке печатных форм (актов, договоров, доверенностей) часто возникает задача вывести дату не в цифровом формате, а прописью. При этом, согласно требованиям делопроизводства, такая фраза часто должна начинаться с большой буквы. В этой статье мы подробно разберем, как реализовать этот функционал в 1С:Предприятие 8, используя стандартные механизмы и функции строковой обработки.
Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), задача значительно упрощается. В программном интерфейсе БСП существует готовая функция ДатаПрописью, которая берет на себя всю логику преобразования даты в строку.
Рассмотрим базовый пример вызова этой функции:
ДатаСтрокой = ОбщегоНазначения.ДатаПрописью(СсылкаНаОбъект.Дата);
// Результат будет: "первое января две тысячи двадцать четвертого года"
Эта функция возвращает результат в именительном падеже и в нижнем регистре. Однако, для печатной формы нам часто требуется вариант "Первое января...".
В языке 1С нет встроенной функции, которая делает заглавной только первую букву строки (аналог ucfirst в некоторых других языках). Поэтому мы воспользуемся комбинацией строковых функций: ВРег (Верхний регистр), Лев (взять символы слева) и Сред (взять подстроку из середины).
Разберем логику по шагам:
Лев(Строка, 1).ВРег().Сред(Строка, 2).Посмотрим на пример кода, который объединяет эти действия:
ТекстДаты = ОбщегоНазначения.ДатаПрописью(СсылкаНаОбъект.Дата);
Результат = ВРег(Лев(ТекстДаты, 1)) + Сред(ТекстДаты, 2);
Проанализируем распространенную ошибку начинающих разработчиков, когда тяжелая функция вызывается несколько раз в одной строке. Рассмотрим неоптимальный вариант:
// НЕПРАВИЛЬНО (низкая производительность)
Область.Параметры.Дата = ВРег(Лев(ОбщегоНазначения.ДатаПрописью(Дата), 1)) + Сред(ОбщегоНазначения.ДатаПрописью(Дата), 2);
В данном примере функция ДатаПрописью будет выполнена дважды. Это создает лишнюю нагрузку на сервер, особенно если печатная форма формируется для большого списка документов. Правильным подходом будет использование промежуточной переменной, как показано в предыдущем разделе.
В процессе обсуждения на форумах часто всплывает функция ТРег (Титульный регистр). Она переводит первую букву каждого слова в строке в верхний регистр. Выясним, почему это не подходит для нашей задачи:
// Если использовать ТРег
ДатаТРег = ТРег("первое января две тысячи двадцать четвертого года");
// Результат: "Первое Января Две Тысячи Двадцать Четвертого Года"
Такой формат написания даты противоречит правилам русского языка. Согласно нормам, с большой буквы пишется только первое слово предложения (если остальные не являются именами собственными). Поэтому использование Лев и Сред остается единственно верным техническим решением.
При работе с датами важно помнить о "пустых" значениях. Если в функцию ДатаПрописью передать пустую дату, она может вернуть пустую строку или вызвать исключение в зависимости от версии БСП. Проанализируем, как защитить наш код:
Если ЗначениеЗаполнено(СсылкаНаОбъект.Дата) Тогда
ТекстДаты = ОбщегоНазначения.ДатаПрописью(СсылкаНаОбъект.Дата);
Если Не ПустаяСтрока(ТекстДаты) Тогда
Область.Параметры.Дата = ВРег(Лев(ТекстДаты, 1)) + Сред(ТекстДаты, 2);
КонецЕсли;
Иначе
Область.Параметры.Дата = "";
КонецЕсли;
Если вам не нужно полное словесное описание (например, "Первое"), а достаточно формата "01 января 2024 г.", лучше использовать встроенную функцию Формат с кодом ДФ. Чтобы сделать месяц с большой буквы, применяется та же логика преобразования первого символа:
// Формируем дату вида "01 Января 2024 г."
ТекстДаты = Формат(СсылкаНаОбъект.Дата, "ДФ='дд ММММ гггг ""г.""'");
// Месяц в формате ММММ может вернуться с маленькой буквы
// Применяем преобразование:
Результат = ВРег(Лев(ТекстДаты, 1)) + Сред(ТекстДаты, 2);
Важно учитывать, что функция ДатаПрописью из стандартной БСП обычно возвращает дату в именительном падеже ("Первое января..."). В текстах договоров часто требуется родительный падеж ("...от Первого января...").
Для решения этой задачи можно воспользоваться функцией СклонениеПредложений.Просклонять() (также входит в БСП), либо разработать собственную вспомогательную функцию, которая будет заменять окончания в строке прописи. Однако в большинстве случаев для печатных форм актов достаточно базового варианта в именительном падеже.
Таким образом, мы рассмотрели наиболее эффективный и правильный способ вывода даты словами в 1С. Использование штатных функций БСП в сочетании с грамотной обработкой строк позволяет быстро и качественно решать задачи по оформлению печатных форм любой сложности.