Универсальный Обмен между базами с использованием Automation-сервера



В организации появилась необходимость обмена между разными базами. При этом пользователь в онлайн режиме хочет отбирать, какие документы переносить ("принесли одну накладную в бухгалтерию и соответственно я хочу перенести только этот документ из УТ в свою БУХ"), а также видеть и одновременно открывать документ источника и приемника. Поискал обработки, думал, что нашел, но она оказалась слишком упрощенной и для конкретных конфигураций. Пришлось, взяв за основу визуальный интерфейс обработки, глобально её переделать.

Обработка создана для организации обмена между базами, используя Automation-сервер, с претензией на универсальность!!!

Пока это BETA-версия, которая проверялась на обмен БГУ-УТ11, БГУ-УП. Но по идее должна работать из любой конфы 8.2 и выше, неуправляемый интерфейс.

Правила работы с обработкой:

1.Теоретически запуск подключаемой конфигурации возможен начиная с платформы 8.1.

2. Обработка использует некоторые стандартные процедуры, функции и формы (в частности «ОбщаяФорма.ВыборОбъектовМетаданных» и др), но в минимальном количестве.

3. Сохранение и восстановление настроек производится с использованием «Справочники.СохраненныеНастройки» и соответственно доступны другим пользователям при предоставлении им такого права.

4. Таблицы настроек доступны пользователям с полными правами.

5. Имя пользователя удаленной базы и пароль хранятся только последние, введённые в соответствующие поля, и только для локального пользомателя.

6. Для записи соответствий используется  «РегистрыСведений.СоответствиеОбъектовДляОбмена».

7. Если хотите вести обмены с множеством баз, то необходимо в конфигураторе создать План обмена «РТК_Обмен»(не обязательно), но тогда запись в «РегистрыСведений.СоответствиеОбъектовДляОбмена» будет производиться раздельной записи(будет куча соответствий не известно к какой базе(узлу) относится). Страдает визуализация.

8. Если решили вести по плану  обмена «РТК_Обмен»,  от можно создать множество узлов для подключения. Важно чтобы имя Узла совпадало с Путем подключения к соответствующей базе.

9. Все поля являются текстовыми и следовательно можно не использовать кнопки выбора, а набивать текст в ручную.

10. Загруженные документы всегда сохраняются в «РегистрыСведений.СоответствиеОбъектовДляОбмена» с узлом = неопределено, для того чтобы видеть все загруженные документы не важно из какой они базы, а хранение соответствий справочников и перечислений осуществляется с именем узла = путю подключения к базе (если ведётся по плану обмена «РТК_Обмен») или в одной куче с документами с именем узла = неопределено (если не ведётся по плану обмена «РТК_Обмен»).

11. Просмотр и создание настроек соответствий объектов баз в разрезе узла (если ведётся по плану обмена «РТК_Обмен») можно увидеть установив на вкладке «Обслуживание» флаг «Cоздание  соответствий для конкретных объектов(перечислений,справочников) узела обмена».

12. Создание соответствий конкретных объектов баз производится в табличной части вкладки «Обслуживание»:

Нажав «Добавить»(«Скопировать»):

в поле «СобственнаяСсылка» выбераете сначала тип обекта приемника, а потом и конкретный объект базы приемника;

в поле «СсылкаВДругойИБ» выбераете сначала тип обекта источника, а потом и конкретный объект базы источника;

Так же можно заполнить соответствия «перечислений» двух баз автоматически нажав кнопку «АвтоНастройка соответствий перечислений» (заполнение производится по полному соответствию имен перечислений).

13. Создание соответствий типов объектов баз производится в табличной части «Параметры загрузки в приёмник (в эту базу)» вкладки «Настройка»:

Поиск по настройке осуществляется в следующем порядке:

-значение по умолчанию;

-по соответствию ИД в «РегистрыСведений.СоответствиеОбъектовДляОбмена»;

-по реквизитам из поля «1 вариант поиска»;

-по реквизитам из поля «2 вариант поиска»;

