В процессе автоматизации учета часто возникают пожелания пользователей изменить стандартный формат нумерации документов. Например, бухгалтерия может требовать вставку префикса месяца в номер документа (вид ММ/000001). Рассмотрим подробно, как подойти к этой задаче, какие риски она несет и как реализовать её с технической точки зрения.
Прежде чем приступать к написанию кода, важно проанализировать, действительно ли необходимо вмешательство в типовой механизм. В 1С номер документа является техническим идентификатором. Типовая платформа позволяет настраивать периодичность нумерации (в пределах года, квартала или месяца) через свойства объекта в конфигураторе. Любое отклонение от стандарта несет следующие риски:
Номер имеет фиксированную длину. При добавлении кастомных префиксов номер может просто не уместиться в отведенное пространство.Если решение об изменении принято, оптимальным способом является использование Расширений конфигурации. Вместо того чтобы снимать конфигурацию с поддержки, мы создаем расширение и работаем с механизмом префиксации.
Для реализации задачи нам необходимо перехватить момент установки номера. В типовых конфигурациях 1С это реализовано через подписки на события. Рассмотрим основные шаги:
Для документов необходимо использовать существующие подписки, отвечающие за установку префиксов:
ПрефиксацияОбъектовСобытия — для документов типа СчетФактура.ПрефиксацияОбъектовБПСобытия — для остальных документов.Вам необходимо переопределить в расширении логику процедур УстановитьПрефикс или УстановитьПрефиксИнформационнойБазыОрганизацииПодразделения.
В событии ПриУстановкеНовогоНомера вы можете задать формат. Например, если вы хотите добавить месяц из даты документа, код может выглядеть следующим образом:
// Пример логики в подписке на событие
Процедура МойПрефикс_ПриУстановкеНовогоНомера(Источник, СтандартнаяОбработка)
ПрефиксМесяца = Прав("0" + Месяц(Источник.Дата), 2) + "/";
// Очищаем текущий префикс и устанавливаем свой
Источник.Номер = ПрефиксМесяца + СокрЛП(Источник.Номер);
КонецПроцедуры
Важно предусмотреть ситуацию, когда документ меняет дату и «перепрыгивает» из одного месяца в другой. В событии ПередЗаписью модуля документа необходимо реализовать проверку:
Если НЕ Источник.ЭтоНовый() Тогда
Если НачалоМесяца(Источник.Ссылка.Дата) <> НачалоМесяца(Источник.Дата) Тогда
// Очищаем номер, чтобы система пересчитала его с учетом новой даты
Источник.Номер = "";
КонецЕсли;
КонецЕсли;
Разберем основные правила, которые помогут избежать «ректальных болей» при эксплуатации доработанной системы:
Таким образом, задачу можно решить программно, перехватив момент записи документа и манипулируя префиксами через расширение. Однако всегда помните о том, что чистота типового кода — залог стабильной работы информационной системы в будущем.