Правила обмена

Версия для печатиPDF-версия

Здравствуйте!

Необходимо настроить обмен данными (РТУ) из УПП одного предприятия (Предприятие) в БП другого предприятия (Организация) с некоторыми условиями.

1. Выгрузка только проведенных
2. Только с реализацией со склада "Сбыт"
3. Если в источнике Продавец - Предприятие, то в приёмнике:
    - Продавцом должна стать Организация;
    - Контрагентом (т.е. Покупателем) должно стать Предприятие;
    - договор должен быть №12345;
    - и префикс номера документа с "ПР.." измениться на "ОР...".

При создании правил обмена в правила конвертации (в данном случае в правило "Контрагентов") в обработчик "При загрузке" поместил код вида:

Если Объект.Проведен Тогда
        Если Объект.Склад = "Сбыт" Тогда
                Если Объект.Организация = "Предприятие" Тогда
                        Объект.Контрагент = Справочники.Контрагенты.НайтиПоКоду("00843    "); // код элемента "Организация"
                КонецЕсли
        КонецЕсли
КонецЕсли

Но при загрузке сразу появляется сообщение:

Ошибка в обработчике события ПриЗагрузкеОбъекта
    ИмяПКО                 =  Контрагенты
    ТипОбъекта             =  Контрагенты
    Объект                 =  <>
    Обработчик             =  ПриЗагрузкеОбъекта
    ОписаниеОшибки         =  Поле объекта не обнаружено (Склад)
    ПозицияМодуля          =  (1)
    КодСообщения           =  20

Видимо синтаксис в правилах не совсем такой, как в Конфигураторе.

Где можно узнать правильность написания и размещения в соответствующих обработчиках таких условий?

Разумеется будет ошибка. Откуда в справочнике Контрагенты возьмутся реквизиты Склад, Организация, Контрагент? Этот код надо поместить в обработчик "После загрузки" правила конвертации РТУ (можно попробовать и в "При загрузке").

В полях Склад и Организация будут элементы соответствующих справочников. Соответственно, нужно проверку по наименованию делать: "Если Объект.Организация.Наименование = "Предприятие" Тогда ...".

Информацию по обработчикам и доступным параметрам можно получить по кнопке "Информация по обработчикам..." на форме правила конвертации объектов.

Синтаксис такой же как и в конфигураторе. Только надо иметь в виду, что обработчики, связанные с выгрузкой, исполняются на стороне Источника, а связанные с загрузкой - на стороне Приёмника.

И ещё. Если хотите фильтр по складу и проведению настроить, то это надо в правиле выгрузки делать.

Понял.

"Проведен", "Пометка удаления" и "Склад" поставил в параметры отбора при выгрузке из УПП.

В РТУ пробовал и в обработчик "При загрузке" и в "После загрузки" вставить такой код:

Если Объект.Организация.Код = Справочники.Организации.НайтиПоКоду("000000003") Тогда //код Предприятия № 1 в справочнике
    Объект.Организация.Наименование = "Организация";
    Объект.Контрагент.Код = Справочники.Организации.НайтиПоКоду("000000003");
    Объект.ДоговорКонтрагента.Код = Справочники.ДоговорыКонтрагентов.НайтиПоКоду("000001799");
ИначеЕсли Объект.Организация.Код = Справочники.Организации.НайтиПоКоду("000000005") Тогда //код Предприятия № 2
    Объект.Организация.Наименование = "Организация";
    Объект.Контрагент.Код = Справочники.Организации.НайтиПоКоду("000000005");
    Объект.ДоговорКонтрагента.Код = Справочники.ДоговорыКонтрагентов.НайтиПоКоду("000001561");
КонецЕсли

Документы выгружаются из УПП и загружаются в БП, но их реквизиты не меняются.

 

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

Надо примерно так код изменить:

Если Объект.Организация.Код = "000000003" Тогда //код Предприятия № 1 в справочнике
    Объект.Организация = Справочники.Организации.НайтиПоНаименованию("Предприятие", Истина);
    Объект.Контрагент = Справочники.Контрагенты.НайтиПоКоду("000000003");
    Объект.ДоговорКонтрагента = Справочники.ДоговорыКонтрагентов.НайтиПоКоду("000001799");
ИначеЕсли Объект.Организация.Код = "000000005" Тогда //код Предприятия № 2
    Объект.Организация = Справочники.Организации.НайтиПоНаименованию("Организация", Истина);
    Объект.Контрагент = Справочники.Организации.НайтиПоКоду("000000005");
    Объект.ДоговорКонтрагента = Справочники.ДоговорыКонтрагентов.НайтиПоКоду("000001561");
КонецЕсли

Разберётесь, где "Организация", где "Предприятие".

Хотя лучше для этих преобразований создать специальные правила конвертации объектов. И сразу передавать уже нужные данные в файл обмена.

Благодарю Вас, очень помогли!.

Несколько вопросов:
1). Что такое "специальные ПКО"?
2). Где можно найти практические задания в примерах по правилам обмена и конвертации данных?
 

Ещё раз внимательно перечитал начальное сообщение. Возник такой вопрос: в БП во все РТУ должны подставляться в качестве организации "Организация", а в качестве контрагента "Предприятие"?

Если так, то никакие специальные ПКО не нужны.

  1. Создаёте новое правило конвертации объектов (ПКО). 
  2. Выбираете в полях "Объект-источник" и "Объект-приемник" значение "СправочникСсылка.Контрагенты". "Имя правила" - "КонтрагентПредприятие" (например).
  3. В настройках отключаете флажок "Искать объект приемника по внутреннему идентификатору объекта источника".
  4. В табличной части "Конвертация свойств" добавляете новое правило конвертации свойств (ПКС).
  5. Поле "Источник" оставляете пустым, в поле "Приемник" выбираете "Код".
  6. Включаете флажок "Поиск объекта при загрузке по свойству".
  7. В обработчике "Перед выгрузкой" пишете следующий код:
    Значение = "<Код контрагента 'Предприятие' в базе БП>";
  8. Переходите в ПКО для документа реализации.
  9. В обработчике "Перед выгрузкой" ПКС Контрагент пишете следующий код:
    Если Источник.Организация.Код = "<Код организации 'Предприятие' в базе УПП>" Тогда
    	ИмяПКО = "КонтрагентПредприятие";
    КонецЕсли;

По такой же схеме создаёте ПКО и изменяете ПКС для Организации и Договора.