Почему не сохраняется программно измененный номер счета-фактуры и как правильно настроить нумерацию в 1С:Бухгалтерии 3.0?

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

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

Анализ проблемы: почему событие «ПриЗаписи» не подходит для смены номера

Рассмотрим, что происходит внутри транзакции записи объекта и почему изменение номера в обработчике ПриЗаписи приводит к иллюзии успешной работы только в открытой форме.

  1. Фиксация данных в СУБД: событие ПриЗаписи вызывается платформой в тот момент, когда тело документа уже физически записано в таблицы базы данных.
  2. Изменение только в оперативной памяти: если в коде подписки или модуля объекта в процедуре ПриЗаписи присвоить реквизиту Источник.Номер новое значение, оно изменится только в памяти текущего экземпляра объекта. В базу данных эти изменения автоматически не попадут, так как запись уже завершена.
  3. Эффект «повторной записи»: при нажатии кнопки «Записать» форма отправляет на сервер измененные данные. В базу записывается тот номер, который находился в форме с прошлого раза, а в процедуре ПриЗаписи номер снова вычисляется заново (например, увеличивается счетчик) и отображается на форме, но опять не сохраняется в БД. При закрытии формы несохраненное значение из памяти просто теряется.

Важно: вызывать метод Источник.Записать() внутри обработчика ПриЗаписи нельзя, так как это вызовет бесконечную рекурсию и аварийное завершение транзакции.

Особенности типовых конфигураций: порядок подписок и регистры БСП

Выясним причину, по которой попытка переопределить номер в событиях ПриУстановкеНовогоНомера или ПередЗаписью через отдельную подписку на событие также может давать сбой:

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

Способ 1: Переопределение правил префиксации в БСП (Рекомендуемый)

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


МетаданныеДокумента = Источник.Метаданные();
ТекПрефикс = Префикс;

Если МетаданныеДокумента.Имя = "СчетФактураВыданный" Тогда
    // Добавляем к префиксу дату в формате ММДД
    ТекПрефикс = ТекПрефикс + Формат(Месяц(Источник.Дата), "ЧЦ=2; ЧВН=") + Формат(День(Источник.Дата), "ЧЦ=2; ЧВН=");
    ШаблонПрефикса = ПрефиксОрганизации + "-" + ТекПрефикс;
Иначе
    ШаблонПрефикса = "[ОР][ИБ]-[Префикс]";
    ШаблонПрефикса = СтрЗаменить(ШаблонПрефикса, "[ОР]", ПрефиксОрганизации);
    ШаблонПрефикса = СтрЗаменить(ШаблонПрефикса, "[ИБ]", ПрефиксИнформационнойБазы);
    ШаблонПрефикса = СтрЗаменить(ШаблонПрефикса, "[Префикс]", Префикс);
КонецЕсли;

Префикс = ШаблонПрефикса;

Такой алгоритм можно разместить в процедуре УстановитьПрефикс общего модуля ПрефиксацияОбъектовСобытия или использовать переопределяемый модуль БСП ПрефиксацияОбъектовПереопределяемый. В этом случае платформа сформирует номер с нужным префиксом в штатном событии установки номера, а БСП корректно запишет данные в регистр ДанныеПервичныхДокументов.

Способ 2: Использование расширения конфигурации с аннотацией &После

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

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

Методологические ограничения

Проанализируем требования законодательства к учету НДС. Согласно Постановлению Правительства РФ № 1137, для счетов-фактур должна соблюдаться единая сквозная хронологическая нумерация в пределах календарного года. Включение в номер динамических префиксов по дням или сброс нумератора в течение года может вызвать вопросы контролирующих органов при проверке книги продаж и декларации по НДС. Если нестандартный номер требуется исключительно для управленческих целей, рекомендуется использовать дополнительный реквизит, оставив системный номер типовым.

← На главную