Перенос данных между конфигурациями 1С:Управление торговлей 10.3 (УТ 10.3) и 1С:Бухгалтерия предприятия 3.0 (БП 3.0) с помощью механизма «Конвертация данных 2.1» (КД 2.1) — классическая задача, с которой сталкиваются многие разработчики. Однако в процессе настройки правил обмена часто возникает неприятная проблема: у загруженного документа РеализацияТоваровУслуг очищается, сбрасывается или вовсе не устанавливается реквизит ВидОперации.
В этой статье мы подробно разберем, почему возникает эта ошибка, где скрывается тот самый «слон», которого легко не заметить в правилах конвертации, и как правильно настроить алгоритмы обмена, чтобы документы переносились корректно.
---
Для начала проанализируем архитектуру обеих конфигураций и логику работы КД 2.1. Сбой в заполнении вида операции обычно обусловлен одной или несколькими из следующих причин:
ВидОперации источника и приемника, то значение из файла XML будет принудительно записываться в объект, затирая любые результаты вычислений в обработчике После загрузки.ПродажаКомиссия). В БП 3.0 это перечисление гораздо шире (Товары, Услуги, ТоварыУслугиКомиссия, Оборудование и т.д.). Прямое сопоставление здесь не работает, требуется программное разделение логики.ОбменДанными.Загрузка = Ложь, что приводит к автоматической очистке «несоответствующих» реквизитов.---
Рассмотрим первый и самый важный шаг. Чтобы КД 2.1 не перезаписывала вид операции стандартными механизмами конвертации свойств, мы должны отключить ПКС для этого реквизита. Выясним, как это сделать:
РеализацияТоваровУслуг.ВидОперации.---
Теперь напишем корректную логику определения вида операции. Перейдем в ПКО документа РеализацияТоваровУслуг, откроем обработчик события После загрузки и проанализируем заполнение табличных частей.
Часто разработчики используют упрощенный код, который проверяет равенство количества строк нулю. Посмотрим на пример некорректного кода, который часто приводит к багам:
// Пример НЕКОРРЕКТНОГО кода, который ломается на смешанных документах
Если Объект.Услуги.Количество() = 0 Тогда
Объект.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.Товары;
ИначеЕсли Объект.Товары.Количество() = 0 Тогда
Объект.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.Услуги;
КонецЕсли;
В чем его недостаток? Если в документе присутствуют и товары, и услуги одновременно, то ни одно условие не выполнится, и вид операции останется пустым. Нам необходимо спроектировать более гибкий алгоритм, учитывающий все возможные варианты, включая договоры комиссии. Напишем правильный вариант кода:
// Правильный алгоритм заполнения Вида операции в обработчике "После загрузки" ПКО
// 1. По умолчанию устанавливаем универсальный вид операции
Объект.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.ТоварыУслугиКомиссия;
КоличествоТоваров = Объект.Товары.Количество();
КоличествоУслуг = Объект.Услуги.Количество();
// 2. Если в документе содержатся только товары
Если КоличествоТоваров > 0 И КоличествоУслуг = 0 Тогда
Объект.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.Товары;
// 3. Если в документе содержатся только услуги
ИначеЕсли КоличествоТоваров = 0 И КоличествоУслуг > 0 Тогда
Объект.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.Услуги;
КонецЕсли;
// 4. Дополнительная проверка на вид договора (для комиссионной торговли)
Если ЗначениеЗаполнено(Объект.ДоговорКонтрагента) Тогда
ВидДоговора = Объект.ДоговорКонтрагента.ВидДоговора;
Если ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СКомиссионером Тогда
Объект.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.ТоварыУслугиКомиссия;
КонецЕсли;
КонецЕсли;
---
Проанализируем еще один важный нюанс. В БП 3.0 счета учета номенклатуры и расчетов с контрагентами заполняются автоматически при записи документа. За это отвечает специализированный механизм. Если в глобальном обработчике конвертации После загрузки данных (On Load Data) вызывается процедура автозаполнения счетов, она критически зависит от вида операции.
Посмотрим на пример вызова заполнения счетов:
ТипОбъекта = ТипЗнч(ДокументСсылка);
РежимЗаписи = РежимЗаписиДокумента.Запись;
Если ТипОбъекта = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
ДокументОбъект.ДополнительныеСвойства.Вставить("ЗаполнитьСчетаУчетаПередЗаписью", Истина);
СчетаУчетаВДокументах.ЗаполнитьПередЗаписью(ДокументОбъект, РежимЗаписи);
КонецЕсли;
Важный момент: если метод ЗаполнитьПередЗаписью() будет вызван в тот момент, когда у документа РеализацияТоваровУслуг еще не определен (или сброшен) вид операции, система БП 3.0 не сможет корректно сопоставить счета доходов/расходов и счета учета НДС. Это приведет к тому, что документ запишется с пустыми счетами учета или вообще вызовет ошибку при проведении. Убедимся, что вычисление ВидОперации (Шаг 2) происходит строго до вызова любых заполняющих счета процедур.
---
Иногда возникает ситуация, когда документ загружается с правильным видом операции, но в момент проведения в БП 3.0 значение снова очищается. Это связано с тем, что в некоторых подписках на события или в самом модуле объекта документа РеализацияТоваровУслуг срабатывает типовой код проверки соответствия реквизитов.
Например, если вид операции установлен в значение Услуги, а в договоре контрагента выбран вид С комиссионером (который недопустим для этой операции), система 1С:Бухгалтерии принудительно «исправит» вид операции на дефолтный или очистит его.
Чтобы избежать подобных проблем, выполним следующие рекомендации:
Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли;
Выполнив эти шаги, мы гарантируем стабильный перенос документов реализации из УТ 10.3 в БП 3.0 с корректным сохранением вида операции и заполненными счетами учета.