При настройке правил обмена в конфигурации «Конвертация данных 2.1» разработчики часто сталкиваются с ситуацией, когда справочники сопоставляются некорректно либо не заполняются счета учета в табличных частях переносимых документов. Разберем по шагам типовые ошибки при переносе документов между конфигурациями (например, из КА 1.1 в БП 3.0), выясним причины сбоя поиска по реквизитам и рассмотрим правильные варианты заполнения счетов учета.
Когда мы настраиваем правило конвертации объекта (ПКО) для поиска контрагента по ИНН и КПП без использования уникального идентификатора (GUID), стандартная настройка включает флаги «Искать объект приемника по свойствам поиска» для соответствующих полей. Однако контрагент в приемнике может не находиться даже при визуальном совпадении данных.
Проанализируем основную причину: в настройках ПКС реквизита ИНН или КПП часто ошибочно устанавливают флаг «Приводить к длине». При включении этого флага механизм КД 2.1 автоматически дополняет строку слева лидирующими нулями до максимальной длины поля приемника. Если длина поля в источнике и приемнике различается (или для 10-значного ИНН юрлица применяется формат 12-значного ИНН физлица), строковые значения перестают совпадать.
Чтобы восстановить корректный поиск, выполним следующие действия:
Контрагенты.ИНН и КПП.ИНН в обработчике «ПередВыгрузкой» добавим очистку строки:
Значение = СтрЗаменить(СокрЛП(Источник.ИНН), Символы.НПП, "");
Стандартный алгоритм КД 2.1 формирует запрос ко всем полям поиска по условию строгого равенства. Если у контрагента (например, ИП) КПП не заполнен, сравнение пустой строки и отсутствующего значения может не дать результата. Кроме того, поиск может случайно захватить помеченный на удаление дубль.
Для гарантированного сопоставления используем обработчик ПКО «ПоляПоиска» базы-приемника. Рассмотрим два варианта реализации:
Вариант А. Динамическое изменение состава полей поиска:
Если Не ЗначениеЗаполнено(СвойстваПоиска["КПП"]) Тогда
СтрокаИменСвойствПоиска = "ИНН";
КонецЕсли;
Вариант Б. Ручной запрос на поиск активного контрагента:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН
| И (&КПП = """" ИЛИ Контрагенты.КПП = &КПП)
| И НЕ Контрагенты.ПометкаУдаления";
Запрос.УстановитьПараметр("ИНН", СвойстваПоиска["ИНН"]);
Запрос.УстановитьПараметр("КПП", ?(СвойстваПоиска["КПП"] = Неопределено, "", СвойстваПоиска["КПП"]));
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СсылкаНаОбъект = Выборка.Ссылка;
ПрекратитьПоиск = Истина;
КонецЕсли;
Если при переносе первыми выгружаются счета-фактуры, а документ РеализацияТоваровУслуг переносится как подчиненный объект (документ-основание), в базе-приемнике реализация может создаться не полностью (например, с пустым контрагентом). Если в настройках ПКС документа включен флаг «Не замещать значение существующих объектов», то при последующей загрузке самой реализации пустые реквизиты не перезапишутся.
Разберем правила правильной настройки выгрузки связанных документов:
Дата, Номер, Организация. Поиск только по номеру и дате в многофирменной базе неизбежно приведет к перезаписи чужих документов.Попытка обратиться к плану счетов через ПланыСчетов.Хозрасчетный.НайтиПоКоду(...) в обработчиках ПКС «ПередВыгрузкой» или «ПриВыгрузке» приводит к ошибкам, так как эти обработчики выполняются в контексте базы-источника (где структура и состав счетов могут отличаться от БП 3.0). Кроме того, в ПКС отсутствует событие «ПриЗагрузке».
Рассмотрим два надежных способа простановки счетов учета в базе-приемнике:
Способ 1. Автоматическое заполнение по правилам конфигурации приемника (рекомендуемый)
В конфигурации «Бухгалтерия предприятия 3.0» предусмотрены типовые механизмы определения счетов по регистру сведений «Счета учета номенклатуры». В ПКО документа в обработчике «ПослеЗагрузки» вызываем типовую процедуру заполнения:
БухгалтерскийУчетПереопределяемый.ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект, "Товары");
БухгалтерскийУчетПереопределяемый.ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект, "Услуги");
Способ 2. Программная установка фиксированных счетов в обработчике «ПослеЗагрузки»
Если счета учета необходимо жестко зафиксировать, в ПКО документа переходим в обработчик «ПослеЗагрузки» и обходим строки табличной части уже загруженного объекта:
СчетДоходов = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.01.1");
СчетРасходов = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.02.1");
СчетНДС = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.03");
Для Каждого Стр Из Объект.Товары Цикл
Стр.СчетДоходов = СчетДоходов;
Стр.СчетРасходов = СчетРасходов;
Стр.СчетУчетаНДСПоРеализации = СчетНДС;
КонецЦикла;
При таком подходе не требуется создавать лишние ПКС для каждого счета табличной части, а поиск элементов плана счетов выполняется непосредственно в базе-приемнике.