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





В данной публикации приведен пример создания простого правила переноса/конвертации объектов. Пример демонстрирует один из вариантов переноса хозрасчетного регистра из бухгалтерии 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 не будет опубликован. Обязательные поля помечены *