При формировании документов, таких как договоры, акты или счета, часто возникает необходимость выводить сумму не только числом, но и прописью, особенно если используется вывод в Word. Стандартная задача усложняется, когда требуется специфический формат, например, рубли прописью должны находиться в скобках, а копейки — числом, вне скобок, с при этом правильным склонением слова "копеек" в зависимости от их количества (например, "01 копейка", "02 копейки", "10 копеек"). Мы рассмотрим, как реализовать такой механизм в 1С, используя встроенные функции и небольшой вспомогательный алгоритм. Для настройки результата будет полезна инструкция по редактированию печатных форм.
Стандартная функция ЧислоПрописью() в 1С, хотя и очень мощная, не всегда позволяет получить именно такой формат напрямую. Обычно она выводит сумму целиком одной строкой, например, "Пятнадцать тысяч рублей 00 копеек", где копейки также прописываются или включаются в общую пропись. Наша задача требует более детального контроля над выводом каждой части суммы.
Для достижения желаемого формата "15000 (Пятнадцать тысяч рублей) 00 копеек" нам потребуется разделить исходное число на две части: целую (рубли) и дробную (копейки), а затем обработать каждую часть отдельно. Рассмотрим этот процесс по шагам.
ЧислоПрописью()Прежде чем приступать к разделению, давайте еще раз вспомним возможности функции ЧислоПрописью(). Это наша основная функция для преобразования чисел в текстовую форму. Она имеет следующий синтаксис:
ЧислоПрописью(<Число>, <ФорматнаяСтрока>, <ПараметрыПредметаИсчисления>)
Разберем ее параметры подробнее:
<Число>: Это обязательный параметр, представляющий собой числовое значение, которое мы хотим преобразовать.<ФорматнаяСтрока>: Необязательный строковый параметр, задающий параметры форматирования.
Л=ru_RU (или L=ru_RU): Указывает код локализации для русского языка.ДП=Истина (или FS=Истина): Определяет, нужно ли выводить дробную часть прописью. Если этот параметр Ложь или отсутствует, дробная часть может быть выведена числом или опущена в зависимости от других настроек.НП=Истина (или SN=Истина): Указывает, нужно ли включать название предмета исчисления (например, "рублей").<ПараметрыПредметаИсчисления>: Необязательный строковый параметр, который позволяет указать склонения для целой и дробной части числа. Это ключевой параметр для нашей задачи. Он содержит:
м - мужской, ж - женский).Пример для российских рублей: "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2". Последняя цифра 2 указывает на два разряда дробной части (копеек). Если мы укажем 0 вместо 2, копейки не будут прописываться функцией ЧислоПрописью(), что нам и нужно для рублей.
Понимая это, мы можем приступить к следующему шагу.
Первым делом, нам нужно извлечь целую и дробную части из общей суммы. Допустим, исходное число хранится в переменной СуммаНаФорме (например, 15000.00 или 123.45).
Цел().Пример:
СуммаНаФорме = 15000.00; // Исходная сумма
Рубли = Цел(СуммаНаФорме); // Получаем целую часть (15000)
Копейки = Окр((СуммаНаФорме - Рубли) * 100, 0); // Получаем копейки как целое число (0)
// Для суммы 123.45:
// Рубли = Цел(123.45) = 123
// Копейки = Окр((123.45 - 123) * 100, 0) = Окр(0.45 * 100, 0) = 45
Обратите внимание на использование функции Окр() при расчете копеек. Это важно для предотвращения проблем с точностью вычислений с плавающей точкой, которые могут возникнуть в 1С при работе с дробными числами.
Теперь, когда у нас есть целая часть суммы, мы можем преобразовать ее в прописную форму. Здесь критически важно, чтобы функция ЧислоПрописью() не добавляла копейки. Мы можем это контролировать с помощью параметра <ПараметрыПредметаИсчисления>, указав 0 в качестве количества знаков дробной части.
Пример:
РублиПрописью = ЧислоПрописью(Рубли, "Л = ru_RU", "рубль, рубля, рублей, м, , , , , 0");
// В этом примере мы явно указываем '0' для количества знаков дробной части.
// Также можно опустить параметры для дробной части, если они не нужны вовсе:
// РублиПрописью = ЧислоПрописью(Рубли, "Л = ru_RU", "рубль, рубля, рублей, м");
В результате переменная РублиПрописью будет содержать, например, "Пятнадцать тысяч рублей".
Копейки мы должны вывести числом, но с обязательным дополнением нулем спереди, если их меньше 10 (например, "01", "05", "12"). Для этого идеально подходит функция Формат().
Пример:
КопейкиЧислом = Формат(Копейки, "ЧЦ=2; ЧДЦ=0; ЧН=00");
// "ЧЦ=2" - минимальная ширина числа 2 знака.
// "ЧДЦ=0" - отсутствие дробной части.
// "ЧН=00" - дополнять нулями слева до 2 знаков.
Таким образом, для 0 копеек мы получим "00", для 5 копеек — "05", для 12 копеек — "12".
Это один из ключевых моментов, который часто вызывает затруднения, как показал автор в сообщении 9. Необходимо, чтобы слово "копейка" склонялось в зависимости от количества копеек: "01 копейка", "02 копейки", "10 копеек". В 1С нет встроенной функции для общего склонения слов по числам, поэтому мы создадим свою вспомогательную функцию.
Мы предлагаем универсальную функцию ФормаМножественногоЧисла, которую можно поместить в общий модуль и использовать в различных местах конфигурации.
// Функция для склонения существительных по числу
// Параметры:
// Слово1 - форма для 1 (например, "копейка")
// Слово2 - форма для 2-4 (например, "копейки")
// Слово3 - форма для 0, 5-9, 11-19 (например, "копеек")
// ЦелоеЧисло - число, к которому склоняем
// Возвращает: правильную форму слова
Функция ФормаМножественногоЧисла(Слово1, Слово2, Слово3, Знач ЦелоеЧисло) Экспорт
Если ТипЗнч(ЦелоеЧисло) <> Тип("Число") Тогда
Возврат Слово3; // Или генерировать ошибку, в зависимости от требований
КонецЕсли;
Если ЦелоеЧисло < 0 Тогда
ЦелоеЧисло = -1 * ЦелоеЧисло; // Работаем с абсолютным значением
КонецЕсли;
// Если число не целое, или мы не можем его однозначно склонить,
// используем форму множественного числа. Это упрощение,
// в реальных задачах можно обработать более детально.
Если ЦелоеЧисло <> Цел(ЦелоеЧисло) Тогда
Возврат Слово2;
КонецЕсли;
// Специальное правило для чисел 11-19 (второй десяток),
// для которых всегда используется третья форма.
// Например, "11 копеек", "15 копеек", "19 копеек".
Если (ЦелоеЧисло >= 11) И (ЦелоеЧисло <= 19) Тогда
Возврат Слово3;
КонецЕсли;
// Определяем остаток от деления на 10 для определения окончания
Остаток = ЦелоеЧисло % 10;
Если Остаток = 1 Тогда
Возврат Слово1; // Например, "1 копейка"
ИначеЕсли (Остаток >= 2) И (Остаток <= 4) Тогда
Возврат Слово2; // Например, "2 копейки", "4 копейки"
Иначе
Возврат Слово3; // Например, "0 копеек", "5 копеек", "10 копеек"
КонецЕсли;
КонецФункции
Использование данной функции для склонения слова "копеек":
СклонениеКопеек = ФормаМножественногоЧисла("копейка", "копейки", "копеек", Копейки);
В результате СклонениеКопеек будет содержать "копейка", "копейки" или "копеек" в зависимости от значения переменной Копейки.
Теперь, когда у нас есть все необходимые части, мы можем объединить их в требуемый формат.
ИсходноеЧислоФорматом = Формат(СуммаНаФорме, "ЧДЦ=2"); // Например, "15000,00" или "123,45"
СуммаНаФормеПрописью = ИсходноеЧислоФорматом + " (" + РублиПрописью + ") " + КопейкиЧислом + " " + СклонениеКопеек;
Эта строка будет выглядеть как "15000,00 (Пятнадцать тысяч рублей) 00 копеек" или "123,45 (Сто двадцать три рубля) 45 копеек", полностью соответствуя нашим требованиям.
Давайте соберем все фрагменты кода в единый блок для наглядности.
// Исходные данные
СуммаНаФорме = 15000.00; // Пример 1
// СуммаНаФорме = 123.45; // Пример 2
// СуммаНаФорме = 1.01; // Пример 3
// СуммаНаФорме = 2.02; // Пример 4
// СуммаНаФорме = 5.15; // Пример 5
// --- 1. Разделение суммы на рубли и копейки ---
Рубли = Цел(СуммаНаФорме);
Копейки = Окр((СуммаНаФорме - Рубли) * 100, 0);
// --- 2. Формирование прописи для рублей ---
РублиПрописью = ЧислоПрописью(Рубли, "Л = ru_RU", "рубль, рубля, рублей, м, , , , , 0");
// Параметры для копеек здесь пустые или с '0' в конце, чтобы функция не прописывала копейки
// --- 3. Форматирование копеек числом ---
КопейкиЧислом = Формат(Копейки, "ЧЦ=2; ЧДЦ=0; ЧН=00");
// --- 4. Определение правильной формы слова "копеек" ---
// Вспомогательная функция (предполагаем, что она определена в Общем Модуле
// или в текущем контексте). Приведем ее еще раз для полноты примера.
//
// Функция ФормаМножественногоЧисла(Слово1, Слово2, Слово3, Знач ЦелоеЧисло) Экспорт
// Если ТипЗнч(ЦелоеЧисло) <> Тип("Число") Тогда
// Возврат Слово3;
// КонецЕсли;
// Если ЦелоеЧисло < 0 Тогда
// ЦелоеЧисло = -1 * ЦелоеЧисло;
// КонецЕсли;
// Если ЦелоеЧисло <> Цел(ЦелоеЧисло) Тогда
// Возврат Слово2;
// КонецЕсли;
// Если (ЦелоеЧисло >= 11) И (ЦелоеЧисло <= 19) Тогда
// Возврат Слово3;
// Иначе
// Остаток = ЦелоеЧисло % 10;
// Если Остаток = 1 Тогда
// Возврат Слово1;
// ИначеЕсли (Остаток >= 2) И (Остаток <= 4) Тогда
// Возврат Слово2;
// Иначе
// Возврат Слово3;
// КонецЕсли;
// КонецЕсли;
// КонецФункции
// Вызов функции для склонения
СклонениеКопеек = ФормаМножественногоЧисла("копейка", "копейки", "копеек", Копейки);
// --- 5. Сборка итоговой строки ---
ИсходноеЧислоФорматом = Формат(СуммаНаФорме, "ЧДЦ=2"); // Форматируем числовую часть с двумя знаками после запятой
СуммаНаФормеПрописью = ИсходноеЧислоФорматом + " (" + РублиПрописью + ") " + КопейкиЧислом + " " + СклонениеКопеек;
// Выводим результат
// Сообщить(СуммаНаФормеПрописью);
// Пример 1: "15000,00 (Пятнадцать тысяч рублей) 00 копеек"
// Пример 2: "123,45 (Сто двадцать три рубля) 45 копеек"
// Пример 3: "1,01 (Один рубль) 01 копейка"
// Пример 4: "2,02 (Два рубля) 02 копейки"
// Пример 5: "5,15 (Пять рублей) 15 копеек"
В типовых конфигурациях 1С, разработанных на базе Библиотеки Стандартных Подсистем (БСП), часто предусмотрены готовые механизмы для работы с суммами прописью. Одним из таких является функция РаботаСКурсамиВалют.СформироватьСуммуПрописью(), как было упомянуто в сообщении 5. Эта функция формирует представление суммы прописью для заданной валюты.
Синтаксис этой функции:
СформироватьСуммуПрописью(СуммаЧислом, Валюта, БезДробнойЧасти = Ложь, Знач КодЯзыка = Неопределено, ДробнаяЧастьПрописью = Ложь)
Рассмотрим ее параметры:
СуммаЧислом: Числовое значение суммы.Валюта: Ссылка на элемент справочника "Валюты".БезДробнойЧасти: Если Истина, дробная часть не будет выводиться.КодЯзыка: Код языка (например, "ru" для русского).ДробнаяЧастьПрописью: Если Истина, дробная часть будет выведена прописью.Хотя эта функция очень удобна, она обычно формирует всю сумму одной строкой (например, "Сто долларов 25 центов" или "Пятнадцать тысяч рублей 00 копеек"). Чтобы получить копейки числом и вне скобок, вам, скорее всего, придется выполнить дополнительные манипуляции со строкой, полученной от этой функции, либо использовать ее только для получения части суммы, а остальное доделывать вручную по описанному выше алгоритму.
Например, вы могли бы получить рубли прописью, установив БезДробнойЧасти = Истина, а затем добавить копейки числом и склоненным словом, используя уже описанный нами механизм:
// Пример использования функции БСП (требуется подключение общих модулей)
// Предполагаем, что у нас есть переменная Валюта (ссылка на элемент справочника)
// Например, Валюта = Справочники.Валюты.НайтиПоКоду("643"); // Российский рубль
// 1. Получаем рубли прописью без копеек
РублиПрописьюБСП = РаботаСКурсамиВалют.СформироватьСуммуПрописью(Рубли, Валюта, Истина);
// 2. Далее используем тот же подход для копеек, что и выше
// (разделить на Копейки, отформатировать КопейкиЧислом, склонить СклонениеКопеек)
// ...
// СуммаНаФормеПрописьюБСП = Формат(СуммаНаФорме, "ЧДЦ=2") + " (" + РублиПрописьюБСП + ") " + КопейкиЧислом + " " + СклонениеКопеек;
Этот подход позволяет использовать стандартные механизмы БСП там, где это возможно, сокращая объем собственного кода, но при этом сохраняя гибкость для выполнения специфических требований к форматированию.
Мы подробно разобрали, как решить задачу вывода суммы прописью в 1С в нестандартном формате "15000 (Пятнадцать тысяч рублей) 00 копеек" с учетом правильного склонения слова "копеек". Ключевым моментом является разделение исходной суммы на целую и дробную части, индивидуальное форматирование каждой части с использованием функций ЧислоПрописью() и Формат(), а также применение вспомогательной функции для корректного склонения существительных по числу. Этот подход обеспечивает максимальную гибкость и точность в формировании выходной строки, полностью соответствующей требованиям документации.