В процессе эксплуатации информационных баз 1С 7.7 пользователи нередко сбивают встроенную автонумерацию справочников (например, «Номенклатура» или «Контрагенты»). Это происходит, если код вводится вручную без ведущих нулей (10 вместо 0000000010) или содержит произвольные символы. В результате платформа ориентируется на максимальное строковое значение, и автоматическое присвоение очередных номеров перестает работать корректно.
Разберем подробно, можно ли программно изменить коды справочника, как это отразится на работе системы, с какими скрытыми рисками можно столкнуться и как правильно организовать процедуру перенумерации.
Проанализируем, как устроены связи между объектами в платформе 1С:Предприятие 7.7. Внутри базы данных все ссылки из документов, регистров, проводок и подчиненных справочников (например, «Цены» или «Единицы») формируются не по коду или наименованию, а по неизменяемому системному идентификатору объекта (внутреннему ID). Изменение строкового представления реквизита Код не приводит к разрыву ссылочной целостности: все ранее проведенные документы и движения сохранят корректные ссылки на свои элементы.
Несмотря на сохранность ссылок внутри базы, массовое изменение кодов может вызвать серьезные сбои в смежных подсистемах и внешних модулях. Рассмотрим основные факторы риска:
.ert) или модулях конфигурации присутствует метод НайтиПоКоду() с жестко заданным значением, эти алгоритмы перестанут работать или вернут неверный объект. Особое внимание следует обратить на специализированные обработки загрузки данных от поставщиков, обменов с сайтами и клиент-банками.Чтобы избежать ошибок уникальности и блокировок, процедуру перенумерации необходимо выполнять строго по правилам:
МонопольныйРежим(1)), чтобы исключить создание новых элементов пользователями во время работы скрипта.TMP_000001). На втором шаге выполняется итоговая запись чистых кодов с ведущими нулями. Это полностью исключает конфликт контроля уникальности.ЗафиксироватьТранзакцию() (например, каждые 200–500 записей).Посмотрим на пример кода обработки для перенумерации справочника «Номенклатура» в два этапа:
Процедура ВыполнитьПеренумерацию()
Если МонопольныйРежим() = 0 Тогда
Предупреждение("Перенумерация должна выполняться только в монопольном режиме!");
Возврат;
КонецЕсли;
Спр = СоздатьОбъект("Справочник.Номенклатура");
Счетчик = 0;
ДлинаКода = Метаданные.Справочник("Номенклатура").ДлинаКода;
// Шаг 1: Присвоение временных кодов для исключения дублей
НачатьТранзакцию();
Спр.ВыбратьЭлементы(0);
Пока Спр.ПолучитьЭлемент() = 1 Цикл
Если Спр.ЭтоГруппа() = 0 Тогда
Счетчик = Счетчик + 1;
Спр.Код = "TMP_" + СокрЛП(Строка(Счетчик));
Спр.Записать();
Если Счетчик % 200 = 0 Тогда
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
КонецЕсли;
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
// Шаг 2: Присвоение итоговых кодов нужного формата
Счетчик = 0;
НачатьТранзакцию();
Спр.ВыбратьЭлементы(0);
Пока Спр.ПолучитьЭлемент() = 1 Цикл
Если Спр.ЭтоГруппа() = 0 Тогда
Счетчик = Счетчик + 1;
НовыйКод = Строка(Счетчик);
Пока СтрДлина(НовыйКод) < ДлинаКода Цикл
НовыйКод = "0" + НовыйКод;
КонецЦикла;
Спр.Код = НовыйКод;
Спр.Записать();
Если Счетчик % 200 = 0 Тогда
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
КонецЕсли;
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
Предупреждение("Перенумерация завершена. Перезапустите программу для сброса нумератора.");
КонецПроцедуры
Привязка обменов исключительно к наименованию или прямому коду базы-источника является архитектурно уязвимым решением. Разберем, как правильно организовать сопоставление данных между конфигурациями «Торговля и Склад» и «Бухгалтерский учет»:
КодВБазеТиС) или использовать таблицу соответствий. При выгрузке элемент сначала ищется по этому реквизиту. Если он найден — обновляются остальные поля, если нет — создается новый элемент и в него записывается исходный код из ТиС.Код на редактирование обычным пользователям, чтобы предотвратить повторный срыв автонумератора.