В процессе сопровождения конфигураций 1С часто возникает задача нормализации нормативно-справочной информации: утвержден новый классификатор, пересмотрен список используемых единиц измерения или требуется исключить дубли. Основная сложность заключается в том, что старые элементы справочника уже задействованы в проведенных документах и регистрах, а прямая замена или загрузка новых данных может приводить к ошибкам контроля уникальности кодов. Разберем по шагам, как правильно выполнить такую замену, не нарушив ссылочную целостность базы данных.
Прежде чем приступать к загрузке новых позиций и замене ссылок, выясним причину возможных сложностей в архитектуре конфигурации:
Номенклатура (реквизит Владелец). Если единицы подчинены номенклатуре, загружать единый общий список нельзя — каждой единице измерения должен быть сопоставлен конкретный владелец.Для того чтобы не выполнять лишних сопоставлений вручную, определим, какие именно единицы измерения реально используются в базе данных. Платформа 1С предоставляет глобальный метод НайтиПоСсылкам, позволяющий получить полную картину использования элементов.
Рассмотрим пример кода для поиска ссылок на элементы справочника:
МассивСсылок = Новый Массив;
Выборка = Справочники.ЕдиницыИзмерения.Выбрать();
Пока Выборка.Следующий() Цикл
МассивСсылок.Добавить(Выборка.Ссылка);
КонецЦикла;
ТаблицаСсылок = НайтиПоСсылкам(МассивСсылок);
// В ТаблицаСсылок содержатся колонки: Данные, Метаданные, Менеджер
Для Каждого СтрокаТаблицы Из ТаблицаСсылок Цикл
Сообщить("Элемент " + СтрокаТаблицы.Данные + " используется в: " + СтрокаТаблицы.Метаданные.Имя);
КонецЦикла;
Если для конкретного элемента в результирующей таблице нет записей, значит, данный элемент не используется ни в одном документе или регистре и может быть удален сразу без предварительной замены ссылок.
При попытке загрузить новые единицы измерения из внешнего файла (например, Excel) часто возникает ошибка контроля уникальности: код нового элемента совпадает с кодом старого элемента, который пока нельзя удалить, так как на него ссылаются документы.
Разберем способы обхода этой коллизии:
00001 в 10001). После освобождения рабочего диапазона кодов новые элементы запишутся без ошибок.УстановитьНовыйКод() или при обычной записи объекта.После того как новые элементы созданы в справочнике, перейдем к переносу ссылочных связей. Для этого используем стандартную обработку «Поиск и замена значений» (или ее модификацию «Поиск и замена дублирующихся элементов с подбором»).
Алгоритм действий следующий:
Проанализируем важный технический нюанс: стандартная замена ссылок в табличной части проведенного документа без перепроведения сохраняет старые ссылки в движениях регистров накопления и бухгалтерии.
Если конфигурация использует регистры, для обеспечения целостности данных необходимо:
Если замена выполняется программным кодом для документов закрытого периода, установим признак обмена данными, чтобы обойти проверки даты запрета изменения данных и встроенные обработчики валидации:
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.ОбменДанными.Загрузка = Истина;
Для Каждого СтрокаТЧ Из ДокументОбъект.Товары Цикл
Если СтрокаТЧ.ЕдиницаИзмерения = СтараяСсылка Тогда
СтрокаТЧ.ЕдиницаИзмерения = НоваяСсылка;
КонецЕсли;
КонецЦикла;
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Когда процедура замены ссылок завершена во всех метаданных, старые элементы справочника следует пометить на удаление. Окончательную очистку базы выполним через стандартную обработку контроля ссылочной целостности («Удаление помеченных объектов») либо программно с помощью метода УдалитьОбъекты():
МассивДляУдаления = Новый Массив;
МассивДляУдаления.Добавить(СтараяСсылка);
// Второй параметр "Истина" включает контроль ссылочной целостности
УдалитьОбъекты(МассивДляУдаления, Истина);
Если замена прошла корректно и старые единицы измерения больше нигде не используются, платформа без ошибок физически удалит их из информационной базы.