В работе с программами на платформе «1С:Предприятие 8», особенно в конфигурациях на обычных формах, таких как «Бухгалтерия предприятия 2.0», пользователи часто сталкиваются с проблемой дублирования кодов. Ситуация выглядит следующим образом: при попытке создать нового контрагента система предлагает код, который уже существует в базе (например, Ю9999), что приводит к ошибке нарушения уникальности или появлению дублей. В этой статье мы подробно разберем, почему это происходит и как окончательно решить проблему.
Прежде чем приступать к исправлению, давайте проанализируем, как «сломалась» нумерация. В среде 1С существует несколько типовых сценариев, приводящих к появлению дублей:
9999. Когда система достигает значения Ю9999, она не может инкрементировать его до Ю10000, так как это потребует 6 символов. В результате 1С постоянно предлагает последний доступный номер.Для начала нам необходимо выявить масштаб проблемы. Проанализируем справочник Контрагенты. Если не уникальных позиций немного (до 10-20), их можно обработать вручную. Если же их сотни, нам потребуются инструменты автоматизации. Мы можем использовать стандартную обработку «Универсальные подбор и обработка объектов» или консоль запросов.
При поиске обратите внимание на коды, которые визуально кажутся одинаковыми, но таковыми не являются для базы. Например, латинская «C» вместо кириллической «С» или наличие невидимых пробелов в конце строки. Рассмотрим пример запроса для поиска дублей:
ВЫБРАТЬ
Контрагенты.Код КАК Код,
КОЛИЧЕСТВО(Контрагенты.Ссылка) КАК КоличествоСсылок
ИЗ
Справочник.Контрагенты КАК Контрагенты
СГРУППИРОВАТЬ ПО
Контрагенты.Код
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Контрагенты.Ссылка) > 1
Рассмотрим ситуацию, когда мы обнаружили 200-250 дублей. Чтобы восстановить уникальность, необходимо перекодировать существующие записи. Мы можем воспользоваться обработкой «Универсальные подбор и обработка объектов». Порядок действий следующий:
Важно помнить, что простое изменение кода у дублей может не помочь, если механизм автонумерации продолжает «смотреть» на старое максимальное значение. Поэтому рекомендуется привести все коды к единому стандарту длины, заполнив их ведущими нулями.
Даже после того, как мы исправили все коды в базе, 1С может продолжать предлагать старый ошибочный код. Это происходит из-за того, что сервер хранит в памяти последнее значение. Чтобы «взбодрить» систему, мы воспользуемся методом ОбновитьНумерациюОбъектов().
Для этого откроем консоль кода или внешнюю обработку и выполним команду для нашего справочника:
ОбновитьНумерациюОбъектов(Метаданные.Справочники.Контрагенты);
Сообщить("Нумерация справочника Контрагенты успешно обновлена!");
Эта команда заставляет платформу пересчитать максимальное значение кода непосредственно по таблицам базы данных, игнорируя старый кэш. Рассмотрим нюанс: если ваша база файловая, иногда достаточно просто перезайти в программу единственным пользователем, но для клиент-серверного варианта выполнение этой команды является обязательным.
Разберем подробнее ситуацию, когда код Ю9999 является максимально возможным по длине. Если мы выполним ОбновитьНумерациюОбъектов(), но в базе останется хотя бы один объект с кодом Ю9999, следующий новый объект все равно получит этот же код, так как расти некуда.
Варианты решения:
Контрагенты и на вкладке «Данные» увеличить длину кода (например, с 5 до 8). Это позволит системе генерировать коды типа Ю0001000. Помните, что это изменение типовой конфигурации.Ю9999 на Ю0999, если общая длина позволяет, или сократить префикс.В некоторых случаях, как показала практика обсуждения на форуме, даже после всех манипуляций проблема может сохраняться на конкретных рабочих местах. Это связано с локальным кэшем пользователя. Если после программного обновления нумерации новый код все равно «прыгает» на старое значение, выполните следующие действия:
%AppData%\1C\1cv8).Проанализировав проблему дублирования кодов, мы выяснили, что она редко возникает сама по себе. Чаще всего это результат человеческого фактора или архитектурных ограничений длины поля. Для предотвращения таких ситуаций в будущем рекомендуем:
Ю00001 вместо Ю1).Таким образом, последовательное выполнение очистки данных, использование функции ОбновитьНумерациюОбъектов и контроль длины кода позволяют полностью устранить проблему дублирования в справочнике Контрагенты.