Дано:
1. Источник - Самописная конфигурация на базе БП Б-г знает каких годов, назовем ее "ТК Северный". В конфигурации присутствует документ "Выписка" с реквизитами таб.части "Приход" и "Расход" типа Число.
2. Приемник - БП 4.5 на платформе 7.7, в ней тоже присутствует документ "Выписка" с реквизитами таб.части "Приход" и "Расход".
3. В документе "Выписка", как в источнике, так и в приемнике, есть реквизит "КоррСчет" (в источнике "КорСчет", с одной "Р"), в источнике это справочник "ПланСчетов", в приемнике - счет плана счетов "Основной"
Как известно, при конвертации данных, когда источник является конфигурацией на платформе 7.7, можно передавать произвольные данные через дополнительные XML-узлы. Таким образом в книге Бояркина и Филатова описан способ передачи значений периодических реквизитов (кому интересно, стр. 143).
Мы используем этот алгоритм, только не совсем так, как описано в книге, вернее, не совсем для этих целей.
Алгоритм действий следующий: по скольку при конвертации данных 7.7- 7.7 не работают половина фишек и возможностей КД, конвертацию документа "Выписка" придется разбить на два этапа:
1) Перенос данных самого документа (шапки) и табличной части без установки реквизита "КоррСчет".
2) Перенос реквизита "КоррСчет". При этом будут запомнены и сохранены в дополнительный XML-узел значения реквизита "КорСчет" документа-источника, а затем будет прочитан дополнительных XML-узел с кодами счетов.
Второй этап нужен только потому, что в 7.7 не работает обработчик "ПослеЗагрузки". При попытке совместить эти два ПКО в обработчике "ПриЗагрузке" Объект.КоличествоСтрок() возвращает 0, что логично, так как объект еще не записан, и даже вызов метода Записать(), ровно как и ОткрытьФормуМодально(Объект,,0) не дают совершенно ничего. А в обработчике "ПослеЗагрузки" не доступны дополнительные XML-узлы.
При использовании второго ПКО объект будет уже записан в базу на момент, когда будет выполняться второе ПКО, что позволит решить нашу проблему с поиском счета в ИБ.
Gentlemen, start your engines
Первым делом, создадим правило конвертации объекта (ПКО) для документа "Выписка", приемником в котором является документ "Выписка" ИБ-приемника
(рис.1)
(рис.2) - табличная часть
Обратите внимание, что на рис.2 для реквизитов Субконто1 и Субконто2 правило конвертации свойства (ПКС) не задано. Что это означает? это означает, что Субконто1 и Субконто2 могут быть различных типов, и мы не можем заранее знать и указать конкретное ПКС. Если не указывать ПКС, система попытается автоматически подобрать подходящее. То есть достаточно, чтобы в наборе правил конвертации присутствовало ПКО с источником и приемником такими, какие попадутся при выгрузке.
Этим правилом мы перенесем все нужные реквизиты шапки документа, его табличную часть, но без реквизита "КоррСчет"
Далее, создадим ПКО "Выписка_СтрокиТЧ". Внешний вид на (рис.3)
В обработчик "ПриВыгрузке" ПКО "Выписка_СтрокиТЧ" пишем
Если Источник.ВыбратьСтроки() = 1 Тогда
УзелСпискаСчетов = СоздатьУзел("СчетаПроводок");
Пока Источник.ПолучитьСтроку()=1 Цикл
Значение = Источник.КорСчет; //КорСчет с одной буквой "Р"
Если ПустоеЗначение(Значение) = 0 Тогда
КодСчета = СокрЛП(Значение.Код);
КодВБазеПриемнике = "";
Если КодСчета = "060" Тогда
КодВБазеПриемнике = "60.1";
ИначеЕсли КодСчета = "062" Тогда
КодВБазеПриемнике = "62.1";
ИначеЕсли КодСчета = "044" Тогда
КодВБазеПриемнике = "44.1.1";
ИначеЕсли КодСчета = "66.3" Тогда
КодВБазеПриемнике = "66.3";
Иначе
//Дополняем по факту
Сообщить("!! Не указано соответствие для счета <"+КодСчета+">. Обратитесь к разработчику!");
КонецЕсли;
КонецЕсли;
Если КодВБазеПриемнике <> "" Тогда
УзелЗначения = СоздатьУзел("Счет");
УстановитьАтрибут(УзелЗначения, "Код", КодВБазеПриемнике);
ДобавитьПодчиненный(УзелСпискаСчетов, УзелЗначения);
КонецЕсли;
КонецЦикла;
ДобавитьПодчиненный(Приемник, УзелСпискаСчетов);
КонецЕсли;
В обработчик "ПриЗагрузке" ПКО "Выписка_СтрокиТЧ" пишем //Славьте лапти, что хотя бы "ПриЗагрузке" в 7.7 работает
УзлыСчетов= Узел.ВыбратьУзлы("СчетаПроводок");
Счет = СоздатьОбъект("Счет.Основной");
СпНайденныхСчетов = СоздатьОбъект("СписокЗначений");
Для СчУзлов = 0 По УзлыСчетов.КоличествоУзлов - 1 Цикл
КонкретныйУзел = УзлыСчетов.ПолучитьУзел(СчУзлов);
Выборка = КонкретныйУзел.ВыбратьУзлы("Счет");
Для Сч =0 По Выборка.КоличествоУзлов - 1 Цикл
УзелЗначения = Выборка.ПолучитьУзел(Сч);
Код = УзелЗначения.ПолучитьАтрибут("Код");
Если Счет.НайтиПоКоду(Код) = 1 Тогда
СпНайденныхСчетов.ДобавитьЗначение(Счет.ТекущийСчет());
Иначе
Сообщить("Не найден счет по коду <"+Код+">! Срочно обратитесь к разработчику!","!!!");
КонецЕсли;
КонецЦикла;
КонецЦикла;
СколькоСчетов = СпНайденныхСчетов.РазмерСписка();
Если СколькоСчетов > 0 Тогда
СколькоСтрок = Объект.КоличествоСтрок();
Если СколькоСтрок <> СколькоСчетов Тогда
Сообщить("Для документа "+ Объект +" количество строк и количество счетов различаются: "+ СколькоСтрок + " <> "+ СколькоСчетов);
Иначе
Если Объект.ВыбратьСтроки()= 1 Тогда
Пока Объект.ПолучитьСтроку()=1 Цикл
НайденныйСчет = СпНайденныхСчетов.ПолучитьЗначение(Объект.НомерСтроки);
Объект.КоррСчет = НайденныйСчет.ТекущийСчет();
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Кстати. Рекомендую использовать переписанную под КД 2.1.3.1 обработку , которая позволяет использовать GCOMP. Экономит кучу времени. Помнится мне, что я что-то в ней менял для работы в КД 2.1.5.1, поэтому свою прикрепляю к публикации.
Теперь создадим правила выгрузки данных (ПВД) для наших ПКО "Выписка" и "Выписка_СтрокиТЧ"
В обработчик "ПередОбработкой" каждого пишем код
ВыборкаДанных = СоздатьОбъект("СписокЗначений");
ВходящиеПараметрыАлгоритма = СоздатьОбъект("СписокЗначений");
ВходящиеПараметрыАлгоритма.ДобавитьЗначение(Правило, "Правило");
ВходящиеПараметрыАлгоритма.ДобавитьЗначение(ВыборкаДанных, "ВыборкаДанных");
ПолучитьВыборкуДокументов(, ВходящиеПараметрыАлгоритма);
Алгоритм "ПолучитьВыборкуДокументов" можно скопировать из любых типовых правил конвертации, этот алгоритм выгружает документы с учетом указанных дат начала и конца периода, а также выбранной в параметре организации. И не забываем поправить "Способ выборки" на "Произвольный алгоритм", иначе не взлетит, ну вобще никак не взлетит, правда.
При загрузке данных сперва отрабатывает ПКО "Выписка", загружаются документы и их табличные части, затем отрабатывает правило "Выписка_СтрокиТЧ", которое подгружает значения поля "КоррСчет". Не забываем убедиться в этом, проверив значения реквизита "Порядок выполнения". То правило, где значение меньше, выполняется раньше. У меня для ПКО "Выписка" это соответственно 150, а для ПКО "Выписка_СтрокиТЧ" соответственно 200.
Итог вы можете видеть на рис.4 - "было"
и рис.5. - "стало". Здесь на скриншот не попала последняя строка, где контрагент "Теплотехника" и число в графе "приход", но она там точно есть, поверьте)
Буду рад любым замечаниям и предложениям. Да, это велосипед, и, господа, пожалуйста, давайте не будем превращать коменты к публикации в обсуждение "зачем тебе конвертация 7.7 - 7.7, давно пора валить на восьмерку". Просто вот есть такие требования, такая задача и вот такое сугубо мое решение.
Буду рад, если кому-то пригодится, а так же дополнениям и исправлениям ошибок.
В публикации для раскраски кода использована Разукрашка