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