При настройке генерации рабочего наименования номенклатуры в конфигурациях 1С часто возникает задача привести числовое значение к строго фиксированному строковому формату. Рассмотрим распространенный кейс: в карточке товара длина реквизита вводится в метрах, но в наименовании её необходимо отражать в дециметрах (умножением на 10) и всегда приводить к длине в 4 символа с лидирующими нулями (например, 5 м = 50 дм -> 0050, а 152 м = 1520 дм -> 1520).
Разберем, как реализовать подобную логику средствами встроенного языка 1С и типового редактора шаблонов наименования.
В типовых конфигурациях (1С:ERP, 1С:Управление торговлей, 1С:Комплексная автоматизация) шаблон наименования настраивается в карточке вида номенклатуры с помощью встроенного редактора выражений. В нем нельзя использовать сложные многострочные функции из внешних модулей, но можно применять базовые математические операции и стандартную функцию Формат().
Проанализируем составление нужного выражения по шагам:
10.Формат() со специальными управляющими параметрами format-строки:
ЧЦ=4 — задает общее число отображаемых цифр (целой части);ЧВН= — включает вывод ведущих (лидирующих) нулей;ЧГ=0 — отключает группировку разрядов (чтобы не появлялись пробелы-разделители тысяч).Итоговая формула для редактора шаблонов наименования будет выглядеть следующим образом:
Формат([{ДР.Длина}] * 10, "ЧЦ=4; ЧВН=; ЧГ=0")
Важное условие: Дополнительный реквизит Длина в базе должен иметь числовой тип данных. Если реквизит создан с типом Строка, оператор умножения вызовет ошибку при вычислении шаблона.
Если в процессе работы возможен ввод незаполненной длины или дробных чисел, рассмотрим дополнительные нюансы форматирования:
0000 для товаров без указанной длины, в шаблоне можно применить условие:
?(ЗначениеЗаполнено([{ДР.Длина}]), Формат([{ДР.Длина}] * 10, "ЧЦ=4; ЧВН=; ЧГ=0"), "")
15.2 * 10 получается ровно 152, что в формате выведет 0152. Если же числа могут содержать больше знаков после запятой, рекомендуется использовать явную функцию Окр().Если задача решается в коде модуля формы, обработчике проведения или в доработке на встроенном языке 1С, вызов функции Формат() выполняется аналогично:
ИсходнаяДлинаМетры = 15.2;
ДлинаДециметры = ИсходнаяДлинаМетры * 10;
СформированнаяСтрока = Формат(ДлинаДециметры, "ЧЦ=4; ЧВН=; ЧГ=0");
// Результат: "0152"
Также в качестве альтернативного (алгоритмического) варианта формирования строки с лидирующими нулями можно написать собственную универсальную функцию с применением конкатенации и расчета недостающих символов:
Функция ДобавитьНули(Значение, НужнаяДлинаЗначения)
ЗначениеСтр = СтрЗаменить(Формат(Значение, "ЧГ=0"), " ", "");
НадоНулей = НужнаяДлинаЗначения - СтрДлина(ЗначениеСтр);
Если НадоНулей > 0 Тогда
ВедущиеНули = Формат(0, "ЧЦ=" + НадоНулей + "; ЧН=; ЧВН=; ЧГ=0");
Возврат ВедущиеНули + ЗначениеСтр;
Иначе
Возврат ЗначениеСтр;
КонецЕсли;
КонецФункции
Посмотрим на задачи проектирования структуры данных под аналогичные требования:
0050, 0100, 0152), и в шаблоне не требуется делать вычисления.Число. Тогда в шаблоне отпадает необходимость умножать число на 10, достаточно оставить только форматирование строки.