EnterpriseData – часть 3. Загрузка данных, идентификация объектов




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

Наконец-то дошли руки до третьей статьи из цикла – Новый формат обмена данными!

Тем, кто не читал первые, можно перейти по ссылкам ниже:

Чтобы облегчить восприятие информации, я сделал схемы с кратким пояснением. Под схемами идет более подробное описание. Схемы можно скачать в формате PowerPoint в комментарии к статье. 

 

 Термины, используемые в статье

 

Общая последовательность операций при загрузке данных

Ниже приведена общая схема процессов загрузки данных:

Процесс загрузки данных

Первое, что происходит во время загрузки данных, это инициализация структуры «Компоненты обмена» и выполнение обработчика «Перед конвертацией». Как правило, данный обработчик используется для инициализации параметров обмена, как и в случае выгрузки данных.

Дальше происходит чтение файла данных. Последовательно считывается каждый объект XDTO и преобразуется в структуру, поля которой соответствуют самому объекту.

Для каждого объекта выполняется поиск ПОД по типа объекта, и его выполнение.

Дальше выполняется обработчик «При обработке». В обработчике доступен параметр «ДанныеXDTO», в который передается подготовленная структура с данными из XDTO объекта. Также в обработчике доступен параметр «ИспользуемыеПКО», который также является структурой. Ключи структуры, это имена ПКО, выбранные для данного ПОД. Значения элементов структуры имеют тип «булево». Выполняться будут только те ПКО, для которых значения в структуре равны «Истина». Обработчик в основном используется для отключения лишних ПКО для объекта на основании полученных данных и параметров обмена.

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

Дальше, после выборки и обработки всех объектов из файла обмена, выполняется обработчик «Перед отложенным заполнением». В нем можно реализовать какие-либо действия, необходимые перед отложенным заполнением. Например, можно выполнить сортировку данных в таблице для отложенного заполнения «КомпонентыОбмена.ЗагруженныеОбъекты». В таблицу записываются все выгруженные объекты, для которых указан алгоритм в КД31, на закладке «После загрузки всех данных». Объекты записываются в той же последовательности, в которой они были загружены. Можно их отсортировать по типу объекта.

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

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

Самым последним действием на этапе загрузки является отложенная запись и отложенное проведение объектов, с выполнением всех необходимых проверок и обработчиков при загрузки. По своей сути, это обычная запись или проведение объекта.  

Самым интересным элементом загрузке данных, является конвертация объекта по правилу. Но прежде чем перейти к подробному описанию этого процесса, введем новый термин – Идентификация.

 

Идентификация объектов при загрузке

Идентификация – это наиважнейшая операция при загрузке данных в ИБ. Она позволяет сопоставить загружаемые объекты с уже существующими в базе.

В КД31 доступны три варианта идентификации:

Идентификация объектов при загрузке

По уникальному идентификатору (УИД), используется по умолчанию – поиск выполняется по значению уникального идентификатора. Данный способ применяется, когда не нужно сопоставлять объекты одной ИБ с объектами в другой. Когда все объекты создаются только в одной ИБ, а затем переносятся в другую. После переноса объекта в ИБ приемнике у него создается УИД, аналогичный УИД этого объекта в ИБ источнике. После этого можно выполнять произвольное изменение реквизитов этого объекта в ИБ приемнике, на дальнейшую синхронизацию это не повлияет.

По полям поиска – поиск выполняется по набору полей объекта. Объект считается найденным, если совпадают все поля, указанные в качестве полей поиска. Данный способ используется для сопоставления объектов одной ИБ с объектами другой, когда объекты одного вида создаются как в ИБ источнике так и в ИБ приемнике. Существенный недостаток данного способа идентификации заключается в том, что если поля, указанные в качестве полей поиска будут изменены в ИБ приемнике, при последующей загрузки этого объекта из ИБ источника, объект не будет найден и будет загружен повторно. Из-за этого недостатка, данный способ идентификации обычно используется только в том случае, если отсутствует УИД у выгружаемых данных.

