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