Перенос данных между существенно различающимися конфигурациями, такими как УПП 1.3 (на обычных формах) и Бухгалтерия предприятия 3.0 (на управляемых формах), часто ставит перед разработчиком неочевидные задачи. Одной из таких задач является корректная конвертация справочника ДоговорыКонтрагентов, особенно в части валютного учета. В современных версиях БП 3.0 логика работы с валютами значительно усложнилась по сравнению со старыми конфигурациями.
В этой статье мы подробно разберем, как настроить правила конвертации данных (КД 2.1), чтобы договоры переносились корректно, документы по ним проводились без ошибок «счета не валютные», а пользователи видели на формах привычные переключатели.
Проанализируем сначала структуру приемника. В Бухгалтерии предприятия 3.0 состояние договора определяется не одним реквизитом, а комбинацией трех параметров. На форме договора мы видим переключатель «Оплата в:», но в самом объекте (базе данных) за это отвечают следующие поля:
Валюты.Рассмотрим три стандартные ситуации, которые нам нужно воспроизвести при переносе:
Валюта = рубль, ОплатаВВалюте = Ложь, РасчетыВУсловныхЕдиницах = Ложь.Валюта ≠ рубль, ОплатаВВалюте = Истина, РасчетыВУсловныхЕдиницах = Ложь.Валюта ≠ рубль, ОплатаВВалюте = Ложь, РасчетыВУсловныхЕдиницах = Истина.Выясним причину, по которой обычный перенос не работает. В УПП реквизита ОплатаВВалюте просто не существует. Поэтому в ПКС (Правилах конвертации свойств) для этого реквизита в качестве источника мы оставляем пустое значение, а логику прописываем программно.
Посмотрим на пример кода, который можно разместить в обработчике ПередВыгрузкой для ПКС ОплатаВВалюте:
// Проверяем валюту в источнике (УПП)
Если СокрЛП(Источник.ВалютаВзаиморасчетов.Код) = "643" Тогда
Значение = Ложь;
ИначеЕсли Источник.РасчетыВУсловныхЕдиницах Тогда
Значение = Ложь;
Иначе
Значение = Истина;
КонецЕсли;
Однако более надежным способом будет проверка в базе-приемнике. Разберем, как это сделать в обработчике ПослеЗагрузки ПКО (Правила конвертации объекта) ДоговорыКонтрагентов.
Проанализируем ситуацию: при загрузке в БП 3.0 у нас уже есть доступ к объекту-приемнику и ко всем константам базы. Мы можем сравнить валюту договора с валютой регламентированного учета.
// В обработчике ПослеЗагрузки ПКО ДоговорыКонтрагентов
ВалютаРегл = Константы.ВалютаРегламентированногоУчета.Получить();
Если Объект.ВалютаВзаиморасчетов = ВалютаРегл Тогда
Объект.ОплатаВВалюте = Ложь;
Объект.РасчетыВУсловныхЕдиницах = Ложь;
Иначе
// Если это не рубли, проверяем, не является ли это договором в у.е.
// Если в УПП стоял флаг у.е., переносим его
Если Объект.РасчетыВУсловныхЕдиницах Тогда
Объект.ОплатаВВалюте = Ложь;
Иначе
Объект.ОплатаВВалюте = Истина;
КонецЕсли;
КонецЕсли;
Обратите внимание на реквизит формы ОплатаВРублях, который часто путает разработчиков. Это не реквизит объекта, а вычисляемое поле на форме. В коде конфигурации БП 3.0 оно напрямую связано с реквизитом РасчетыВУсловныхЕдиницах. Если вы правильно заполните РасчетыВУсловныхЕдиницах, форма отобразится корректно.
Часто при переносе возникает ошибка, когда в справочнике Валюты создается еще один «рубль» (например, с кодом 810 вместо 643 или наоборот). Это критично, так как сравнение с константой ВалютаРегламентированногоУчета начнет выдавать неверный результат, и счета в документах не будут подставляться.
Рассмотрим, как этого избежать:
Валюты установите поиск только по полю Код.ВалютаВзаиморасчетов не стоит флаг «Искать объект приемника по внутреннему идентификатору источника», если базы создавались независимо.Если после переноса договоров документы (например, ПоступлениеТоваровУслуг) не проводятся, ругаясь на то, что «счета учета не являются валютными», проанализируем состояние регистра сведений СчетаУчетаРасчетовСКонтрагентами.
В БП 3.0 счета подставляются автоматически исходя из вида договора и валюты. Если вы перенесли договор как валютный, но в документе остались счета 60.01/62.01, система выдаст ошибку. Рекомендуется в ПКО договора в обработчике ПослеЗагрузки вызвать стандартную процедуру заполнения счетов учета, если она доступна в контексте или если вы выполняете перенос через обработку «Универсальный обмен данными XML».
Разберем еще один важный вопрос: как переносить документы и справочники только по одной конкретной организации?
Самый эффективный способ — использовать параметры выгрузки. Рассмотрим пошагово:
ОрганизацияДляВыгрузки.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг
|ГДЕ
| Организация = &Организация";
Запрос.УстановитьПараметр("Организация", Параметры.ОрганизацияДляВыгрузки);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ВыгрузитьПоПравилу(Выборка.Ссылка);
КонецЦикла;
Этот метод гораздо быстрее, чем прописывание условий в каждом ПКС, так как отсекает ненужные данные еще на этапе формирования выборки из базы-источника.
Подведем итог: для успешного переноса договоров из УПП в БП 3.0 необходимо четко понимать триггеры валютного учета в приемнике (ОплатаВВалюте и РасчетыВУсловныхЕдиницах), следить за уникальностью кодов валют и использовать программные обработчики для заполнения отсутствующих в источнике реквизитов.