Пример правила конвертации объектов





В данной публикации приведен пример создания простого правила переноса/конвертации объектов. Пример демонстрирует один из вариантов переноса хозрасчетного регистра из бухгалтерии 2 в управление торговлей 11 с созданием в последней документов "Ввод остатков" по каждому виду операции с разбивкой по счетам.

Задача этого правила обмена перенести остатки по взаиморасчетам из БП 2 в УТ11.

Поэтапное создание правила обмена с помощью конфигурации «Конвертация данных»(метаданные должны быть загружены ):

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

Создание правила выгрузки

2) Переходим к написанию самого кода т.к. в УТ нет хозрасчетного регистра то мы должны его преобразовать. Сначала нам нужен запрос который по нашим параметрам будет возвращать остатки по взаиморасчетам. В обработчике события «Перед обработкой» пишем следующий запрос:

ТекстЗапроса =  »    ВЫБРАТЬ
|    ХозрасчетныйОстатки.Счет,
|    ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
|    ЕСТЬNULL(СУММА(ХозрасчетныйОстатки.СуммаОстатокДт),0) КАК СуммаОстатокДт,
|    ЕСТЬNULL(СУММА(ХозрасчетныйОстатки.СуммаОстатокКт),0) КАК СуммаОстатокКт,
|    МАКСИМУМ(ХозрасчетныйОстатки.Субконто2.Дата) КАК ДатаРасчетногоДокумента,
|    МАКСИМУМ(ХозрасчетныйОстатки.Субконто2.Номер) КАК НомерРасчетногоДокумента
|ИЗ
|    РегистрБухгалтерии.Хозрасчетный.Остатки(&НаДату, Счет = &счет, ,) КАК ХозрасчетныйОстатки
|ГДЕ
|    ХозрасчетныйОстатки.Субконто1.Родитель <> &группа и
|    ХозрасчетныйОстатки.Субконто1.Родитель <> &группа1
|СГРУППИРОВАТЬ ПО
|    ХозрасчетныйОстатки.Счет,
|    ХозрасчетныйОстатки.Субконто1,
|    ХозрасчетныйОстатки.Субконто2
|УПОРЯДОЧИТЬ ПО
|    Субконто1
|АВТОУПОРЯДОЧИВАНИЕ»;

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

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

 НаДату = дата(‘20130101’);
 ТД = ТекущаяДата();
 группа = Справочники.Контрагенты.НайтиПоНаименованию(«Покупатели»);
 группа1 = Справочники.Контрагенты.НайтиПоНаименованию(«Возвраты от ФИЗЛИЦ»);

Создаем таблицу которую в последствии будем передавать в правило конвертации значений.

ТЗ = Новый ТаблицаЗначений();
 ТЗ.Колонки.Добавить(«Контрагент»);
 ТЗ.Колонки.Добавить(«Сумма»);
 ТЗ.Колонки.Добавить(«СуммаРЕГЛ»);
 ТЗ.Колонки.Добавить(«РасчетныйДокумент»);
 ТЗ.Колонки.Добавить(«ДатаРасчетногоДокумента»);
 ТЗ.Колонки.Добавить(«НомерРасчетногоДокумента»);
 ТЗ.Колонки.Добавить(«Партнер»);
 ТЗ.Колонки.Добавить(«ВалютаВзаиморасчетов»);
 ТЗ.Колонки.Добавить(«ДатаПлатежа»);

Устанавливаем параметры, вызываем запрос, заполняем таблицу вызываем правило конвертации.

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

Аналогично проделываем ту же операцию и для остальных необходимых счетов(их описание как и готовое правило имеется во вложении).

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

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

 Правило конвертации

В обработчике события «Перед загрузкой» напишем следующий код:

ГенерироватьНовыйНомерИлиКодЕслиНеУказан = истина;

В обработчике события «После загрузки» напишем:

выполнить(алгоритмы.ПослеЗагрузкиВводаОстатков);

он выполнит алгоритм со следующим содержанием:

валюта = Константы.ВалютаРегламентированногоУчета.Получить();
объект.Ответственный = ПараметрыСеанса.ТекущийПользователь;
объект.организация=параметры.порганизация;
для каждого стр из объект.расчетыспартнерами цикл
Стр.РасчетныйДокумент = Справочники.ДоговорыКонтрагентов.пустаяссылка();
Стр.ВалютаВзаиморасчетов = валюта;
если ЗначениеЗаполнено(стр.контрагент.партнер) тогда
    стр.партнер = стр.контрагент.партнер;
иначе
    парт = Справочники.Партнеры.НайтиПоНаименованию(стр.контрагент.Наименование);
    если парт <> Неопределено и парт <> Справочники.Партнеры.пустаяссылка() тогда
        стр.партнер = парт;
    контрагент = Справочники.Контрагенты.НайтиПоНаименованию(стр.контрагент.Наименование);
    объект2 =  контрагент.ПолучитьОбъект();
    объект2.Партнер = парт;
    объект2.Записать();    
иначе
    выполнить(алгоритмы.ДобавитьПартнера);
    конецесли;    

конецесли;

конеццикла;

Этот алгоритм будет исполнен на стороне приемника(БП). Кроме переноса остатков по взаиморасчетам стоит задача переноса контрагентов, но в УТ используются партнеры поэтому после формирования документа мы проверяем все ли контрагенты и партнеры имеются в базе приемнике, если по какой то причине их нет то мы их добавляем.

 Алгоритм после загрузки

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

Для партнеров был создан алгоритм который выполняется на стороне приемника.

 Добавить партнера

Для того чтобы выполнить алгоритм на стороне приемника, надо в правом верхнем углу окна алгоритма(при его редактировании) проставить флаг «Используется при загрузке».

Ниже приведен код алгоритма «Добавить партнера»:

        нПартнер = Справочники.Партнеры.СоздатьЭлемент();
        нПартнер.Наименование =стр.контрагент.наименование;
        нПартнер.Комментарий = «Создан при загрузке из БП»;
        нПартнер.НаименованиеПолное =стр.контрагент.НаименованиеПолное;
        нПартнер.Поставщик = ?(найти(стр.контрагент.ДополнительнаяИнформация,»Поставщик»)>0,истина,ложь);
        нПартнер.Клиент = ?(найти(стр.контрагент.ДополнительнаяИнформация,»Клиент»)>0,истина,ложь);
        ПрочиеОтношения = ?(найти(стр.контрагент.ДополнительнаяИнформация,»Прочее»)>0,истина,ложь);
        нпартнер.Записать();
        стр.партнер = нпартнер.ссылка;
        контрагент = Справочники.Контрагенты.НайтиПоНаименованию(стр.контрагент.Наименование);
    объект2 =  контрагент.ПолучитьОбъект();
    объект2.Партнер = нпартнер.ссылка;
    объект2.Записать();

Возвращаемся обратно к правилу конвертации объекта. Теперь нам надо установить соответствия полей источника и приемника, это можно было сделать непосредственно перед написанием кода. Для того чтобы сопоставить поля в нижней табличной части имеется кнопка вызова мастера «Синхронизация свойств». В этом мастере мы можем либо сопоставить поля, либо оставить как без источника, так и без приемника. В нашем случае все поля и ТЧ мы оставляем без источника.

После того как необходимы поля были выбраны в нижней ТЧ для каждого поля выставляем флаг в колонке «Получить из входящих данных». Этот флаг говорит о том, что система будет искать это поле во входящих данных. Важно чтобы имя поля совпадало с именем во входящих данных, иначе будет выведено сообщение о том, что поле не найдено.

Текстом описаны не все нюансы процесса.

17 Comments

  1. Famza

    (0), к сожалению оформление убило желание читать.

    Reply
  2. Zhilyakovdr

    (1) поправил оформление.

    Reply
  3. DoctorRoza

    Норм информация, пригодится!:)

    Reply
  4. Meson

    Добротная статья для начинающих.

    Reply
  5. Crush

    Согласен. Хороший пример для начинающих. Мне б такой в своё время:)

    Reply
  6. ivanov660

    Для начинающих предлагаю добавить больше пояснений. А то получается, что много моментов опущено (хотя бы станет ясно что искать).

    Reply
  7. Zhilyakovdr

    Если есть предложения по дополнению статьи, пишите, дополню)))

    Reply
  8. iov

    (7)Конвертация данных, редакция 2.1 (2.1.7.1) правила не загружаются.

    Reply
  9. Zhilyakovdr

    Ошибку в студию.

    Reply
  10. V_K

    Автор, какой у вас релиз КД. У меня после загрузки в названии правил конвертации <Объект не найден> (10:8ca6cc49fd47b1ac11e29de93834ea8d)

    и правила пустые

    Reply
  11. Zhilyakovdr

    Если правила не грузятся снимите флаг загрузки в транзакции. Эта ошибка происходит из-за правила сопоставления «ТипыОперациВводаОстатков», после загрузки вам вручную придется их снова сопоставить.

    Reply
  12. sumixam

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

    МассивСчетов = Новый Массив;

    МассивСчетов.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду(«68.01»));

    МассивСчетов.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду(«68.10.7»));

    Если МассивСчетов.Найти(ОбъектКоллекции.СчетДт) <> Неопределено И

    Строка(ВидСубконто) = «Район» Тогда

    ИмяПКОВидСубконто = «ВидыСубконтоХозрасчетныеНеПредопределенный»;

    Иначе

    ИмяПКОВидСубконто = «ВидыСубконтоХозрасчетные»;

    КонецЕсли;

    Reply
  13. Zhilyakovdr

    (12) sumixam, Добрый день, я отправил вам в личку свою почту, скиньте ваши правила, постараюсь помочь

    Reply
  14. natarezn

    хорошо объяснили !!

    Reply
  15. DedMoroz1983

    Спасибо за статью и «Правило»

    Reply
  16. Zhilyakovdr

    Если у кого то есть вопросы по КД или предложения для статей, темы, пишите в комменты, есть мысль описать неявные возможности КД, но нет конкретного понимания того что будет полезно и интересно другим.

    Reply
  17. Forest

    Спасибо тебе добрый человек. Помогло.

    Reply

Leave a Comment

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