Нажав «Добавить»

в поле «Тип источника» выбераете сначала тип обекта источника;

в поле «Вид пиемника» выбераете сначала тип обекта приемника;

в поле «Значение по умолчанию» выбераете значение обекта приемника, если ничего не найдено и если не установлены флаги «Добавлять если не существует» и «Переписывать если существует»;

флаг «Добавлять если не существует» устанавливается если хотите создать новый объект в базе приёмнике по данным реквизитов из базы источника;

флаг «Переписывать если существует» устанавливается если хотите переписывать найденный объект в базе приёмнике по данным реквизитов из базы источника;

флаг «Не искать по ИД» устанавливается если не хотите осуществлять поиск по соответствию ИД в «РегистрыСведений.СоответствиеОбъектовДляОбмена;

флаг «Всегда по умолчанию» устанавливается если хотите при любом поиске для данного типа источника устанавливалось значение из поля «Значение по умолчанию»;

в поле «запрос» указывается текст запроса для выполнения перед заполнением объекта приемника. Результат можно использовать в алгоритме по имени «Результат».

в поле «алгоритм» указывается текст кода для выполнения перед записью объекта приемника. В алгоритме можно использовать вновь созданный объект по имени «Объект» и для отказа от записи «Отказ».

ПРИМЕР:

Если Объект.ЭтоНовый() Тогда
  Отказ = РаботаСДиалогами.ЕстьДубльПоИНН(Объект);//использование процедур общего модуля
КонецЕсли;

Нажав кнопку «Показать(скрыть) соответствия» отображается вторая таблица соответствия реквизитов обекта источика и приемника (активной строки таблицы «Параметры загрузки в приёмник (в эту базу)» )

в поле «Источник» можно указать:

имя реквизита объекта источника (например «Наименование»); 

имя реквизита табличной части объекта источника (например «Товары.Номенклатура»); 

пустое значение.

в поле «Приемник» (обязательно для заполнения) нужно указать:

имя реквизита объекта приёмника(например «Наименование»); 

имя реквизита табличной части объекта приёмника(например «Товары.Номенклатура»); 

в поле «Алгоритм» указывается текст кода для выполнения после записи реквизита из поля «Приемник». В алгоритме можно использовать для чтения и записи данные создаваемого объекта по имени «Объект» и если поле «Приемник» содержит имя реквизита табличной части объекта источника (например «Товары.Номенклатура»), то в алгоритме можно использовать для чтения и записи данные создаваемой строки, обращаясь по имени «СтрокаТаблицыПриемника». Также доступны данные для чтения объекта(ссылки) источника по имени «СсылкаУБ» и если поле «Источник» содержит имя реквизита табличной части объекта «Источника»(например «Товары.Номенклатура»), то в алгоритме можно использовать для чтения данные считываемой строки из табличной части источника, обращаясь по имени «СтрокаТЧ».

НО ДАННЫЕ ИСТОЧНИКА ЭТО «COM-объекты» И ПО ЭТОМУ ИХ ИСПОЛЬЗОВАНИЕ ТРЕБУЕТ БОЛЬШОГО ВНИМАНИЯ!!!

ТАКЖЕ ДЛЯ ПРОФИ ИМЯ «Коннект» ЭТО «COM-объект» ПОДКЛЮЧЁННОЙ БАЗЫ.

При использовании алгоритма обратите внимание когда он должен запуститься, для этого указывайте текст алгоритма в строке после заполнения которой он должен запуститься. Можно использовать в алгоритме при создании строки приёмника параметр «Отказ» с типом булево. Если указать «Отказ=истина;», то строка не запишется.

