В практической работе с конфигурациями 1С (такими как «1С:Управление торговлей», «1С:Комплексная автоматизация» или «1С:ERP») часто возникает задача настроить уникальную логику нумерации документов для отдельного юридического лица. Стандартный механизм платформы предполагает единую периодичность нумератора для всех организаций в рамках одного типа документа (как правило, в пределах года). Если нам требуется, чтобы для одной конкретной организации нумерация документов начиналась заново с единицы каждый месяц, а для всех остальных организаций сохранялся типовой годовой цикл, мы сталкиваемся с техническим ограничением платформы.
В этой статье мы подробно разберем, как элегантно обойти это ограничение, не снимая конфигурацию с поддержки, используя современные механизмы БСП (Библиотеки стандартных подсистем) и расширения конфигурации.
Свойство метаданных документа Периодичность определяет интервал времени, в течение которого номера документов должны быть уникальными. По умолчанию для большинства документов установлена периодичность «Год». Это значит, что платформа 1С отслеживает уникальность номеров с 1 января по 31 декабря текущего года.
Если мы попытаемся изменить свойство Периодичность на «Месяц» напрямую в конфигураторе, это изменение применится ко всем организациям информационной базы. Более того, изменить периодичность нумератора через расширение конфигурации невозможно — платформа накладывает жесткое ограничение на изменение свойств метаданных нумерации в расширениях. Следовательно, нам нужен обходной путь, который позволит имитировать ежемесячную смену периода нумерации только для выбранной организации.
Платформенный механизм автонумерации 1С ищет максимальный номер документа в пределах установленного периода по конкретному префиксу. Если в начале нового месяца префикс документа изменится, система не обнаружит в базе документов с новым префиксом за текущий период и автоматически начнет нумерацию заново с единицы.
Например, если в январе для организации «Торговый Дом» использовался префикс ТД01-, то максимальным номером будет ТД01-000150. Когда наступит февраль, программа автоматически сформирует для этой организации префикс ТД02-. Поскольку документов с таким префиксом в базе еще нет, следующий созданный документ автоматически получит номер ТД02-000001. При этом для остальных организаций префикс останется стандартным (например, ОП-), и их годовая нумерация никак не пострадает.
Рассмотрим по шагам, как реализовать этот алгоритм в современных конфигурациях на управляемых формах.
В современных конфигурациях 1С формирование префиксов и номеров документов регулируется подсистемой БСП «Префиксация объектов». Вместо прямого редактирования модулей документов мы воспользуемся общим модулем ПрефиксацияОбъектовПереопределяемый. Нам необходимо создать расширение конфигурации и переопределить процедуру ПриУстановкеНовогоНомера.
Создадим новое расширение, добавим в него общий модуль ПрефиксацияОбъектовПереопределяемый и создадим метод-обработчик с аннотацией &После. Напишем следующий код:
&После("ПриУстановкеНовогоНомера")
Процедура Расш1_ПриУстановкеНовогоНомера(Источник, СтандартнаяОбработка, Префикс)
// Проверяем, что у документа есть реквизит Организация
Если ОбщегоНазначения.ЕстьРеквизитОбъекта(Источник, "Организация") Тогда
// Задаем ссылку на нашу организацию, для которой нужен ежемесячный нумератор.
// В реальной базе лучше использовать предопределенный элемент или настройку в параметрах учета.
НужнаяОрганизация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701010101");
Если Источник.Организация = НужнаяОрганизация И ЗначениеЗаполнено(Источник.Дата) Тогда
// Получаем двузначный номер месяца из даты документа (например, "02" для февраля)
НомерМесяца = Формат(Источник.Дата, "ДФ=ММ");
// Модифицируем префикс, добавляя к нему номер месяца
// Например, из префикса "ТД" мы получим "ТД02-"
Префикс = Префикс + НомерМесяца + "-";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Разберем, как работает этот код. Когда пользователь создает новый документ, БСП генерирует стандартный префикс организации (например, ТД). Наш код перехватывает управление, проверяет, относится ли документ к нашей целевой организации, и динамически добавляет к префиксу номер текущего месяца и дефис в качестве разделителя. Платформа видит новый уникальный префикс и начинает отсчет номеров с единицы для каждого нового месяца.
Использование префиксов вроде ТД02-000001 полностью решает техническую проблему в базе данных, однако бухгалтеры и клиенты могут негативно отнестись к появлению месяца в печатных формах накладных или счетов-фактур. На бумаге номер должен выглядеть стандартно и лаконично (например, просто 1 или ТД-1 вместо ТД02-000001).
Для решения этой задачи в БСП предусмотрен механизм редактирования номера перед отправкой на печать. Мы добавим в наше расширение общий модуль ПрефиксацияОбъектовКлиентСерверПереопределяемый и переопределим процедуру ПриПолученииНомераНаПечать:
&После("ПриПолученииНомераНаПечать")
Процедура Расш1_ПриПолученииНомераНаПечать(Номер, ПропуститьПрефиксациюДепартаментов, ПреобразоватьНомер)
// Алгоритм поиска нашей кастомной добавки месяца в префиксе.
// Если номер содержит шаблон вида "ТД[Месяц]-", мы можем программно очистить его.
// Ищем вхождение дефиса, который отделяет наш измененный префикс
ПозицияРазделителя = СтрНайти(Номер, "-");
Если ПозицияРазделителя > 0 Тогда
// Извлекаем чистую числовую часть номера и убираем лидирующие нули
ЧистыйНомер = Сред(Номер, ПозицияРазделителя + 1);
// Удаляем лидирующие нули для красивого отображения (например, "000001" превратится в "1")
Пока Лев(ЧистыйНомер, 1) = "0" Цикл
ЧистыйНомер = Сред(ЧистыйНомер, 2);
КонецЦикла;
// Возвращаем измененный номер для печати
Номер = ЧистыйНомер;
ПреобразоватьНомер = Истина;
КонецЕсли;
КонецПроцедуры
Этот простой алгоритм позволяет хранить в базе данных строгую и уникальную сквозную нумерацию с префиксом месяца, гарантируя отсутствие конфликтов номеров, при этом выдавая контрагентам красивые и понятные документы без лишних символов.
Если вы работаете в старой конфигурации на обычных формах, где БСП еще не использовалась, то логику изменения префикса придется прописывать в модулях объектов документов или через подписки на события. Рассмотрим пример кода, который можно поместить в подписку на событие ПриУстановкеНовогоНомера для необходимых документов:
Процедура УстановитьПрефиксОрганизацииЕжемесячно(Источник, СтандартнаяОбработка, Префикс) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(Источник.Организация) = Тип("СправочникСсылка.Организации") Тогда
Если Источник.Организация.Код = "000000001" Тогда // Код вашей организации
НомерМесяца = Формат(Источник.Дата, "ДФ=ММ");
Префикс = Префикс + НомерМесяца + "/";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Обратите внимание на использование символа косой черты / или дефиса - в качестве разделителя префикса. Платформа 1С корректно распознает эти знаки и отделяет префикс от цифровой части номера при автогенерации.
При внедрении ежемесячной нумерации обязательно обратите внимание на следующие технические аспекты:
ТД02-000150). Если затем пользователь решит перенести этот документ на 1 марта, стандартный механизм БСП при записи должен автоматически пересчитать префикс на мартовский и обновить номер на ТД03-000001. Обязательно протестируйте этот сценарий в вашей базе, чтобы избежать ситуации, когда мартовский документ остался с февральским номером.Таким образом, использование динамического префикса в комбинации с механизмами БСП — это наиболее безопасный, чистый и масштабируемый способ реализации ежемесячной нумерации для отдельной организации без изменения глобальных настроек метаданных конфигурации 1С.