Почему документ "Отгрузка товаров с хранения" из УТ не переносится в БП и как это исправить?

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

При настройке синхронизации данных между конфигурациями "Управление торговлей" (УТ) и "Бухгалтерия предприятия" (БП) часто возникают вопросы, связанные с переносом специфических документов. Одна из таких ситуаций — невозможность выгрузить документ Отгрузка товаров с хранения с хозяйственной операцией Отгрузка поклажедателю. Стандартный механизм обмена просто игнорирует этот документ. Давайте разберемся, почему так происходит и как настроить корректный перенос данных.

Проанализируем ситуацию, с которой столкнулся пользователь: при попытке синхронизации документ не попадает в файл выгрузки, а попытки "обмануть" систему, подставив другие правила обмена, приводят к созданию в БП некорректных документов без нужных проводок.

Анализ проблемы: почему стандартный обмен не работает?

Чтобы понять причину, нужно заглянуть в код правил обмена. Автор исходной темы правильно начал с анализа модуля менеджера обмена и обнаружил ключевой фрагмент кода, который определяет, какое правило конвертации (ПКО) использовать.

В процедуре, отвечающей за подготовку данных к отправке (например, ПОД_Документ_ОтгрузкаТоваровСХранения_Отправка_ПриОбработке), мы видим следующую логику:


Если ДанныеИБ.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ВозвратДавальцу2_5
    ИЛИ ДанныеИБ.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ОтгрузкаПринятыхСПравомПродажиТоваровСХранения Тогда
    ИспользованиеПКО.Документ_ОтгрузкаТоваровСХранения_Возврат_Отправка = Истина;
ИначеЕсли ДанныеИБ.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПередачаДавальцу2_5 Тогда
    ИспользованиеПКО.Док_ОтгрузкаТоваровСХранения_Передача_Отправка = Истина;
КонецЕсли;

Из этого кода видно, что типовой механизм обмена обрабатывает только три специфические хозяйственные операции:

  1. ВозвратДавальцу2_5 — возврат давальческого сырья.
  2. ОтгрузкаПринятыхСПравомПродажиТоваровСХранения — отгрузка товаров, принятых на хранение с правом продажи (часть комиссионной схемы).
  3. ПередачаДавальцу2_5 — передача продукции, произведенной из давальческого сырья.

Важно: нашей операции ОтгрузкаПоклажедателю в этом списке нет. Следовательно, для нее не назначается ни одно правило конвертации, и документ просто не выгружается. Отладка это подтверждает: после выполнения этого кода файл выгрузки остается пустым (тег body пуст).

Это не ошибка, а методологическое ограничение. Причина кроется в различии моделей учета в УТ и БП. В "Бухгалтерии предприятия" нет отдельного специализированного документа для отражения простого возврата товара с ответственного хранения. Эта операция является движением по забалансовому счету и должна отражаться проводкой по кредиту счета 002 "Товарно-материальные ценности, принятые на ответственное хранение". Как правило, такие операции в БП оформляются универсальным документом Операция.

Поскольку прямого соответствия "один к одному" между документом в УТ и документом в БП нет, разработчики не включили эту операцию в типовые правила обмена.

Разбор неверного решения: почему "обман" системы не помогает?

Столкнувшись с проблемой, программист попытался решить ее "в лоб" с помощью расширения, принудительно указав использовать одно из существующих правил конвертации для всех операций.

Посмотрим на код расширения:


&ИзменениеИКонтроль("ПОД_Документ_ОтгрузкаТоваровСХранения_Отправка_ПриОбработке")
Процедура ИК_ПОД_Документ_ОтгрузкаТоваровСХранения_Отправка_ПриОбработке(ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена)
    // Стандартный код закомментирован или удален
    // ...
    
    // Вставка нового кода, который всегда использует одно и то же правило
    ИспользованиеПКО.Док_ОтгрузкаТоваровСХранения_Передача_Отправка = Истина;
КонецПроцедуры

Что произошло в результате?

  1. Документ успешно выгрузился из УТ.
  2. В БП был создан документ Возврат товаров поставщику (или аналогичный, связанный с давальческой схемой, в зависимости от правила).
  3. Самое главное — этот документ не сформировал никаких проводок по забалансовому счету 002.

Такой результат абсолютно закономерен. Мы заставили систему использовать правило, предназначенное для совершенно другой хозяйственной операции (передача давальцу). Это правило "знает", как создавать в БП документ, отражающий производственный учет, а не складскую операцию ответственного хранения. В итоге мы получаем в бухгалтерии логически неверный документ, который не отражает суть операции и не формирует правильные движения в учете.

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

