Как настроить свою нумерацию для определенных типов документов в 1С

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

В типовых конфигурациях 1С:Предприятие 8 на управляемых формах (таких как 1С:Бухгалтерия предприятия 3.0, 1С:Управление торговлей 11, 1С:ERP и других решениях на базе Библиотеки стандартных подсистем — БСП) механизм формирования номеров документов автоматизирован и вынесен в общие модули. Рассмотрим, как устроена эта система, где перехватывается назначение номеров и какими способами можно реализовать собственную нумерацию для выбранных видов документов.

Как работает нумерация в платформе и БСП

Прежде чем вмешиваться в алгоритмы нумерации, разберем базовую логику платформы 1С и типовых библиотек:

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

Способ 1. Разделение нумерации с помощью назначения уникального префикса

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

Выясним, где именно в конфигурации на БСП перехватывается префикс. В типовых решениях вызываются процедуры подсистемы префиксации, например в общем модуле ПрефиксацияОбъектовБПСобытия или ПрефиксацияОбъектовСобытия. Посмотрим на типовой пример изменения префикса для конкретных видов документов:


// В процедуре подписки на установку префикса:
МетаданныеДокумента = Источник.Метаданные();
Если МетаданныеДокумента.Имя = "АктОбОказанииПроизводственныхУслуг" 
	Или МетаданныеДокумента.Имя = "СписаниеТоваров" Тогда
	// Устанавливаем собственный префикс для разделения нумератора
	Префикс = "СП-";
Иначе
	// Оставляем стандартную логику формирования префикса
КонецЕсли;

Если конфигурация находится на поддержке без возможности изменения, правильным подходом будет использование общего модуля ПрефиксацияОбъектовПереопределяемый или создание расширения конфигурации с аннотацией &После или &Вместо для типовых процедур установки префикса (например, ПриУстановкеПрефиксаНомераДокумента).

Способ 2. Полное программное переопределение номера документа

Если требуется сформировать номер по нестандартному шаблону (например, включить дату, подразделение, сложные разделители или сквозной индекс из внешней системы), стандартного префикса будет недостаточно. В этом случае мы можем полностью отключить платформенный автоинкремент.

В обработчике события ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс) присутствует параметр СтандартнаяОбработка. По умолчанию он равен Истина. Если установить его в Ложь, платформа не будет пытаться сгенерировать номер автоматически, и обязанность по установке уникального номера ложится на разработчика.

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


Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
	
	// Отключаем стандартный механизм автонумерации платформы
	СтандартнаяОбработка = Ложь;
	
	// Формируем собственный номер
	ПрефиксДокумента = "АКТ-";
	ОчереднойНомер = ПолучитьСледующийНомерДокумента(); // Собственная функция получения счетчика
	
	// Важно дополнять числовую часть ведущими нулями
	НомерСформированный = ПрефиксДокумента + Формат(ОчереднойНомер, "ЧЦ=6; ЧВН=; ЧГ=0");
	
	ЭтотОбъект.Номер = НомерСформированный;
	
КонецПроцедуры

Важное замечание: при ручном формировании строкового номера обязательно форматируйте числовую часть ведущими нулями до расчетной длины (например, с помощью функции Формат() с параметром ЧВН=). Если длина номера начнет «плавать» (например, сначала будет записан номер АКТ-1, а затем АКТ-000002), механизм поиска максимального номера платформы даст сбой.

Способ 3. Использование объекта конфигурации «Нумератор»

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

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

  1. В дереве метаданных в ветке Документы -> Нумераторы создаем новый объект (например, СквознаяНумерацияАктов).
  2. В свойствах нумератора определяем тип номера (обычно строка), длину номера и периодичность (в пределах года, месяца или без периодичности).
  3. Открываем свойства каждого из целевых документов и в свойстве Нумератор выбираем созданный объект.

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

Ошибки нумерации и особенности работы с кэшем платформы

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

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