ПРИМЕР АЛГОРИТМА:

 СтруктураРеквизитов = Новый Структура;
 СтруктураРеквизитов.Вставить(«ЕдиницаИзмерения»,»ЕдиницаИзмерения»);
 СтруктураРеквизитов.Вставить(«СтавкаНДС»,»СтавкаНДС»);
 ПолучениеНСИ.ПолучитьЗначенияРеквизитовСправочника(СтрокаТаблицыПриемника.Номенклатура, СтруктураРеквизитов);
    СтрокаТаблицыПриемника.ЕдиницаИзмерения = СтруктураРеквизитов.ЕдиницаИзмерения;
 Если СтрокаТаблицыПриемника.КоличествоМест = 0 Тогда
   СтрокаТаблицыПриемника.КоличествоМест = 1;
 КонецЕсли; 
 Если СтрокаТаблицыПриемника.Коэффициент = 0 Тогда
  СтрокаТаблицыПриемника.Коэффициент = 1;
 КонецЕсли;
 
 ОбработкаТабличныхЧастей.РассчитатьВсегоТабЧасти(СтрокаТаблицыПриемника, Объект); //обращение к общей процедуре
    Объект.СуммаДокумента =Объект.СуммаДокумента + СтрокаТаблицыПриемника.всего;

Если СтрокаТаблицыПриемника.всего = 0 тогда отказ=Истина; КонецЕсли;

 

14. Для переноса документов используется вкладка «Документы».

ОБЯЗАТЕЛЬНО в таблице «Документы источника» должны быть добавлены имена объектов (документов) например «АктПриемкиНФА» (есть в БГУ).

Флаг определяет какие виды документов будут переноситься.

Период определяет интервал дат считываемых документов (по умолчанию весь период по текущую дату).

15. Для переноса элементов справочника используется вкладка «Справочники».

ОБЯЗАТЕЛЬНО в поле «Справочник» укажите данные какого справочника источника вы хотите перенести.

В нижней таблице указавается (если необходимо) отбор (только «Код» и «Наименование»), вид сравнения и значение(тип строка);

Данный раздел пока экспериментальный!!!

16. Если все настройки сделаны, то действия пользователя просты.

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

Возможен просмотр данных источника и приёмника из табличной части нажав «лупу».

Обработка в стадии развития, есть идеи. Также жду ваши замечания и предложения!!!

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

