gifts2017

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

Опубликовал Дмитрий Жиляков (Zhilyakovdr) в раздел Обмен - Перенос данных из 1С7.7 в 1C8.X

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

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

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

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

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Правило.xml
.xml 106,28Kb
24.01.13
109
.xml 106,28Kb 109 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Иван Иванов (Famza) 25.01.13 09:22
(0), к сожалению оформление убило желание читать.
2. Дмитрий Жиляков (Zhilyakovdr) 26.01.13 20:15
(1) Famza, поправил оформление.
3. Алексей Роза (DoctorRoza) 27.01.13 17:17
Норм информация, пригодится!:)
4. Александр Noname (Meson) 30.01.13 09:50
Добротная статья для начинающих.
5. Илья Парамонов (Crush) 30.01.13 10:50
Согласен. Хороший пример для начинающих. Мне б такой в своё время:)
6. ivanov660 ivanov660 (ivanov660) 13.03.13 10:03
Для начинающих предлагаю добавить больше пояснений. А то получается, что много моментов опущено (хотя бы станет ясно что искать).
7. Дмитрий Жиляков (Zhilyakovdr) 13.03.13 10:34
Если есть предложения по дополнению статьи, пишите, дополню)))
8. Александр Зубцов (iov) 24.03.13 12:56
(7)Конвертация данных, редакция 2.1 (2.1.7.1) правила не загружаются.
9. Дмитрий Жиляков (Zhilyakovdr) 24.03.13 20:08
10. Victor (V_K) 05.04.13 16:09
Автор, какой у вас релиз КД. У меня после загрузки в названии правил конвертации <Объект не найден> (10:8ca6cc49fd47b1ac11e29de93834ea8d)
и правила пустые
11. Дмитрий Жиляков (Zhilyakovdr) 05.04.13 17:18
Если правила не грузятся снимите флаг загрузки в транзакции. Эта ошибка происходит из-за правила сопоставления "ТипыОперациВводаОстатков", после загрузки вам вручную придется их снова сопоставить.
12. sumixam (sumixam) 13.02.14 11:29
День добрый, может кто подскажет что не так делаю в конверташке, замаялся уже. Выгружаю субконто Район по 68. счетам, из узла риб, в центр не грузится, в документах где учествует данный счет, в субконто Дт и субконто Кт, в обработчиках свойств, хозрасчетный, дописываю ПКС при выгрузке. Не загружает в центр.

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

Если МассивСчетов.Найти(ОбъектКоллекции.СчетДт) <> Неопределено И
Строка(ВидСубконто) = "Район" Тогда
ИмяПКОВидСубконто = "ВидыСубконтоХозрасчетныеНеПредопределенный";
Иначе
ИмяПКОВидСубконто = "ВидыСубконтоХозрасчетные";
КонецЕсли;
13. Дмитрий Жиляков (Zhilyakovdr) 13.02.14 17:02
(12) sumixam, Добрый день, я отправил вам в личку свою почту, скиньте ваши правила, постараюсь помочь
14. Вика Козлова (natarezn) 29.12.15 00:45
15. Евгений я (DedMoroz1983) 13.10.16 10:53
Спасибо за статью и "Правило"
16. Дмитрий Жиляков (Zhilyakovdr) 14.10.16 10:09
Если у кого то есть вопросы по КД или предложения для статей, темы, пишите в комменты, есть мысль описать неявные возможности КД, но нет конкретного понимания того что будет полезно и интересно другим.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа