При настройке синхронизации данных между конфигурациями "Управление торговлей" (УТ) и "Бухгалтерия предприятия" (БП) часто возникают вопросы, связанные с переносом специфических документов. Одна из таких ситуаций — невозможность выгрузить документ Отгрузка товаров с хранения с хозяйственной операцией Отгрузка поклажедателю. Стандартный механизм обмена просто игнорирует этот документ. Давайте разберемся, почему так происходит и как настроить корректный перенос данных.
Проанализируем ситуацию, с которой столкнулся пользователь: при попытке синхронизации документ не попадает в файл выгрузки, а попытки "обмануть" систему, подставив другие правила обмена, приводят к созданию в БП некорректных документов без нужных проводок.
Чтобы понять причину, нужно заглянуть в код правил обмена. Автор исходной темы правильно начал с анализа модуля менеджера обмена и обнаружил ключевой фрагмент кода, который определяет, какое правило конвертации (ПКО) использовать.
В процедуре, отвечающей за подготовку данных к отправке (например, ПОД_Документ_ОтгрузкаТоваровСХранения_Отправка_ПриОбработке), мы видим следующую логику:
Если ДанныеИБ.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ВозвратДавальцу2_5
ИЛИ ДанныеИБ.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ОтгрузкаПринятыхСПравомПродажиТоваровСХранения Тогда
ИспользованиеПКО.Документ_ОтгрузкаТоваровСХранения_Возврат_Отправка = Истина;
ИначеЕсли ДанныеИБ.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПередачаДавальцу2_5 Тогда
ИспользованиеПКО.Док_ОтгрузкаТоваровСХранения_Передача_Отправка = Истина;
КонецЕсли;
Из этого кода видно, что типовой механизм обмена обрабатывает только три специфические хозяйственные операции:
ВозвратДавальцу2_5 — возврат давальческого сырья.ОтгрузкаПринятыхСПравомПродажиТоваровСХранения — отгрузка товаров, принятых на хранение с правом продажи (часть комиссионной схемы).ПередачаДавальцу2_5 — передача продукции, произведенной из давальческого сырья.Важно: нашей операции ОтгрузкаПоклажедателю в этом списке нет. Следовательно, для нее не назначается ни одно правило конвертации, и документ просто не выгружается. Отладка это подтверждает: после выполнения этого кода файл выгрузки остается пустым (тег body пуст).
Это не ошибка, а методологическое ограничение. Причина кроется в различии моделей учета в УТ и БП. В "Бухгалтерии предприятия" нет отдельного специализированного документа для отражения простого возврата товара с ответственного хранения. Эта операция является движением по забалансовому счету и должна отражаться проводкой по кредиту счета 002 "Товарно-материальные ценности, принятые на ответственное хранение". Как правило, такие операции в БП оформляются универсальным документом Операция.
Поскольку прямого соответствия "один к одному" между документом в УТ и документом в БП нет, разработчики не включили эту операцию в типовые правила обмена.
Столкнувшись с проблемой, программист попытался решить ее "в лоб" с помощью расширения, принудительно указав использовать одно из существующих правил конвертации для всех операций.
Посмотрим на код расширения:
&ИзменениеИКонтроль("ПОД_Документ_ОтгрузкаТоваровСХранения_Отправка_ПриОбработке")
Процедура ИК_ПОД_Документ_ОтгрузкаТоваровСХранения_Отправка_ПриОбработке(ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена)
// Стандартный код закомментирован или удален
// ...
// Вставка нового кода, который всегда использует одно и то же правило
ИспользованиеПКО.Док_ОтгрузкаТоваровСХранения_Передача_Отправка = Истина;
КонецПроцедуры
Что произошло в результате?
Возврат товаров поставщику (или аналогичный, связанный с давальческой схемой, в зависимости от правила).Такой результат абсолютно закономерен. Мы заставили систему использовать правило, предназначенное для совершенно другой хозяйственной операции (передача давальцу). Это правило "знает", как создавать в БП документ, отражающий производственный учет, а не складскую операцию ответственного хранения. В итоге мы получаем в бухгалтерии логически неверный документ, который не отражает суть операции и не формирует правильные движения в учете.
Вывод: Попытка использовать неподходящие правила конвертации — это тупиковый путь, который приводит к искажению данных в бухгалтерском учете.
Единственный корректный способ решить задачу — это доработать правила обмена так, чтобы они правильно обрабатывали операцию ОтгрузкаПоклажедателю. Наша цель — при получении такого документа из УТ создавать в БП документ Операция с нужной проводкой.
Разберем по шагам, что для этого нужно сделать. Работа обычно ведется в конфигурации "Конвертация данных 2.0" или путем прямого редактирования XML-файлов правил.
Нам понадобится новое ПКО, которое будет описывать, как преобразовать документ ОтгрузкаТоваровСХранения из УТ в документ Операция в БП. Назовем его, например, ОтгрузкаТоваровСХранения_ОтгрузкаПоклажедателю_Операция.
Нужно вернуться к коду, который мы анализировали в самом начале, и добавить туда условие для нашей операции. Это можно сделать через расширение в УТ или непосредственно в правилах обмена (в обработчике события Перед обработкой для группы правил).
Модифицированный код будет выглядеть так:
// ... существующий код
ИначеЕсли ДанныеИБ.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПередачаДавальцу2_5 Тогда
ИспользованиеПКО.Док_ОтгрузкаТоваровСХранения_Передача_Отправка = Истина;
// Добавляем наше условие
ИначеЕсли ДанныеИБ.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ОтгрузкаПоклажедателю Тогда
// Указываем имя нашего нового правила
ИспользованиеПКО.ОтгрузкаТоваровСХранения_ОтгрузкаПоклажедателю_Операция = Истина;
КонецЕсли;
Это самый важный этап. В обработчике события При выгрузке (или аналогичном) для нашего нового ПКО нужно написать код, который сформирует данные для документа Операция. Основная задача — создать записи для регистра бухгалтерии.
Данные для документа Операция выгружаются в виде таблицы проводок. Нам нужно для каждой строки из табличной части "Товары" исходного документа сформировать одну проводку.
Проводка должна быть следующей:
Код в обработчике может выглядеть примерно так (синтаксис "Конвертации данных"):
// В обработчике "При выгрузке" для ПКО ОтгрузкаТоваровСХранения_..._Операция
// Создаем структуру для документа "Операция"
ИсходящиеДанные = СоздатьСтруктуру("БухгалтерскаяОперация");
// Проходим по табличной части "Товары" исходного документа
Для Каждого СтрокаТоваров Из Источник.Товары Цикл
// Создаем новую проводку
НоваяПроводка = СоздатьСтруктуру("СчетКт, СубконтоКт, КоличествоКт, Сумма");
// Заполняем данные проводки
НоваяПроводка.СчетКт = "002"; // Указываем счет
// Заполняем аналитику (субконто)
МассивСубконто = Новый Массив;
МассивСубконто.Добавить(Источник.Контрагент);
МассивСубконто.Добавить(СтрокаТоваров.Номенклатура);
//... добавить другие субконто при необходимости
НоваяПроводка.СубконтоКт = МассивСубконто;
НоваяПроводка.КоличествоКт = СтрокаТоваров.Количество;
НоваяПроводка.Сумма = СтрокаТоваров.Сумма; // или другое поле с суммой
// Добавляем проводку в набор
ИсходящиеДанные.БухгалтерскаяОперация.Добавить(НоваяПроводка);
КонецЦикла;
// Выгружаем данные
Выгрузить(ИсходящиеДанные);
Важно: Приведенный код является схематичным. Реальная реализация зависит от версии "Конвертации данных" и структуры объектов. Главное — понять принцип: мы не пытаемся найти готовый документ, а вручную формируем проводки для универсального документа Операция.
После выполнения этих шагов и загрузки обновленных правил в информационные базы, документ Отгрузка товаров с хранения с операцией Отгрузка поклажедателю будет корректно переноситься из УТ в БП, создавая документ Операция с правильными движениями по забалансовому счету 002.