По уникальному идентификатору и полям поиска – поиск выполняется по УИД, если объект не найден, продолжается по указанным полям поиска. Если объект был найден по полям поиска, его УИД будет записан в специальный регистр сведений «ПубличныеИдентификаторыСинхронизируемыхОбъектов». При последующей синхронизации, поиск будет выполняться по УИД в данном регистре сведений, а не по полям. Таким образом можно выполнять сопоставление объектов, созданных в двух ИБ, и решается проблема поиска только по полям. 

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

КД31 позволяет указать несколько разных комбинаций для поиска объектов по полям. Поиск в ИБ приемнике будет выполнен по всем комбинациям. Объект будет считаться найденным, если поиск успешен хотя бы по одной из этих комбинаций.

 

Конвертация объектов по правилам конвертации (ПКО)

Рассмотрим более подробно алгоритм основного этапа загрузки данных, в процессе которого происходит идентификация и запись новых или найденных объектов в ИБ.

Данный алгоритм можно разделить на два разных процесса:

  • Конвертация объекта, загружаемого по ПОД – объект выгружен целиком из базы источника.
  • Конвертация объекта по ссылке – загружается ссылка на объект из другого объекта.

Конвертация объекта, выгруженного целиком

Общая схема конвертации полного объекта:

Конвертация полного объекта

Первым действием происходит поиск объекта по УИД, если данный вид идентификации доступен для объекта.

Дальше выполняется конвертация свойств (ПКС) первого этапа. На первом этапе происходит конвертация тех свойств, для которых задано свойство формата.

Дальше выполняется обработчик «При конвертации данных XDTO». В обработчике доступны параметры:

  • ДанныеXDTO – структура с полученными данными.
  • ПолученныеДанные — новый, созданный объект данного типа, с частично заполненными свойствами (на первом этапе конвертации).

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

После выполнения обработчика выполняется конвертация свойств второго этапа. Конвертируются все свойства и коллекции, добавленные в структуру «ДополнительныСвойства» параметра «ПолученныеДанные».

Дальше, если объект был найден по УИД, выполняется обработчик «Перед записью полученных данных». В обработчике доступны параметры: «ПолученныеДанные» и «ДанныеИБ».

 Если объект найден, параметр «ДанныеИБ» содержит ссылку на этот объект.  

Если объект не найден по УИД, и для него доступен поиск по полям, происходит поиск по этим полям. Если объект найден по полям, также вызывается обработчик «Перед записью полученных данных» с заполненным параметром «ДанныеИБ».

Если объект не найден ни по УИД ни по полям, в обработчике «Перед записью полученных данных», параметр «ДанныеИБ» будет иметь значение «Неопределено».

В данном обработчике, можно реализовать собственный поиск объекта, и присвоить параметру «ДанныеИБ» найденный объект самостоятельно. Если же параметр «ДанныеИБ» останется не заполненным, в ИБ будет создан новый объект, который находится в параметре «ПолученныеДанные».

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

Если в обработчике «Перед записью полученных данных» присвоить параметру «Полученные данные» значение «Неопределено», данные найденного объекта замещаться не будут.

Объект (новый или найденный) будет записан в режиме «ОбменДанными.Загрузка = Истина». Это значит, что не будут выполнены многие платформенные проверки и обработчики при записи объекта, и он запишется в любом случае. 

 

Конвертация объекта, выгруженного по ссылке

Общая схема конвертации по ссылке:

Конвертация объекта по ссылке

Так же, как и в случае с загрузкой полного объекта, сначала происходит поиск по УИД (если он доступен). Если объект найден, возвращается ссылка на него, и больше никаких действий не происходит.

Если объект не найден по УИД, и поиск по полям для объекта не доступен, возвращается пустая ссылка. В этом случае, если объект в дальнейшем не будет загружен по ПОД полностью, будет ссылка на несуществующий объект.

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

Дальше происходит поиск объекта по полям поиска. В случае, если объект найден, возвращается ссылка на него. А если же он не найден, выполняется обработчик «Перед записью полученных данных». В этом обработчике можно реализовать собственный поиск объекта. Но, обратите внимание, поиск будет выполняться только в том случае, если объект не был найден ни по УИД ни по полям поиска.

Дальше происходит запись частично заполненного объекта (заполнены только поля поиска), и возвращается ссылка не него. Поскольку запись происходит в режиме «ОбменДанными.Загрузка = Истина», объект будет записан на данном этапе.

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

 

 Полезные процедуры общего модуля «ОбменДаннымиXDTOСервер»

 

 

 Основные элементы структуры «КомпонентыОбмена»

 

