Как добавить дату в номер документа в 1С: способы реализации и технические нюансы

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

Зачастую от заказчиков поступает запрос на изменение стандартной нумерации документов. Одно из самых популярных пожеланий — включение даты документа непосредственно в его строковый номер. Несмотря на кажущуюся простоту, эта задача тянет за собой цепочку изменений в логике работы системы: от механизмов автонумерации до правил сортировки в списках. В этой статье мы подробно разберем, как реализовать данное требование, проанализируем различные подходы и выясним, какие «подводные камни» могут встретиться на пути программиста.

Вариант 1. Использование стандартного события ПриУстановкеНовогоНомера

Рассмотрим наиболее правильный с точки зрения архитектуры 1С способ. Вместо того чтобы создавать дополнительные реквизиты или изменять номер после записи, мы перехватим процесс генерации номера в момент его создания. Для этого используется обработчик события ПриУстановкеНовогоНомера, который располагается в модуле объекта документа.

Этот метод хорош тем, что измененный номер сразу становится системным. Он будет корректно отображаться во всех стандартных отчетах, журналах и печатных формах без необходимости их ручного редактирования. Разберем пример кода, который добавляет дату в конец номера:


Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
    
    // Позволяем системе сначала сгенерировать стандартный номер
    // Это важно для сохранения уникальности и инкремента
    
    // После того как номер будет сформирован (в конце процедуры), 
    // мы можем его модифицировать. 
    // Но так как внутри этого события номер еще не присвоен реквизиту окончательно, 
    // часто используют программный вызов генерации или постобработку.
    
    // Однако чаще всего логика пишется так:
    ТекущаяДатаДокумента = Объект.Дата;
    СтрокаДаты = Формат(ТекущаяДатаДокумента, "ДФ=dd.MM.yyyy");
    
    // Формируем новый префикс, который будет включать дату
    Префикс = Префикс + СтрокаДаты + "/";
    
КонецПроцедуры

Важный нюанс: Если мы просто добавим дату в префикс, система 1С будет искать максимальный номер с таким префиксом. Это позволит сохранить автоматическую нумерацию в пределах одного дня.

Вариант 2. Программная манипуляция строкой номера

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

Рассмотрим алгоритм действий:

  1. Генерируем стандартный номер (например, 00000000001).
  2. Определяем, сколько символов занимает дата.
  3. Удаляем лишние лидирующие нули из стандартного номера.
  4. Конкатенируем (соединяем) усеченный номер и дату.

Выясним причину, почему это может быть сложно: если длина номера ограничена 11 символами, то после добавления даты 31.12.2023 у нас останется всего 1 символ под порядковый номер. Это допустимо только для документов, которых создается не более 9 штук в день. В противном случае необходимо увеличить длину реквизита Номер в конфигураторе (например, до 20-25 символов).

Вариант 3. Создание дополнительного реквизита для отображения

Иногда клиенту важно видеть дату в номере только «визуально», а для системы лучше оставить чистый порядковый номер. В этом случае мы можем завести новый реквизит, например, НомерДляВывода.

Разберем шаги реализации этого метода:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ЗначениеЗаполнено(ЭтотОбъект.Номер) Тогда
        ЭтотОбъект.НомерДляВывода = СокрЛП(ЭтотОбъект.Номер) + " от " + Формат(ЭтотОбъект.Дата, "ДФ=dd.MM.yyyy");
    КонецЕсли;
КонецПроцедуры

Преимущество: Мы не ломаем системную нумерацию и не меняем длину стандартных полей. Недостаток: Придется менять макеты всех печатных форм и настраивать видимость в списках, чтобы пользователь видел именно этот «красивый» номер.

Проблема сортировки и хронологии

Проанализируем ситуацию с сортировкой. В 1С номера документов — это строки. Строки сортируются посимвольно слева направо. Если вы добавите дату в конец номера (001_01.12.2023, 002_01.01.2023), то при сортировке по номеру документ за декабрь может оказаться выше документа за январь, так как «12» больше «01» в рамках строки.

Рекомендация: Если критично, чтобы документы в списке по номеру шли в хронологическом порядке, дату следует вставлять в начало номера в формате ГГГГММДД. Например: 20231201_0001. В таком виде строковая сортировка будет полностью совпадать с временной.

Использование механизмов БСП (Библиотеки стандартных подсистем)

В современных конфигурациях, таких как 1С:ERP, Бухгалтерия предприятия 3.0 или УТ 11, управление нумерацией вынесено в отдельные модули БСП. Вместо того чтобы писать код в каждом документе, правильно будет использовать возможности подсистемы «Префиксация объектов».

Рассмотрим подробнее: в БСП существует общий модуль ПрефиксацияОбъектовСобытия. Мы можем создать расширение и в нем переопределить логику формирования префикса, добавив туда дату. Это позволит централизованно управлять форматом номеров для всех типов документов в системе, соблюдая единый стандарт компании.

Риски для Счетов-фактур и ЭДО

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

Также стоит учитывать Электронный документооборот (ЭДО). Операторы ЭДО и приемные шлюзы часто накладывают ограничения на формат номера. Слишком длинные номера или использование спецсимволов (точки, слэши) могут привести к ошибкам при выгрузке или загрузке документов на стороне контрагента.

Итоги и рекомендации

Подводя итог, можно сказать, что технически задача решается довольно быстро, но требует вдумчивого подхода к деталям:

  1. Если нужно быстро и «дешево» — используйте программную склейку в ПриУстановкеНовогоНомера.
  2. Если важна типовая поддержка — рассмотрите вариант изменения только печатных форм, оставляя номер в базе стандартным.
  3. Всегда проверяйте длину поля Номер в конфигураторе, чтобы избежать обрезки данных.
  4. Помните о сортировке: формат ГГГГММДД в начале номера — самый надежный для работы списков.

Мы проанализировали основные подходы к модификации номеров. Выбор конкретного метода зависит от архитектуры вашей конфигурации и того, насколько глубоко вы готовы вносить изменения в типовой функционал 1С.

← На главную