Как настроить нумерацию счетов-фактур с учетом месяца и дня в 1С и избежать обрезания лидирующих нулей?

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

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

Почему 1С обрезает лидирующие нули в номерах счетов-фактур

В типовых конфигурациях 1С («1С:Бухгалтерия 8», «1С:ERP», «1С:Комплексная автоматизация») логика отображения номеров счетов-фактур в печатных формах и регламентированной отчетности централизована. Разберем ключевые механизмы платформы и БСП, влияющие на этот процесс:

  1. Унификация функций формирования номера: Формирование номера для вывода на печать и в книгу продаж осуществляется через модуль ПрефиксацияОбъектовКлиентСервер (метод НомерНаПечать) или процедуры учета НДС. Этот алгоритм не только отсекает системный префикс узла информационной базы и префикс организации, но и удаляет все лидирующие нули вплоть до первой значащей цифры.
  2. Неоднородность нумерации по месяцам: Если номер начинается с месяца 01 (январь), алгоритм уберет 0, и номер 0115001 превратится в 115001. В то же время для октября, ноября и декабря (номера 10..., 11..., 12...) лидирующих нулей в начале нет, и номер останется шести- или семизначным. В учете возникает путаница форматов.
  3. Строковые особенности платформы 1С: Для корректной автонумерации документов платформа дополняет строковый номер нулями слева до установленной длины поля. При программном изменении структуры номера встроенный механизм автонумерации может давать сбой и выбирать некорректное следующее значение.

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

Прежде чем приступать к доработке алгоритмов нумерации, проанализируем позицию контролирующих органов и особенности автоматизированного контроля со стороны ФНС (АСК НДС-2):

  1. Требования к хронологии: Согласно разъяснениям Минфина и ФНС, нумерация счетов-фактур должна быть возрастающей и хронологически последовательной. Ежедневное обнуление нумерации или переход на нумерацию в пределах одного дня часто вызывает вопросы проверяющих органов при камеральных проверках, так как создает условия для выписки документов задним числом.
  2. Сопоставление в АСК НДС-2: Налоговый орган сопоставляет счет-фактуру в книге покупок покупателя и книге продаж продавца по реквизитам «ИНН продавца + Номер + Дата». Если доработать только печатную форму внешней обработкой, покупатель введет номер с нулем (0115001), а продавец выгрузит в декларацию усеченный номер (115001). Это приведет к расхождению и автоматическому требованию о представлении пояснений.

Вариант 1. Формирование структуры номера через подписку на событие

Если задача состоит в том, чтобы присваивать префикс из месяца и дня автоматически без изменения типовых модулей, правильным решением будет создание подписки на событие ПриУстановкеНовогоНомера.

Рассмотрим реализацию обработчика подписки. В процедуре переопределяется стандартный префикс документа:


Процедура ПриУстановкеНовогоНомераСчетаФактуры(Источник, СтандартнаяОбработка, Префикс, ЧисловойНомер) Экспорт
	
	// Формируем префикс на основе даты документа (ММДД)
	ПрефиксМесяцДень = Формат(Источник.Дата, "ДФ=MMdd");
	
	// Присваиваем сформированный префикс
	Префикс = ПрефиксМесяцДень + Префикс;
	
КонецПроцедуры

Однако при интерактивной смене даты существующего документа встроенный механизм 1С не пересчитает номер автоматически. Чтобы предотвратить рассинхронизацию номера и даты при перемещении счета-фактуры между днями, добавим обработчик события ПередЗаписью:


Процедура ПроверитьНомерПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
	
	Если Не Источник.ЭтоНовый() Тогда
		// Проверяем соответствие номера дате документа при ее изменении
		РаботаСДиалогами.ПроверитьНомерДокумента(Источник, Источник.Ссылка.Дата);
	КонецЕсли;
	
КонецПроцедуры

Вариант 2. Использование буквенного разделителя структуры номера

Чтобы избежать удаления первых цифр типовыми алгоритмами БСП, рекомендуется изменить сам шаблон нумерации так, чтобы номер не начинался с нуля, либо разделялся символами, которые алгоритм распознает как часть значащего идентификатора.

Разберем возможные структуры:

  1. Формат «ГГММ-ПорядковыйНомер»: Например, 2501-0001 (две цифры года, две цифры месяца, разделитель и порядковый номер). В этом случае номер начинается с цифры 2, поэтому алгоритм отсечения лидирующих нулей не затронет месяц.
  2. Формат с буквенным префиксом: Добавление символа М0115-001. Буквенная часть воспринимается алгоритмами как префикс, а разделитель позволяет корректно передавать номер в учет НДС без искажения месяцев с 01 по 09.

Вариант 3. Переопределение алгоритма обрезки нулей через расширение конфигурации

Если формат номера строго утвержден учетной политикой и должен содержать ведущий ноль, корректировку логики вывода на печать и выгрузки в книгу продаж следует выполнить через расширение конфигурации (файл .cfe). Это позволяет оставить основную базу данных на полной поддержке вендора.

Посмотрим на алгоритм реализации в расширении:

  1. Добавляем расширение с назначением Адаптация или Дополнение.
  2. Подключаем модуль формирования печатных номеров (например, ПрефиксацияОбъектовКлиентСервер или соответствующие функции формирования книги продаж из модуля УчетНДС).
  3. Используем аннотацию &Вместо или &ИзменениеИКонтроль для переопределения метода обработки номера:

&Вместо("НомерНаПечать")
Функция Расш_НомерНаПечать(Знач ВходящийНомер, УдалитьПрефикс = Истина, УдалитьЛидирующиеНули = Истина) Экспорт
	
	// Если это счет-фактура выданный с нашей маской номера, 
	// отключаем удаление лидирующих нулей принудительно
	Если СтрДлина(ВходящийНомер) > 6 И УдалитьЛидирующиеНули Тогда
		// Вызываем исходный метод только для снятия стандартного префикса ИБ
		Возврат ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерБезПрефиксов(ВходящийНомер);
	КонецЕсли;
	
	Возврат ПродолжитьВызов(ВходящийНомер, УдалитьПрефикс, УдалитьЛидирующиеНули);
	
КонецФункции

Важно: При таком подходе измененная логика формирования номера применяется одновременно и к печатным бланкам счетов-фактур, и к процедурам заполнения Книги продаж и Декларации по НДС. Это гарантирует 100% совпадение данных у продавца и покупателя при автоматической сверке в АСК НДС-2.

← На главную