Как вывести дату словами в 1С и сделать первую букву заглавной?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке печатных форм (актов, договоров, доверенностей) часто возникает задача вывести дату не в цифровом формате, а прописью. При этом, согласно требованиям делопроизводства, такая фраза часто должна начинаться с большой буквы. В этой статье мы подробно разберем, как реализовать этот функционал в 1С:Предприятие 8, используя стандартные механизмы и функции строковой обработки.

Использование стандартной функции Библиотеки стандартных подсистем (БСП)

Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), задача значительно упрощается. В программном интерфейсе БСП существует готовая функция ДатаПрописью, которая берет на себя всю логику преобразования даты в строку.

Рассмотрим базовый пример вызова этой функции:


ДатаСтрокой = ОбщегоНазначения.ДатаПрописью(СсылкаНаОбъект.Дата);
// Результат будет: "первое января две тысячи двадцать четвертого года"

Эта функция возвращает результат в именительном падеже и в нижнем регистре. Однако, для печатной формы нам часто требуется вариант "Первое января...".

Как сделать первую букву заглавной

В языке 1С нет встроенной функции, которая делает заглавной только первую букву строки (аналог ucfirst в некоторых других языках). Поэтому мы воспользуемся комбинацией строковых функций: ВРег (Верхний регистр), Лев (взять символы слева) и Сред (взять подстроку из середины).

Разберем логику по шагам:

  1. Выделяем первый символ строки с помощью функции Лев(Строка, 1).
  2. Преобразуем этот символ в верхний регистр функцией ВРег().
  3. Берем оставшуюся часть строки, начиная со второго символа, используя функцию Сред(Строка, 2).
  4. Соединяем (конкатенируем) полученные части.

Посмотрим на пример кода, который объединяет эти действия:


ТекстДаты = ОбщегоНазначения.ДатаПрописью(СсылкаНаОбъект.Дата);
Результат = ВРег(Лев(ТекстДаты, 1)) + Сред(ТекстДаты, 2);

Оптимизация кода: избегаем двойных вызовов

Проанализируем распространенную ошибку начинающих разработчиков, когда тяжелая функция вызывается несколько раз в одной строке. Рассмотрим неоптимальный вариант:


// НЕПРАВИЛЬНО (низкая производительность)
Область.Параметры.Дата = ВРег(Лев(ОбщегоНазначения.ДатаПрописью(Дата), 1)) + Сред(ОбщегоНазначения.ДатаПрописью(Дата), 2);

В данном примере функция ДатаПрописью будет выполнена дважды. Это создает лишнюю нагрузку на сервер, особенно если печатная форма формируется для большого списка документов. Правильным подходом будет использование промежуточной переменной, как показано в предыдущем разделе.

Почему не подходит функция ТРег()?

В процессе обсуждения на форумах часто всплывает функция ТРег (Титульный регистр). Она переводит первую букву каждого слова в строке в верхний регистр. Выясним, почему это не подходит для нашей задачи:


// Если использовать ТРег
ДатаТРег = ТРег("первое января две тысячи двадцать четвертого года");
// Результат: "Первое Января Две Тысячи Двадцать Четвертого Года"

Такой формат написания даты противоречит правилам русского языка. Согласно нормам, с большой буквы пишется только первое слово предложения (если остальные не являются именами собственными). Поэтому использование Лев и Сред остается единственно верным техническим решением.

Обработка исключительных ситуаций

При работе с датами важно помнить о "пустых" значениях. Если в функцию ДатаПрописью передать пустую дату, она может вернуть пустую строку или вызвать исключение в зависимости от версии БСП. Проанализируем, как защитить наш код:


Если ЗначениеЗаполнено(СсылкаНаОбъект.Дата) Тогда
    ТекстДаты = ОбщегоНазначения.ДатаПрописью(СсылкаНаОбъект.Дата);
    Если Не ПустаяСтрока(ТекстДаты) Тогда
        Область.Параметры.Дата = ВРег(Лев(ТекстДаты, 1)) + Сред(ТекстДаты, 2);
    КонецЕсли;
Иначе
    Область.Параметры.Дата = "";
КонецЕсли;

Альтернативный вариант: Использование функции Формат()

Если вам не нужно полное словесное описание (например, "Первое"), а достаточно формата "01 января 2024 г.", лучше использовать встроенную функцию Формат с кодом ДФ. Чтобы сделать месяц с большой буквы, применяется та же логика преобразования первого символа:


// Формируем дату вида "01 Января 2024 г."
ТекстДаты = Формат(СсылкаНаОбъект.Дата, "ДФ='дд ММММ гггг ""г.""'");
// Месяц в формате ММММ может вернуться с маленькой буквы
// Применяем преобразование:
Результат = ВРег(Лев(ТекстДаты, 1)) + Сред(ТекстДаты, 2);

Работа с падежами (Склонение)

Важно учитывать, что функция ДатаПрописью из стандартной БСП обычно возвращает дату в именительном падеже ("Первое января..."). В текстах договоров часто требуется родительный падеж ("...от Первого января...").

Для решения этой задачи можно воспользоваться функцией СклонениеПредложений.Просклонять() (также входит в БСП), либо разработать собственную вспомогательную функцию, которая будет заменять окончания в строке прописи. Однако в большинстве случаев для печатных форм актов достаточно базового варианта в именительном падеже.

Таким образом, мы рассмотрели наиболее эффективный и правильный способ вывода даты словами в 1С. Использование штатных функций БСП в сочетании с грамотной обработкой строк позволяет быстро и качественно решать задачи по оформлению печатных форм любой сложности.

← На главную