При работе в системе 1С:Предприятие многие пользователи и администраторы сталкиваются со специфическим поведением платформы в начале нового календарного года. Если в метаданных конфигурации Длина номера документа установлена, например, в 11 символов, а фактически в организации принято использовать короткие номера (4–6 символов), то первый же документ, созданный 1 января, получит номер максимальной длины, заполненный лидирующими нулями. Рассмотрим подробнее, почему так происходит и как автоматизировать сохранение удобного формата нумерации.
Для начала разберем внутренние механизмы платформы. Когда свойство документа Периодичность установлено в значение Год, система при наступлении нового периода обнуляет счетчик. При генерации самого первого номера в году платформа не имеет «образца» в текущем периоде и берет за основу максимальную длину, указанную разработчиком в конфигураторе. Если в прошлом году последний номер был 000123, то в новом году 1С предложит 00000000001. Как только такой длинный номер будет записан в базу, все последующие документы будут ориентироваться на него, сохраняя ту же длину.
Проанализируем ситуацию: наша задача — «обмануть» или «подсказать» системе формат номера до того, как пользователи начнут массово вводить данные в новом году. Выясним основные способы решения этой задачи.
Это самый простой метод, не требующий программирования. Его суть заключается в том, чтобы заранее создать в базе документ, который задаст правильный темп автонумерации.
0001 (если нужно 4 знака).0002.Важный нюанс: Этот метод плох тем, что о нем нужно помнить каждый год. Если у вас десятки информационных баз для разных юридических лиц, рутинная работа становится обременительной.
Рассмотрим более продвинутый подход, который выбрал автор темы. Мы можем создать небольшую процедуру, которая будет запускаться автоматически 1 января каждого года и создавать «эталонный» документ.
Разберем по шагам логику работы такого задания:
Пример кода для модуля сервера или регламентного задания:
Процедура УстановитьПервыйНомерНовогоГода() Экспорт
ТекущийГод = НачалоГода(ТекущаяДата());
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка ИЗ Документ.РеализацияТоваровУслуг ГДЕ Дата >= &НачалоГода";
Запрос.УстановитьПараметр("НачалоГода", ТекущийГод);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
НовыйДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДок.Дата = ТекущийГод + 1; // 00:00:01 первого января
// Устанавливаем номер нужной длины, например 5 символов
НовыйДок.Номер = "00001";
НовыйДок.Записать();
НовыйДок.УстановитьПометкуУдаления(Истина);
КонецЕсли;
КонецПроцедуры
Данный подход позволяет один раз настроить систему и забыть о проблеме на годы вперед. Мы рекомендуем настроить расписание регламентного задания на 1 января в 00:01. Для более гибкой настройки времени запуска можно использовать такой инструмент, как конструктор Cron расписания.
Посмотрим на пример решения через программный обработчик. В модуле объекта или через подписку на событие можно использовать процедуру ПриУстановкеНовогоНомера. Это позволяет динамически корректировать номер в момент его генерации.
Проанализируем код, который определяет, является ли документ первым в году, и сокращает его номер:
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
// Если это первый документ, платформа предложит длинный номер
// Мы можем принудительно обрезать лидирующие нули
// Но делать запрос к базе в этом событии затратно для производительности
// Поэтому используем проверку только если номер действительно длинный
КонецПроцедуры
Однако, как справедливо заметили участники обсуждения, использование этого метода требует осторожности. Постоянные запросы к базе данных при создании каждого документа могут замедлить работу системы. Рациональнее проверять «первость» документа только один раз за сеанс или использовать кеширование (повторное использование значений).
В современных конфигурациях, таких как 1С:Управление торговлей 11 или 1С:ERP, за нумерацию отвечает подсистема «Префиксация объектов» из состава БСП (Библиотеки стандартных подсистем). Проанализируем, как это помогает нам.
БСП часто добавляет к номеру префиксы организации (МС) и информационной базы (ЦБ). В итоге номер выглядит как МСЦБ-0000001. Если общая длина номера 11, а префикс занимает 4 символа плюс дефис, на саму цифровую часть остается всего 6 знаков. Это частично решает проблему визуального перегруза номеров. Если вам нужно еще сильнее сократить длину, придется вносить изменения в правила префиксации в модуле ПрефиксацияОбъектовСобытия. Кроме того, для массового изменения префиксов у уже созданных документов можно использовать специальные обработки номеров объектов.
Подведем итог. Чтобы сохранить длину номера и не «лохматить бабушек», как выразились на форуме, выберите один из следующих путей:
001. Это займет 1 минуту в год.ПриУстановкеНовогоНомера, где программно проверяйте длину сгенерированного платформой номера. Если в номере слишком много нулей (больше, чем было в декабре прошлого года), обрезайте их программно.Помните, что автонумерация в 1С очень чувствительна к ручному вводу. Если в середине года кто-то из пользователей случайно введет номер вручную, использовав все 11 символов, платформа мгновенно переключится на этот формат для всех последующих документов. В таких случаях для исправления ситуации может понадобиться специальный перенумератор документов с учетом префикса. Если же ручные правки привели к дублированию номеров, то потребуется восстановление нумерации объектов, чтобы устранить ошибки уникальности.