Правильное решение: доработка правил обмена

Единственный корректный способ решить задачу — это доработать правила обмена так, чтобы они правильно обрабатывали операцию ОтгрузкаПоклажедателю. Наша цель — при получении такого документа из УТ создавать в БП документ Операция с нужной проводкой.

Разберем по шагам, что для этого нужно сделать. Работа обычно ведется в конфигурации "Конвертация данных 2.0" или путем прямого редактирования XML-файлов правил.

  1. Создать новое правило конвертации объекта (ПКО).

    Нам понадобится новое ПКО, которое будет описывать, как преобразовать документ ОтгрузкаТоваровСХранения из УТ в документ Операция в БП. Назовем его, например, ОтгрузкаТоваровСХранения_ОтгрузкаПоклажедателю_Операция.

  2. Модифицировать логику выбора правила.

    Нужно вернуться к коду, который мы анализировали в самом начале, и добавить туда условие для нашей операции. Это можно сделать через расширение в УТ или непосредственно в правилах обмена (в обработчике события Перед обработкой для группы правил).

    Модифицированный код будет выглядеть так:

    
    // ... существующий код
    ИначеЕсли ДанныеИБ.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПередачаДавальцу2_5 Тогда
        ИспользованиеПКО.Док_ОтгрузкаТоваровСХранения_Передача_Отправка = Истина;
    // Добавляем наше условие
    ИначеЕсли ДанныеИБ.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ОтгрузкаПоклажедателю Тогда
        // Указываем имя нашего нового правила
        ИспользованиеПКО.ОтгрузкаТоваровСХранения_ОтгрузкаПоклажедателю_Операция = Истина; 
    КонецЕсли;
    
  3. Настроить логику конвертации в новом ПКО.

    Это самый важный этап. В обработчике события При выгрузке (или аналогичном) для нашего нового ПКО нужно написать код, который сформирует данные для документа Операция. Основная задача — создать записи для регистра бухгалтерии.

    Данные для документа Операция выгружаются в виде таблицы проводок. Нам нужно для каждой строки из табличной части "Товары" исходного документа сформировать одну проводку.

    Проводка должна быть следующей:

    • Счет Кт: 002 "Товарно-материальные ценности, принятые на ответственное хранение".
    • Субконто 1 (Кт): Контрагент-поклажедатель (из шапки документа).
    • Субконто 2 (Кт): Номенклатура (из строки табличной части).
    • Субконто 3 (Кт): Партия (если ведется партионный учет).
    • Количество (Кт): Количество товара из строки.
    • Сумма: Учетная стоимость товара (если она ведется на забалансовом счете).

    Код в обработчике может выглядеть примерно так (синтаксис "Конвертации данных"):

    
    // В обработчике "При выгрузке" для ПКО ОтгрузкаТоваровСХранения_..._Операция
    // Создаем структуру для документа "Операция"
    ИсходящиеДанные = СоздатьСтруктуру("БухгалтерскаяОперация");
    
    // Проходим по табличной части "Товары" исходного документа
    Для Каждого СтрокаТоваров Из Источник.Товары Цикл
        // Создаем новую проводку
        НоваяПроводка = СоздатьСтруктуру("СчетКт, СубконтоКт, КоличествоКт, Сумма");
    
        // Заполняем данные проводки
        НоваяПроводка.СчетКт = "002"; // Указываем счет
        
        // Заполняем аналитику (субконто)
        МассивСубконто = Новый Массив;
        МассивСубконто.Добавить(Источник.Контрагент);
        МассивСубконто.Добавить(СтрокаТоваров.Номенклатура);
        //... добавить другие субконто при необходимости
        НоваяПроводка.СубконтоКт = МассивСубконто;
    
        НоваяПроводка.КоличествоКт = СтрокаТоваров.Количество;
        НоваяПроводка.Сумма = СтрокаТоваров.Сумма; // или другое поле с суммой
    
        // Добавляем проводку в набор
        ИсходящиеДанные.БухгалтерскаяОперация.Добавить(НоваяПроводка);
    КонецЦикла;
    
    // Выгружаем данные
    Выгрузить(ИсходящиеДанные);
    

    Важно: Приведенный код является схематичным. Реальная реализация зависит от версии "Конвертации данных" и структуры объектов. Главное — понять принцип: мы не пытаемся найти готовый документ, а вручную формируем проводки для универсального документа Операция.

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

← На главную