Задача этого правила обмена перенести остатки по взаиморасчетам из БП 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.Записать();
Возвращаемся обратно к правилу конвертации объекта. Теперь нам надо установить соответствия полей источника и приемника, это можно было сделать непосредственно перед написанием кода. Для того чтобы сопоставить поля в нижней табличной части имеется кнопка вызова мастера «Синхронизация свойств». В этом мастере мы можем либо сопоставить поля, либо оставить как без источника, так и без приемника. В нашем случае все поля и ТЧ мы оставляем без источника.
После того как необходимы поля были выбраны в нижней ТЧ для каждого поля выставляем флаг в колонке «Получить из входящих данных». Этот флаг говорит о том, что система будет искать это поле во входящих данных. Важно чтобы имя поля совпадало с именем во входящих данных, иначе будет выведено сообщение о том, что поле не найдено.
Текстом описаны не все нюансы процесса.
(0), к сожалению оформление убило желание читать.
(1) поправил оформление.
Норм информация, пригодится!:)
Добротная статья для начинающих.
Согласен. Хороший пример для начинающих. Мне б такой в своё время:)
Для начинающих предлагаю добавить больше пояснений. А то получается, что много моментов опущено (хотя бы станет ясно что искать).
Если есть предложения по дополнению статьи, пишите, дополню)))
(7)Конвертация данных, редакция 2.1 (2.1.7.1) правила не загружаются.
Ошибку в студию.
Автор, какой у вас релиз КД. У меня после загрузки в названии правил конвертации <Объект не найден> (10:8ca6cc49fd47b1ac11e29de93834ea8d)
и правила пустые
Если правила не грузятся снимите флаг загрузки в транзакции. Эта ошибка происходит из-за правила сопоставления «ТипыОперациВводаОстатков», после загрузки вам вручную придется их снова сопоставить.
День добрый, может кто подскажет что не так делаю в конверташке, замаялся уже. Выгружаю субконто Район по 68. счетам, из узла риб, в центр не грузится, в документах где учествует данный счет, в субконто Дт и субконто Кт, в обработчиках свойств, хозрасчетный, дописываю ПКС при выгрузке. Не загружает в центр.
МассивСчетов = Новый Массив;
МассивСчетов.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду(«68.01»));
МассивСчетов.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду(«68.10.7»));
Если МассивСчетов.Найти(ОбъектКоллекции.СчетДт) <> Неопределено И
Строка(ВидСубконто) = «Район» Тогда
ИмяПКОВидСубконто = «ВидыСубконтоХозрасчетныеНеПредопределенный»;
Иначе
ИмяПКОВидСубконто = «ВидыСубконтоХозрасчетные»;
КонецЕсли;
(12) sumixam, Добрый день, я отправил вам в личку свою почту, скиньте ваши правила, постараюсь помочь
хорошо объяснили !!
Спасибо за статью и «Правило»
Если у кого то есть вопросы по КД или предложения для статей, темы, пишите в комменты, есть мысль описать неявные возможности КД, но нет конкретного понимания того что будет полезно и интересно другим.
Спасибо тебе добрый человек. Помогло.