Для краткого ознакомления, что такое конвертация, можно перейти по ссылке: //infostart.ru/1c/articles/659090/
Для информации по формированию ПКС есть статья: //infostart.ru/1c/articles/413178/
Просто классный тортик
Настройки Конвертации
Методы Конвертации (слева на Рис.1: перед выгрузкой, перед загрузкой и тп.) обрабатываются раньше, чем в ПВД или ПКО.
Рис. 1
Параметры конвертации.
Общая информация: Параметры - Структура, в которой хранятся переменные доступные во всех обработчиках.
Первый пример:
В плане обмена могут быть реквизиты и табличные части, которые заполняются при настройке обмена.
План обмена Зарплата -> Бухгалтерия Рис. 2 (режим Конфигуратор ЗУП 3.1):
Рис. 2
При этом в правилах обмена параметры не заданы:
Рис. 3
В обработчике "Перед получением измененных" добавим их значение в структуру "Параметры" (из плана обмена на Рис. 1).
Рис. 4
И далее можем обратиться к этой структуре "Параметры" из любого обработчика.
Рис. 5
Второй пример:
Параметры заданы в правилах (Рис.6).
Это типовые правила ЗУП 2.5 -> Бух 3.0, параметры ИНН и КПП заполняются программно в форме обработки "Выгрузка данных в бухгалтерскую программу" (режим Конфигуратор ЗУП 2.5).
Далее Параметры используются при загрузке в БУХ 3.0.
Рис. 6
Перед загрузкой объекта выполняется проверка в ту ли базу загружаются данные. Если организация не найдена, происходит отмена загрузки (Рис.7):
Рис. 7
Пример отмены обмена с тестовой базой.
В списке значений (или массиве) можно указать строки соединения с рабочими базами, если строка соединения не входит в этот список, отмена выгрузки:
Рис. 8
ПВД
Обработчик "Перед обработкой" в ПВД нужно использовать при способе выборки "Произвольный алгоритм" с обязательным переопределением параметра "ВыборкаДанных".
Первый пример:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПриемНаРаботу.Ссылка КАК Ссылка,
| ПриемНаРаботу.Организация КАК Организация,
| ПриемНаРаботу.Сотрудник КАК Сотрудник,
| ПриемНаРаботу.ФизическоеЛицо КАК ФизическоеЛицо,
| ПриемНаРаботу.Должность КАК Должность,
| ПриемНаРаботу.ДатаПриема КАК ДатаПриема,
| ПриемНаРаботу.Начисления.(
| Ссылка КАК Ссылка,
| НомерСтроки КАК НомерСтроки,
| Начисление КАК Начисление,
| ИдентификаторСтрокиВидаРасчета КАК ИдентификаторСтрокиВидаРасчета,
| Размер КАК Размер
| ) КАК Начисления
|ИЗ
| Документ.ПриемНаРаботу КАК ПриемНаРаботу";
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Отказ = Истина;
КонецЕсли;
ВыборкаДанных = Результат.Выгрузить();
Табличные части так же можно включить в запрос, в примере это табличная часть "Начисления."
Если в базе приемнике реквизиты называются иначе, их нужно назвать верными наименованиями после слова "КАК".
Второй пример:
Рис. 9
В ПВД в обработчике "Перед выгрузкой", чтобы не выгружать непроведенные объекты, можно указать:
Отказ = Не Объект.Проведен;
В ПВД в обработчике "Перед выгрузкой", чтобы не выгружать группы, можно указать:
Отказ = Объект.ЭтоГруппа;
ПКО/ПКС
Установка своего Значения (Вариант 1).
В в табличной части документа "ПриемНаРаботуВОрганизацию" есть реквизит "ВидРасчета" для которого правилом конвертации является ПКО "ОсновныеНачисленияОрганизаций":
Рис. 10
Создавать новые ВидыРасчетов в базе загрузки из базы выгрузки я не хочу (отключаю поиск по "Коду", "Пометка на удаление" мне тоже не интересна), пытаюсь найти объекты по Наименованию:
Рис. 11
и в случае, если Наименование определенное, то присваиваю ему другое значение (другими словами. устанавливаю соответствие):
Рис. 12
Установка своего Значения (Вариант 2).
Ситуация вторая, мне не интересно что было в источнике, я хочу просто задать своё конкретное значение.
Рис. 13
Наименование имеет тип "Строка", поэтому Значение задано строкой:
Рис. 14
Задать своё значение реквизиту табличной части в ПКС, использование Алгоритма, задать другое ПКО.
Если условие "Получить из входящих данных" установлено у группы свойств (табличной части), тогда у самих свойств (реквизитов) этот флаг ставить не обязательно:
Рис. 15
Правило у СубконтоДт2 не указано, оно устанавливается программно:
Рис. 16
Обратиться к строке табличной части можно с помощью переменной "ОбъектКоллекции".
В алгоритме "ПолучитьПКОСубконтоПоТипуЗначения" прописаны ПКО для СубконтоДт2, поскольку в зависимости от счета второе субконто может быть любого типа.
Алгоритм "ПолучитьПКОСубконтоПоТипуЗначения" выглядит вот так:
Рис. 17
Если в результате получаем ИмяПКО = "", отключаем ПКС (Отказ = Истина;), удобно для случаев, когда в одном документе есть реквизит, а в другом - нет. Например, подобная ситуация возникает, если в одной настройке плана обмена ЗУП 2.5 установлен обмен с Бухгалтерией 7.7, а в другой - Бухгалтерия 3.0
Несколько часто используемых строчек кода в ПКО.
Перед выгрузкой:
РежимЗаписи = "Проведение";
При загрузке:
Отказ = ОбъектНайден;
После загрузки:
Объект.Ответственный = Пользователи.ТекущийПользователь();
Для кода можно воспользоваться следующим кодом:
Значение = ПривестиНомерКДлине(Источник.НомерДок,8);
Найти ссылку в приёмнике, которой нет в источнике.
Пример приведён, чтобы показать все возможности конвертации.
Предположим, в источнике есть информация о табельном номере сотрудника, мне необходимо определить сотрудника:
Рис. 18
Вариант 1 приведен с целью, чтобы показать идею. Но, поскольку запрос в цикле - это зло, смотри Вариант 2 :)
В запросе установите галочку:
Рис. 19
Конвертация перечисления.
Вариант 1:
ПКО для перечисления не нужно, можно просто указать его Значение.
Рассмотрим простейший пример:
Рис. 20
ПКС такого перечисления:
Рис. 21
Вариант 2:
Пример, пол физлица. ПКО задано:
Рис. 22
В ПКО задаётся только конвертация значений (на закладке конвертация свойств - пусто):
Рис. 23
Передать данные в параметр.
По ряду причин нужно передать какие-либо данные в приемник. В моём примере необходимо сформировать назначение платежа с указанием периода за который происходит оплата. В документе платежное поручение есть реквизит Дата, но она не соответствует периоду оплаты.
Рис. 24
Далее при загрузке используем код:
ПараметрыОбъекта.Получить("ИмяПараметра")
Рис. 25
Использование параметра в табличной части.
В табличной части "ОтражениеВУчете" добавим параметр "ВидРезерва" и зададим ему нужное нам значение.
Рис. 26
Далее после загрузки объекта можем обратиться к параметрам любым способом.
Я привела два примера:
Рис. 27
Код из Рис. 27:
ТаблицаПараметровТовары = ПараметрыОбъекта["ОтражениеВУчетеТабличнаяЧасть"];
1. МассивПараметровИзТЧ = ТаблицаПараметровТовары.ВыгрузитьКолонку("ВидРезерва");
ИЛИ
2. ТЗОтражениеВУчете = Объект.ОтражениеВУчете.Выгрузить();
ТЗОтражениеВУчете.Колонки.Добавить("ВидРезерва",Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(6)));
ТЗОтражениеВУчете.ЗагрузитьКолонку(ТаблицаПараметровТовары.ВыгрузитьКолонку("ВидРезерва"),"ВидРезерва");
Выгрузка структуры в ПКС.
Зачем может понадобиться: например, в Договоре контрагента при выгрузке нужно подменить Владельца.
Пример:
Если выполняется какое-либо условие, то при выгрузке в договоре Владелец будет другой.
Рис. 28
Если, условие перестаёт выполняться, "Договор контрагента" выгружается стандартным образом.
Выгрузка по произвольному правилу.
Вдогонку выгрузки структур из пункта 15, рассмотрим следующий пример.
На основании документа "Отражение зарплаты в бухучете" в ЗУП 3.1 формируется одноимённый документ в БУХ 3.0.
Так же было принято решение формировать платежные поручения по алиментам и выплатам налогов в фонды.
Соответственно при повторной загрузке важно найти документ "Платежное поручение" в системе-приёмнике и логично, что не может быть несколько документов с одинаковым УИД.
Итак, в ПКО в обработчике "После выгрузки в файл" сформируем выгрузку налогов по каждому фонду:
Рис. 29
Весь код из Рис.29:
Если Источник.ВыгрузитьПлатежноеПоручениеВБухгалтерию Тогда
ВходящиеДанные = Новый Структура;
//ПФР
ВходящиеДанные.Вставить("ВидНалога", "СтраховыеВзносы_ПФР_СтраховаяЧасть");
ВходящиеДанные.Вставить("ВидНалоговогоОбязательства", "Налог");
ВходящиеДанные.Вставить("УИДОтраженияИлиПеречисления", Источник.УИДОтраженияИлиПеречисления);
ВходящиеДанные.Вставить("ИдентификаторДокумента", "");
ВходящиеДанные.Вставить("НазначениеПлатежа", "");
ВходящиеДанные.Вставить("СтавкаНДС", "");
ПФР = Источник.НачисленнаяЗарплатаИВзносы.Итог("ПФРДоПредельнойВеличины") + Источник.НачисленнаяЗарплатаИВзносы.Итог("ПФРСПревышения");
ВходящиеДанные.Вставить("СуммаДокумента", ПФР);
ВходящиеДанные.Вставить("ВидПеречисленияВБюджет", "ИнойПлатеж");
ВходящиеДанные.Вставить("ВидОперации", "ПеречислениеНалога");
ВходящиеДанные.Вставить("ОчередностьПлатежа", 5);
ВходящиеДанные.Вставить("ПеречислениеВБюджет", Истина);
ВходящиеДанные.Вставить("Контрагент", "");
ВходящиеДанные.Вставить("ПоследовательностьЗагружаемогоДокумента", 1);
ВходящиеДанные.Вставить("ПериодРегистрации", Источник.ПериодРегистрации);
ВыгрузитьПоПравилу(Источник,,ВходящиеДанные,,"ПлатежноеПоручение",,Ложь);
//ФСС
ВходящиеДанные.Вставить("ВидНалога", "СтраховыеВзносы_ФСС");
ВходящиеДанные.Вставить("СуммаДокумента", Источник.НачисленнаяЗарплатаИВзносы.Итог("ФСС"));
ВходящиеДанные.Вставить("ПоследовательностьЗагружаемогоДокумента", 2);
ВыгрузитьПоПравилу(Источник,,ВходящиеДанные,,"ПлатежноеПоручение",,Ложь);
//ФСС НС и ПЗ
ВходящиеДанные.Вставить("ВидНалога", "СтраховыеВзносы_ФСС_НСиПЗ");
ВходящиеДанные.Вставить("СуммаДокумента", Источник.НачисленнаяЗарплатаИВзносы.Итог("ФССНесчастныеСлучаи"));
ВходящиеДанные.Вставить("ПоследовательностьЗагружаемогоДокумента", 3);
ВыгрузитьПоПравилу(Источник,,ВходящиеДанные,,"ПлатежноеПоручение",,Ложь);
//ФФОМС
ВходящиеДанные.Вставить("ВидНалога", "СтраховыеВзносы_ФФОМС");
ВходящиеДанные.Вставить("СуммаДокумента", Источник.НачисленнаяЗарплатаИВзносы.Итог("ФФОМС"));
ВходящиеДанные.Вставить("ПоследовательностьЗагружаемогоДокумента", 4);
ВыгрузитьПоПравилу(Источник,,ВходящиеДанные,,"ПлатежноеПоручение",,Ложь);
//Алименты
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОтражениеЗарплатыВБухучетеУдержаннаяЗарплата.Контрагент КАК Контрагент,
| ОтражениеЗарплатыВБухучетеУдержаннаяЗарплата.Сумма КАК Сумма,
| ОтражениеЗарплатыВБухучетеУдержаннаяЗарплата.ФизическоеЛицо КАК ФизическоеЛицо,
| ОтражениеЗарплатыВБухучетеУдержаннаяЗарплата.Ссылка.ПериодРегистрации КАК ПериодРегистрации
|ИЗ
| Документ.ОтражениеЗарплатыВБухучете.УдержаннаяЗарплата КАК ОтражениеЗарплатыВБухучетеУдержаннаяЗарплата
|ГДЕ
| ОтражениеЗарплатыВБухучетеУдержаннаяЗарплата.Ссылка = &Ссылка
| И ОтражениеЗарплатыВБухучетеУдержаннаяЗарплата.ВидОперации В(&ВидыОпераций)";
ВидыОпераций = Новый Массив;
ВидыОпераций.Добавить(Перечисления.ВидыОперацийПоЗарплате.АлиментыПрочиеИсполнительныеЛисты);
ВидыОпераций.Добавить(Перечисления.ВидыОперацийПоЗарплате.АлиментыПрочиеИсполнительныеЛистыКонтрагенты);
Запрос.УстановитьПараметр("ВидыОпераций", ВидыОпераций);
Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
ПоследовательностьЗагружаемогоДокумента = 5;
Пока Выборка.Следующий() Цикл
ВходящиеДанные.Вставить("СуммаДокумента", Выборка.Сумма);
ВходящиеДанные.Вставить("Контрагент", Выборка.Контрагент);
ВходящиеДанные.Вставить("ВидОперации", "ПрочиеРасчетыСКонтрагентами");
ВходящиеДанные.Вставить("ОчередностьПлатежа", 1);
ВходящиеДанные.Вставить("ПеречислениеВБюджет", Ложь);
ТекстСумма = "Сумма " + Формат(Выборка.Сумма, "ЧЦ=15; ЧДЦ=2; ЧРД=-; ЧН=0-00; ЧГ=");
НазначениеПлатежа = "Перечисление алиментов из зарплаты сотрудника " +
Выборка.ФизическоеЛицо+" за " + НРег(Формат(Выборка.ПериодРегистрации, "ДФ='ММММ yyyy'")) + Символы.ПС +
ТекстСумма + Символы.ПС +
"Без налога (НДС)";
ВходящиеДанные.Вставить("НазначениеПлатежа", НазначениеПлатежа);
ВходящиеДанные.Вставить("ПоследовательностьЗагружаемогоДокумента", ПоследовательностьЗагружаемогоДокумента);
ВходящиеДанные.Вставить("СтавкаНДС", "БезНДС");
ВходящиеДанные.Вставить("ПериодРегистрации", Источник.ПериодРегистрации);
ВыгрузитьПоПравилу(Источник,,ВходящиеДанные,,"ПлатежноеПоручение",,Ложь);
ПоследовательностьЗагружаемогоДокумента = ПоследовательностьЗагружаемогоДокумента + 1;
КонецЦикла;
КонецЕсли;
В ПКО "Платежное поручение" часть ПКС получаем из входящих данных:
Рис. 30
Каждое перечисление в загружается с новым произвольным УИД, не связанным с документом источником. Поиск будет осуществляться по двум дополнительным сведениям документа "Платежное поручение" и для этого их добавим:
УИДОтраженияИлиПеречисления : Строка(36)
ПоследовательностьЗагружаемогоДокумента : Число(2,0)
В обработчике "Поля поиска" указан следующий код (чтобы поля были доступны в обработчике они обязательно должны быть отмечены флагом "Поиск"):
ОбъектНайден = Ложь;
Если ЗначениеЗаполнено(ПараметрыОбъекта.Получить("УИДОтраженияИлиПеречисления")) Тогда
ПВХ_УИДОтраженияИлиПеречисления = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("ИдентификаторДляФормул", "УИДОтраженияИлиПеречисления");
ПВХ_ПоследовательностьЗагружаемогоДокумента = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("ИдентификаторДляФормул", "ПоследовательностьЗагружаемогоДокумента");
Знач_УИДОтраженияИлиПеречисления = Строка(ПараметрыОбъекта.Получить("УИДОтраженияИлиПеречисления"));
Знач_ПоследовательностьЗагружаемогоДокумента = ПараметрыОбъекта.Получить("ПоследовательностьЗагружаемогоДокумента");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ДополнительныеСведения.Объект КАК Объект
|ПОМЕСТИТЬ ВТ_Объект
|ИЗ
| РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
|ГДЕ
| ДополнительныеСведения.Свойство = &ПВХ_УИДОтраженияИлиПеречисления
| И ДополнительныеСведения.Значение = &Знач_УИДОтраженияИлиПеречисления
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДополнительныеСведения.Объект КАК Объект
|ИЗ
| РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
|ГДЕ
| ДополнительныеСведения.Свойство = &ПВХ_ПоследовательностьЗагружаемогоДокумента
| И ДополнительныеСведения.Значение = &Знач_ПоследовательностьЗагружаемогоДокумента
| И ДополнительныеСведения.Объект В
| (ВЫБРАТЬ
| ВТ_Объект.Объект КАК Объект
| ИЗ
| ВТ_Объект КАК ВТ_Объект)";
Запрос.УстановитьПараметр("ПВХ_УИДОтраженияИлиПеречисления", ПВХ_УИДОтраженияИлиПеречисления);
Запрос.УстановитьПараметр("ПВХ_ПоследовательностьЗагружаемогоДокумента", ПВХ_ПоследовательностьЗагружаемогоДокумента);
Запрос.УстановитьПараметр("Знач_УИДОтраженияИлиПеречисления", Знач_УИДОтраженияИлиПеречисления);
Запрос.УстановитьПараметр("Знач_ПоследовательностьЗагружаемогоДокумента", Знач_ПоследовательностьЗагружаемогоДокумента);
СсылкаНаОбъект = Документы.ПлатежноеПоручение.ПустаяСсылка();
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СсылкаНаОбъект = Выборка.Объект;
КонецЕсли;
ПрекратитьПоиск = Истина;
Иначе
СсылкаНаОбъект = Документы.ПлатежноеПоручение.ПолучитьСсылку(ПараметрыОбъекта.Получить("ИдентификаторДокумента"));
Если СсылкаНаОбъект.ПолучитьОбъект() = Неопределено Тогда
СсылкаНаОбъект = Неопределено;
СвойстваПоиска.Вставить("{УникальныйИдентификатор}", ПараметрыОбъекта.Получить("ИдентификаторДокумента"));
ПрекратитьПоиск = Истина;
КонецЕсли;
КонецЕсли;
Параметр "ИдентификаторДокумента" нужен для другого документа, пример которого нет смысла приводить.
В обработчике "После загрузки", если объект не найден нужно записать дополнительные сведения по нему:
Если НЕ ОбъектНайден И ЗначениеЗаполнено(ПараметрыОбъекта.Получить("УИДОтраженияИлиПеречисления")) Тогда
Объект.Записать();
ПВХ_УИДОтраженияИлиПеречисления = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("ИдентификаторДляФормул", "УИДОтраженияИлиПеречисления");
ПВХ_ПоследовательностьЗагружаемогоДокумента = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("ИдентификаторДляФормул", "ПоследовательностьЗагружаемогоДокумента");
Знач_УИДОтраженияИлиПеречисления = ПараметрыОбъекта.Получить("УИДОтраженияИлиПеречисления");
Знач_ПоследовательностьЗагружаемогоДокумента = ПараметрыОбъекта.Получить("ПоследовательностьЗагружаемогоДокумента");
Если ЗначениеЗаполнено(ПВХ_УИДОтраженияИлиПеречисления) Тогда
МЗ = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи();
МЗ.Объект = Объект.Ссылка;
МЗ.Свойство = ПВХ_УИДОтраженияИлиПеречисления;
МЗ.Значение = Знач_УИДОтраженияИлиПеречисления;
МЗ.Записать();
КонецЕсли;
Если ЗначениеЗаполнено(ПВХ_ПоследовательностьЗагружаемогоДокумента) Тогда
МЗ = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи();
МЗ.Объект = Объект.Ссылка;
МЗ.Свойство = ПВХ_ПоследовательностьЗагружаемогоДокумента;
МЗ.Значение = Знач_ПоследовательностьЗагружаемогоДокумента;
МЗ.Записать();
КонецЕсли;
КонецЕсли;
Поля поиска (подробнее).
Пример 1
Чтобы поля были доступны в обработчике "Поля поиска" они обязательно должны быть отмечены флагом "Поиск" (отмечены стрелкой на рисунке ниже):
В обработчике укажем следующий код:
При этом создавать объект мне не нужно, мне нужно его просто найти.
Пример 2
Типовые правила ЗУП 3.1 -> БУХ 3.0
Обработчик "Поля поиска":
ПоляПоискаМассив = Новый Массив;
Если ЗначениеЗаполнено(СвойстваПоиска["СтраховойНомерПФР"]) Тогда
ПоляПоискаМассив.Добавить("СтраховойНомерПФР");
КонецЕсли;
Если ЗначениеЗаполнено(СвойстваПоиска["ИНН"]) Тогда
ПоляПоискаМассив.Добавить("ИНН");
КонецЕсли;
Если ЗначениеЗаполнено(СвойстваПоиска["ДатаРождения"]) Тогда
ПоляПоискаМассив.Добавить("Наименование,ДатаРождения");
КонецЕсли;
Если НомерВариантаПоиска <= ПоляПоискаМассив.Количество() Тогда
СтрокаИменСвойствПоиска = ПоляПоискаМассив[НомерВариантаПоиска-1];
Иначе
ПрекратитьПоиск = Истина;
КонецЕсли;
Общая информация
Запросы размещаются на закладке "Алгоритмы\Запросы" без кавычек.
Чтобы получить текст запроса, нужно указать код:
ТекстЗапроса = Запросы.Прием.Текст;
Для выполнения алгоритма:
Выполнить(Алгоритмы.ДатаЗапретаВыгрузки);
Если Алгоритм используется при загрузке, это важно указать, чтобы он выгрузился в файл обмена.
Конвертация документа "Перенос данных", или, например "Операция" (Перенос движений документа).
В выгрузке описания структуры установите галочку, как показано на рис. ниже.
Далее в конвертации данных:
Галочками отметьте необходимые регистры, по которым хотите перенести движения, они будут добавлены так же, как и табличные части документа. Менять стандартные правила выгрузки не нужно (то есть не нужно писать никаких запросов), движения будут выгружены автоматически.