Как исправить пустое основание (ДокументПоступления) при выгрузке корректировок из УТ 10.3 в БП 3.0?

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

При настройке обмена данными между «Управление торговлей 10.3» и «Бухгалтерия предприятия 3.0» через конфигурацию «Конвертация данных 2.0» (КД) разработчики часто сталкиваются с ситуацией, когда документ «Корректировка поступления» переносится, но его ключевой реквизит ДокументПоступления (основание) остается пустым. Это происходит даже в тех случаях, когда в исходной базе реквизит заполнен, а правила кажутся типовыми.

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

Причина проблемы: особенности составных типов и работа алгоритмов выгрузки

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

Если для свойства не указано конкретное правило конвертации объекта, система может просто пропустить этот узел в XML-файле, так как она «не знает», по какой структуре превращать внутреннюю ссылку УТ в объект БП. Также часто встречается ошибка, когда программисты пытаются передать в Значение не саму ссылку, а результат метода .Ссылка, что избыточно и иногда приводит к потере контекста типа.

Способ 1. Явное указание ИмяПКО (Рекомендуемый способ)

Самый правильный и «чистый» способ решения проблемы — подсказать конвертации, какое именно правило нужно применить к выгружаемой ссылке. Это делается в обработчике Перед выгрузкой соответствующего правила конвертации свойства (ПКС).

Проанализируем шаги настройки:

  1. Откроем «Конвертацию данных» и перейдем в ПКО документа КорректировкаПоступления.
  2. Найдем в списке свойств (ПКС) реквизит ДокументПоступления.
  3. В обработчике Перед выгрузкой пропишем следующий код:

// Указываем конкретное правило для выгрузки ссылки
ИмяПКО = "ПоступлениеТоваровУслуг";

Важный момент: если в источнике (УТ 10.3) основанием могут быть разные типы документов, нам нужно добавить проверку типа. Рассмотрим расширенный пример:


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

Таким образом, мы исключаем неопределенность для системы, и ссылка корректно попадает в файл выгрузки с указанием нужного правила для поиска в базе-приемнике.

Способ 2. Передача данных через параметры и поиск в приемнике

Если базы данных сильно рассинхронизированы (например, GUID-ы документов не совпадают, так как они вводились вручную в обеих базах), стандартный поиск по идентификатору не сработает. В этом случае мы можем прибегнуть к передаче параметров Номер и Дата документа-основания и выполнить поиск программно при загрузке.

Разберем этот метод по шагам. Сначала настроим выгрузку в УТ 10.3. В ПКО КорректировкаПоступления создадим новый параметр ДокументПоступленияСсылка. В ПКС этого параметра (обработчик Перед выгрузкой) напишем:


// Передаем структуру с данными для идентификации документа
Значение = ЗначениеВСтрокуВнутр(Новый Структура("Номер, Дата", Источник.ДокументПоступления.Номер, Источник.ДокументПоступления.Дата));

Теперь перейдем к настройке в базе-приемнике (БП 3.0). В ПКО документа КорректировкаПоступления в событии После загрузки пропишем алгоритм поиска:


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

Этот способ гарантирует заполнение реквизита, даже если механизмы синхронизации по GUID дали сбой.

Способ 3. Использование структуры «ВходящиеДанные»

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

  1. В ПКС реквизита ДокументПоступления установим флаг Получать из входящих данных.
  2. В ПКО документа (в событии Перед выгрузкой объектов) соберем структуру:

// Формируем структуру, которая будет передана в ПКС
ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("ДокументПоступления", Источник.ДокументПоступления);

Этот подход заставляет конвертацию обратить внимание на реквизит и обработать его согласно заданным правилам, принудительно передавая объект в поток выгрузки.

Как проверить, почему реквизита нет в файле?

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

  1. В ПКС нужного свойства в обработчике Перед выгрузкой напишите Сообщить("Выгружаю основание для: " + Источник.Ссылка);.
  2. Если при выгрузке сообщение не появляется — значит, до этого свойства алгоритм не доходит (возможно, стоит флаг Отключить или срабатывает условие Отказ = Истина в родителе).
  3. Если сообщение есть, откройте сформированный XML-файл блокнотом и поищите узел с именем вашего реквизита. Если узла нет — значит, ИмяПКО не определено и система «молча» пропустила поле.

Важное предостережение: никогда не используйте конструкцию Значение = Источник.ДокументПоступления.Ссылка;. В контексте КД Источник.ДокументПоступления уже является ссылкой. Лишнее обращение через точку к свойству Ссылка может привести к ошибкам получения данных, если объект по какой-то причине недоступен или помечен на удаление в транзакции выгрузки.

Подводя итог, наиболее стабильным решением является явное указание ИмяПКО. Это сохраняет типизацию данных и позволяет использовать стандартные механизмы поиска 1С, обеспечивая корректный и быстрый обмен между УТ 10.3 и БП 3.0.

← На главную