На этом все, спасибо за внимание. Напишите, пожалуйста, в комментариях, какие еще темы по ED могут быть интересны. Ну и ставьте плюс, если статья Вам понравилась.

 

Другие мои статьи из серии «Новый подход к обмену данными»

  1. Теоретическая, вводная статья по EnterpriseData
  2. EnterpriseData  Часть 2. Процесс выгрузки данных
  3. Пример доработки правил конвертации данных без использования КД31 

 

7 Comments

  1. acanta

    Спасибо!

    Самый большой плюс КД 3 в том, что доработка обмена не требует КД3.

    Reply
  2. ids79

    (2)Пожалуйста. Да, это так. Но существенные доработки все-таки лучше делать в КД 3

    Reply
  3. shusharu

    Спасибо за статьи! Очень помогает.

    Есть вопрос. Можно ли как то отказаться от получения объекта, при определенных условиях. Попробовал в процедуру ПКО_Документ_ПКОРасчетыССотрудниками_Получение_ПриКонвертаци­иДанныхXDTO сделать условие с возвратом. Но все равно объект попадает в форму сопоставления данных. (обмен между ЕРП и БУХ). Нужен аналог флага Отказ=Истина;

    Reply
  4. ids79

    (4)Чтобы отказаться от загрузки объекта, используйте событие «При обработке» правила обработки данных (ПОД).

    Код следующий:

    ИспользованиеПКО.ПКО_Документ_ПКОРасчетыССотрудниками_Получение = Ложь;

    Также в обработчике доступны ДанныеXDTO, можно отменить загрузку выборочно.

    Но более правильно поставить ограничение на этапе отправки, чтобы не нужные данные не попадали в файл выгрузки. На этапе выгрузки также можно использовать обработчик «При обработке».

    Reply
  5. shusharu

    (5)

    При обработке

    Спасибо. А если в МенеджерОбменаЧерезУниверсальныйФормат13 на этот вид операции документа нет такого обработчика?

    Только на вид Документ_ПКОРозничнаяВыручка_Получение, есть обработчик.

    Вот кусочек из модуля

    #Область Документ_ПКОРасчетыССотрудниками_Получение
    Процедура ДобавитьПОД_Документ_ПКОРасчетыССотрудниками_Получение(ПравилаОбработкиДанных)
    ПравилоОбработки                         = ПравилаОбработкиДанных.Добавить();
    ПравилоОбработки.Имя                     = «Документ_ПКОРасчетыССотрудниками_Получение»;
    ПравилоОбработки.ОбъектВыборкиФормат     = «Документ.ПКОРасчетыССотрудниками»;
    ПравилоОбработки.ИспользуемыеПКО.Добавить(«Документ_ПКОРасчетыССотрудниками_Получение»);
    КонецПроцедуры
    #КонецОбласти
    #Область Документ_ПКОРозничнаяВыручка_Получение
    Процедура ДобавитьПОД_Документ_ПКОРозничнаяВыручка_Получение(ПравилаОбработкиДанных)
    ПравилоОбработки                         = ПравилаОбработкиДанных.Добавить();
    ПравилоОбработки.Имя                     = «Документ_ПКОРозничнаяВыручка_Получение»;
    ПравилоОбработки.ОбъектВыборкиФормат     = «Документ.ПКОРозничнаяВыручка»;
    ПравилоОбработки.ПриОбработке            = «ПОД_Документ_ПКОРозничнаяВыручка_Получение_ПриОбработке»;
    ПравилоОбработки.ИспользуемыеПКО.Добавить(«Документ_ПКОРозничнаяВыручка_Получение»);
    КонецПроцедуры
    

    Показать

    Мне самому добавить такой обработчик?

    Что касается выгрузки я понимаю что так лучше, то основная доработка обмена идет на стороне Бухгалтерии и хотелось по возможности остаться только там, если не получится придется тогда сделать расширение и в ЕРП.

    Reply
  6. ids79

    (6) Я бы посоветовал использовать конвертацию данных 3.1 в таком случае.

    Но если уже решили вносить изменения вручную, добавляйте процедуру по аналогии с другими объектами. Также нужно отредактировать процедуры: ДобавитьПОД_Документ_ПКОРасчетыССотрудниками_Получение и ВыполнитьПроцедуруМодуляМенеджера

    Reply
  7. shusharu

    (7) СПАСИБИЩЕ!!! Описал свой обработчик в расширении и все получилось!!

    Вот так это выглядело в итоге, может кому пригодится
    &Вместо(«ДобавитьПОД_Документ_ПКОРасчетыССотрудниками_Получение»)
    Процедура АБС_ДобавитьПОД_Документ_ПКОРасчетыССотрудниками_Получение(ПравилаОбработкиДанных)
    ПравилоОбработки                         = ПравилаОбработкиДанных.Добавить();
    ПравилоОбработки.Имя                     = «Документ_ПКОРасчетыССотрудниками_Получение»;
    ПравилоОбработки.ОбъектВыборкиФормат     = «Документ.ПКОРасчетыССотрудниками»;
    ПравилоОбработки.ПриОбработке            = «АБС_ПОД_Документ_ПКОРасчетыССотрудниками_Получение_ПриОбраб­отке»;
    ПравилоОбработки.ИспользуемыеПКО.Добавить(«Документ_ПКОРасчетыССотрудниками_Получение»);
    КонецПроцедуры
    &Вместо(«ДобавитьПОД_Документ_ПКОРасчетыСКонтрагентами_Получение»)
    Процедура АБС_ДобавитьПОД_Документ_ПКОРасчетыСКонтрагентами_Получение(ПравилаОбработкиДанных)
    ПравилоОбработки                         = ПравилаОбработкиДанных.Добавить();
    ПравилоОбработки.Имя                     = «Документ_ПКОРасчетыСКонтрагентами_Получение»;
    ПравилоОбработки.ОбъектВыборкиФормат     = «Документ.ПКОРасчетыСКонтрагентами»;
    ПравилоОбработки.ПриОбработке            = «АБС_ПОД_Документ_ПКОРасчетыСКонтрагентами_Получение_ПриОбра­ботке»;
    ПравилоОбработки.ИспользуемыеПКО.Добавить(«Документ_ПКОРасчетыСКонтрагентами_Получение»);
    КонецПроцедуры
    
    Процедура АБС_ПОД_Документ_ПКОРасчетыССотрудниками_Получение_ПриОбрабо­тке(ДанныеXDTO, ИспользованиеПКО, КомпонентыОбмена)
    Если ДанныеXDTO.КлючевыеСвойства.ТипЗначения=»ПКОРасчетыССотрудниками» Тогда
    ИспользованиеПКО.Документ_ПКОРасчетыССотрудниками_Получение = Ложь;
    КонецЕсли;
    КонецПроцедуры
    Процедура АБС_ПОД_Документ_ПКОРасчетыСКонтрагентами_Получение_ПриОбраб­отке(ДанныеXDTO, ИспользованиеПКО, КомпонентыОбмена)
    ИспользованиеПКО.Документ_ПКОРасчетыСКонтрагентами_Получение = Ложь;
    КонецПроцедуры
    
    &После(«ВыполнитьПроцедуруМодуляМенеджера»)
    
    Процедура АБС_ВыполнитьПроцедуруМодуляМенеджера(ИмяПроцедуры, Параметры)
    Если ИмяПроцедуры = «АБС_ПОД_Документ_ПКОРасчетыССотрудниками_Получение_ПриОбраб­отке» Тогда
    АБС_ПОД_Документ_ПКОРасчетыССотрудниками_Получение_ПриОбрабо­тке(
    Параметры.ОбъектОбработки, Параметры.ИспользованиеПКО, Параметры.КомпонентыОбмена);
    ИначеЕсли  ИмяПроцедуры = «АБС_ПОД_Документ_ПКОРасчетыСКонтрагентами_Получение_ПриОбра­ботке» Тогда
    АБС_ПОД_Документ_ПКОРасчетыСКонтрагентами_Получение_ПриОбраб­отке(
    Параметры.ОбъектОбработки, Параметры.ИспользованиеПКО, Параметры.КомпонентыОбмена);
    КонецЕсли;
    КонецПроцедуры

    Показать

    Reply

Leave a Comment

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