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

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

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

Штатный метод УстановитьНовыйНомер

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

Рассмотрим пример программного создания документа с явной установкой префикса:


НовыйДокумент = Документы.АвансовыйОтчет.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДатаСеанса();
НовыйДокумент.Организация = ВыбраннаяОрганизация;

// Формируем нужный префикс, например: ПрефиксОрганизации + ГодМесяц
ПрефиксНомера = "ЧА" + Формат(НовыйДокумент.Дата, "ДФ=yyyyMM");
НовыйДокумент.УстановитьНовыйНомер(ПрефиксНомера);

НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);

Обратите внимание на важный нюанс: если номер не требуется получать заранее (до записи) для передачи во внешние системы или печатные формы, явно вызывать метод УстановитьНовыйНомер перед Записать() не обязательно. Если реквизит Номер остается пустым, платформа автоматически сгенерирует его в момент физической записи документа в транзакции. Лишний предварительный вызов метода может привести к появлению неиспользуемых пропусков в нумерации.

Переопределение номера через событие ПриУстановкеНовогоНомера

Когда требуется централизованно изменить логику префиксации для документов определенного вида, логику выносят в модуль объекта документа в процедуру-обработчик ПриУстановкеНовогоНомера.

Посмотрим на пример реализации внутри модуля объекта документа:


Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
    
    // Формируем собственный префикс
    ПрефиксОрганизации = "ЧА";
    ПрефиксПериода = Формат(ЭтотОбъект.Дата, "ДФ=yyyyMM");
    
    Префикс = ПрефиксОрганизации + ПрефиксПериода;
    
КонецПроцедуры

Параметр Префикс передается по ссылке. Платформа берет возвращенную строку, подставляет ее в начало номера и автоматически дополняет оставшуюся длину числовым счетчиком.

Использование подписки на событие для группы документов

Если логику нумерации нужно применить сразу к нескольким видам документов без изменения их индивидуальных модулей объектов, оптимальным решением является создание подписки на событие. Разберем порядок действий:

  1. Создаем новый объект метаданных Подписка на событие.
  2. В свойстве Источник выбираем необходимые типы документов через составной тип (или ДокументОбъект).
  3. В качестве события указываем ПриУстановкеНовогоНомера.
  4. В свойстве Обработчик выбираем экспортную процедуру общего модуля.

Реализуем процедуру в общем серверном модуле:


Процедура ДокументыПриУстановкеНовогоНомера(Источник, СтандартнаяОбработка, Префикс) Экспорт
    
    // Префикс узла информационной базы или организации
    ПрефиксОрганизации = "";
    Если ОбщегоНазначения.ЕстьРеквизитИлиСвойствоОбъекта(Источник, "Организация") 
        И ЗначениеЗаполнено(Источник.Организация) Тогда
        ПрефиксОрганизации = СокрЛП(Источник.Организация.Префикс);
    КонецЕсли;
    
    СтрокаПериода = Формат(Источник.Дата, "ДФ=yyyyMM");
    Префикс = ПрефиксОрганизации + СтрокаПериода;
    
КонецПроцедуры

Особенности работы в типовых конфигурациях на базе БСП (УТ 11, ERP, КА)

В конфигурациях уровня «1С:Управление торговлей 11» действует встроенная подсистема Префиксация объектов Библиотеки Стандартных Подсистем (БСП). В типовой конфигурации на событие ПриУстановкеНовогоНомера уже зарегистрированы стандартные подписки.

При внедрении собственной логики важно учитывать следующие факторы:

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

Почему нельзя формировать номер запросом «Максимум + 1»

Иногда разработчики пытаются вычислить следующий номер прямым запросом к таблице базы данных:


// ОШИБОЧНЫЙ ПОДХОД: НЕ ИСПОЛЬЗОВАТЬ В РЕАЛЬНЫХ СИСТЕМАХ
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |   Док.Номер КАК Номер
    |ИЗ
    |   Документ.АвансовыйОтчет КАК Док
    |УПОРЯДОЧИТЬ ПО
    |   Док.Номер УБЫВ";
// Прибавление единицы к строке или числу...

Проанализируем риски такого решения:

  1. Коллизии в многопользовательской среде: Если два пользователя одновременно создадут или запишут документ, оба запроса вернут одинаковый текущий максимум. В результате оба документа получат одинаковый номер, и второй пользователь столкнется с ошибкой контроля уникальности.
  2. Сортировка строк: В строковом типе данных сортировка работает посимвольно (алфавитно). Значение "10" будет меньше "9", если отсутствуют лидирующие нули, что приведет к неверному определению максимального значения.
  3. Производительность: Штатный механизм платформы УстановитьНовыйНомер работает на уровне внутренних системных таблиц с оптимизированными транзакционными блокировками без выполнения тяжелых запросов по всей таблице документов.

Ограничения длины номера и особенности префиксов

При конструировании сложных префиксов следует всегда проверять свойства метаданных документа:

  1. Тип номера: Должен быть обязательно строковым. Числовой номер префиксы не поддерживает.
  2. Длина номера: Если длина номера в метаданных равна 11 символам, а ваш префикс (например, ЧА201604) занимает 8 символов, на порядковую нумерацию останется всего 3 знака (от 001 до 999). После превышения 999 документов в периоде нумерация собьется или вернет ошибку. Всегда закладывайте достаточную длину номера в конфигураторе.
  3. Цифры в конце префикса: Платформа вычисляет числовую часть с конца строки. Если длина свободной нумерационной части исчерпана, платформа начнет инкрементировать цифры самой даты, переданной в префиксе, что приведет к искажению данных.
← На главную