Как реализовать автонумерацию документов с префиксом организации в 1С

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

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

Основы механизма автонумерации: процедура ПриУстановкеНовогоНомера

Для начала проанализируем, где именно должна располагаться логика формирования префикса. Платформа 1С предоставляет стандартный обработчик события ПриУстановкеНовогоНомера, который находится в модуле объекта документа. Рассмотрим, как он работает.

Эта процедура вызывается автоматически в тот момент, когда системе необходимо присвоить документу новый номер. Обычно это происходит при первой записи документа. Важно понимать, что параметр Префикс, передаваемый в эту процедуру, является «входящим-исходящим». Если мы присвоим ему значение внутри кода, платформа автоматически добавит его к следующему порядковому номеру.

Рассмотрим правильный пример реализации в модуле объекта документа:


Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
    
    // Проверяем, заполнена ли организация в документе
    Если ЗначениеЗаполнено(Организация) Тогда
        // Получаем префикс из соответствующего реквизита справочника Организации
        Префикс = Организация.Префикс;
    КонецЕсли;

КонецПроцедуры

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

Управление моментом появления номера в форме

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

Чтобы номер устанавливался только в момент записи (когда организация уже точно выбрана), выполним следующие действия:

  1. Откроем свойства формы документа.
  2. Найдем параметр Автонумерация.
  3. Установим значение "Не использовать".

В этом случае поле «Номер» останется пустым до момента нажатия кнопки «Записать», после чего сработает процедура ПриУстановкеНовогоНомера и сформирует корректное значение с нужным префиксом.

Динамическое обновление номера при смене организации

Проанализируем более сложный сценарий: пользователь создал документ, выбрал «Организацию А», система присвоила номер «А-001». Затем пользователь понял, что ошибся, и выбрал «Организацию Б». В этом случае номер должен измениться на «Б-001», но стандартная процедура ПриУстановкеНовогоНомера срабатывает только при первой записи, когда номер еще пуст.

Для решения этой задачи нам потребуется вмешаться в работу модуля формы. Мы будем использовать обработчик события ПриИзменении для реквизита Организация. Рассмотрим по шагам, как это реализовать:

  1. Перейдем в модуль формы документа.
  2. Создадим процедуру-обработчик для события ОрганизацияПриИзменении.
  3. Внутри процедуры очистим текущий номер и вызовем принудительную перенумерацию.

Пример программного кода для модуля формы:


&НаКлиенте
Процедура ОрганизацияПриИзменении(Элемент)
    
    // Вызываем серверную процедуру для обновления номера
    ОбновитьНомерНаСервере();
    
КонецПроцедуры

&НаСервере
Процедура ОбновитьНомерНаСервере()
    
    // Очищаем текущий номер, чтобы метод УстановитьНовыйНомер сработал
    Объект.Номер = "";
    
    // Вызываем метод объекта для генерации нового номера с учетом текущего префикса
    // Если логика префиксации в модуле объекта, достаточно вызвать:
    Объект.УстановитьНовыйНомер();
    
    // Либо можно явно передать префикс:
    // ПрефиксОрг = Объект.Организация.Префикс;
    // Объект.УстановитьНовыйНомер(ПрефиксОрг);

КонецПроцедуры

Типичные ошибки и способы их решения

Выясним причины, по которым нумерация может работать некорректно даже при наличии правильного кода:

1. Ручное редактирование номера. Если пользователь хотя бы один раз вручную введет номер, нарушающий логику (например, «999» без префикса), система может «сбиться» и начать отсчет от этого значения. Для исправления ситуации рекомендуется использовать обработку «Обновление нумерации объектов» или программно очистить некорректные номера и перенумеровать документы.

2. Длина номера. Проверьте длину номера в конфигураторе. Если префикс организации занимает 3 символа, а общая длина номера — 5, то для числовой части останется всего 2 знака (от 01 до 99). При достижении лимита система выдаст ошибку об отсутствии уникальности. Рекомендуется устанавливать длину номера не менее 11 символов.

3. Префиксы в распределенных базах (РИБ). Если вы работаете в РИБ, помните, что префикс документа обычно складывается из Префикса информационной базы и Префикса организации. Это необходимо для того, чтобы документы, созданные в разных филиалах для одной и той же организации, не имели одинаковых номеров.

Заключение

Подводя итог, можно сказать, что надежная автонумерация в 1С строится на сочетании трех факторов: правильной обработке события ПриУстановкеНовогоНомера в модуле объекта, управлении видимостью номера через настройки формы и оперативном реагировании на изменение ключевых реквизитов (организации) через метод УстановитьНовыйНомер(). Следуя этим рекомендациям, мы обеспечим строгий порядок в нумерации документов и минимизируем ручной труд пользователей.

← На главную