Как изменить автоматическую генерацию кодов номенклатуры с префикса 00- на префикс М в 1С:Комплексная автоматизация 2.0

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

В современных конфигурациях 1С, таких как «Комплексная автоматизация 2.0», «ERP Управление предприятием» или «Управление торговлей 11», механизм нумерации и кодирования объектов существенно усложнился по сравнению со старыми версиями платформ. Теперь за это отвечает подсистема «Префиксация объектов» из состава Библиотеки стандартных подсистем (БСП). Простого вызова метода УстановитьНовыйКод() в форме часто оказывается недостаточно, так как система игнорирует его или добавляет служебные префиксы информационной базы.

В этой статье мы подробно разберем, почему появляется префикс 00-, как от него избавиться и как реализовать собственную логику формирования кода вида М00001.

Анализируем причину появления префикса 00-

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

  1. Префикс информационной базы: Он устанавливается в настройках синхронизации данных. Если ваша база участвует в распределенной информационной базе (РИБ) или просто имеет настройки обмена, ей присваивается код (например, 00). Система добавляет его ко всем новым кодам через дефис, чтобы избежать коллизий при слиянии данных из разных узлов.
  2. Префикс организации: Если в объекте предусмотрен учет по организациям, система может добавлять еще один префикс из карточки организации.

Если мы видим код 00-М00001, это означает, что стандартный механизм БСП отработал корректно: он взял префикс узла 00, добавил разделитель - и применил ваш префикс М. Чтобы получить «чистый» код М00001, нам придется вмешаться в стандартную обработку события.

Способ 1. Использование события ПриУстановкеНовогоКода в модуле объекта

Самый надежный способ изменить логику генерации кода — это использование обработчика события ПриУстановкеНовогоКода непосредственно в модуле объекта справочника Номенклатура. Рассмотрим, как это сделать правильно, чтобы не нарушить работу системы.

Для начала проанализируем ситуацию: если мы просто напишем СтандартнаяОбработка = Ложь, нам придется самостоятельно заботиться о поиске последнего номера и контроле уникальности. Рассмотрим пример реализации:


Процедура ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс)
    
    // Указываем наш желаемый префикс
    Префикс = "М";
    
    // Если мы хотим полностью контролировать процесс и убрать "00-",
    // иногда требуется отключить стандартную логику БСП.
    // Однако в КА 2.0 лучше вклиниться в механизм префиксации.
    
КонецПроцедуры

Важно понимать, что в типовых решениях этот обработчик может вызываться несколько раз, и БСП все равно может дописать префикс базы поверх вашего. Если это происходит, необходимо использовать расширение конфигурации.

Способ 2. Использование расширения и переопределение БСП

Профессиональный подход в «1С:Комплексная автоматизация 2.0» — использование механизмов расширений. Мы можем перехватить процедуру, которая отвечает за формирование префикса. В БСП за это отвечает общий модуль ПрефиксацияОбъектовПереопределяемый.

Однако для частного случая со справочником Номенклатура проще создать расширение и добавить в него модуль объекта справочника. Выясним причину, почему стандартный метод не помогает: он просто не знает, что вы хотите игнорировать префикс РИБ. В расширении мы можем написать следующий код:


&После("ПриУстановкеНовогоКода")
Процедура Расш1_ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс)
    
    // Принудительно устанавливаем префикс "М"
    // и отключаем дальнейшую обработку стандартными механизмами,
    // если они мешают получить нужный формат.
    Префикс = "М";
    
КонецПроцедуры

Способ 3. Реализация собственной генерации кода

Если префикс 00- все равно упорно добавляется из-за глубоких настроек РИБ, можно применить «силовой» метод — генерацию кода вручную перед записью. Как отмечалось в сообщениях форума, это позволяет полностью обойти ограничения платформы.

Разберем по шагам, как это реализовать в модуле объекта:

  1. Создадим функцию, которая находит максимальный существующий код с префиксом М.
  2. Прибавим к найденному числу единицу.
  3. Сформируем строку нужной длины с ведущими нулями.

Посмотрим на пример кода, который можно разместить в событии ПередЗаписью или ПриУстановкеНовогоКода:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    Если ЭтоНовый() И (ПустаяСтрока(Код) Или Код = "") Тогда
        
        // Отключаем стандартную нумерацию для этого вызова
        СтандартнаяОбработка = Ложь;
        
        ПрефиксОбъекта = "М";
        ДлинаКода = Метаданные().ДлинаКода; // Например, 11
        
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ ПЕРВЫЕ 1
            |	Номенклатура.Код КАК Код
            |ИЗ
            |	Справочник.Номенклатура КАК Номенклатура
            |ГДЕ
            |	Номенклатура.Код ПОДОБНО &ШаблонКода
            |УПОРЯДОЧИТЬ ПО
            |	Номенклатура.Код УБЫВ";
        
        Запрос.УстановитьПараметр("ШаблонКода", ПрефиксОбъекта + "%");
        
        РезультатЗапроса = Запрос.Выполнить();
        Выборка = РезультатЗапроса.Выбрать();
        
        НовыйНомер = 1;
        Если Выборка.Следующий() Тогда
            // Извлекаем числовую часть и увеличиваем на 1
            ТекстНомера = СтрЗаменить(Выборка.Код, ПрефиксОбъекта, "");
            НовыйНомер = Число(ТекстНомера) + 1;
        КонецЕсли;
        
        // Формируем новый код с ведущими нулями
        ФорматнаяСтрока = "ЧЦ=" + Формат(ДлинаКода - СтрДлина(ПрефиксОбъекта), "ЧГ=0") + "; ЧВН=; ЧГ=0";
        Код = ПрефиксОбъекта + Формат(НовыйНомер, ФорматнаяСтрока);
        
    КонецЕсли;
    
КонецПроцедуры

Важные замечания по работе в РИБ

Проанализируем ситуацию, описанную в сообщениях форума. Пользователь хочет убрать префикс 00-, который является префиксом узла распределенной базы. Это несет определенные риски:

Рекомендации по внедрению решения

Рассмотрим подробнее, как лучше всего внедрить эти изменения в рабочую базу КА 2.0:

  1. Используйте расширение: Никогда не снимайте конфигурацию с поддержки ради изменения префикса. Все описанные процедуры (ПриУстановкеНовогоКода) прекрасно перехватываются расширением с аннотацией &Вместо или &После.
  2. Проверьте настройки БСП: Перед написанием кода зайдите в раздел «НСИ и администрирование — Синхронизация данных» и посмотрите поле «Префикс этой информационной базы». Если вы его очистите, префикс 00- исчезнет сам собой для всех объектов базы. Но будьте осторожны: это повлияет на все справочники и документы.
  3. Перенумерация: Если в базе уже есть много позиций с кодом 00-М..., автоматика 1С при попытке создать код М... может продолжить старую серию. Возможно, потребуется обработка по перенумерации старых записей под новый формат, чтобы «выровнять» последовательность для корректной работы автонумерации платформы.

Подводя итог, можно сказать: чтобы изменить префикс в «Комплексной автоматизации 2.0», нужно либо изменить настройки узла информационной базы, либо программно переопределить формирование кода в модуле объекта через расширение, не забывая о контроле уникальности в условиях распределенной системы.

← На главную