При разработке нестандартных правил нумерации документов в типовых конфигурациях 1С (в частности, в «Бухгалтерии предприятия 3.0») разработчики часто сталкиваются с ситуацией: в форме документа отображается сформированный пользовательский номер, однако в динамическом списке или после повторного открытия документа номер остается стандартным либо сбрасывается. Разберем по шагам, почему так происходит и как правильно реализовать собственную нумерацию счетов-фактур выданных.
Рассмотрим, что происходит внутри транзакции записи объекта и почему изменение номера в обработчике ПриЗаписи приводит к иллюзии успешной работы только в открытой форме.
ПриЗаписи вызывается платформой в тот момент, когда тело документа уже физически записано в таблицы базы данных.ПриЗаписи присвоить реквизиту Источник.Номер новое значение, оно изменится только в памяти текущего экземпляра объекта. В базу данных эти изменения автоматически не попадут, так как запись уже завершена.ПриЗаписи номер снова вычисляется заново (например, увеличивается счетчик) и отображается на форме, но опять не сохраняется в БД. При закрытии формы несохраненное значение из памяти просто теряется.Важно: вызывать метод Источник.Записать() внутри обработчика ПриЗаписи нельзя, так как это вызовет бесконечную рекурсию и аварийное завершение транзакции.
Выясним причину, по которой попытка переопределить номер в событиях ПриУстановкеНовогоНомера или ПередЗаписью через отдельную подписку на событие также может давать сбой:
ПередЗаписью) назначено несколько подписок, платформа 1С не гарантирует строгую очередность их вызова. Типовая подписка Библиотеки Стандартных Подсистем (БСП) по префиксации объектов может выполниться позже пользовательской и перезаписать сформированный номер типовым префиксом.Номер, а вычисляемое пользовательское представление (без лидирующих нулей и технических префиксов) либо данные из регистра сведений ДанныеПервичныхДокументов. Если структура номера нарушена, механизмы БСП отображают его некорректно.Штатный и наиболее надежный путь модификации номера без нарушения типового механизма автонумерации — встраивание в логику подсистемы префиксации БСП. Рассмотрим пример, в котором к префиксу счета-фактуры добавляются месяц и день формирования документа:
МетаданныеДокумента = Источник.Метаданные();
ТекПрефикс = Префикс;
Если МетаданныеДокумента.Имя = "СчетФактураВыданный" Тогда
// Добавляем к префиксу дату в формате ММДД
ТекПрефикс = ТекПрефикс + Формат(Месяц(Источник.Дата), "ЧЦ=2; ЧВН=") + Формат(День(Источник.Дата), "ЧЦ=2; ЧВН=");
ШаблонПрефикса = ПрефиксОрганизации + "-" + ТекПрефикс;
Иначе
ШаблонПрефикса = "[ОР][ИБ]-[Префикс]";
ШаблонПрефикса = СтрЗаменить(ШаблонПрефикса, "[ОР]", ПрефиксОрганизации);
ШаблонПрефикса = СтрЗаменить(ШаблонПрефикса, "[ИБ]", ПрефиксИнформационнойБазы);
ШаблонПрефикса = СтрЗаменить(ШаблонПрефикса, "[Префикс]", Префикс);
КонецЕсли;
Префикс = ШаблонПрефикса;
Такой алгоритм можно разместить в процедуре УстановитьПрефикс общего модуля ПрефиксацияОбъектовСобытия или использовать переопределяемый модуль БСП ПрефиксацияОбъектовПереопределяемый. В этом случае платформа сформирует номер с нужным префиксом в штатном событии установки номера, а БСП корректно запишет данные в регистр ДанныеПервичныхДокументов.
Если требуется полностью переопределить номер документа перед сохранением, минуя стандартную нумерацию, используем механизм расширений:
ПередЗаписью модуля документа или общего модуля с аннотацией &После.&После гарантирует, что типовая логика БСП уже отработала, и наш алгоритм установит финальный номер непосредственно перед отправкой объекта в базу данных.Номер, заданную в метаданных.Проанализируем требования законодательства к учету НДС. Согласно Постановлению Правительства РФ № 1137, для счетов-фактур должна соблюдаться единая сквозная хронологическая нумерация в пределах календарного года. Включение в номер динамических префиксов по дням или сброс нумератора в течение года может вызвать вопросы контролирующих органов при проверке книги продаж и декларации по НДС. Если нестандартный номер требуется исключительно для управленческих целей, рекомендуется использовать дополнительный реквизит, оставив системный номер типовым.