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

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

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

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

Выясним причины появления ошибки «Объект не найден»

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

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

Способ 1. Использование обработки «Регистрация изменений для обмена» и консоли запросов

Посмотрим, как зарегистрировать объекты без написания кода с помощью типовой обработки «Регистрация объектов для обмена» (или «Регистрация изменений для обмена»):

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

Способ 2. Программная регистрация через платформенный метод

Разберем программный вариант решения задачи. Если у нас есть готовый запрос, выгрузим его результат в массив ссылок и зарегистрируем изменения на узле обмена одной командой. Метод ПланыОбмена.ЗарегистрироватьИзменения() напрямую обновляет служебную таблицу регистрации изменений, не создавая лишней нагрузки на систему.

Рассмотрим пример кода:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	РеализацияТоваровУслуг.Контрагент КАК Контрагент
    |ИЗ
    |	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |ГДЕ
    |	РеализацияТоваровУслуг.Проведен";

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

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

Если МассивКонтрагентов.Количество() > 0 Тогда
    ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, МассивКонтрагентов);
КонецЕсли;

Способ 3. Регистрация изменений с помощью функций БСП

Если разработка ведется в конфигурации на базе Библиотеки стандартных подсистем (БСП), рекомендуется использовать предназначенные для этого сервисные процедуры. Процедура ОбменДаннымиСобытия.ЗарегистрироватьИзмененияДанных() учитывает состав плана обмена и правила выгрузки узла:


Для Каждого СсылкаИзМассива Из МассивКонтрагентов Цикл
    ОбменДаннымиСобытия.ЗарегистрироватьИзмененияДанных(УзелОбмена, СсылкаИзМассива);
КонецЦикла;

Почему не стоит использовать перезапись объектов через Записать()

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

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

Поэтому правильным и безопасным решением является непосредственная регистрация изменений через ПланыОбмена.ЗарегистрироватьИзменения() или с помощью обработки регистрации изменений.

← На главную