Ситуация, когда в 1С перестает работать автоматическое присвоение кодов в справочниках, является довольно распространенной, особенно после масштабного переноса данных из версии 7.7 или внесения изменений в структуру конфигурации. Пользователи сталкиваются с тем, что при попытке записать новый договор система выдает предупреждение: «Поле "Код" не заполнено». При этом ручной ввод кода позволяет сохранить элемент, но блокирует дальнейшую автоматизацию процесса. В этой статье мы подробно разберем причины возникновения такой ошибки и рассмотрим пошаговые алгоритмы ее устранения.
Разберем, почему механизм автонумерации может выйти из строя. В системе 1С за этот процесс отвечает внутренний счетчик, который анализирует существующие записи в таблице базы данных и инкрементирует (увеличивает на единицу) последний максимальный код. Основными факторами сбоя являются:
Проанализируем программный способ решения. Платформа 1С предоставляет встроенный механизм для принудительного пересчета последнего кода в справочнике. Это наиболее эффективный метод, если физически данные в базе верны, но внутренний индекс системы «завис».
Для выполнения этого действия нам потребуется создать внешнюю обработку или воспользоваться консолью кода. Рассмотрим пример кода, который необходимо выполнить:
// Обновление внутренней нумерации для справочника Договоры контрагентов
МетаданныеСправочника = Метаданные.Справочники.ДоговорыКонтрагентов;
ОбновитьНумерациюОбъектов(МетаданныеСправочника);
Сообщить("Нумерация справочника Договоры успешно обновлена!");
После выполнения данной команды платформа просканирует таблицу ДоговорыКонтрагентов, найдет максимальный код и установит внутренний счетчик на следующее значение. Рекомендуем выполнять это действие на копии базы данных.
Выясним причину, связанную с настройками конфигурации. В платформе 8.2 и выше у стандартного реквизита Код есть свойство «Проверка заполнения». Рассмотрим ситуацию: механизм автонумерации в 1С обычно срабатывает непосредственно в момент записи объекта в базу данных. Если в свойствах реквизита в конфигураторе установлено значение «Выдавать ошибку», форма элемента может потребовать заполнения кода еще до того, как сработает системный алгоритм.
Разберем шаги для проверки:
ДоговорыКонтрагентов.Код.Это позволит системе беспрепятственно дойти до этапа записи, где платформа сама присвоит нужный номер объекту.
Если в справочнике присутствуют коды, которые нарушают маску (например, коды разной длины или с префиксами), нам поможет полная перенумерация. Посмотрим, как это сделать с помощью стандартных инструментов ИТС. Рассмотрим обработку «Универсальные подбор и обработка объектов».
Алгоритм действий следующий:
ДоговорыКонтрагентов.Важно: Перед выполнением убедитесь, что в справочнике нет элементов с кодом, состоящим только из девяток, так как это вызовет ошибку переполнения при попытке инкремента.
Проанализируем ситуацию с учетом специфики объекта. Справочник ДоговорыКонтрагентов является подчиненным справочнику Контрагенты. Это означает, что в его свойствах может быть установлен режим «Нумерация в пределах подчинения».
В этом случае нумерация договоров ведется отдельно для каждого контрагента (у Контрагента А могут быть договоры 1, 2, 3, и у Контрагента Б также 1, 2, 3). Если сбой происходит только у конкретного владельца, необходимо проверить коды именно его договоров. Возможно, один из них был введен вручную с нарушением формата, что заблокировало создание последующих элементов именно для этого контрагента.
Если вышеописанные методы не помогают, рассмотрим вероятность технического повреждения индексов таблицы. Попробуем выполнить очистку локального кэша пользователя. Для этого необходимо удалить базу из списка запуска 1С и добавить её заново (это сбросит временные файлы, где могут храниться настройки форм).
Если проблема сохраняется, воспользуемся механизмом Тестирование и исправление:
Agent 1C:Enterprise, чтобы сбросить серверный кэш нумераторов.Рассмотрим вариант, к которому прибегнул автор темы в сообщении №15. Если стандартная автонумерация упорно отказывается работать из-за изменений в коде конфигурации, можно реализовать программное назначение кода в модуле объекта. Разберем пример кода в процедуре ПриУстановкеНовогоКода:
Процедура ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс)
// Если стандартный механизм не справляется, можем задать логику здесь
// Например, добавить префикс организации
Префикс = "ДК-";
КонецПроцедуры
Однако более корректным считается использование события ПередЗаписью, если требуется гарантированное заполнение реквизита. Тем не менее, мы рекомендуем сначала восстановить штатную работу механизма через ОбновитьНумерациюОбъектов, так как это сохранит целостность логики платформы без «костылей» в коде.
Подводя итог, отметим, что в 90% случаев проблема решается либо методом ОбновитьНумерациюОбъектов, либо исправлением кривого кода в последнем созданном элементе справочника, который мешает системе вычислить следующее числовое значение.