Почему при копировании справочника в 1С создаются элементы старого объекта и как это исправить

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

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

Анализ основной проблемы: Привязка основного реквизита формы

Разберем ситуацию, описанную пользователем: при попытке создать элемент в новом Справочнике 2, система внезапно создает объект Справочника 1. Выясним причину этого странного поведения. Проблема кроется в том, что при копировании объекта справочника вместе с ним копируются и его формы (ФормаЭлемента, ФормаСписка и др.).

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

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

  1. Откроем Форму элемента нового справочника в Конфигураторе.
  2. Перейдем на закладку «Реквизиты» (правая верхняя часть окна редактора формы).
  3. Найдем реквизит «Объект». Проанализируем колонку «Тип».
  4. Если там указано СправочникОбъект.СтарыйСправочник, нажмем на кнопку выбора и заменим его на СправочникОбъект.НовоеИмяСправочника.

После этого действия платформа предложит обновить связи реквизитов на форме. Соглашаемся, и теперь форма будет корректно работать с данными именно нового справочника.

Использование отладчика для проверки типа объекта

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Установите точку останова на строке ниже
    ТипОбъекта = ТипЗнч(Объект);
    Сообщить("Текущий тип объекта: " + ТипОбъекта);
    
КонецПроцедуры

Если отладчик показывает тип старого справочника, значит, форма все еще обращается не к тем метаданным. Также стоит проверить свойство формы «Основной реквизит» в палитре свойств — там должен быть выбран именно наш реквизит Объект с правильным типом.

Глобальный поиск и программные ссылки в коде

Копирование справочника в конфигураторе не обновляет программный код в модулях. Проанализируем модули формы и модуля объекта на наличие жестко прописанных ссылок (hardcode). Рассмотрим подробнее, что нужно искать:

Для быстрого исправления рекомендуем использовать инструмент «Глобальный поиск» (Ctrl+Shift+F). Введите имя старого справочника и ограничьте область поиска только новым справочником. Все найденные вхождения необходимо заменить на актуальное имя.

Работа с подписками на события и правами доступа

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

Проанализируем ситуацию с подписками:

  1. Найдем в дереве конфигурации раздел «Общие» -> «Подписки на события».
  2. Просмотрим подписки, где источником является СправочникОбъект.СтарыйСправочник.
  3. Если логика этих подписок должна распространяться и на новый справочник, добавим СправочникОбъект.НовыйСправочник в список типов источника подписки.

Важный момент: Не забудьте проверить роли и права доступа. При копировании объекта права на него по умолчанию есть только у полных прав. Чтобы пользователи могли работать с новым справочником, нужно вручную проставить галочки «Чтение», «Просмотр», «Добавление» и «Изменение» во всех соответствующих ролях.

Методика разделения данных (Data Migration)

Как справедливо отмечено в обсуждении, «в конфигураторе данные не поделишь». После того как мы создали структуру нового справочника, нам нужно перенести туда часть данных из старого. Рассмотрим, как это сделать правильно:

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


НовыйЭлемент = Справочники.НовыйСправочник.СоздатьЭлемент();
ЗаполнитьЗначенияСвойств(НовыйЭлемент, СсылкаНаСтарыйСправочник);
НовыйЭлемент.Наименование = СсылкаНаСтарыйСправочник.Наименование;
НовыйЭлемент.Записать();

Шаг 2: Поиск и замена ссылок. Поскольку GUID (уникальные идентификаторы) у старых и новых элементов будут разными, все документы, ссылавшиеся на «Старый справочник», не узнают о появлении нового. Если вы хотите, чтобы старые документы теперь указывали на новый справочник, необходимо воспользоваться стандартной обработкой «Поиск и замена значений».

Шаг 3: Удаление дублей. Только после того, как все ссылки в системе обновлены, можно безопасно удалять элементы из исходного справочника. Помните о контроле ссылочной целостности — 1С не позволит удалить элемент, если он еще где-то используется.

Резюме

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

← На главную