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

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

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

Давайте подробно разберем, почему так происходит и как заставить систему выгрузить нужный нам объект, даже если он не соответствует общим правилам фильтрации.

Причина проблемы: многоуровневая система фильтрации в БСП

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

Рассмотрим весь процесс по шагам:

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

Если в настройках для справочников установлен режим «Отправлять только используемую в документах», то система для вашего принудительно зарегистрированного элемента справочника задаст себе вопрос: «А есть ли на этот элемент ссылка в документах, которые выгружаются в этом же сеансе обмена?». Если таких документов нет, система принимает решение: объект выгружать не нужно. Он не соответствует правилам.

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

Интересный побочный эффект: регистрация удаления

Проанализируем еще одну важную деталь. Если какой-то объект ранее выгружался (то есть соответствовал правилам, например, использовался в документах), а после очередного изменения перестал им соответствовать, система может поступить еще хитрее. Чтобы базы оставались синхронизированными, она может зарегистрировать для базы-приемника не изменение объекта, а его удаление. С точки зрения логики обмена, если объект больше не должен присутствовать в базе-приемнике согласно правилам, его нужно оттуда убрать. Это может приводить к неожиданным пометкам на удаление, если не понимать этот механизм.

Решение: как принудительно выгрузить нужный объект?

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

Способ 1 (Правильный): Использование регистра сведений «Данные объектов для регистрации в обменах»

Этот регистр предназначен как раз для таких случаев. Он хранит список объектов, которые должны быть зарегистрированы для обмена принудительно, даже если они не подпадают под общие правила авторегистрации.

Как это работает:

Добавление объекта в этот регистр — это прямой сигнал для механизма обмена, что данный объект является исключением и его нужно включать в выгрузку. Это наиболее корректный и надежный способ обойти фильтр «Отправлять только используемую в документах» для конкретных элементов.

Посмотрим на пример кода для добавления объекта в регистр:


// Получаем узел обмена, для которого нужно зарегистрировать объект
УзелОбмена = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоКоду("001"); // Замените на ваш код поиска узла

// Ссылка на элемент справочника, который нужно выгрузить
СсылкаНаНоменклатуру = Справочники.Номенклатура.НайтиПоКоду("Н000123"); // Пример

// Создаем запись в регистре
НаборЗаписей = РегистрыСведений.ДанныеОбъектовДляРегистрацииВОбменах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.УзелОбмена.Установить(УзелОбмена);
НаборЗаписей.Отбор.Объект.Установить(СсылкаНаНоменклатуру);

НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.УзелОбмена = УзелОбмена;
НоваяЗапись.Объект = СсылкаНаНоменклатуру;

// Записываем набор
НаборЗаписей.Записать();

// После этого можно дополнительно зарегистрировать изменения стандартным способом
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, СсылкаНаНоменклатуру);

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

Способ 2 (Радикальный): Изменение настроек обмена

Вы всегда можете зайти в настройки узла обмена и для нужного типа объектов (например, для справочника «Номенклатура») изменить правило выгрузки с «Отправлять только используемую в документах» на «Отправлять все». Это решит проблему, но у такого подхода есть серьезный недостаток: при следующем обмене система начнет выгружать все элементы этого справочника, что может привести к отправке большого объема ненужных данных и увеличению времени обмена. Этот способ стоит использовать только как временную меру для разовой выгрузки.

Дополнительный фильтр, о котором стоит знать: Настройки XDTO

Даже если вы все сделали правильно, объект может не попасть в выгрузку по еще одной причине. В БСП существует дополнительный, более низкоуровневый фильтр — проверка на соответствие типов данных, которые поддерживает конфигурация-приемник.

Эти настройки хранятся в регистре сведений НастройкиОбменаДаннымиXDTO. В нем для каждого узла обмена прописано, какие типы объектов (например, Справочник.Номенклатура) и в каком формате может получать корреспондент. Если по какой-то причине тип данных вашего объекта отсутствует в этих настройках для получателя, объект будет молча проигнорирован на этапе выгрузки, даже если он прошел все проверки по правилам регистрации. Также в случаях возникновения проблем с «битыми ссылками» или ошибками «объект не найден» может потребоваться исправление правил обмена EnterpriseData для справочников «Номенклатура» и «Склады», что позволяет устранить корневую причину сбоев при валидации данных.

← На главную