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

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

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

Анализируем причину изменения длины номера

Для начала разберем внутренние механизмы платформы. Когда свойство документа Периодичность установлено в значение Год, система при наступлении нового периода обнуляет счетчик. При генерации самого первого номера в году платформа не имеет «образца» в текущем периоде и берет за основу максимальную длину, указанную разработчиком в конфигураторе. Если в прошлом году последний номер был 000123, то в новом году 1С предложит 00000000001. Как только такой длинный номер будет записан в базу, все последующие документы будут ориентироваться на него, сохраняя ту же длину.

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

Способ 1. Ручное создание «нулевого» документа

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

  1. В конце текущего года или в первые минуты нового создадим документ нужного вида датой 01.01 нового года.
  2. В поле «Номер» вручную введем значение в требуемом формате, например, 0001 (если нужно 4 знака).
  3. Запишем документ. Его не обязательно проводить — достаточно просто зафиксировать номер в таблице базы данных.
  4. Пометим документ на удаление или оставим его пустым. Главное, что платформа теперь видит: в текущем году уже есть номер длиной 4 символа, и следующий номер будет 0002.

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

Способ 2. Использование регламентного задания (Автоматизация)

Рассмотрим более продвинутый подход, который выбрал автор темы. Мы можем создать небольшую процедуру, которая будет запускаться автоматически 1 января каждого года и создавать «эталонный» документ.

Разберем по шагам логику работы такого задания:

  1. Система проверяет наличие документов в новом году.
  2. Если документов еще нет, создается новый объект.
  3. Объекту присваивается номер нужной длины с учетом префикса организации.
  4. Объект записывается и может быть сразу помечен на удаление.

Пример кода для модуля сервера или регламентного задания:


Процедура УстановитьПервыйНомерНовогоГода() Экспорт
    ТекущийГод = НачалоГода(ТекущаяДата());
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка ИЗ Документ.РеализацияТоваровУслуг ГДЕ Дата >= &НачалоГода";
    Запрос.УстановитьПараметр("НачалоГода", ТекущийГод);
    
    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
        НовыйДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
        НовыйДок.Дата = ТекущийГод + 1; // 00:00:01 первого января
        // Устанавливаем номер нужной длины, например 5 символов
        НовыйДок.Номер = "00001"; 
        НовыйДок.Записать();
        НовыйДок.УстановитьПометкуУдаления(Истина);
    КонецЕсли;
КонецПроцедуры

Данный подход позволяет один раз настроить систему и забыть о проблеме на годы вперед. Мы рекомендуем настроить расписание регламентного задания на 1 января в 00:01. Для более гибкой настройки времени запуска можно использовать такой инструмент, как конструктор Cron расписания.

Способ 3. Перехват события «ПриУстановкеНовогоНомера»

Посмотрим на пример решения через программный обработчик. В модуле объекта или через подписку на событие можно использовать процедуру ПриУстановкеНовогоНомера. Это позволяет динамически корректировать номер в момент его генерации.

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


Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
    // Если это первый документ, платформа предложит длинный номер
    // Мы можем принудительно обрезать лидирующие нули
    // Но делать запрос к базе в этом событии затратно для производительности
    // Поэтому используем проверку только если номер действительно длинный
КонецПроцедуры

Однако, как справедливо заметили участники обсуждения, использование этого метода требует осторожности. Постоянные запросы к базе данных при создании каждого документа могут замедлить работу системы. Рациональнее проверять «первость» документа только один раз за сеанс или использовать кеширование (повторное использование значений).

Использование механизмов БСП

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

БСП часто добавляет к номеру префиксы организации (МС) и информационной базы (ЦБ). В итоге номер выглядит как МСЦБ-0000001. Если общая длина номера 11, а префикс занимает 4 символа плюс дефис, на саму цифровую часть остается всего 6 знаков. Это частично решает проблему визуального перегруза номеров. Если вам нужно еще сильнее сократить длину, придется вносить изменения в правила префиксации в модуле ПрефиксацияОбъектовСобытия. Кроме того, для массового изменения префиксов у уже созданных документов можно использовать специальные обработки номеров объектов.

Рекомендации по внедрению

Подведем итог. Чтобы сохранить длину номера и не «лохматить бабушек», как выразились на форуме, выберите один из следующих путей:

  1. Для небольших баз: Просто создайте вручную пустой документ 1 января с номером 001. Это займет 1 минуту в год.
  2. Для крупных компаний с множеством баз: Реализуйте регламентное задание, которое пробежит по всем нужным видам документов и создаст «стартовые» объекты. Это гарантирует единообразие учета во всех филиалах.
  3. Для разработчиков тиражных решений: Используйте подписку на событие ПриУстановкеНовогоНомера, где программно проверяйте длину сгенерированного платформой номера. Если в номере слишком много нулей (больше, чем было в декабре прошлого года), обрезайте их программно.

Помните, что автонумерация в 1С очень чувствительна к ручному вводу. Если в середине года кто-то из пользователей случайно введет номер вручную, использовав все 11 символов, платформа мгновенно переключится на этот формат для всех последующих документов. В таких случаях для исправления ситуации может понадобиться специальный перенумератор документов с учетом префикса. Если же ручные правки привели к дублированию номеров, то потребуется восстановление нумерации объектов, чтобы устранить ошибки уникальности.

← На главную