При разработке правил обмена в конфигурации Конвертация данных 2.0 часто возникает задача подставить в загружаемый документ определенный элемент справочника, которого физически нет в информационной базе-источнике. Типичный пример — выгрузка документов РасходныйКассовыйОрдер (РКО) или ПриходныйКассовыйОрдер (ПКО), когда в источнике ведется укрупненная аналитика (например, всего 5 статей), а в приемнике (типовой конфигурации 1С:Бухгалтерия) требуется детальный учет по конкретному коду статьи ДДС.
Рассмотрим, почему при стандартном присвоении статьи в обработчиках Конвертации данных реквизит в документе может оставаться пустым или перезаписываться, и как правильно выстроить логику передачи данных.
Проанализируем устройство документа РасходныйКассовыйОрдер в типовых конфигурациях на платформе 1С (в частности, Бухгалтерия предприятия 2.0). Для многих видов операций (например, Инкассация, Оплата поставщику, Прочий расход) поле «Статья ДДС» на форме является не простым реквизитом шапки документа, а реквизитом табличной части РасшифровкаПлатежа либо отображением субконто счета дебета.
Если в правила обмена заложить заполнение только реквизита шапки или установить статью без учета аналитики счетов, то при прочтении документа и открытии формы данные не отобразятся или очистятся при проведении.
Если в базе-источнике нет нужной статьи ДДС и поиск необходимо выполнить исключительно на стороне приемника по известному коду (например, 000000006), наиболее простым и надежным способом является написание кода в обработчике ПослеЗагрузки для ПКО документа РасходныйКассовыйОрдер.
Разберем по шагам, что должен делать обработчик:
СтатьиДвиженияДенежныхСредств в базе-приемнике по коду.РасшифровкаПлатежа.СубконтоДт1), от которого зависит отображение реквизита на форме РКО.Пример кода для обработчика ПослеЗагрузки ПКО документа РКО:
// Находим целевую статью в базе-приемнике
СтатьяЦелевая = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000006");
Если ЗначениеЗаполнено(СтатьяЦелевая) Тогда
// 1. Заполняем реквизит в табличной части
Если Объект.РасшифровкаПлатежа.Количество() > 0 Тогда
Объект.РасшифровкаПлатежа[0].СтатьяДвиженияДенежныхСредств = СтатьяЦелевая;
КонецЕсли;
// 2. Устанавливаем аналитику на счете дебета (для вида операции "Инкассация" и др.)
Объект.СубконтоДт1 = СтатьяЦелевая;
// При необходимости заполняем реквизит шапки, если он присутствует в метаданных
Если Метаданные.Документы.РасходныйКассовыйОрдер.Реквизиты.Найти("СтатьяДвиженияДенежныхСредств") <> Неопределено Тогда
Объект.СтатьяДвиженияДенежныхСредств = СтатьяЦелевая;
КонецЕсли;
КонецЕсли;
Обратите внимание: в обработчике ПослеЗагрузки вызывать метод Объект.Записать() не нужно — платформа 1С выполнит запись объекта автоматически после завершения работы события.
Рассмотрим другой вариант: сформировать значение кода непосредственно при выгрузке данных из источника, чтобы приемник сам нашел нужный элемент по стандартным правилам поиска.
Для этого выполним следующие настройки в конфигурации Конвертация данных:
СтатьиДвиженияДенежныхСредств установим флаг поиска по свойству Код (галочка «Поиск» напротив реквизита Код).СтатьиДвиженияДенежныхСредствДляРКО.Код этого правила в обработчике ПередВыгрузкой жестко зададим значение:
Значение = "000000006";
СтатьяДвиженияДенежныхСредств (или соответствующего реквизита ТЧ) укажем созданное правило конвертации СтатьиДвиженияДенежныхСредствДляРКО.При таком подходе в файл выгрузки XML запишется конструкция, содержащая код 000000006. При загрузке обработчик конвертации выполнит поиск элемента по коду в приемнике и подставит найденный объект в документ.
"000000006") точно соответствует длине кода справочника СтатьиДвиженияДенежныхСредств в приемнике. При разной длине поиск методом НайтиПоКоду() или стандартными средствами КД вернет пустую ссылку.ОплатаПоставщику, Инкассация, ВыплатаЗаработнойПлаты) используют разные номера субконто (СубконтоДт1, СубконтоДт2). Перед устанвкой субконто рекомендуется анализировать счет дебета или вид операции документа."000000006" в коде обработчиков рекомендуется передавать код статьи через глобальные Параметры конвертации. Это упростит техническое обслуживание правил при изменении справочников.