Почему при переносе данных из УТ 10.3 в БП 3.0 не устанавливается вид операции документа реализации и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

Перенос данных между конфигурациями 1С:Управление торговлей 10.3 (УТ 10.3) и 1С:Бухгалтерия предприятия 3.0 (БП 3.0) с помощью механизма «Конвертация данных 2.1» (КД 2.1) — классическая задача, с которой сталкиваются многие разработчики. Однако в процессе настройки правил обмена часто возникает неприятная проблема: у загруженного документа РеализацияТоваровУслуг очищается, сбрасывается или вовсе не устанавливается реквизит ВидОперации.

В этой статье мы подробно разберем, почему возникает эта ошибка, где скрывается тот самый «слон», которого легко не заметить в правилах конвертации, и как правильно настроить алгоритмы обмена, чтобы документы переносились корректно.

---

Причины возникновения проблемы

Для начала проанализируем архитектуру обеих конфигураций и логику работы КД 2.1. Сбой в заполнении вида операции обычно обусловлен одной или несколькими из следующих причин:

  1. Конфликт ПКС (Правил конвертации свойств) и обработчиков событий ПКО (Правил конвертации объектов). Это наиболее частая скрытая ошибка. Если в ПКО документа настроено прямое сопоставление свойства ВидОперации источника и приемника, то значение из файла XML будет принудительно записываться в объект, затирая любые результаты вычислений в обработчике После загрузки.
  2. Несоответствие перечислений видов операций. В УТ 10.3 документ реализации имеет ограниченный набор видов операций (основной — ПродажаКомиссия). В БП 3.0 это перечисление гораздо шире (Товары, Услуги, ТоварыУслугиКомиссия, Оборудование и т.д.). Прямое сопоставление здесь не работает, требуется программное разделение логики.
  3. Ошибки в алгоритме анализа табличных частей. Распространенный код, определяющий вид операции по количеству строк в таблицах товаров и услуг, часто не учитывает «смешанные» документы, содержащие одновременно и номенклатуру, и услуги.
  4. Двойная запись объекта и обход режима загрузки. В БП 3.0 при записи документа могут срабатывать подписки на события или механизмы конфигурации, которые принудительно перезаписывают документ с установленным флагом ОбменДанными.Загрузка = Ложь, что приводит к автоматической очистке «несоответствующих» реквизитов.

---

Шаг 1. Отключение автоматического сопоставления ПКС для «ВидОперации»

Рассмотрим первый и самый важный шаг. Чтобы КД 2.1 не перезаписывала вид операции стандартными механизмами конвертации свойств, мы должны отключить ПКС для этого реквизита. Выясним, как это сделать:

  1. Откроем правила конвертации данных в программе «Конвертация данных 2.1».
  2. Найдем ПКО для документа РеализацияТоваровУслуг.
  3. Перейдем на вкладку Конвертация свойств.
  4. Найдем в списке реквизит приемника ВидОперации.
  5. Отключим его (снимем флаг активности или полностью удалим это ПКС из списка). Теперь это свойство не будет передаваться напрямую из XML, и мы сможем управлять им полностью программно.

---

Шаг 2. Разработка надежного алгоритма в обработчике «После загрузки»

Теперь напишем корректную логику определения вида операции. Перейдем в ПКО документа РеализацияТоваровУслуг, откроем обработчик события После загрузки и проанализируем заполнение табличных частей.

Часто разработчики используют упрощенный код, который проверяет равенство количества строк нулю. Посмотрим на пример некорректного кода, который часто приводит к багам:


// Пример НЕКОРРЕКТНОГО кода, который ломается на смешанных документах
Если Объект.Услуги.Количество() = 0 Тогда 
    Объект.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.Товары; 
ИначеЕсли Объект.Товары.Количество() = 0 Тогда 
    Объект.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.Услуги; 
КонецЕсли;

В чем его недостаток? Если в документе присутствуют и товары, и услуги одновременно, то ни одно условие не выполнится, и вид операции останется пустым. Нам необходимо спроектировать более гибкий алгоритм, учитывающий все возможные варианты, включая договоры комиссии. Напишем правильный вариант кода:


// Правильный алгоритм заполнения Вида операции в обработчике "После загрузки" ПКО

// 1. По умолчанию устанавливаем универсальный вид операции
Объект.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.ТоварыУслугиКомиссия;

КоличествоТоваров = Объект.Товары.Количество();
КоличествоУслуг = Объект.Услуги.Количество();

// 2. Если в документе содержатся только товары
Если КоличествоТоваров > 0 И КоличествоУслуг = 0 Тогда
    Объект.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.Товары;

// 3. Если в документе содержатся только услуги
ИначеЕсли КоличествоТоваров = 0 И КоличествоУслуг > 0 Тогда
    Объект.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.Услуги;
КонецЕсли;

// 4. Дополнительная проверка на вид договора (для комиссионной торговли)
Если ЗначениеЗаполнено(Объект.ДоговорКонтрагента) Тогда
    ВидДоговора = Объект.ДоговорКонтрагента.ВидДоговора;
    Если ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СКомиссионером Тогда
        Объект.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.ТоварыУслугиКомиссия;
    КонецЕсли;
КонецЕсли;

---

Шаг 3. Взаимосвязь с заполнением счетов учета в БП 3.0

Проанализируем еще один важный нюанс. В БП 3.0 счета учета номенклатуры и расчетов с контрагентами заполняются автоматически при записи документа. За это отвечает специализированный механизм. Если в глобальном обработчике конвертации После загрузки данных (On Load Data) вызывается процедура автозаполнения счетов, она критически зависит от вида операции.

Посмотрим на пример вызова заполнения счетов:


ТипОбъекта = ТипЗнч(ДокументСсылка);
РежимЗаписи = РежимЗаписиДокумента.Запись;

Если ТипОбъекта = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
    ДокументОбъект.ДополнительныеСвойства.Вставить("ЗаполнитьСчетаУчетаПередЗаписью", Истина);
    СчетаУчетаВДокументах.ЗаполнитьПередЗаписью(ДокументОбъект, РежимЗаписи);
КонецЕсли;

Важный момент: если метод ЗаполнитьПередЗаписью() будет вызван в тот момент, когда у документа РеализацияТоваровУслуг еще не определен (или сброшен) вид операции, система БП 3.0 не сможет корректно сопоставить счета доходов/расходов и счета учета НДС. Это приведет к тому, что документ запишется с пустыми счетами учета или вообще вызовет ошибку при проведении. Убедимся, что вычисление ВидОперации (Шаг 2) происходит строго до вызова любых заполняющих счета процедур.

---

Шаг 4. Борьба с повторной записью и сбросом реквизитов

Иногда возникает ситуация, когда документ загружается с правильным видом операции, но в момент проведения в БП 3.0 значение снова очищается. Это связано с тем, что в некоторых подписках на события или в самом модуле объекта документа РеализацияТоваровУслуг срабатывает типовой код проверки соответствия реквизитов.

Например, если вид операции установлен в значение Услуги, а в договоре контрагента выбран вид С комиссионером (который недопустим для этой операции), система 1С:Бухгалтерии принудительно «исправит» вид операции на дефолтный или очистит его.

Чтобы избежать подобных проблем, выполним следующие рекомендации:

Выполнив эти шаги, мы гарантируем стабильный перенос документов реализации из УТ 10.3 в БП 3.0 с корректным сохранением вида операции и заполненными счетами учета.

← На главную