Одной из самых распространенных и в то же время досадных проблем в работе с платформой 1С:Предприятие является сбой автоматической нумерации справочников. Пользователь пытается записать новый элемент, но система выдает ошибку, сообщая, что «Код не уникален», или, в некоторых случаях, просто выводит пустое сообщение об ошибке. Рассмотрим подробнее, почему это происходит и какими способами можно вернуть систему в рабочее состояние.
Для начала проанализируем ситуацию с точки зрения механизмов платформы. В 1С коды справочников чаще всего имеют строковый тип. Это сделано для возможности использования префиксов (например, организации или узла распределенной информационной базы). Когда пользователь создает новый элемент, система ищет последний использованный код и прибавляет к нему единицу.
Основная проблема кроется в строковой сортировке. Разберем по шагам типичный сценарий «поломки»:
000000001, 000000002 и так далее.1 (или 999).999 будет «больше», чем 000000009.999 уже существует, и система пытается создать его снова), возникает конфликт уникальности.Часто проблема усугубляется отсутствием лидирующих нулей или случайным вводом символов в середине кода. Как только логика инкремента нарушается, штатный механизм УстановитьНовыйКод() перестает выдавать корректные значения.
Если в справочнике уже накопилось множество «кривых» кодов, рассмотрим вариант массового исправления. В составе типовых конфигураций (в разделе администрирования или в составе инструментов разработчика) существует обработка «Перенумерация объектов».
Проанализируем алгоритм действий при ее использовании:
Этот метод хорош тем, что он «чистит» базу полностью, возвращая нумерацию к классическому виду 000000001.
Чтобы ситуация не повторилась, самым правильным решением будет технический запрет на изменение кода пользователями. Посмотрим на пример того, как это можно реализовать. Наилучший способ — использовать расширение конфигурации, чтобы не снимать основную программу с поддержки.
В расширении для нужной формы справочника в событии ПриСозданииНаСервере можно прописать следующий код:
&НаСервере
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Элементы.Код.ТолькоПросмотр = Истина;
КонецПроцедуры
Такой подход гарантирует, что автонумерация будет работать по правилам платформы, а пользователи не смогут внести хаос в структуру данных. Если же пользователям жизненно необходимо хранить какие-то свои номера, рассмотрим альтернативу: создание дополнительного реквизита справочника (например, РучнойНомер или ВнешнийИдентификатор). Пусть пользователи заполняют его, а системный код остается в ведении платформы.
Если ошибка возникает только у одного конкретного элемента и вы не хотите перенумеровывать весь справочник, можно воспользоваться методом УстановитьНовыйКод(). Этот метод принудительно рассчитывает следующий номер на основании текущих данных в базе.
Разберем ситуацию: мы нашли «проблемный» элемент, код которого мешает остальным. Мы можем программно вызвать процедуру:
ОбъектСправочника = ЭлементыСправочника.НайтиПоКоду("999").ПолучитьОбъект();
ОбъектСправочника.УстановитьНовыйКод("ПРФ-"); // Где ПРФ- это ваш префикс
ОбъектСправочника.Записать();
После выполнения этого кода система пересчитает номер для данного элемента, и, скорее всего, «затык» в автонумерации исчезнет.
Иногда проблема кроется в том, что справочник просто «перерос» выделенный ему объем. Например, если длина кода была установлена в 3 символа, то после кода 999 система не сможет создать новый уникальный номер. В этом случае рассмотрим техническое решение по увеличению длины кода в метаданных.
Важно: Увеличение длины кода — это изменение структуры базы данных. После этого действия крайне желательно запустить обработку перенумерации, чтобы заполнить новые разряды лидирующими нулями. Код 1 при длине 3 выглядит как 001, а при длине 5 он должен стать 00001. Без этого сортировка останется сломанной.
При исправлении кодов справочников выясним, какие «подводные камни» могут встретиться специалисту:
Управление торговлей и Бухгалтерия предприятия), изменение кода может быть фатальным. Если правила обмена настроены на поиск по коду, то после перенумерации при следующем обмене система создаст дубликаты всех элементов, так как не найдет старые коды. В таких случаях перенумерацию нужно проводить одновременно во всех связанных базах.1C:Enterprise Server Administration или вызов метода ОбновитьПовторноИспользуемыеЗначения().A001 (латинская A) и А001 (русская А) — это два абсолютно разных диапазона нумерации.Подводя итог, проанализируем оптимальную стратегию действий при возникновении ошибки записи из-за неуникального кода:
Код для пользователей через расширение или механизм прав доступа.Помните, что порядок в кодах справочников — это залог стабильной работы всех автоматизированных механизмов платформы 1С.