Как настроить свою нумерацию документов вида день-месяц-номер в 1С 7.7

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

Формирование префикса и использование метода УстановитьНовыйНомер

Штатный механизм платформы 1С 7.7 для назначения следующего порядкового номера использует метод документа УстановитьНовыйНомер(). Этот метод принимает строковый параметр — префикс, к которому система автоматически находит максимальный существующий номер и увеличивает его на единицу.

Посмотрим на пример вызова метода, в котором префикс выделяется из даты документа при помощи встроенных функций форматирования:


// Формируем строковый префикс формата "ДД.ММ-"
ПрефиксДаты = Лев(Формат(ДатаДок, "ДДДММГГ"), 5) + "-";
УстановитьНовыйНомер(ПрефиксДаты);

В данном фрагменте функция Формат(ДатаДок, "ДДДММГГ") преобразует дату в текстовую строку с точками (например, «15.05.24»), а функция Лев(..., 5) оставляет только первые 5 знаков — число и месяц. Добавив дефис, мы передаем готовый префикс в метод автонумерации.

В каких предопределенных процедурах вызывать нумерацию

Разберем по шагам, где именно в модуле формы или модуле документа следует размещать код формирования номера:

  1. Процедура ВводНового() — основной предопределенный обработчик, срабатывающий в момент интерактивного создания нового документа. Именно здесь логичнее всего инициализировать префикс и устанавливать начальный номер.
  2. Процедура ВводНаОсновании() — если документ вводится на основании другого объекта (например, счет-фактура на основании документа реализации), процедура ВводНового() не вызывается. Поэтому для сквозного порядка код генерации номера необходимо дублировать и здесь.
  3. Процедура ПриИзмененииДаты() — пользователь может изменить дату уже после того, как номер был автоматически сгенерирован. Если префикс привязан к дню или месяцу, старый номер станет неактуальным. В процедуре, назначенной на поле изменения даты, следует повторно вызывать генерацию номера с новым префиксом.

Иногда код размещают в процедуре ПриОткрытии() с условием Если Выбран() = 0 Тогда. Однако на уровне платформы вызов автонумерации в ПриОткрытии() может приводить к лишней блокировке таблиц или некорректной отработке при программном создании документов без открытия формы.

Почему не работает периодичность «Месяц» при наличии дня в префиксе

Проанализируем распространенную проблему: если для нумератора в конфигураторе установлена периодичность «Месяц», но при этом префикс формируется ежедневно («15.05-», «16.05-»), то нумерация все равно начинает отсчет с единицы каждый день, а не продолжается сквозным списком весь месяц.

Выясним причину такого поведения платформы. Метод УстановитьНовыйНомер(<Префикс>) ищет максимальное число строго в пределах переданного текстового префикса. Когда наступает новый день, строка префикса меняется (например, с «15.05-» на «16.05-»). Платформа воспринимает это как совершенно новую серию номеров и начинает нумерацию заново с 1. Таким образом, штатная периодичность «Месяц» не сможет поддерживать сквозной номер за месяц, если день включен в префикс.

Способы реализации сквозной нумерации за месяц

Если требуется сохранить формат номера «ДД.ММ-Номер», но при этом счетчик должен увеличиваться непрерывно в течение всего календарного месяца, рассмотрим два пути решения:

  1. Программный подсчет максимального номера выборкой: в процедуре ПриЗаписи() открывается выборка документов за интервал с начала месяца по дату документа через метод ВыбратьДокументы(НачМесяца(ДатаДок), КонМесяца(ДатаДок)). В цикле перебираются номера, текстовой функцией Прав() отсекается числовая часть, находится максимальное число, увеличивается на 1 и форматируется с префиксом.
  2. Использование служебного счетчика: номер текущего документа в пределах месяца можно хранить в периодической константе или реквизите служебного справочника, сбрасывая его в единицу при смене календарного месяца.

Важные ограничения и особенности конфигурации

При внедрении нестандартной нумерации обязательно обратим внимание на следующие технические и законодательные аспекты:

  1. Тип и длина реквизита «Номер»: реквизит номера в метаданных конфигуратора обязательно должен иметь тип «Текстовый», так как числовой тип не допускает точек и дефисов. Кроме того, префикс «ДД.ММ-» занимает 6 знаков. Если стандартная длина номера равна 8 или 10 символам, то под порядковую часть останется всего 2–4 знака, что приведет к быстрому переполнению. Длину номера в свойствах документа потребуется увеличить.
  2. Многопользовательская работа: генерация номера при открытии формы в сетевом режиме может приводить к дублированию, если два пользователя одновременно создают документы. Безопаснее фиксировать уникальный номер перед сохранением в процедуре ПриЗаписи(), используя транзакцию через НачатьТранзакцию() и ЗафиксироватьТранзакцию().
  3. Требования к счетам-фактурам: согласно требованиям статьи 169 Налогового кодекса РФ и Постановления № 1137, нумерация счетов-фактур должна обеспечивать хронологическое возрастание в пределах календарного года. Использование спецсимволов и ежемесячный сброс номеров могут вызвать вопросы при налоговых проверках или выгрузке книги продаж по каналам ЭДО.
← На главную