Конвертация данных 2.1: почему БСП не регистрирует изменения объектов и нужно ли включать все реквизиты в ПКО?

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

При настройке обмена данными между конфигурациями 1С на базе Библиотеки стандартных подсистем (БСП) с использованием Конвертации данных 2.1 (КД 2.1) разработчики часто сталкиваются с крайне странным поведением системы. Сценарий выглядит следующим образом: в базе-источнике изменяется или перепроводится документ, но он упорно отказывается регистрироваться на узле плана обмена. При этом правила регистрации объектов (ПРО) настроены корректно, авторегистрация отключена (как того требует методология ИТС), а подписки на события активны. В процессе отладки выясняется, что система даже не пытается анализировать правила регистрации, прерывая выполнение алгоритма на более раннем этапе.

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

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

Для того чтобы понять логику БСП, проанализируем путь, который проходит объект при записи. За регистрацию изменений в БСП обычно отвечает подписка на событие перед записью объекта, например, ОбменДаннымиСобытия.МеханизмРегистрацииОбъектовПередЗаписьюДокумента (или аналогичная для справочников).

Внутри этого механизма БСП выполняет оптимизацию, призванную снизить нагрузку на базу данных и уменьшить объем передаваемой информации. Эта оптимизация называется «Фильтром выборочной регистрации объектов». Логика разработчиков БСП здесь следующая: зачем регистрировать объект к обмену и отправлять его на другой узел, если в нем изменились только те реквизиты, которые вообще не участвуют в конвертации данных и никак не переносятся в приемник?

Чтобы реализовать эту логику, БСП работает по следующему алгоритму:

  1. При загрузке правил обмена в информационную базу (через файл ПравилаОбмена.xml) данные записываются в регистр сведений «Правила для обмена данными».
  2. БСП автоматически парсит структуру ПКО (Правил конвертации объектов) и ПКС (Правил конвертации свойств). Она собирает список всех реквизитов объекта, для которых в КД 2.1 настроены правила сопоставления.
  3. Этот список реквизитов кэшируется в специальном параметре сеанса ПравилаВыборочнойРегистрацииОбъектов.
  4. При записи объекта (в обработчике подписки перед записью) БСП обращается к этому кэшу и проверяет, изменились ли конкретно те реквизиты, которые входят в список ПКС.
  5. Если изменился реквизит, которого нет в правилах конвертации (например, системный комментарий, или новый добавленный программистом реквизит, или даже сумма документа, если в ПКО переносятся только Номер и Дата), БСП считает, что для принимающей стороны объект остался неизменным. В итоге регистрация сбрасывается, а управление коду правил регистрации объектов (ПРО) даже не передается.

Такое поведение БСП логично с точки зрения экономии трафика, но оно создает огромные проблемы разработчикам в следующих случаях:

Рассмотрим, какими способами можно решить эту проблему и заставить систему регистрировать объекты корректно.

Решение 1. Полное отключение фильтра выборочной регистрации (Штатный метод)

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

Разберем по шагам, как отключить фильтр выборочной регистрации:

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

После отключения этого флага БСП перестанет анализировать состав реквизитов ПКС при записи объектов. При любом изменении объекта система сразу будет передавать управление правилам регистрации объектов (ПРО), где вы уже сможете тонко настроить условия регистрации.

Решение 2. Использование «фиктивных» ПКС (Точечная настройка)

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

Например, у нас есть реквизит СтатусДокумента или какой-то внутренний признак, изменение которого должно приводить к выгрузке документа (поскольку это меняет логику ПРО), но сам этот реквизит в приемнике не нужен или отсутствует.

Разберем, как настроить «фиктивное» правило конвертации свойства в конфигурации «Конвертация данных 2.1»:

  1. Откройте ваши правила конвертации в КД 2.1 и перейдите к нужному ПКО.
  2. Добавьте новое правило конвертации свойства (ПКС) для отслеживаемого реквизита. В качестве источника укажите ваш реквизит (например, СтатусДокумента), а приемник оставьте пустым.
  3. Перейдите в обработчики событий для этого ПКС и выберите событие «При выгрузке».
  4. Напишите следующий код, который предотвратит физическую выгрузку значения в XML-файл обмена:

// Отменяем выгрузку значения свойства в файл обмена
Значение = Неопределено;
Отказ = Истина;

Как это работает: При загрузке правил обмена в базу БСП увидит, что для реквизита СтатусДокумента определено правило конвертации (ПКС). Система послушно добавит его в список отслеживаемых в параметре сеанса ПравилаВыборочнойРегистрацииОбъектов. При изменении этого реквизита документ будет успешно зарегистрирован к обмену. Однако в момент непосредственной выгрузки сработает обработчик «При выгрузке», значение будет сброшено, и оно не попадет в файл обмена, тем самым не вызывая ошибок в базе-приемнике.

Дополнительные рекомендации по ручной регистрации изменений

Иногда в процессе работы обменов возникает необходимость принудительно переотправить документы, которые по какой-то причине не зарегистрировались автоматически (например, если правила были настроены некорректно или произошел сбой). Менять реквизиты документов вручную ради этого — плохая практика.

Для решения таких задач в БСП предусмотрена штатная обработка «Регистрация изменений для обмена данными». Рассмотрим особенности работы с ней:

Резюме и выводы

Мы выяснили, что поведение БСП, при котором изменения объектов не регистрируются из-за отсутствия реквизитов в правилах конвертации (ПКО), является штатным и задокументированным механизмом оптимизации.

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

← На главную