При разработке или доработке конфигураций на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с необходимостью создания нового документа на базе существующего. Самый простой путь — копирование объекта в дереве метаданных. Однако этот метод таит в себе множество «подводных камней». Одной из типичных проблем является ошибка: «Обнаружены неразрешимые ссылки: Документ.ЗаказКлиента1.Характеристики». Рассмотрим подробно, почему это происходит и как правильно решить данную задачу.
Когда мы копируем объект метаданных (например, Документ.ЗаказКлиента), платформа создает полную копию структуры: реквизиты, табличные части, формы и модули. Но важно понимать, что автоматического переименования обращений в программном коде не происходит. Если в модуле исходного документа был жестко прописан вызов по имени типа, например Документы.ЗаказКлиента.СоздатьДокумент(), то в копии этот код останется неизменным.
Проанализируем ситуацию с характеристиками. Ошибка «Обнаружены неразрешимые ссылки» чаще всего возникает в двух случаях:
Разберем по шагам проверку свойств объекта. В дереве метаданных откроем наш новый документ (например, ЗаказКлиента1) и перейдем на закладку «Характеристики». В современных конфигурациях (УТ 11, ERP, КА) этот раздел используется для настройки дополнительных реквизитов и сведений.
Если там заполнены поля «Виды характеристик» или «Значения характеристик», система ожидает найти соответствующее описание. Часто ссылки там ведут на ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения, где программно жестко прописана связь с конкретным типом объекта. Нам необходимо убедиться, что новый документ корректно описан в этой структуре.
Как мы уже выяснили, программный код модулей копируется «как есть». Если ваш новый документ называется ЗаказКлиента1, а в коде остались упоминания ЗаказКлиента, это приведет к ошибкам при компиляции или в процессе работы. Чтобы не исправлять каждое вхождение вручную, используем инструмент «Глобальный поиск и замена».
Рассмотрим, как это сделать правильно:
Ctrl+Shift+H в конфигураторе.Документ.ЗаказКлиента.Документ.ЗаказКлиента1.Проанализируем пример кода, который часто вызывает проблемы при копировании:
// В модуле менеджера или формы может встретиться такой фрагмент:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказКлиента.Ссылка КАК Ссылка
|ИЗ
| Документ.ЗаказКлиента КАК ЗаказКлиента"; // Вот здесь возникнет ошибка!
В данном случае после копирования Документ.ЗаказКлиента превратится в Документ.ЗаказКлиента1, и если в тексте запроса не поменять имя таблицы, система выдаст ошибку, так как она будет искать данные в старом объекте или обнаружит несоответствие типов.
Если вы работаете в конфигурации на базе Библиотеки Стандартных Подсистем (БСП), то простого копирования объекта недостаточно. Механизм характеристик (дополнительных свойств) требует программной регистрации объекта.
Посмотрим на общие модули, которые отвечают за работу свойств. Обычно это УправлениеСвойствамиПереопределяемый. Найдем процедуру ПриОпределенииОбъектовСДополнительнымиРеквизитами. Если мы хотим, чтобы в нашем новом документе работали характеристики, нам нужно добавить его в список поддерживаемых типов:
Процедура ПриОпределенииОбъектовСДополнительнымиРеквизитами(Список) Экспорт
Список.Добавить(Метаданные.Документы.ЗаказКлиента);
Список.Добавить(Метаданные.Документы.ЗаказКлиента1); // Добавляем нашу копию
КонецПроцедуры
Без этой регистрации подсистема «Свойства» не будет знать, как обрабатывать ваш новый документ, и при попытке обращения к таблице характеристик возникнет исключение.
При копировании сложного документа, такого как «Заказ клиента», критически важно проверить Подписки на события. В 1С многие действия (заполнение цен, расчет налогов, запись в регистры) вынесены в подписки.
Рассмотрим ситуацию: у исходного документа есть подписка ПриЗаписи, которая вызывает определенный общий модуль. При создании копии документа, эта копия не включается в список источников подписки автоматически. Вам необходимо найти все подписки, где участвует ЗаказКлиента, и вручную проставить галочку напротив ЗаказКлиента1. В противном случае ваш новый документ будет «мертвым» — у него не будут работать стандартные механизмы проведения и проверки.
Проанализировав трудозатраты на поддержку копий (ЗаказКлиента1, ЗаказКлиента2 и так далее), профессиональные разработчики приходят к выводу, что это плохая практика. Каждый раз при обновлении конфигурации от поставщика вам придется вручную переносить изменения во все ваши копии.
Вместо копирования рекомендуем использовать Механизм расширений. Если вам нужно изменить логику работы характеристик или добавить новые поля, сделайте следующее:
&Вместо, &После или &Перед для перехвата методов в модулях.Это позволит сохранить типовую логику и избежать появления «неразрешимых ссылок», так как вы будете работать с оригинальным объектом ЗаказКлиента, лишь дополняя его поведение.
Если ошибка «неразрешимые ссылки» уже возникла, выполните следующие действия:
Ctrl+Shift+F) и глобальную замену (Ctrl+Shift+H) по имени старого объекта внутри вашего нового объекта.Тип("ДокументСсылка.ЗаказКлиента").Помните, что платформа 1С предоставляет мощные инструменты для поиска (Ctrl+F в модулях, глобальный поиск), которые позволяют быстро локализовать место возникновения ошибки в коде. Регулярная проверка конфигурации через меню «Конфигурация — Проверка конфигурации» также поможет выявить все неразрешимые ссылки еще до попытки запуска программы.