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