Как изменить формат нумерации документа на ГГММннн в 1С:Бухгалтерия 3.0 с сохранением типового обновления?

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

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

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

Ограничения платформы и расширений конфигурации

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

  1. Невозможность менять свойства метаданных через расширение: Такие свойства документа, как Периодичность, Длина номера и Тип номера, нельзя изменить в расширении конфигурации. Они жестко зафиксированы в основной конфигурации (для документов БП 3.0 стандартная длина номера составляет 11 символов, а тип — строка). Изменение этих свойств напрямую в дереве метаданных приведет к снятию объекта с поддержки.
  2. Формирование длины номера платформой: Если штатный автонумератор формирует строку, он автоматически дополняет числовую часть лидирующими нулями слева до максимальной длины поля (11 символов). Поэтому, если требуется получить строго 7 символов, работу стандартного платформенного механизма нужно скорректировать кодом.

Вариант 1. Использование механизма префиксации БСП через расширение

В типовых решениях 1С генерация номеров опирается на события БСП. Платформа формирует следующий номер с учетом установленного префикса. Если задать префикс документа в формате ГГММ (например, 2608 для августа 2026 года), то при годовой периодичности нумератора платформа автоматически будет искать максимальный номер с указанным префиксом и инкрементировать числовую часть в рамках текущего месяца.

Рассмотрим по шагам, как внедрить такую логику без изменения основной конфигурации:

  1. Создадим новое расширение конфигурации с назначением Адаптация или Дополнение.
  2. Добавим в расширение общий модуль ПрефиксацияОбъектовПереопределяемый.
  3. Переопределим процедуру ПриУстановкеНовогоНомераДокумента с помощью директивы &После или &Вместо.

Посмотрим на пример кода, формирующего префикс на основе даты документа:


&После("ПриУстановкеНовогоНомераДокумента")
Процедура Расш_ПриУстановкеНовогоНомераДокумента(Источник, СтандартнаяОбработка, Префикс)
	
	Если ТипЗнч(Источник) = Тип("ДокументОбъект.СчетНаОплатуПокупателю") Тогда
		ГодСтр = Формат(Источник.Дата, "ДФ=yy");
		МесяцСтр = Формат(Источник.Дата, "ДФ=MM");
		Префикс = ГодСтр + МесяцСтр;
	КонецЕсли;

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

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

Вариант 2. Использование собственной подписки на событие в расширении

Если требуется полный контроль над строкой номера без привязки к стандартным алгоритмам БСП, создадим в расширении собственную подписку на событие.

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

Разберем пример программного вычисления номера:


Процедура Расш_ПриУстановкеНовогоНомера(Источник, СтандартнаяОбработка, Префикс) Экспорт
	
	СтандартнаяОбработка = Ложь;
	
	ПрефиксПериода = Формат(Источник.Дата, "ДФ=yyMM");
	
	// Устанавливаем управляемую блокировку для исключения дублей
	Блокировка = Новый БлокировкаДанных;
	ЭлементБлокировки = Блокировка.Добавить("Документ.СчетНаОплатуПокупателю");
	ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
	Блокировка.Заблокировать();
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	МАКСИМУМ(Счет.Номер) КАК МаксимальныйНомер
		|ИЗ
		|	Документ.СчетНаОплатуПокупателю КАК Счет
		|ГДЕ
		|	Счет.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) И КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ)
		|	И Счет.Номер ПОДОБНО &ШаблонНомера";
	
	Запрос.УстановитьПараметр("Дата", Источник.Дата);
	Запрос.УстановитьПараметр("ШаблонНомера", ПрефиксПериода + "%");
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	ПорядковыйНомер = 1;
	Если Выборка.Следующий() И ЗначениеЗаполнено(Выборка.МаксимальныйНомер) Тогда
		ХвостоваяЧасть = Сред(Выборка.МаксимальныйНомер, СтрДлина(ПрефиксПериода) + 1);
		ПорядковыйНомер = Число(ХвостоваяЧасть) + 1;
	КонецЕсли;
	
	Источник.Номер = ПрефиксПериода + Формат(ПорядковыйНомер, "ЧЦ=3; ЧВН=; ЧГ=");

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

Подводные камни и важные нюансы реализации

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

  1. Вывод номера в печатных формах: В типовой конфигурации БП 3.0 перед выводом номера на печать вызываются специальные функции (например, НомерНаПечать или УдалитьПрефиксыИзНомераДляПечати). Если префикс ГГММ распознается системой как стандартный служебный префикс, он может быть автоматически обрезан при печати, и в бланке останется только ннн. Проверьте формирование печатной формы и при необходимости скорректируйте функцию печати в расширении.
  2. Параллельная работа пользователей: При самостоятельном поиске максимального номера через запрос обязательным условием является использование объекта БлокировкаДанных в транзакции. Без наложения исключительной блокировки одновременная запись двух счетов разными пользователями приведет к коллизии номеров и ошибке нарушения уникальности.
  3. Смена даты документа: Платформа 1С не запускает событие перенумерации автоматически, если пользователь изменил дату уже созданного документа и перенес его в другой месяц. Для сохранения строгой структуры ГГММ рекомендуется добавить проверку соответствия префикса дате документа в событии ПередЗаписью или обработать событие изменения даты в форме документа.
← На главную