Как заменить элементы справочника и обновить ссылки в документах 1С

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

В процессе сопровождения конфигураций 1С часто возникает задача нормализации нормативно-справочной информации: утвержден новый классификатор, пересмотрен список используемых единиц измерения или требуется исключить дубли. Основная сложность заключается в том, что старые элементы справочника уже задействованы в проведенных документах и регистрах, а прямая замена или загрузка новых данных может приводить к ошибкам контроля уникальности кодов. Разберем по шагам, как правильно выполнить такую замену, не нарушив ссылочную целостность базы данных.

Анализ структуры справочника и выявление используемых позиций

Прежде чем приступать к загрузке новых позиций и замене ссылок, выясним причину возможных сложностей в архитектуре конфигурации:

  1. Подчиненность справочника: проверим, является ли справочник независимым или подчинен справочнику Номенклатура (реквизит Владелец). Если единицы подчинены номенклатуре, загружать единый общий список нельзя — каждой единице измерения должен быть сопоставлен конкретный владелец.
  2. Коэффициенты пересчета: если в справочнике единиц измерения присутствуют коэффициенты (например, для упаковок или коробок), простое переименование или замена ссылки может исказить количественный учет. Если же коэффициенты не используются (единицы являются базовыми), процесс существенно упрощается.

Для того чтобы не выполнять лишних сопоставлений вручную, определим, какие именно единицы измерения реально используются в базе данных. Платформа 1С предоставляет глобальный метод НайтиПоСсылкам, позволяющий получить полную картину использования элементов.

Рассмотрим пример кода для поиска ссылок на элементы справочника:


МассивСсылок = Новый Массив;
Выборка = Справочники.ЕдиницыИзмерения.Выбрать();
Пока Выборка.Следующий() Цикл
    МассивСсылок.Добавить(Выборка.Ссылка);
КонецЦикла;

ТаблицаСсылок = НайтиПоСсылкам(МассивСсылок);
// В ТаблицаСсылок содержатся колонки: Данные, Метаданные, Менеджер
Для Каждого СтрокаТаблицы Из ТаблицаСсылок Цикл
    Сообщить("Элемент " + СтрокаТаблицы.Данные + " используется в: " + СтрокаТаблицы.Метаданные.Имя);
КонецЦикла;

Если для конкретного элемента в результирующей таблице нет записей, значит, данный элемент не используется ни в одном документе или регистре и может быть удален сразу без предварительной замены ссылок.

Решение проблемы с неуникальными кодами при загрузке

При попытке загрузить новые единицы измерения из внешнего файла (например, Excel) часто возникает ошибка контроля уникальности: код нового элемента совпадает с кодом старого элемента, который пока нельзя удалить, так как на него ссылаются документы.

Разберем способы обхода этой коллизии:

  1. Модификация кодов старых элементов: перед импортом новых значений изменим коды существующих записей с помощью групповой обработки. Например, добавим префикс к коду или увеличим разрядность (превратим код 00001 в 10001). После освобождения рабочего диапазона кодов новые элементы запишутся без ошибок.
  2. Отказ от явной загрузки кодов: если коды в файле не являются утвержденными кодами Общероссийского классификатора (ОКЕИ), снимем сопоставление поля кода при загрузке. Платформа 1С автоматически сгенерирует уникальные коды для новых элементов при вызове метода УстановитьНовыйКод() или при обычной записи объекта.
  3. Корректировка исходного файла: если новые коды принципиальны, можно временно переименовать или сместить нумерацию в файле Excel, загрузить данные, выполнить замену ссылок, удалить старые элементы и вернуть новым элементам требуемые коды.

Подмена ссылок в документах через обработку «Поиск и замена значений»

После того как новые элементы созданы в справочнике, перейдем к переносу ссылочных связей. Для этого используем стандартную обработку «Поиск и замена значений» (или ее модификацию «Поиск и замена дублирующихся элементов с подбором»).

Алгоритм действий следующий:

  1. В колонке исходных значений указываем старый элемент справочника, который подлежит выводу из эксплуатации.
  2. В колонке новых значений выбираем соответствующий ему вновь созданный элемент.
  3. Запускаем поиск ссылок во всех объектах базы данных (документы, регистры, периодические и непериодические регистры сведений).
  4. Выполняем замену значений.

Особенности проведения документов и движений в регистрах

Проанализируем важный технический нюанс: стандартная замена ссылок в табличной части проведенного документа без перепроведения сохраняет старые ссылки в движениях регистров накопления и бухгалтерии.

Если конфигурация использует регистры, для обеспечения целостности данных необходимо:

  1. Либо выполнить полное перепроведение измененных документов.
  2. Либо программно перезаписать наборы записей соответствующих регистров.

Если замена выполняется программным кодом для документов закрытого периода, установим признак обмена данными, чтобы обойти проверки даты запрета изменения данных и встроенные обработчики валидации:


ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.ОбменДанными.Загрузка = Истина;

Для Каждого СтрокаТЧ Из ДокументОбъект.Товары Цикл
    Если СтрокаТЧ.ЕдиницаИзмерения = СтараяСсылка Тогда
        СтрокаТЧ.ЕдиницаИзмерения = НоваяСсылка;
    КонецЕсли;
КонецЦикла;

ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);

Удаление устаревших элементов

Когда процедура замены ссылок завершена во всех метаданных, старые элементы справочника следует пометить на удаление. Окончательную очистку базы выполним через стандартную обработку контроля ссылочной целостности («Удаление помеченных объектов») либо программно с помощью метода УдалитьОбъекты():


МассивДляУдаления = Новый Массив;
МассивДляУдаления.Добавить(СтараяСсылка);

// Второй параметр "Истина" включает контроль ссылочной целостности
УдалитьОбъекты(МассивДляУдаления, Истина);

Если замена прошла корректно и старые единицы измерения больше нигде не используются, платформа без ошибок физически удалит их из информационной базы.

← На главную