При настройке автоматического формирования рабочих наименований номенклатуры или характеристик по шаблону в программах семейства «1С:Предприятие 8» (например, в «1С:ERP», «1С:Управление торговлей» или «1С:Комплексная автоматизация») пользователи часто сталкиваются с неприятной особенностью. Дополнительный реквизит с типом Число (например, длина в мм, объем или артикул), который в карточке отображается корректно и без пробелов, при подстановке в шаблон наименования внезапно разделяется на триады. Например, вместо ожидаемого значения «Кабель 1200мм» система генерирует наименование «Кабель 1 200мм».
В этой статье мы подробно разберем, почему платформа 1С ведет себя подобным образом, проанализируем техническую суть проблемы и рассмотрим четыре практических способа ее решения — от настройки формул в режиме пользователя до создания программного расширения.
Для начала проанализируем ситуацию с технической точки зрения. Когда мы настраиваем дополнительный реквизит в режиме предприятия и указываем в его формате строку ЧГ=0 (или отключаем группировку в конструкторе формата), эта настройка влияет исключительно на отображение поля в экранных формах ввода. Сама база данных продолжает хранить обычное числовое значение.
При формировании рабочего наименования по шаблону система выполняет следующие действия:
123456).Посмотрим, какими путями мы можем обойти это поведение платформы и добиться желаемого результата.
Это самый простой, надежный и штатный способ, не требующий изменения конфигурации или кода. Редактор шаблонов наименований в типовых конфигурациях 1С поддерживает использование встроенных функций платформы, включая функцию Формат().
Чтобы вывести дополнительный реквизит типа Число без разделения триад, нам достаточно явно переопределить формат вывода в формуле шаблона. Рассмотрим подробнее синтаксис написания такой формулы.
Обычный вывод реквизита выглядит так:
[ДопРеквизит.Длина]
Чтобы отключить группировку триад, нам нужно обернуть этот реквизит в функцию форматирования:
[Формат(ДопРеквизит.Длина, "ЧГ=0")]
Важный нюанс: при использовании параметра ЧГ=0 платформа при значении реквизита, равном нулю, может вернуть пустую строку вместо символа «0». Чтобы шаблон формировался корректно даже при нулевых значениях, обязательно добавляйте параметр представления нуля ЧН=0. Итоговая формула в шаблоне должна выглядеть следующим образом:
[Формат(ДопРеквизит.Длина, "ЧГ=0; ЧН=0")]
Этот метод полностью решает проблему, работает на уровне конкретного шаблона и не затрагивает другие объекты системы.
Если вы не хотите прописывать сложные формулы форматирования в каждом шаблоне, можно изменить тип данных самого дополнительного реквизита в его карточке с Число на Строка. Текстовые значения подставляются в любые шаблоны «как есть», без применения каких-либо региональных настроек и разделения пробелами.
Однако перед тем, как выбрать этот вариант, обязательно проанализируйте возможные ограничения:
Таким образом, данный способ подходит только для тех реквизитов, по которым никогда не планируется осуществлять математический анализ и сортировку в отчетах.
Если в вашей базе настроено множество шаблонов и ручное прописывание функции Формат() для каждого числового свойства кажется вам трудоемким процессом, можно автоматизировать эту задачу. Для этого доработаем конфигурацию через механизм расширений так, чтобы система сама считывала формат из карточки свойства и применяла его при генерации наименования.
Проанализируем алгоритм работы такого расширения:
Номенклатура и ХарактеристикиНоменклатуры).ФорматСвойства из плана видов характеристик ДополнительныеРеквизитыИСведения.ЧГ=0), мы применяем его к числу программно перед подстановкой в текст наименования.Пример реализации программного кода в расширении для общего модуля БСП может выглядеть следующим образом:
&ВОбходе
Функция Расш1_ПолучитьЗначениеСвойстваДляНаименования(Свойство, ИсходноеЗначение)
// Проверяем, что свойство имеет числовой тип
Если Свойство.ТипЗначения.СодержитТип(Тип("Число")) Тогда
// Получаем строку формата, заданную пользователем в режиме Предприятия
СтрокаФормата = Свойство.ФорматСвойства;
Если Не ПустаяСтрока(СтрокаФормата) Тогда
// Применяем пользовательский формат к значению свойства
Возврат Формат(ИсходноеЗначение, СтрокаФормата);
КонецЕсли;
КонецЕсли;
// Если формат не задан, возвращаем стандартную обработку
Возврат ПродолжитьВызов(Свойство, ИсходноеЗначение);
КонецФункции
Данный подход решает проблему глобально для всей базы: один раз настроив формат отображения в карточке дополнительного реквизита, вы гарантируете его автоматическое применение во всех шаблонах рабочих наименований.
В настройках системы существует возможность глобально отключить группировку триад для всех чисел в сеансе. Для этого необходимо перейти в раздел Администрирование — Региональные установки информационной базы и снять флаг Использовать региональные установки текущего сеанса, настроив формат чисел вручную.
Внимание! Мы настоятельно не рекомендуем использовать этот способ! Если вы отключите группировку триад на уровне всей базы данных, эти изменения затронут абсолютно все объекты системы:
Региональные настройки должны обеспечивать комфортное чтение больших чисел во всей системе, поэтому менять их ради локальной задачи формирования одного наименования категорически нельзя.
Подведем итог нашего анализа и выберем оптимальный вариант действий:
[Формат(ИмяРеквизита, "ЧГ=0; ЧН=0")] в шаблоне наименования является лучшей стандартной практикой.