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