При работе с документами в 1С для Казахстана часто возникает задача вывода денежной суммы в текстовом виде, то есть прописью, на государственном языке. Стандартная функция платформы 1С ЧислоПрописью() корректно работает только для русского языка. Это создает проблему при формировании печатных форм счетов-фактур, актов выполненных работ, накладных и других документов, где требуется текстовое представление суммы. Рассмотрим, как решить эту задачу.
Проанализируем ситуацию: нам нужна функция, которая на вход получает числовое значение (например, 1523.55) и возвращает строку на казахском языке («бір мың бес жүз жиырма үш теңге елу бес тиын»). Выясним, существуют ли стандартные механизмы в типовых конфигурациях и разберем готовый код универсальной функции, которую можно встроить в любую систему.
Прежде чем писать собственный код, всегда стоит проверить возможности вашей конфигурации. В современных типовых решениях от 1С для Казахстана (например, "Бухгалтерия для Казахстана", "Управление торговлей для Казахстана") уже есть встроенные функции для решения этой задачи. Обычно они находятся в общих модулях, предназначенных для локализации.
Рекомендуемый подход — использовать функцию СформироватьСуммуПрописью из общего модуля ОбщегоНазначенияКаз. Она более гибкая и учитывает множество нюансов, включая правильные падежи и названия валют.
Посмотрим на пример ее использования:
// Пример вызова стандартной функции из конфигурации "Бухгалтерия для Казахстана"
СуммаДокумента = 12345.67;
ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("398"); // KZT
// Вызываем функцию, передавая сумму, валюту и код языка
СуммаПрописьюНаКазахском = ОбщегоНазначенияКаз.СформироватьСуммуПрописью(СуммаДокумента, ВалютаДокумента, "kz_KZ");
Сообщить(СуммаПрописьюНаКазахском);
// Результат: он екі мың үш жүз қырық бес теңге алпыс жеті тиын
Преимущества этого способа:
Если вы работаете с нетиповой, сильно измененной или устаревшей конфигурацией, где таких функций нет, потребуется универсальное решение. Рассмотрим его далее.
Если в вашей системе нет встроенных средств, можно добавить собственную функцию. Проанализируем готовый код, который решает эту задачу и может быть легко интегрирован в любой общий модуль.
Полный код функции:
Функция СуммаПрописьюКаз(Сумма) Экспорт
Разряд = Новый Массив(5);
Разряд[1] = "";
Разряд[2] = " мың";
Разряд[3] = " миллион";
Разряд[4] = " миллиард";
Единицы = Новый Массив(10);
Единицы[0] = "";
Единицы[1] = " бір";
Единицы[2] = " екі";
Единицы[3] = " үш";
Единицы[4] = " төрт";
Единицы[5] = " бес";
Единицы[6] = " алты";
Единицы[7] = " жеті";
Единицы[8] = " сегіз";
Единицы[9] = " тоғыз";
Десятки = Новый Массив(10);
Десятки[0] = "";
Десятки[1] = " он";
Десятки[2] = " жиырма";
Десятки[3] = " отыз";
Десятки[4] = " қырық";
Десятки[5] = " елу";
Десятки[6] = " алпыс";
Десятки[7] = " жетпіс";
Десятки[8] = " сексен";
Десятки[9] = " тоқсан";
Сотни = Новый Массив(2);
Сотни[0] = "";
Сотни[1] = " жүз";
СуммаПрописью = "";
ЦелаяЧасть = Цел(Сумма);
ДробнаяЧасть = Окр(Сумма - ЦелаяЧасть, 2) * 100;
// Обработка целой части (тенге)
Если ЦелаяЧасть = 0 Тогда
СуммаПрописью = "нөл";
Иначе
ПорядковыйНомер = 1;
Пока ЦелаяЧасть > 0 Цикл
Трехзначное = ЦелаяЧасть % 1000;
СуммаПрописью = РазложитьТрехзначное(Трехзначное, Единицы, Десятки, Сотни) + Разряд[ПорядковыйНомер] + СуммаПрописью;
ЦелаяЧасть = Цел(ЦелаяЧасть/1000);
ПорядковыйНомер = ПорядковыйНомер + 1;
КонецЦикла;
КонецЕсли;
СуммаПрописью = СуммаПрописью + " теңге";
// Обработка дробной части (тиыны)
ТиыныПрописью = Формат(ДробнаяЧасть, "ЧЦ=2; ЧН=00");
СуммаПрописью = СуммаПрописью + " " + ТиыныПрописью + " тиын";
// Убираем лишние пробелы в начале и делаем первую букву заглавной
Возврат ВРег(Лев(СуммаПрописью,1)) + Сред(СуммаПрописью,2);
КонецФункции
Функция РазложитьТрехзначное(Число, Единицы, Десятки, Сотни)
СуммаПрописью = "";
Если Число = 0 Тогда
Возврат "";
КонецЕсли;
// Разбираем число на сотни, десятки и единицы
Ед = Число % 10;
Дес = (Цел(Число/10)) % 10;
Сот = Цел(Число/100);
// Формируем строку
Если Сот > 0 Тогда
Если Сот = 1 Тогда
СуммаПрописью = Сотни[1]; // "жүз"
Иначе
СуммаПрописью = Единицы[Сот] + Сотни[1]; // "екі жүз"
КонецЕсли;
КонецЕсли;
СуммаПрописью = СуммаПрописью + Десятки[Дес] + Единицы[Ед];
Возврат СуммаПрописью;
КонецФункции
Чтобы лучше понять, как работает этот код, разберем его логику по шагам. Основной принцип — это разбор числа на группы по три цифры (триады) и их последовательное преобразование в текст.
Инициализация массивов. В начале функции создаются массивы, которые служат словарями для перевода цифр в слова: Единицы (бір, екі, ...), Десятки (он, жиырма, ...), Сотни (жүз) и Разряд (мың, миллион, ...).
Разделение суммы. Входное число Сумма разделяется на целую часть (тенге) и дробную (тиыны) с помощью функций Цел() и Окр().
Основной цикл обработки целой части. Цикл Пока ЦелаяЧасть > 0 обрабатывает число справа налево, по три цифры за раз. Оператор % 1000 (остаток от деления на 1000) выделяет последнюю триаду. Например, из числа 123456 сначала будет выделено 456, а на следующей итерации — 123.
Преобразование триады в текст. За это отвечает вспомогательная функция РазложитьТрехзначное. Она получает число от 1 до 999 и, используя "словари", формирует его текстовое представление. Например, для числа 456 она вернет строку " төрт жүз елу алты".
Сборка итоговой строки. Результат работы РазложитьТрехзначное объединяется с названием разряда ( " мың", " миллион" и т.д.) и добавляется в начало итоговой строки. Таким образом, строка "собирается" справа налево, что обеспечивает правильный порядок слов.
Добавление валюты и дробной части. После обработки целой части к результату добавляется слово "теңге". Дробная часть (тиыны) просто форматируется как двузначное число и добавляется в конец строки вместе со словом "тиын".
Финальное форматирование. В конце первая буква строки делается заглавной, и результат возвращается.
Рассмотрим по шагам, как добавить и начать использовать эту функцию в вашей программе 1С.
Создайте общий модуль. В дереве конфигурации найдите ветку "Общие" -> "Общие модули". Создайте новый модуль, например, с именем РаботаСоСтрокамиКаз.
Настройте свойства модуля. Установите для нового модуля следующие флаги: Сервер, Вызов сервера, Клиент (обычное приложение). Это обеспечит доступность функции как на сервере, так и на клиенте.
Скопируйте код. Вставьте в созданный модуль полный текст обеих функций: СуммаПрописьюКаз и РазложитьТрехзначное. Убедитесь, что у основной функции СуммаПрописьюКаз есть ключевое слово Экспорт, чтобы ее можно было вызывать из других мест конфигурации.
Вызывайте функцию в коде. Теперь вы можете обращаться к этой функции из любого места, где требуется получить сумму прописью. Например, при формировании печатной формы документа:
// Фрагмент кода из модуля объекта или модуля менеджера документа
Процедура Печать(ТабДокумент, Ссылка)
Макет = ПолучитьМакет("МойМакет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
// Получаем сумму из данных документа
СуммаДокумента = Ссылка.СуммаДокумента;
// Вызываем нашу новую функцию
ОбластьШапка.Параметры.СуммаПрописью = РаботаСоСтрокамиКаз.СуммаПрописьюКаз(СуммаДокумента);
ТабДокумент.Вывести(ОбластьШапка);
КонецПроцедуры
В этом примере результат работы функции присваивается параметру макета СуммаПрописью, который затем выводится в соответствующую ячейку печатной формы (подробнее о редактировании печатных форм читайте в инструкциях).
Таким образом, мы рассмотрели два надежных способа для вывода суммы прописью на казахском языке. Для типовых конфигураций предпочтительнее использовать встроенные функции, а для нетиповых — предложенный универсальный код, который легко встроить и адаптировать под свои нужды.