При работе в программных продуктах на платформе 1С:Предприятие 7.7 пользователи периодически сталкиваются с неприятной ситуацией: при попытке отредактировать элемент справочника или выполнить замену комплектующих система выдает модальное окно с предупреждением «Код не уникален». При этом программа буквально блокируется — закрыть окно крестиком или штатно завершить работу приложения становится невозможно. Любые клики мышкой по экрану лишь вызывают повторное появление этой же ошибки, создавая иллюзию «зависания» всей системы.
В этой статье мы подробно разберем, почему возникает этот сбой, как экстренно разблокировать интерфейс программы без потери данных и как раз и навсегда решить проблему сбившейся автонумерации в справочниках 1С 7.7.
Для начала проанализируем поведение платформы 1С 7.7. Когда мы открываем форму элемента справочника или начинаем редактировать строку непосредственно в табличной части (например, при замене комплектующих в подчиненном справочнике), система переводит фокус ввода на редактируемое поле кода.
Если мы случайно или намеренно пытаемся кликнуть мышкой в любую другую область экрана, переключиться на другую вкладку или закрыть программу нажатием на крестик, платформа пытается увести фокус с текущего поля. Однако перед этим в фоновом режиме запускается стандартная процедура проверки корректности данных. Система сверяет введенный код на уникальность по всей базе данных (или в пределах подчинения).
Поскольку код совпадает с уже существующим, проверка возвращает ошибку, на экран выводится предупреждающее окно «Код не уникален», а фокус принудительно возвращается обратно в редактируемое поле. Каждый последующий клик мышкой по любому элементу интерфейса воспринимается платформой как новая попытка выйти из поля, что снова запускает проверку и вызывает бесконечный цикл модальных окон. Закрыть программу через «крестик» в этот момент физически невозможно, так как система ожидает завершения текущей транзакции редактирования.
Решение проблемы «зависания»: Чтобы прервать этот замкнутый круг без аварийного завершения процесса через Диспетчер задач Windows (которое может привести к повреждению базы данных), необходимо нажать клавишу Esc на клавиатуре. Это действие отменит ввод некорректного значения, закроет режим редактирования строки и вернет фокус интерфейса в нормальное состояние. После этого вы сможете спокойно закрыть форму или продолжить работу.
Часто разработчики и администраторы начинают искать проблему уникальности в основном справочнике Справочник.Изделия. Однако при замене комплектующих в спецификациях или составе изделий изменения вносятся не в сам справочник готовой продукции, а в его подчиненный справочник (например, Состав, Спецификации, Аналоги или ВариантыКомплектации).
В платформе 1С 7.7 для любого подчиненного справочника в конфигураторе может быть установлено два режима контроля уникальности кодов:
Если в подчиненном справочнике установлен глобальный контроль уникальности, а нумерация сбилась, система будет выдавать ошибку при попытке записать любой новый аналог или комплектующую. Поэтому искать дублирующиеся коды необходимо именно в подчиненной структуре.
Выясним, из-за чего механизм автоматического присвоения кодов в базе данных может выйти из строя:
00000125 ввел вручную 125 или добавил буквенный индекс 125-А), встроенный алгоритм автонумерации сбивается. Платформа анализирует текстовое поле кода, пытается прибавить единицу к последнему значению, но из-за нарушения структуры шаблона не может корректно вычислить следующий номер и начинает раз за разом предлагать уже занятый старый код.9999. При попытке создать 10000-й элемент система не сможет расширить поле кода и начнет предлагать записать элемент с уже существующим номером, вызывая ошибку уникальности.МСК-0001 и СПБ-0001), то при слиянии баз во время очередного сеанса обмена возникнет наложение диапазонов и появятся дубликаты..CDX могут повредиться. Программа перестает «видеть» реальное максимальное значение кода в таблице и начинает генерировать повторяющиеся номера.Рассмотрим последовательность действий, которые помогут администратору или программисту полностью восстановить работоспособность базы данных.
Если справочник небольшой, исправить ситуацию можно визуальным анализом списка:
125 напишите 00000125). После этого закройте и снова откройте справочник для проверки работы автонумератора.Если записей в базе слишком много, ручной поиск неэффективен. Напишем простую обработку на встроенном языке 1С 7.7, которая поможет быстро выявить все дублирующиеся коды в проблемном справочнике. Создадим внешнюю обработку и разместим в ней следующий программный код:
// Создаем объект справочника для обхода базы
Спр = СоздатьОбъект("Справочник.Аналоги"); // Укажите имя вашего проблемного справочника
ТекКод = "";
// Устанавливаем сортировку по коду для корректного последовательного сравнения
Спр.ПорядокКодов();
Спр.ВыбратьЭлементы();
Сообщить("--- Запуск проверки уникальности кодов ---");
Пока Спр.ПолучитьЭлемент() = 1 Цикл
// Пропускаем группы, если проверка идет по элементам
Если Спр.ЭтоГруппа() = 1 Тогда
Продолжить;
КонецЕсли;
// Сравниваем код текущего элемента с кодом предыдущего
Если СокрЛП(Спр.Код) = СокрЛП(ТекКод) Тогда
Сообщить("Найден дублирующийся код: " + Спр.Код + " у элемента: " + Спр.Наименование);
КонецЕсли;
ТекКод = Спр.Код;
КонецЦикла;
Сообщить("--- Проверка успешно завершена ---");
Запустите данную обработку в режиме предприятия. В окне сообщений вы увидите список всех элементов, коды которых дублируются. Вам останется лишь открыть их и изменить повторяющиеся коды на уникальные.
Если визуально все коды выглядят корректно, а новые элементы все равно не создаются из-за ошибки уникальности, вероятно, повреждены файлы индексов. Проведем процедуру переиндексации таблиц:
.CDX, что восстановит правильную работу автонумерации.В ситуации, когда нумерация уперлась в физический предел разрядности поля (например, достигнут код 999 при длине кода равной 3), необходимо увеличить длину поля в метаданных:
Если кодов со сбитым форматом оказалось слишком много (сотни или тысячи), ручное исправление займет недопустимо много времени. В таких случаях мы рекомендуем использовать специализированные сервисные обработки перенумерации справочников (например, универсальную внешнюю обработку UniversalReNumbering.ert).
Эти инструменты позволяют автоматически перебрать все элементы выбранного справочника, восстановить корректное количество ведущих нулей, убрать лишние символы и выстроить строгую хронологическую последовательность номеров без потери связей между объектами базы данных.