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