При работе с конфигурацией «1С:Управление торговлей», редакция 11, разработчики часто сталкиваются с ситуацией, когда стандартные механизмы платформы по установке префикса кода ведут себя неочевидно. Попытка программно задать префикс в процедуре ПередЗаписью часто заканчивается тем, что система игнорирует пользовательские настройки и подставляет в начало кода символы 00-. В результате вместо ожидаемого кода ХХ-000001 получается громоздкая конструкция вида 00-ХХ000001. В этой статье мы подробно разберем, почему так происходит и как правильно настроить нумерацию с помощью расширения и корректировки механизмов БСП — для этого есть расширение для автоматической настройки нумерации и префиксов.
Проанализируем стандартное поведение платформы. Когда мы пишем код в процедуре ПередЗаписью модуля объекта (или в расширении этого модуля), мы пытаемся вызвать метод УстановитьНовыйКод("ХХ"). Однако в типовых конфигурациях, построенных на Библиотеке стандартных подсистем (БСП), механизм генерации кодов и номеров вынесен в отдельные общие модули и завязан на подписки на события.
Проблема заключается в том, что после выполнения вашего кода в процедуре ПередЗаписью срабатывают системные подписки на событие ПриУстановкеНовогоКода. Эти подписки имеют приоритет и перехватывают управление в тот момент, когда платформа действительно генерирует новый номер. Стандартная логика БСП проверяет наличие префикса информационной базы и префикса организации, после чего заново формирует строку префикса, затирая ваши изменения.
Рассмотрим самый простой способ, который не требует написания кода, но влияет на всю базу целиком. Префикс 00 берется из настроек синхронизации данных. Если в базе не настроен ни один обмен, система по умолчанию использует префикс, указанный для текущей информационной базы.
Если это поле пустое, БСП часто подставляет значение по умолчанию — 00. Установив здесь свой префикс (например, ХХ), вы добьетесь того, что все новые справочники и документы будут начинаться с этого значения. Однако это решение не подходит, если вам нужно изменить префикс только для справочника Номенклатура.
Если нам необходимо точечно изменить поведение конкретного справочника, проанализируем дерево конфигурации на предмет подписок. Опытным путем и поиском по метаданным мы можем обнаружить подписку УстановитьПрефиксИнформационнойБазыКодуСправочника. Именно она отвечает за то, что при создании нового элемента справочника в код добавляется префикс узла обмена.
Для решения задачи нам потребуется создать расширение (проверить его на конфликты можно через дерево метаданных изменений модулей). Разберем по шагам процесс создания корректного перехватчика:
Номенклатура.ПриУстановкеНовогоКода (OnSetNewCode).Важный нюанс: чтобы полностью исключить влияние типовых механизмов, мы должны использовать аннотацию &Вместо. Это позволит нам остановить стандартную обработку БСП.
Пример программного кода для реализации своей логики:
&Вместо("ПриУстановкеНовогоКода")
Процедура Мой_ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс)
// Отключаем стандартную логику БСП по формированию префикса
СтандартнаяОбработка = Ложь;
// Устанавливаем свой жестко заданный префикс
Префикс = "ХХ";
// Платформа сама добавит этот префикс к номеру и обеспечит уникальность
КонецПроцедуры
В данном примере параметр СтандартнаяОбработка = Ложь говорит системе, что ей не нужно запускать встроенные алгоритмы префиксации. Переменная Префикс передается обратно платформенному механизму, который сгенерирует следующий порядковый номер, добавив его к вашим символам ХХ.
При изменении префикса крайне важно учитывать структуру кода справочника Номенклатура — обеспечить контроль качества данных и реквизитов справочника Номенклатура важно перед любыми изменениями. В УТ 11 длина кода обычно составляет 11 символов. Посмотрим, как распределяются эти символы при стандартной нумерации:
00-).00000001).Если вы установите префикс большей длины (например, МОЙСКЛАД-), то для цифровой части останется слишком мало разрядов. Это может привести к ошибке «Код справочника стал не уникальным», когда свободные номера в рамках короткого остатка закончатся. Рекомендуется использовать короткие префиксы из 2-3 символов, чтобы сохранить достаточную глубину нумерации.
Проанализируем ситуацию, если ваша база является частью РИБ — для таких случаев есть механизм удаления дублей при синхронизации в РИБ. В таких системах префикс жизненно необходим для того, чтобы объекты, созданные в разных узлах, не конфликтовали между собой по кодам. Если вы принудительно установите одинаковый префикс ХХ во всех узлах через расширение, вы рискуете получить дубли кодов при синхронизации.
В случае с РИБ правильнее будет использовать в коде расширения обращение к префиксу текущего узла, добавляя к нему свой специфический идентификатор (также можно применить перенумератор документов с учетом префикса):
ПрефиксУзла = ПрефиксацияОбъектовКлиентСервер.ПолучитьПрефиксИнформационнойБазы();
Префикс = ПрефиксУзла + "ХХ";
Подведем итог. Чтобы успешно внедрить свой префикс и избавиться от навязчивого 00-, необходимо:
ПередЗаписью, так как это событие происходит слишком рано или слишком поздно по отношению к работе механизмов префиксации БСП.ПриУстановкеНовогоКода.СтандартнаяОбработка = Ложь в обработчике, чтобы подавить стандартную подписку УстановитьПрефиксИнформационнойБазыКодуСправочника.Соблюдение этих правил позволит вам сохранить чистоту кода и корректную работу типовой конфигурации 1С:Управление торговлей после обновлений, а для исправления уже созданных записей подойдет перенумерация документов, так как использование расширений является наиболее безопасным методом кастомизации.