Как в 1С вывести сумму прописью на казахском языке?

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет
← На главную

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

Проанализируем ситуацию: нам нужна функция, которая на вход получает числовое значение (например, 1523.55) и возвращает строку на казахском языке («бір мың бес жүз жиырма үш теңге елу бес тиын»). Выясним, существуют ли стандартные механизмы в типовых конфигурациях и разберем готовый код универсальной функции, которую можно встроить в любую систему.

Способ 1: Использование штатных функций типовых конфигураций для Казахстана

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

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

Посмотрим на пример ее использования:


// Пример вызова стандартной функции из конфигурации "Бухгалтерия для Казахстана"
СуммаДокумента = 12345.67;
ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("398"); // KZT

// Вызываем функцию, передавая сумму, валюту и код языка
СуммаПрописьюНаКазахском = ОбщегоНазначенияКаз.СформироватьСуммуПрописью(СуммаДокумента, ВалютаДокумента, "kz_KZ");

Сообщить(СуммаПрописьюНаКазахском);
// Результат: он екі мың үш жүз қырық бес теңге алпыс жеті тиын

Преимущества этого способа:

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

Способ 2: Универсальная функция для любой конфигурации

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

Полный код функции:


Функция СуммаПрописьюКаз(Сумма) Экспорт
	
	Разряд = Новый Массив(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]; // "екі жүз"
		КонецЕсли;
	КонецЕсли;
	
	СуммаПрописью = СуммаПрописью + Десятки[Дес] + Единицы[Ед];
	
	Возврат СуммаПрописью;

КонецФункции

Анализ алгоритма работы функции

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

  1. Инициализация массивов. В начале функции создаются массивы, которые служат словарями для перевода цифр в слова: Единицы (бір, екі, ...), Десятки (он, жиырма, ...), Сотни (жүз) и Разряд (мың, миллион, ...).

  2. Разделение суммы. Входное число Сумма разделяется на целую часть (тенге) и дробную (тиыны) с помощью функций Цел() и Окр().

  3. Основной цикл обработки целой части. Цикл Пока ЦелаяЧасть > 0 обрабатывает число справа налево, по три цифры за раз. Оператор % 1000 (остаток от деления на 1000) выделяет последнюю триаду. Например, из числа 123456 сначала будет выделено 456, а на следующей итерации — 123.

  4. Преобразование триады в текст. За это отвечает вспомогательная функция РазложитьТрехзначное. Она получает число от 1 до 999 и, используя "словари", формирует его текстовое представление. Например, для числа 456 она вернет строку " төрт жүз елу алты".

  5. Сборка итоговой строки. Результат работы РазложитьТрехзначное объединяется с названием разряда ( " мың", " миллион" и т.д.) и добавляется в начало итоговой строки. Таким образом, строка "собирается" справа налево, что обеспечивает правильный порядок слов.

  6. Добавление валюты и дробной части. После обработки целой части к результату добавляется слово "теңге". Дробная часть (тиыны) просто форматируется как двузначное число и добавляется в конец строки вместе со словом "тиын".

  7. Финальное форматирование. В конце первая буква строки делается заглавной, и результат возвращается.

Как использовать эту функцию в своей конфигурации?

Рассмотрим по шагам, как добавить и начать использовать эту функцию в вашей программе 1С.

  1. Создайте общий модуль. В дереве конфигурации найдите ветку "Общие" -> "Общие модули". Создайте новый модуль, например, с именем РаботаСоСтрокамиКаз.

  2. Настройте свойства модуля. Установите для нового модуля следующие флаги: Сервер, Вызов сервера, Клиент (обычное приложение). Это обеспечит доступность функции как на сервере, так и на клиенте.

  3. Скопируйте код. Вставьте в созданный модуль полный текст обеих функций: СуммаПрописьюКаз и РазложитьТрехзначное. Убедитесь, что у основной функции СуммаПрописьюКаз есть ключевое слово Экспорт, чтобы ее можно было вызывать из других мест конфигурации.

  4. Вызывайте функцию в коде. Теперь вы можете обращаться к этой функции из любого места, где требуется получить сумму прописью. Например, при формировании печатной формы документа:

    
    // Фрагмент кода из модуля объекта или модуля менеджера документа
    Процедура Печать(ТабДокумент, Ссылка)
        
        Макет = ПолучитьМакет("МойМакет");
        ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
        
        // Получаем сумму из данных документа
        СуммаДокумента = Ссылка.СуммаДокумента;
        
        // Вызываем нашу новую функцию
        ОбластьШапка.Параметры.СуммаПрописью = РаботаСоСтрокамиКаз.СуммаПрописьюКаз(СуммаДокумента);
        
        ТабДокумент.Вывести(ОбластьШапка);
        
    КонецПроцедуры
    

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

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

← На главную