Зачастую от заказчиков поступает запрос на изменение стандартной нумерации документов. Одно из самых популярных пожеланий — включение даты документа непосредственно в его строковый номер. Несмотря на кажущуюся простоту, эта задача тянет за собой цепочку изменений в логике работы системы: от механизмов автонумерации до правил сортировки в списках. В этой статье мы подробно разберем, как реализовать данное требование, проанализируем различные подходы и выясним, какие «подводные камни» могут встретиться на пути программиста.
Рассмотрим наиболее правильный с точки зрения архитектуры 1С способ. Вместо того чтобы создавать дополнительные реквизиты или изменять номер после записи, мы перехватим процесс генерации номера в момент его создания. Для этого используется обработчик события ПриУстановкеНовогоНомера, который располагается в модуле объекта документа.
Этот метод хорош тем, что измененный номер сразу становится системным. Он будет корректно отображаться во всех стандартных отчетах, журналах и печатных формах без необходимости их ручного редактирования. Разберем пример кода, который добавляет дату в конец номера:
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
// Позволяем системе сначала сгенерировать стандартный номер
// Это важно для сохранения уникальности и инкремента
// После того как номер будет сформирован (в конце процедуры),
// мы можем его модифицировать.
// Но так как внутри этого события номер еще не присвоен реквизиту окончательно,
// часто используют программный вызов генерации или постобработку.
// Однако чаще всего логика пишется так:
ТекущаяДатаДокумента = Объект.Дата;
СтрокаДаты = Формат(ТекущаяДатаДокумента, "ДФ=dd.MM.yyyy");
// Формируем новый префикс, который будет включать дату
Префикс = Префикс + СтрокаДаты + "/";
КонецПроцедуры
Важный нюанс: Если мы просто добавим дату в префикс, система 1С будет искать максимальный номер с таким префиксом. Это позволит сохранить автоматическую нумерацию в пределах одного дня.
Проанализируем ситуацию, когда нам нужно вставить дату в уже сформированный номер, сохранив его общую длину. Стандартное поле Номер обычно имеет ограничение в 11 символов. Если мы добавим дату (10 символов) и разделитель, нам придется пожертвовать числовой частью.
Рассмотрим алгоритм действий:
Выясним причину, почему это может быть сложно: если длина номера ограничена 11 символами, то после добавления даты 31.12.2023 у нас останется всего 1 символ под порядковый номер. Это допустимо только для документов, которых создается не более 9 штук в день. В противном случае необходимо увеличить длину реквизита Номер в конфигураторе (например, до 20-25 символов).
Иногда клиенту важно видеть дату в номере только «визуально», а для системы лучше оставить чистый порядковый номер. В этом случае мы можем завести новый реквизит, например, НомерДляВывода.
Разберем шаги реализации этого метода:
Номер и выводим наш новый реквизит.ПередЗаписью прописываем логику заполнения:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ЗначениеЗаполнено(ЭтотОбъект.Номер) Тогда
ЭтотОбъект.НомерДляВывода = СокрЛП(ЭтотОбъект.Номер) + " от " + Формат(ЭтотОбъект.Дата, "ДФ=dd.MM.yyyy");
КонецЕсли;
КонецПроцедуры
Преимущество: Мы не ломаем системную нумерацию и не меняем длину стандартных полей. Недостаток: Придется менять макеты всех печатных форм и настраивать видимость в списках, чтобы пользователь видел именно этот «красивый» номер.
Проанализируем ситуацию с сортировкой. В 1С номера документов — это строки. Строки сортируются посимвольно слева направо. Если вы добавите дату в конец номера (001_01.12.2023, 002_01.01.2023), то при сортировке по номеру документ за декабрь может оказаться выше документа за январь, так как «12» больше «01» в рамках строки.
Рекомендация: Если критично, чтобы документы в списке по номеру шли в хронологическом порядке, дату следует вставлять в начало номера в формате ГГГГММДД. Например: 20231201_0001. В таком виде строковая сортировка будет полностью совпадать с временной.
В современных конфигурациях, таких как 1С:ERP, Бухгалтерия предприятия 3.0 или УТ 11, управление нумерацией вынесено в отдельные модули БСП. Вместо того чтобы писать код в каждом документе, правильно будет использовать возможности подсистемы «Префиксация объектов».
Рассмотрим подробнее: в БСП существует общий модуль ПрефиксацияОбъектовСобытия. Мы можем создать расширение и в нем переопределить логику формирования префикса, добавив туда дату. Это позволит централизованно управлять форматом номеров для всех типов документов в системе, соблюдая единый стандарт компании.
Посмотрим на ситуацию с точки зрения законодательства. Для таких документов, как Счета-фактуры, существуют жесткие требования к нумерации. Налоговые органы ожидают видеть возрастающую последовательность номеров. Добавление даты в номер счета-фактуры может привести к тому, что при автоматической сверке деклараций НДС у контрагента возникнут расхождения.
Также стоит учитывать Электронный документооборот (ЭДО). Операторы ЭДО и приемные шлюзы часто накладывают ограничения на формат номера. Слишком длинные номера или использование спецсимволов (точки, слэши) могут привести к ошибкам при выгрузке или загрузке документов на стороне контрагента.
Подводя итог, можно сказать, что технически задача решается довольно быстро, но требует вдумчивого подхода к деталям:
ПриУстановкеНовогоНомера.Номер в конфигураторе, чтобы избежать обрезки данных.ГГГГММДД в начале номера — самый надежный для работы списков.Мы проанализировали основные подходы к модификации номеров. Выбор конкретного метода зависит от архитектуры вашей конфигурации и того, насколько глубоко вы готовы вносить изменения в типовой функционал 1С.