15 Comments

  1. Yimaida

    В чем отличие от типового инструмента для обмена «Конвертации данных» (КД)?

    Для тех, кто тоже искал и не нашел — попробуйте КД…

    Reply
  2. nkp14108

    (1) Yimaida, Практически небо и земля! Здесь вы работаете напрямую с другой базой, без промежуточных файлов выгрузок-загрузок. Открываете выгружаемый документ в другой базе (источнике, приемнике) просматриваете и сравниваете. Да есть схожие принципы построения обмена и не более.

    Reply
  3. mikhailovaew
    Обработка использует некоторые стандартные процедуры, функции и формы( в частности «ОбщаяФорма.ВыборОбъектовМетаданных» и др)

    В типовом ЗУПе, например, такой формы нет. Лучше вынести весь типовой функционал непосредственно в обработку, в противном случае обмен получается не очень «универсальный».

    Reply
  4. nkp14108

    (3) mikhailovaew, жалко, придется со временем переделать. Это же из стандартных подсистем, получается ЗУП ущемлен. А регистр «СоответствиеОбъектовДляОбмена», и справочник «СохраненныеНастройки» хоть есть.

    Reply
  5. Yimaida

    (2) онлайн-обмен тоже позволяет напрямую подключаться к базе. Скажем так, при наличии уже существующих механизмов обмена, надо хотя бы выделить явные преимущества и отличия Вашей обработки (при условии что известны возможности той же КД). Написав статью, Вы же хотите поделиться опытом, помочь другим, но может получиться наоборот. Если есть похожие инструменты о которых известно, то как минимум о них надо обмолвится и хотя бы провести небольшое сравнение.

    Reply
  6. Tarlich

    при открытии ругнулось

    {ВнешняяОбработка.ПереносДокументовИзУТВБП20.МодульОбъекта}: Переменная не определена (СохранениеНастроек)

    Reply
  7. Tarlich

    при запуске из розницы то же ругнулось но

    {Форма.Форма.Форма(102)}: Поле объекта не обнаружено (ВалютаРегламентированногоУчета)

    Если Не ЗначениеЗаполнено(Константы.ВалютаРегламентированногоУчета.Получить().ВерсияДанных) Тогда

    Reply
  8. nkp14108

    (7) Tarlich, Интереса никто особо не проявлял поэтому я не выкладывал более новые версии, обновил файл, можно скачать. Про «Розницу» не знаю нет конфы чтобы проверить. Мин. требования к конф. указаны выше по тексту.

    Reply
  9. Збянтэжаны Саўка

    [0]

    Процедура АктивироватьОкно(ЗаголовокОкна) Экспорт
    
    Попытка
    Файл = «c:vbscriptswin_act.vbs»;
    Shell = Новый ComObject(«WScript.Shell»);
    СтрокаЗапуска = «»»» + Файл + «»» «»» + ЗаголовокОкна + «»»»;
    
    Shell.Run(СтрокаЗапуска);
    Исключение
    КонецПопытки;
    
    КонецПроцедуры

    Показать

    а можно глянуть, что в файле win_act.vbs ?

    Reply
  10. Alex_E

    Пичалька — хотел посмотреть:

    {Форма.Форма.Форма(748)}: Поле объекта не обнаружено (РТК_Обмен)

    ПутьКУБ = Строка(ПланыОбмена.РТК_Обмен.ПолучитьФормуВыбора().ОткрытьМодально());

    Вопрос, подключение только к серверной базе, хотел файловую открыть:

    ВнешняяОбработка.ПереносДокументов.МодульОбъекта(37)}: Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (1C:Enterprise 8.3.5.1517): Неверные или отсутствующие параметры соединения с информационной базой

    Ошибка соединения

    Модуль запаролен, даже не попробовать и не исправить….

    P.S. Пробовал в БП 2.0

    Reply
  11. nkp14108

    (10) Alex_E, по первой проблеме читайте выше текст:

    8. Если решили вести по плану обмена «РТК_Обмен», от можно создать множество узлов для подключения. Важно чтобы имя Узла совпадало с Путем подключения к соответствующей базе.

    9. Все поля являются текстовыми и следовательно можно не использовать кнопки выбора, а набивать текст в ручную.

    Набивайте путь вручную.

    По второй, я работаю с 8.3, проблем нет. проверте настройки (пароль, логин, путь, № платформы).

    Reply
  12. Збянтэжаны Саўка

    (0)(8) спасибо за скрипт и за обработку

    мне понравилось — хорошее начало, развивайте ее дальше и может получиться, по-моему, очень и очень не плохой продукт.

    Reply
  13. Збянтэжаны Саўка

    (0) что за реквизит «СоздаватьДажеЕслиЭлемент»?…

    не понятен его смысл, не закончено имя: ЕслиЭлемент… что?…

    тем более, что уже есть реквизиты:

    ПереписыватьЕслиСуществует

    ДобавлятьЕслиНеСуществует

    что же имелось в виду: СоздаватьДажеЕслиЭлемент «существует»? — нет смысла.

    Не могли бы Вы прояснить этот момент: каким же должно быть имя этого реквизита, чтобы понятно стало для чего он служит?

    Спасибо.

    Reply
  14. nkp14108

    (13) Збянтэжаны Саўка,

    Принцип переноса данных в обработке почти бесконечный вложенный перенос, т.е. переносим документ в нем ссыкка на справочник которого нет,то переносим(создаем). В справочнике ссылка на справочник которого нет,то переносим(создаем) и т.д. Так получилось, в строках документа есть партия(ссылка на документ) и без галочки СоздаватьДажеЕслиЭлемент, если его нет начинает его создавать. А в начале работы и чтобы не насоздавать кучу новых документов, которые забыли выставить соответствия, добавили это поле.

    По развитию, постепенно появляется необходимость в управляемых формах, если и будет(время) то развивать будем на них.

    Reply
  15. Збянтэжаны Саўка

    (14) спасибо

    а новые изменения выкладывать не планируете?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *