В процессе эксплуатации 1С:Управление торговлей 10.3 многие администраторы и программисты сталкиваются с ситуацией, когда при создании нового документа система присваивает ему уже существующий номер или «зацикливается» на одном и том же значении. Рассмотрим подробнее, почему это происходит и как устранить данную проблему.
Зачастую кажется, что платформа 1С перестала корректно работать с нумератором, однако в 90% случаев причина кроется в специфической логике конфигурации. В старых конфигурациях, таких как УТ 10.3, механизм автоматического присвоения номера может быть переопределен разработчиками с помощью подписок на события.
Если вы столкнулись с тем, что документ всегда получает конкретный номер (например, 149999), вероятнее всего, в вашей системе реализован алгоритм, который «жестко» перехватывает процесс записи и принудительно задает номер, не учитывая текущее состояние информационной базы.
Первым делом проанализируем дерево конфигурации. В УТ 10.3 активно используются ПодпискиНаСобытия, которые могут выполнять код перед записью документа. Разберем по шагам, как найти проблемный участок:
Общие -> Подписки на события.ПриУстановкеНовогоНомера или ПередЗаписью для вашего документа.Например, если в коде подписки вы видите что-то подобное:
Процедура ОбработкаПриУстановкеНовогоНомера(Источник, СтандартнаяОбработка, Префикс)
ПрефиксОрганизации = Константы.ПрефиксОрганизации.Получить();
// Принудительное присвоение номера, которое может игнорировать реальный максимум
Источник.Номер = ПрефиксОрганизации + "149999";
КонецПроцедуры
Именно такие конструкции приводят к «зацикливанию». Если алгоритм не делает запрос к базе для определения следующего свободного номера через Максимум, он будет всегда возвращать одно и то же значение.
Если вы уверены, что стандартная логика платформы не нарушена программным кодом, воспользуйтесь встроенным механизмом ОбновитьНумерациюОбъектов(). Этот метод заставляет платформу пересчитать текущие значения нумераторов для всех объектов метаданных на основе имеющихся в базе данных записей.
Выполните данный код в консоли кода:
ОбновитьНумерациюОбъектов();
Однако помните: этот метод эффективен только в том случае, если нумерация сбилась из-за расхождения кэша номеров платформы, а не из-за ошибок в логике вашей конфигурации.
Если проблема в префиксах, разберемся, как правильно настроить их использование. Проблема может возникать при изменении префикса организации, когда старые документы имеют один префикс, а новые — другой, и система теряет «нить» нумерации.
Для корректной работы рекомендуем убедиться, что:
Число() или Прав().Номер в объекте Документ достаточна для вашего объема данных.Для того чтобы окончательно выяснить причину, используйте режим отладки. Поставьте «точку останова» в процедуре ПриУстановкеНовогоНомера модуля объекта или в соответствующей подписке на событие. Пройдите по шагам выполнения кода (F10, F11), чтобы увидеть, в какой именно момент переменная Источник.Номер получает «зависшее» значение 149999.
Чаще всего решение заключается в переписывании алгоритма: вместо фиксации номера необходимо реализовать функцию, которая находит Макс(Номер) среди существующих документов с учетом текущего префикса, и прибавляет к нему единицу.
Помните: последовательная работа над кодом и отказ от «жесткого» прописывания номеров — залог стабильной работы вашей системы 1С. Если после анализа подписок вы найдете ошибки, исправляйте их, делая код более гибким и независимым от конкретных числовых значений.