При переходе на новые релизы конфигурации 1С:Управление торговлей 11.5.21.x многие пользователи и разработчики столкнулись с критической проблемой при попытке синхронизации данных с 1С:Бухгалтерией предприятия. Ошибка проявляется при выгрузке документа ПоступлениеТоваровОтХранителя. Несмотря на то что документ в исходной базе заполнен корректно, механизм обмена выдает сообщения о незаполненных обязательных полях (Ставка НДС, Вид ставки, Валюта, Вид операции), что блокирует передачу данных.
В рамках этой статьи мы подробно разберем, почему возникают эти ошибки, проанализируем структуру правил конвертации и выясним, как программно устранить эти недостатки с помощью расширения конфигурации.
Давайте проанализируем ситуацию. В релизе 11.5.21.111 разработчики обновили используемые форматы обмена EnterpriseData до версий 1.16 и 1.17. В этих версиях схемы XDTO стали более жесткими в плане контроля целостности данных. Если раньше некоторые поля могли быть опущены, то теперь они стали обязательными для заполнения (minOccurs="1").
Проблема с документом ПоступлениеТоваровОтХранителя заключается в том, что в самой конфигурации УТ у него отсутствуют реквизиты, связанные со ставками НДС в табличной части Товары. Однако при синхронизации этот документ должен трансформироваться в ПеремещениеТоваров или ВозвратТоваровОтПокупателя (в зависимости от настроек ПОД). Объект формата требует наличия полей СтавкаНДС, ВидСтавки и РасчетнаяСтавка. Поскольку в исходном документе их нет, модуль менеджера обмена оставляет их пустыми, что и приводит к ошибке "Не удалось выполнить конвертацию в объект формата".
Если нам необходимо восстановить работоспособность обмена немедленно и нет возможности оперативно вносить правки в код, рассмотрим вариант с изменением настроек синхронизации. Проанализируем настройки подключения в обеих базах (УТ и БП):
В версии 1.15 требования к полям НДС для документов перемещения и поступления от хранителя менее строгие. Это часто позволяет обойти ошибку проверки XDTO без изменения программного кода.
Для системного решения проблемы нам потребуется вмешаться в работу модуля менеджера обмена. Разберем по шагам, какие процедуры нуждаются в корректировке. Основное внимание уделим процедуре ПКО_Документ_ПоступлениеТоваровОтХранителяВПеремещениеТоваров_Отправка_ПриОтправкеДанных.
Выясним причину ошибки по валюте и виду операции. Как правило, она возникает из-за того, что в ДанныеXDTO не передается структура ВидОперации, которую ожидает принимающая сторона для корректного отражения на счетах учета.
Рассмотрим пример кода, который необходимо модифицировать в расширении. Нам нужно принудительно заполнить структуру НДС для каждой строки выгружаемых товаров, даже если в исходном документе НДС не предусмотрен. Посмотрим на фрагмент кода в процедуре ПриОтправкеДанных:
Процедура ПКО_Документ_ПоступлениеТоваровОтХранителяВПеремещениеТоваров_Отправка_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)
// ... существующий код выгрузки ...
// Решаем проблему с ВидомОперации и Валютой
// Нам необходимо убедиться, что структура ДанныеXDTO содержит эти ключи
Если Не ДанныеXDTO.Свойства().Содержит("ВидОперации") Тогда
ДанныеXDTO.Вставить("ВидОперации", "ТоварыНаХранении"); // Или иное значение согласно логике БП
КонецЕсли;
// Проанализируем заполнение табличной части Товары
Товары = ДанныеXDTO.Товары;
Для Каждого СтрокаТовара Из Товары Цикл
// Принудительно заполняем обязательные поля НДС для формата 1.17
Если Не СтрокаТовара.Свойства().Содержит("СтавкаНДС") Тогда
СтрокаТовара.Вставить("СтавкаНДС", "БезНДС");
СтрокаТовара.Вставить("ВидСтавки", "Общая");
СтрокаТовара.Вставить("РасчетнаяСтавка", Ложь);
СтрокаТовара.Вставить("НеОблагается", Истина);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Обратите внимание, что использование СтрокаТовара.Вставить позволяет динамически расширить структуру XDTO перед ее сериализацией в XML. Это критически важно, так как стандартная обработка ЗаполнитьСобственныеТоварыВТексте из типового кода не знает о необходимости этих полей для данного типа документа.
Если в журнале регистрации мы видим ошибку "ПОД: Документ_ПоступлениеТоваровОтХранителя. ПКО: Документ_ВозвратОтКомиссионера_Отправка", это сигнализирует о неверном выборе правила обработки данных. Система пытается применить логику возврата от комиссионера к поступлению от хранителя.
Выясним причину в процедуре ПОД_Документ_ПоступлениеТоваровОтХранителя_Отправка_ПриОбработке. Нам нужно четко сопоставить хозяйственную операцию документа и ПКО. Рассмотрим пример правильной настройки:
Процедура ПОД_Документ_ПоступлениеТоваровОтХранителя_Отправка_ПриОбработке(ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена)
ИспользованиеПКО.Очистить();
// Явно указываем правило конвертации для перемещения
ИспользованиеПКО.Вставить("Документ_ПоступлениеТоваровОтХранителяВПеремещениеТоваров_Отправка", Истина);
// Если документ должен уходить как возврат, добавляем условие:
// ИспользованиеПКО.Вставить("Документ_ВозвратОтКомиссионера_Отправка", Ложь);
КонецПроцедуры
Такая жесткая установка ПКО гарантирует, что документ не "свалится" в ошибочное правило конвертации, где ожидаются совсем другие реквизиты (например, данные о комиссионном вознаграждении).
Поскольку проблема носит массовый характер в релизе 11.5.21.111, фирма "1С" регулярно выпускает оперативные исправления (патчи). Рекомендуем проверить наличие установленных патчей в разделе Обслуживание — Обновление программы — Установленные исправления. Ищите патчи с описанием "Ошибка синхронизации данных EnterpriseData" или по номеру ошибки EF_0016xxxx.
Важный момент: если вы используете расширение для исправления этой ошибки, обязательно отключите его после обновления на следующий релиз (например, 11.5.22), так как разработчики могут изменить структуру объектов ПКО, и ваше расширение может вызвать конфликт имен процедур.
Мы рассмотрели сложную техническую проблему, связанную с эволюцией формата EnterpriseData. Подведем итог: ошибки возникают из-за разрыва между требованиями XDTO-схемы и фактическим составом реквизитов документа ПоступлениеТоваровОтХранителя. Самым надежным способом решения остается программное дополнение структуры ДанныеXDTO значениями по умолчанию для НДС и вида операции в расширении конфигурации.