Какие задачи поставила передо мной жизнь?
Нужно было, чтобы дерево ссылок строилось самостоятельно, как в конвертации, если запросы для всех объектов участников обмена написаны. И чтобы ничего не надо было конфигурировать и сопоставлять, используя малопонятные настройки, в которых сам со временем начинаешь путаться. Информация о составе объектов в источнике должна была браться из плана обмена. А вся необходимая для обмена информация об объектах приемника должна была извлекаться из псевдонимов запроса, который служит для извлечения данных источника.
Пришлось вернуться к теме. Все задачи удалось решить. В итоге получился значительно более функциональный инструмент, о котором и хочу здесь поговорить.
Итак, перейду к описанию:
Для публикации я подготовил специальный вариант кода в виде расширения. Оно устанавливается практически на любую конфигурацию и содержит все необходимое для демонстрации возможностей решения.
Расширение содержит четыре подсистемы. УниверсальныйОбмен, ПодсистемаИсточник, ПодсистемаПриемник, ПодсистемаДемонстрация. Из названия ясно что для чего.
- "УниверсальныйОбмен" служит исключительно для размещения в интерфейсе обработки.
- "ПодсистемаПриемник" содержит http-сервис, который в рабочем варианте должен быть помещен в конфигурацию приемника (и естественно опубликован).
- "ПодсистемаИсточник" содержит обработку, формирующую пакеты для обмена, регистр сведений для хранения данных авторизации и регистр "Параметры и запросы обмена". В последнем хранятся запросы для обмена между объектами источника и приемника.
- "ПодсистемаДемонстрация" содержит план обмена и объекты для теста и демострации. В демонстрационный план уже включен демо-объекты источники.
В модуле сервиса располагается универсальный раскладчик данных в объекты приемника. Он умеет раскладывать данные в достаточно широких пределах. Справочники, документы и регистры сведений. Главное - поставлять ему правильные пакеты данных в определенном формате. Примеры пакетов приведены в комментариях модуля сервиса. Для пользователя же будут полезны примеры, приведенные в демонстрационных запросах объектов. Т.к. здесь главное - написать правильный запрос.
!!! Значения перечислений тоже можно передавать. Только передается не ссылка, а порядок. Подразумевается, что на стороне приемника есть точно такое же перечисление, с тем же порядком значений.
Пример из запроса: "ДокументПриемник.ПеречислениеИсточник.Порядок КАК ПеречислениеПриемник".
Обработка собственно и занимается формированием этих пакетов на основании запросов, которые создал пользователь. Алгоритм содержит элементы рекурсии. Что несет в себе известные плюсы и минусы.
Настройка в коде вынесена в отдельную область и сводится к указанию имени регистра, предназначенного для хранения данных авторизации. Данные авторизации по умолчанию сохраняются в регистре расширения "ХранилищеАвторизации". Он сделан по аналогии со стандартным регистром "БезопасноеХранилищеДанных" и в рабочем варианте (при необходимости), легко может быть им заменен. Имя этого регистра также можно поменять в коде. В модуле обработки есть функция:
Вот, собственно, и все настройки.
Зарегистрируйте расширение.
!!! После регистрации расширения не забудьте снять галку "Безопасный режим". Иначе конструктор HTTPСоединение будет давать ошибку.
В регистр параметров настроек обмена объекты из плана попадают автоматически. Все объекты, участвующие в обмене надо в состав плана включить. Иначе обмен не пойдет. При этом авторегистрацию объекта включать не обязательно, если предполагается только обмен по ссылкам.
На практике система оказалась особенно полезной при использовании в базах РИБ, где конфигурация обновляется релизами, периодически. Один раз установив и опубликовав универсальный сервис-раскладчик в приемнике получаем возможно управлять логикой обмена исключительно на стороне источника. Т.к. манипуляции с конфигурацией и данными приемника в случае РИБ обычно существенно затруднены и регламентированы.
Обработка доступна в подсистеме "Универсальный обмен".
Запустив конфигуратор от имени администратора, опубликуйте http-сервис расширения (не забудьте про галку).
Можете увидеть такую картинку:
Тогда надо пойти и дать указанному пользователю ОС все права на указанный каталог.
Не буду рассказывать, как настроить IIS. Это многократно описано в других местах. Наверное, здесь не место для таких описаний. Будем считать, что публикация сделана. Идем дальше.
Данные узла обмена должны быть уже заполнены из демо-данных. Поля понадобятся при настройке на реальный узел. Изначально нужно ввести только параметры авторизации для сервиса в базе приемника. В режиме демонстрации - это наша база.
У меня результат выглядит примерно так:
Параметры обмена для демо-объектов при первом запуске будут заполнены в регистре с помощью кода. Запросы для всех демонстрационных объектов источников расширения также будут уже заполнены. Их, в дальнейшем можно будет использовать в качестве примеров для написания собственных.
!!! Предлагаемое расширение позволяет продемонстрировать работу на одной конфигурации. Часть объектов имитирует объекты источника, а остальные - объекты приемника. По названию объектов легко разобраться - кто есть кто. Все объекты находятся в одной конфигурации, но передача данных из источников в приемники осуществляется через http-сервис.
Для демонстрации нужно указать параметры авторизации своей же базы.
Пока работаем (пробуем, смотрим) то на вкладке "Отладка", в демонстрационных целях, доступен и список объекта приемника.
Нижний динамический список на следующей картинке это чистая демонстрация. В него ничего пытаться вносить не надо!!! Он нужен для того, чтобы по его содержанию можно сразу оценить результат обмена. В реальных условиях (для добавленных объектов, которых нет в базе источнике) он на форме не появится.
Для демонстрации результата обмена данные в объектах источниках придется заполнить самостоятельно. Регистрируются изменения всех объектов в плане расширения автоматически. Работаем на вкладке "Отладка". Она предназначена для проверки написанных запросов. Вносим необходимые данные в источник и нажимаем "Выполнить обмен". Или кнопку "Обменяться", если нужно проверить обмен по выбранной строке объекта. При выборе объекта обмена в левой таблице, в правой на форме программно строится соответствующий динамический список.
В правой части экрана выведен протокол обмена. Можно посмотреть, что и в какой последовательности обменивалось. Также, в отдельном окне, можно посмотреть текст оправленного пакета.
В нижней части формы, в поле "Результат", можно увидеть диагностику в случае неудачной попытки обмена:
После добавления объектов для обмена с другой конфигурацией, при написании своих запросов рекомендую использовать демонстрационные образцы из расширения.
Общие правила написания запросов:
1. Во всех запросах используется параметр &СписокСсылок.
!!! Не надо думать о том, как его задать. Он заполняется автоматически. Просто он должен быть в тексте запроса. Программа сама его задаст в зависимости от обстоятельств. Для регистров это будет узел обмена. Для документов и справочников это либо список ссылок на измененные объекты (для обмена по зарегистрированным изменениям), либо список подчиненных ссылок объектов данного типа для передаваемых изменений.
2. Обязательно должно передаваться поле "Ссылка". Через него в приемник будет передаваться УИД. Программа ждет, что оно есть. Если нет - выдаст в диагностику ошибку.
3. Нужно указывать в запросе поля "ПометкаУдаления" и "Проведен", если Вы хотите получить в приемнике документ с проведением или установить пометку удаления в нужное положение.
4. В начале пакета запросов можно использовать сколь угодно сложные конструкции для предварительных расчетов. Мне случалось делать запросы по движениям документа с целью вычисления значения для передачи в реквизит приемника. В качестве данных для передачи программа будет использовать последние запросы из пакета. Для них правило такое: Сначала идет шапка документа или справочника. Затем табличные части. Программа сама отсчитает от конца нужное количество запросов определив, что есть что, следуя указанному правилу.
5. Наименование реквизитов, табличных частей и объектов в базе приемнике будут взяты из псевдонимов запроса, написанного для соответствующего объекта источника. Поэтому везде должны использоваться псевдонимы с именами из приемника. Это касается и самого объекта. Например, не надо в запросе писать "Справочник.СправочникИсточник КАК СправочникИсточник". Надо - "Справочник.СправочникИсточник КАК СправочникПриемник". Так и пишем "СправочникПриемник.СсылочныйРеквизитИсточник КАК СсылочныйРеквизитПриемник". Это будет означать передать реквизит источника "СсылочныйРеквизитИсточник" в реквизит приемника "СсылочныйРеквизитПриемник". А когда пишем "Справочник.СправочникИсточник.ТабличнаяЧастьИсточник КАК ТабличнаяЧастьПриемник" - программа будет знать какие табличные части обмениваются данными.
Это надо учитывать при написании запросов. Надеюсь, понятно объяснил.
Ну и вишенкой на торте является функция сервиса выполнять произвольный запрос с параметрами на стороне приемника. Данные запрашиваются только простых типов. Результат в источник пересылается в виде массива структур. Пока использовалась для получения справок и выгрузки данных с помощью аналогичной обработки. В данном случае демонстрируется получение простой справки:
Для публикации создавалась специальная редакция программы. Поэтому, если вдруг встретится баг или неадекватная диагностика ситуации в поле результата - просьба сразу сообщать. Это будет оперативно исправлено. Заранее благодарен за такую помощь.
Код модуля сервиса и код модуля обработки документированы. Функции подробно описаны.
Это все. Надеюсь, публикация будет кому-то полезна и найдутся те, кто ее оценит. Всего доброго. Удачи.