При настройке и проведении обмена данными между конфигурациями (например, между 1С:Бухгалтерия предприятия 3.0 и 1С:Управление нашей фирмой 1.5) разработчики и администраторы часто сталкиваются с ситуацией, когда перенесенные документы содержат ссылки с текстом «Объект не найден». Это происходить из-за того, что связанный элемент справочника (например, контрагент) не был зарегистрирован на узле обмена и не попал в выгружаемый пакет.
Регистрировать весь справочник контрагентов целиком бывает опасно, так как это может привести к появлению дублей в базе-приемнике. Оптимальный подход — выбрать запросом только тех контрагентов, которые фигурируют в переносимых документах, и зарегистрировать к обмену исключительно их. Рассмотрим подробнее, как решить эту задачу с помощью встроенных инструментов и программного кода.
Прежде чем переходить к выборочной регистрации объектов, проанализируем основные причины, по которым возникает битая ссылка в базе-приемнике:
Посмотрим, как зарегистрировать объекты без написания кода с помощью типовой обработки «Регистрация объектов для обмена» (или «Регистрация изменений для обмена»):
Выбрать результат (в зависимости от версии консоли она может находиться в меню Еще – Зарегистрировать – Результаты запроса).Разберем программный вариант решения задачи. Если у нас есть готовый запрос, выгрузим его результат в массив ссылок и зарегистрируем изменения на узле обмена одной командой. Метод ПланыОбмена.ЗарегистрироватьИзменения() напрямую обновляет служебную таблицу регистрации изменений, не создавая лишней нагрузки на систему.
Рассмотрим пример кода:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровУслуг.Контрагент КАК Контрагент
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Проведен";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
МассивКонтрагентов = Новый Массив;
Пока Выборка.Следующий() Цикл
МассивКонтрагентов.Добавить(Выборка.Контрагент);
КонецЦикла;
Если МассивКонтрагентов.Количество() > 0 Тогда
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, МассивКонтрагентов);
КонецЕсли;
Если разработка ведется в конфигурации на базе Библиотеки стандартных подсистем (БСП), рекомендуется использовать предназначенные для этого сервисные процедуры. Процедура ОбменДаннымиСобытия.ЗарегистрироватьИзмененияДанных() учитывает состав плана обмена и правила выгрузки узла:
Для Каждого СсылкаИзМассива Из МассивКонтрагентов Цикл
ОбменДаннымиСобытия.ЗарегистрироватьИзмененияДанных(УзелОбмена, СсылкаИзМассива);
КонецЦикла;
Иногда встречается совет выполнить запрос и просто вызвать метод Записать() для каждого найденного объекта. При перезаписи объекта платформа действительно автоматически регистрирует его на связанных узлах обмена. Однако проанализируем недостатки этого подхода:
Записать() запускает подписки на события, проверки заполнения и транзакции записи.Поэтому правильным и безопасным решением является непосредственная регистрация изменений через ПланыОбмена.ЗарегистрироватьИзменения() или с помощью обработки регистрации изменений.