Кому эта статья покажется простой и/или захочется продолжения: рекомендую другую мою публикацию, в которой разобран более сложный пример : https://infostart.ru/public/695916/
Оглавление
2. Краткое описание и схема решения задачи
3. Работа со структурой метаданных БП КОРП 3.0 и ЗУП 2.5
4. Создаём новый элемент справочника «Конвертации»
5. Создаём правила выгрузки данных (ПВД)
6. Создаём правила конвертации объектов (ПКО) и к ним правила конвертации свойств (ПКС)
6.1 ПКО ФизическиеЛица в ФизическиеЛица
6.3 ПКО ЛицевыеСчетаРаботниковОрганизации в БанковскиеСчета, флаг ПКС Получать из входящих данных
7. Работа с глобальными параметры Конвертации. Метод ПередатьОдинПараметрВПриемник(…). Запросы.
7.1 Инициализируем параметры в глобальном обработчике конвертации «Перед выгрузкой данных»
7.2 Процедура ПВД «Перед обработкой», ВыгрузитьПоПравилу() записи регистра полученные из глобального параметра
7.3 Работа с процедурой конвертации «После загрузки данных», получение и обработка данных параметра в Приёмнике
8. Приемы оптимизации и ускорения выгрузки данных.
8.1 Если Объект.ОбменДанными.Загрузка Тогда
8.2 Повторное использование COM соединения
8.3 Используем приемы оптимизации и ускорения на практике
1 Постановка задачи
Необходимо создать правила выгрузки данных, с помощью которых по заданному расписанию в автоматическом режиме:
а) происходило создание или синхронизации ранее созданных в БП КОРП 3.0 банковских счетов физических лиц, но только тех, у которых в ЗУП создан только один лицевой счет (если несколько – должно быть предупреждение без обмена данными) и только если номер счета задан (если задан номер карты и не задан номер счета – не выгружать);
б) происходило обновления реквизита «Основной счет» физических лиц в БП КОРП 3.0 на основании перегруженных из ЗУП 2.5 данные о лицевых счетах, но только, если в базе БП КОРП у физ лица в банковских счетах не более одного счета с тем же номером, который был перегружен из ЗУП 2.5 (банк значения не играет).
Выгрузка данных о лицевых счетах физических лиц должна удовлетворять условиям:
а) происходит в полностью автоматическом режиме без участия пользователей;
б) частота выгрузки данных – 1 раз в сутки в промежутке с 02:00 до 02:10 по московскому времени;
в) продолжительность выгрузки данных – не более 5 минут,
г) выполняется для данных базы Общества и всех филиалов.
2. Краткое описание и схема решения задачи
Исходя из задания необходимо реализовать следующую логику выгрузки данных о лицевых счетах физических лиц:
1) в базе ЗУП отбираются все записи регистра «Лицевые счета сотрудников организаций» при условии, что:
а) в ЗУПе у физ лица в организации только один счет (если несколько – то не участвует в обмене);
б) в ЗУПе у физ лица задан номер счета (если номер счета не задан — то не участвует в обмене, даже если задан номер карты ).
2) отобранные записи регистра «Лицевые счета сотрудников организаций» базы ЗУП перегружаются в справочник «Банковские счета» базы БП КОРП.
3) в базе БП КОРП для всех физ лиц, по которым были обновлены банковские счета, устанавливается реквизит «Основной счет» тем значением, которое перегрузилось из ЗУПа, но только, если в базе БП КОРП у физ лица в банковских счетах не более одного счета с тем же номером, который был перегружен из Источника (банк значения не играет).
Созданные правила выгрузки данных будут подгружаться в обработку «Универсальный обмен данными» , все настройки этой обработки тоже будут заполняться автоматически, запускаться обработка будет по расписанию рег заданием.
* Мной создана подсистема, в которую входит "улучшенная" типовая обработка «Универсальный обмен данными», которая позволяет "на лету" фильтровать передаваемые данные, а так же рег задание для тонкой настройки частоты и направления выгрузки данных и пр. Однако, это тема другой статьи.
Схема выгрузки данных лицевых счетов представлена на рисунке ниже
3. Работа со структурой метаданных БП КОРП 3.0 и ЗУП 2.5
Загружаем в конфигурацию КД 2.1 структуры метаданных конфигураций Источника (ЗУП 2.5) и Приемника (БП КОРП 3.0). Для этого нам потребуюется обработка из состава поставки конфигурации «Конвертация данных» ред. 2.1, которая называется «MD82Exp.epf». Открываем эту обработку в ЗУП 2.5 и выгружаем структуру с помощью «MD82Exp.epf» в xml файл (настройки флажков в обработке не меняем). Чтобы открыть обработку в БП КОРП надо запустить бухгалтерию как толстый клиент в обычном режиме, для этого в свойствах строки ИБ надо написать: /RunModeOrdinaryApplication
Параметры запуска БП КОРП 3.0 для выгрузки структуры метаданных
У вас должно получиться два файла xml с описанием структуры метаданных. Я создал папку «1С Проекты по обмену данными», в которой создал папку «Структуры конфигураций».
Последовательно загружаем структуры конфигураций в конфигурацию «Конвертация данных» ред. 2.1
4. Создаем новый элемент справочника «Конвертации»
Находим на рабочем столе конфигурации КД 2.1 кнопку «Правила обмена данными», создаем папку «ЗУП 2.5 -> БП КОРП 3.0» в справочнике «Конвертации».
В папке «ЗУП 2.5 -> БП КОРП 3.0» создаем новый элемент и в открывшемся окне заполняем два верхних реквизита Источник и Приемник.
При записи нового элемента справоника «Конвертации» появится окно помошника авто создания правил обмена – отказываемся от его услуг и закрываем его.
Поздравляю, конвертация создана, правда она пустая и пока ничего не умеет.
5. Создаём правила выгрузки данных (ПВД)
Определим сколько Правил Выгрузки Данных (ПВД) нам нужно создать. Для этого ответим на один вопрос: какие данные нам может потребоваться фильтровать при выгрузке данных? – Только записи регистра сведений «Лицевые счета работников организаций» (РС ЛСРО). Остальные данные (банковские счета, физ лица, банки и пр.) должны тоже выгружаться, но ТОЛЬКО ПОТОМУ, что ссылки на них содержаться в записях РС ЛСРО. Т.е. мы никак не должны руками фильтровать ни физ лица, ни банки, ни номера счетов, они должны выгружаться поскольку содержаться в РС ЛСРО.
В другой статье я писал о том, как правильно определить ПВД в п. 4.3: //infostart.ru/public/695916/
После того как мы закончим создавать правила выгрузки, мы откроем их из обработки «Универсальный обмен данными». ПВД – подтянутся в табличную часть обработки «Универсальный обмен данными», где каждое созданное нами в конвертации данных ПВД можно будет отключить специальным флагом. Обратите внимание, что в обработке «Универсальный обмен данными» можно задать дополнительные фильтры для содержимого выделенного ПВД. На рисунке ниже показано как можно фильтровать выгружаемые записи регистра с отбором по измерению регистра "Организация":
Создадим в конвертации новое ПВД и заполним как показано на рисунке
Третий сверху реквизит «Правило конвертации» вам пока нечем заполнить, для этого читаем следующий пункт.
6. Создаём правила конвертации объектов (ПКО) и к ним правила конвертации свойств (ПКС)
Создаём ПКО без использования встроенных помощников!
РегистрСведенийЗапись.ЛицевыеСчетаРаботниковОрганизации —> СправочникСсылка.БанковскиеСчета
СправочникСсылка.ФизическиеЛица —> СправочникСсылка.ФизическиеЛица
СправочникСсылка.Контрагенты – > СправочникСсылка.Банки
Рассмотрим настройки каждого из трех ПКО подробнее.
6.1 ПКО СправочникСсылка.ФизическиеЛица-> СправочникСсылка.ФизическиеЛица
Рассуждаем нужно ли искать элементы справочника по УИД: у моего заказчика исторически ключевым полем поиска элементов всех справочников был «КОД». Это не очень хорошо, поскольку КОД пользователи могут менять в отличие от УИДа. Но ничего не поделаешь – если я оставлю настройку поиска по УИД, то это может привести к задвоению справочников в Приемнике. Заходим в ПКО справочников и снимаем флаг «Искать объект приемника по внутреннему идентификатору». Поскольку новые элементы справочников создаются в базе БП КОРП (Приемник) и эта база является главной по отношению в ЗУП (Источник), то для справочников ставим флажки «Не замещать существующие объекты в приемнике, а только создавать новые» и «Не создавать новый объект, если он НЕ найден». У вас может быть иная специфика.
6.2 ПКО СправочникСсылка.Контрагенты-> СправочникСсылка.Банки
Контрагенты мы будем конвертировать в Банки из-за различий хранения данных в ЗУП 2.5 и БП КОРП 3.0. В ЗУП 2.5 измерение в регистре сведений «Лицевые счета работников организаций» хоть и называется «Банк», но тип имеет «СправочникСсылка.Контрагенты». «Ох уж эти сказочники» – вспоминаю методологов ЗУПа (особенно когда надо разобрать сборные из лоскутов запросы расчета в куче общих модулей).
6.3 ПКО РегистрСведенийЗапись.ЛицевыеСчетаРаботниковОрганизации -> СправочникСсылка.БанковскиеСчета, флаг ПКС Получать из входящих данных
Если дважды щелкнуть мышью по ПКО, то откроется окно настроек ПКО, в котором есть предопределенные обработчики событий. Поскольку в базе БП КОРП некоторые реквизиты банковского счета будут заполняться по шаблону, то пропишем код их заполнения в обработчике ПКО «После загрузки»:
Валюта_Руб = Справочники.Валюты.ПолучитьСсылку(Новый УникальныйИдентификатор("6840fa3d-ac3c-11e0-8812-001e5848397d")); //руб.
Если НЕ Валюта_Руб.Пустая() Тогда
Объект.ВалютаДенежныхСредств = Валюта_Руб;
КонецЕсли;
Объект.ВидСчета = "Расчетный";
Объект.ТекстКорреспондента = Объект.Владелец.Наименование;
Объект.ТекстНазначения = "Зачисление денежных средств";
Объект.Наименование = Объект.НомерСчета+", "+Объект.Банк.Наименование;
Три ПКС создайте как показано на рисунке.
Колонку «Источник» для ПКС очистим, а в колонке «Получать из входящих данных» поставим везде флажок – мы это делаем потому, что будем организовывать выгрузку записей регистра используя процедуру ВыгрузитьПоПравилу(, , ИсходящиеДанные, , " ВедомостьНаВыплатуЗарплатыВБанк "); , которую поместим в обработчик «Перед выгрузкой» ПВД (об этом подробнее ниже). Мы полностью берем на себя подготовку исходящих данных на стороне Источника, отказываясь от конструктора – только так мы сможем реализовать два условия фильтрации выгружаемых данных.
7. Работа с глобальными параметры Конвертации. Метод ПередатьОдинПараметрВПриемник(…). Работа с запросами.
Немногие знают, что конфигурация «Конвертация данных» ред. 2.1 позволяет создавать глобальные параметры Конвертации типа структура, которые могут быть доступны как на стороне Источника, так и на стороне Приемника; а так же в обработчиках ПВД и ПКО. Я НЕ могу себе представить профессионала по конвертации КД 2.1, который бы не умел пользоваться глобальными параметрами.
Для решения задачи выполним следующую последовательность действий с глобальными параметрами
7.1 Инициализируем параметры в глобальном обработчике конвертации «Перед выгрузкой данных»
Методы «Параметры» и «Запросы» служебные и зарезервированы в конфигурации КД 2.1 для режима предприятия. Просто запомните их.
Параметр «Выборка_ЛицевыеСчетаФизЛицВедомости» будет хранить выборку записей регистра, который нам надо выгрузить в БП КОРП, будем использовать этот параметр только на стороне Источника.
Параметр «СтрокаТаблицаКодовФизЛицИБанковСоСчетом» будет заполняться на стороне Источника форматированной строкой, содержащей коды физ лиц, банков и номера счетов и передаваться в Приемник, где строка будет парситься в таблицу значений, для обновления реквизита «Основной счет» физ лиц, с учетом заданных задачей условий.
Обратите внимание на строчку:
Параметры.Вставить("Выборка_ЛицевыеСчетаФизЛицВедомости", Запросы.ЛицевыеСчетаФизЛицВедомости.Выполнить().Выбрать() );
В ней создается свойство структуры с именем «Выборка_ЛицевыеСчетаФизЛицВедомости», в которое помещается ВЫБОРКА из запроса. Сам текст запроса заранее написан и помещен на закладку «Алгоритмы/Запросы»:
Запрос «ЛицевыеСчетаФизЛицВедомости» отбирает только те записи регистра сведений «Лицевые счета работников организаций», которые согласно условию задачи содержат записи:
а) с физ лицами в организации с одним счетом (если несколько – то не выгружаются);
б) с физ лица с заданным номером счета (если номер счета не задан — то не участвует в обмене, даже если задан номер карты).
Сам текст запроса я не буду комментировать, иначе никто не дочитает до конца. Кому интересно – скачивайте внизу публикации правила выгрузки данных, все тексты внутри.
7.2 Записи регистра полученные из параметра Выборка_ЛицевыеСчетаФизЛицВедомости выгружаем с помощью метода ВыгрузитьПоПравилу() в процедуре ПВД «Перед обработкой», там же заполняем параметр СтрокаТаблицаКодовФизЛицИБанковСоСчетом
В процедуре ПВД «Перед обработкой» пишем код, который сам за себя говорит:
//------------------------------------------------------------------------------------------------------------------------------------
//ИсходящиеДанныеДляСинхронизацииБанковскихСчетов
//------------------------------------------------------------------------------------------------------------------------------------
ИсходящиеДанныеДляСинхронизацииБанковскихСчетов = Новый Структура("Владелец, Банк, НомерСчета");
//------------------------------------------------------------------------------------------------------------------------------------
//Делаем синхронизацию банковских счетов физ лиц, у которых КолвоСчетовВОрганизации не более 1
//------------------------------------------------------------------------------------------------------------------------------------
СтрокаСчетаФизЛица = "";
Выборка = Параметры.Выборка_ЛицевыеСчетаФизЛицВедомости;
Сообщить("Найдено "+Выборка.Количество()+" лицевых счетов которые будут выгружены, удовлетворяющих условиям: 1) НомерСчета физ лица заполнен и 2) у физ лица только один лицевой счет в организации");
Пока Выборка.Следующий() Цикл
ИсходящиеДанныеДляСинхронизацииБанковскихСчетов.Владелец = Выборка.Физлицо;
ИсходящиеДанныеДляСинхронизацииБанковскихСчетов.Банк = Выборка.Банк;
ИсходящиеДанныеДляСинхронизацииБанковскихСчетов.НомерСчета = Выборка.НомерЛицевогоСчета;
ВыгрузитьПоПравилу(, , ИсходящиеДанныеДляСинхронизацииБанковскихСчетов, , "БанковскиеСчета");
СтрокаСчетаФизЛица = СтрокаСчетаФизЛица + "Счет физ лица в ЗУПе в формате: ФизЛицоКод|БанкКод|НомерСчета;"+Выборка.ФизЛицоКод+";"+Выборка.БанкКод+";"+Выборка.НомерЛицевогоСчета+Символы.ПС;
КонецЦикла;
Параметры.СтрокаТаблицаКодовФизЛицИБанковСоСчетом = Строка(СтрокаСчетаФизЛица);
ПередатьОдинПараметрВПриемник("СтрокаТаблицаКодовФизЛицИБанковСоСчетом", Параметры.СтрокаТаблицаКодовФизЛицИБанковСоСчетом);
//Отменяем стандартную выгрузку объекта
Отказ = Истина;
Используя метод «ВыгрузитьПоПравилу(…)» мы полностью взяли на себя подготовку передаваемых записей регистра, при этом мы заполнили глобальный параметр «СтрокаТаблицаКодовФизЛицИБанковСоСчетом», который будем передавать в базу Приемник в строке
ПередатьОдинПараметрВПриемник("СтрокаТаблицаКодовФизЛицИБанковСоСчетом", Параметры.СтрокаТаблицаКодовФизЛицИБанковСоСчетом);
И не забудем написать в процедуре «Перед выгрузкой» Отказ=Истина.
Преобразуем строку из параметра СтрокаТаблицаКодовФизЛицИБанковСоСчетом в таблицу значений. Эту таблицу значений подаем как параметр в запрос ФизЛицаДляУстановкиОсновногоСчета, который определен на закладке «Алгоритмы/Запросы». Запрос возвращает выборку физ лиц и банковских счетов, которые надо установить физ лицам в качестве основных.
Так же можно организовать создание простейшего ЛОГ файла, который будет содержать информацию об измененных в базе Приемнике объектах: основных счетов физ лиц, которые были изменены и другой полезной информации. Файл можно хранить в папке «Users1C_Agent_StarterAppDataLocalTemp».
8. Приемы оптимизации и ускорения выгрузки данных.
8.1 Если Объект.ОбменДанными.Загрузка Тогда
Часто в базе Приемнике в процедурах ПередЗаписью и ПриЗаписи подгружаемых объектов можно встретить колоссальные проверки на наполненность различных реквизитов. В этих процедурах первой строкой идет проверка на режим обмена данными: если объекты записываются при выгрузки из другой базы (а не руками пользователя), то проверки НЕ ДЕЛАЮТСЯ.
Однако, не во всех типовых объектах (справочниках, документах, регистрах) реализована проверка на режим обмена данными, иногда при обмене данными выполняются сложные проверки, которые нагружают базу Приемника и приводят к многократному росту длительности перегрузки данных. Часто, в базе есть еще и подписки, которые любят добавлять программисты при изменении типовой конфигурации и очень часто эти программисты даже не задумывается о том, что код этой подписки может быть задействован извне при обмене данными и сильно тормозить обмены.
8.2 Повторное использование COM соединения
Суть в том, что КАЖДОЕ COM соединение к базе Приемнику занимает ВРЕМЯ, бывает и дольше 30 секунд. Представьте, что пользователь сам нажимает кнопку «Выгрузить документ» и каждый раз ждет эти несколько десятков секунд. Решается проблема помещением во временное хранилище соединения. Это описано кратко и ясно в публикации: //infostart.ru/public/331683/
8.3 Используем приемы оптимизации и ускорения на практике
В статье //infostart.ru/public/695916/ уже писал про некоторые приемы, например, про флаг «Использовать быстрый поиск объекта при выгрузке и загрузке». Его надо ставить когда выгружаемые справочники содержат мало элементов (до 1000).
Рекомендую прочесть статью по оптимизации конвертации данных:
http://helpme1c.ru/uchebnik-po-1s-konvertacii-dannyx-redakciya-2-optimizaciya
Применим приемы оптимизации в нашем примере:
1) поставим флаг «Выбирать данные для выгрузки одним запросом» в ПВД «РегистрСведенийЗапись.ЛицевыеСчетаРаботниковОрганизации»;
2) в ПКО «РегистрСведенийЗапись.ЛицевыеСчетаРаботниковОрганизации в СправочникСсылка.БанковскиеСчета» поставим флаг «Не запоминать выгруженные объекты»;
3) в ПКО «Р СправочникСсылка.ФизическиеЛица в СправочникСсылка.ФизическиеЛица» поставим флаг «Использовать быстрый поиск при загрузке» — имеет смысл если число элементов справочника не велико (до 1000);
4) для ПКО справочников поставим флаг «Не выгружать объекты свойств по ссылкам» — при выгрузке будет выгружен сам объект и информация для поиска всех его ссылок, но полная информация о зависимых элементах выгружена не будет;
5) для ПКО регистра поставим флаг «Не запоминать выгруженные объекты» — правил конвертации не ссылочных объектов (регистров) нет смысла запоминать те строки регистров, которые были выгружены.
Описанный способ решения задачи не является единственным.
Механизмы и транспорт обмена данными. Пример создания в КД 2.1 правил обмена данными ЗУП 2.5 -> БП 3.0. Выгрузка ведомостей и банковских счетов: //infostart.ru/public/695916/
В конце публикации вы можете скачать архив содержащий: описанные правила выгрузки «Выгрузка лицевых счетов из ЗУП 2_5 в БанковскиеСчета БП КОРП 3_0» и текст этой статьи в формате MS Word.
Буду рад узнать ваше мнение о статье в комментариях и благодарен за оценку.
Вопросы, предложения сотрудничества и замечания пишите в комментариях, в личку или по адресу Panteleev@Inbox.ru
Резюме автора: //infostart.ru/job/resume/537490/
С пожеланием творческих успехов всем посетителям сайта ИС, Пантелеев Иван.
Добрый день, спасибо за статью.
Подскажите, как можно удалять записи регистра сведений, если они были удалены в базе — источнике?
Например, у номенклатуры есть ШК. В базе источнике его удалили или заменили. Новый ШК при этом загрузится благополучно, а вот старый в базе преемнике так и останется.