Регистрация изменений в плане обмена 1С: почему правка не встала в очередь
Иван Недомолков · Опубликовано:
Если правка справочника не доехала до другой базы, начинать стоит с одного вопроса: встала ли она в очередь узла. Между записью объекта и строкой в таблице изменений библиотека стандартных подсистем проводит изменение через пять ступеней, и на любой из них механизм может молча выйти: ошибки нет, объект записан, очередь пуста. Ниже все пять по порядку, по коду типовой УТ 11.5.22.67, с замером на стенде.
Сначала факт: есть ли изменение в очереди узла
Очередь узла хранится в таблицах изменений, и их можно прочитать обычным запросом. Для справочника контрагентов:
ВЫБРАТЬ
Изм.Ссылка КАК Объект,
Изм.НомерСообщения КАК НомерСообщения
ИЗ
Справочник.Контрагенты.Изменения КАК Изм
ГДЕ
Изм.Узел = &Узел
Один объект проверяется одной строкой: ПланыОбмена.ИзменениеЗарегистрировано(Узел, Ссылка). Посмотреть и поправить очередь без кода можно штатной обработкой БСП “Регистрация изменений для обмена данными”.
Пустой номер сообщения значит, что изменение ждёт выгрузки. Заполненный говорит, что оно уже ушло в сообщение обмена: запись удалится, когда приёмник подтвердит приём.
Пустая очередь бывает и у изменения, которое давно уехало: после подтверждения приёма запись удаляется. Поэтому надёжнее сделать свежую правку и сразу посмотреть очередь. Записи нет и после неё, значит дело в регистрации, и дальше ступени по порядку. Запись есть, а на той стороне по-прежнему старое, значит смотреть надо выгрузку и загрузку, про них предпоследний раздел.
Пять ступеней от записи объекта до очереди
| Ступень | Что решает | Где смотреть |
|---|---|---|
| 1. Подписка на событие | вызывается ли механизм для этого типа | источник подписки в конфигурации |
| 2. Синхронизация данных | работает ли регистрация в базе вообще | функциональная опция и узлы плана |
| 3. Выборочная регистрация | считается ли эта запись изменением | режим плана обмена |
| 4. Авторегистрация | кто регистрирует: платформа или правила | состав плана обмена |
| 5. Правила регистрации | на какие узлы уйдёт изменение | загруженные правила плана |
1. Подписка на событие
Механизм запускается из подписки на событие “Перед записью”. В УТ 11.5 для плана обмена с Розницей это подписка ОбменДаннымиОбменУправлениеТорговлейРозницаЗарегистрироватьИзменение. Если тип объекта не входит в её источник, остальные ступени не проверяются вовсе. Какие подписки висят на нужном типе, выводит короткий код по метаданным из разбора о том, кто записывает реквизит.
2. Синхронизация данных
Регистрация работает, только когда включена функциональная опция ИспользоватьСинхронизациюДанных и в плане есть хотя бы один узел, кроме своего, помеченных на удаление и самого отправителя изменения. Проверяется это вызовом ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных"). В базе, где синхронизацию ни разу не настраивали мастером, опция выключена, и механизм не регистрирует ничего, есть у объекта правила или нет.
3. Выборочная регистрация
Даже при работающей регистрации не каждая запись объекта считается изменением. Решает режим выборочной регистрации в настройках плана обмена:
- “Отключен”: изменением считается любая запись;
- “Модифицированность”: смотрят на признак модифицированности объекта; этот режим БСП подставляет сама, если план настройку не описал;
- “Согласно правилам XML”: сравнивают значения реквизитов до и после записи, а список реквизитов берут из правил конвертации свойств. Правка реквизита, которого в этом списке нет, изменением не считается. Если строк объекта в правилах нет вовсе, фильтра нет, и изменением считается любая запись.
При любом режиме регистрируются новые объекты, наборы записей регистров, физическое удаление и объекты, записанные самим обменом. У документа изменением считается и смена признака проведения. Поэтому план обмена с регистром в составе ловит даже запись набора записей мимо документа. Если данные уходят во внешнее хранилище под отчёты, а менять конфигурацию нельзя, ту же задачу решают версиями документов и сверкой по дням, это разобрано в статье про хранилище, которое не сходится с 1С.
4. Авторегистрация
У каждого элемента состава плана обмена стоит признак авторегистрации. Разрешена, и объект регистрирует платформа. Запрещена, и механизм выполняет правила регистрации. В типовых правилах УТ - Розница авторегистрация выключена у всех 75 элементов состава: регистрацией там управляют правила.
5. Правила регистрации
Есть у объекта свои правила, и узлы отбираются по их условиям: по свойствам объекта и по реквизитам узла. Правил нет, и в коде БСП срабатывает отдельная ветка с комментарием “Правила регистрации не заданы”: объект регистрируется на всех узлах плана, кроме предопределённого. В типовых правилах УТ - Розница своего правила нет у 21 объекта из 75, среди них контрагенты, характеристики номенклатуры, штрихкоды и пользователи.
Что показал стенд
Типовая УТ 11.5.22.67, план обмена с Розницей, правила регистрации загружены из макета, один узел, синхронизация включена, режим выборочной регистрации “Модифицированность”. Очередь узла перед замером очистили, в каждом объекте правили одно строковое поле.
| Объект | Своё правило регистрации | Строк в очереди узла после правки |
|---|---|---|
| Контрагенты | нет | 1 |
| Номенклатура | есть | 0 |
Контрагента без правила механизм поставил в очередь, как и написано в коде. Номенклатуру в очередь пустого узла не пустило её собственное правило; почему именно, мы не разбирали. У объекта со своим правилом отказ ищут в условиях отбора.
Что видно по файлу правил, а что нет
По файлу правил регистрации видно состав плана, признак авторегистрации, сами правила и их условия отбора, в том числе условия, заданные кодом. Подписки, функциональной опции и режима выборочной регистрации в файле нет: они живут в конфигурации и в данных базы, и проверять их приходится там.
Если изменение в очереди есть, а в приёмнике старое, смотрят правила конвертации: выключенное правило выгрузки (объекты вида не уходят вовсе), правило без способа поиска (объект может создаваться заново), признак “не замещать” (исправление не перезапишет найденный объект) и обработчики, которые могут отменить выгрузку или подменить значение.
Бывает, что правила ни при чём, а сообщение обмена просто не доехало целиком. Если узлы обмениваются через FTP по слабому каналу, штатный транспорт после обрыва оставляет на сервере обрезанный файл под настоящим именем, приёмник забирает его как целый, и всё кончается ошибкой разбора при загрузке. Как довезти такой пакет частями и проверить его до загрузки, разобрано на странице обмена через FTP с докачкой, а почему штатный транспорт не умеет продолжать с места обрыва, рассказано в статье обмен 1С через FTP рвётся на большом пакете.
Прочитать это в файле на пару мегабайт без Конвертации данных помогает разбор правил обмена: он понимает правила конвертации и правила регистрации и выносит отдельным списком объекты состава без своего правила регистрации. Сама обработка лежит на Инфостарте, 10 SM.
Если отбор всё-таки нужен
Объект без своего правила уходит на все узлы плана. При двух-трёх узлах разницы не видно, а в сети на десятки магазинов правка одного контрагента поедет в каждый, и условие вроде “только своя организация” на неё не действует: отбирать нечем. Отбор появляется вместе со своим правилом регистрации, и заводить его лучше до того, как узлов станет много.