При использовании универсального формата обмена (EnterpriseData) между различными конфигурациями 1С пользователи часто сталкиваются с ситуацией, когда после обновления одной из программ синхронизация начинает работать некорректно. Чаще всего это выражается в том, что определенные типы документов (например, Списание товаров) перестают загружаться в приемник, хотя в файле выгрузки они присутствуют. Разберем подробно, почему это происходит и как решить проблему даже в базовых версиях программ.
Проанализируем техническую сторону вопроса. Обмен через EnterpriseData строится на использовании XDTO-пакетов. Каждая версия формата (1.0, 1.1, 1.2... 1.15) имеет строго определенную структуру. Начиная с версии формата 1.3, фирма 1С произвела унификацию объектов обмена для программ ERP, УТ 11, КА 2 и БП 3.0.
В ходе этой унификации объект Документ.СписаниеТоваров был признан устаревшим и заменен на новые типы:
Документ.СписаниеЗапасов — используется для общего отражения списания ТМЦ.Документ.СписаниеНедостач — используется, когда списание привязано к результатам инвентаризации.Проблема возникает, когда конфигурация-источник (например, Общепит или БП 3.0) уже обновилась и начала использовать формат версии 1.3 или выше, отправляя данные под именем СписаниеЗапасов, а конфигурация-приемник (например, Розница 2.2) еще работает по старым правилам или содержит ошибку в модуле менеджера обмена, ожидая старое имя СписаниеТоваров.
Посмотрим на пример кода из общего модуля ОбменДаннымиXDTOСервер, где происходит сбой:
ТипXDTO = ФабрикаXDTO.Тип(XMLСхема, ПОД.ОбъектВыборкиФормат);
Если ТипXDTO = Неопределено Тогда
ПравилаОбработкиДанных.Удалить(ПОД);
Продолжить;
КонецЕсли;
Здесь система пытается сопоставить правило обработки данных (ПОД) с типом в фабрике XDTO. Если в правилах указано старое имя, а в схеме XML (которая соответствует новой версии формата) этого имени больше нет, ТипXDTO становится Неопределено, и правило просто удаляется из очереди обработки. В результате документы игнорируются при загрузке.
Если вы столкнулись с такой проблемой в Базовой версии (где невозможно вносить изменения в код), самым эффективным решением будет заставить программы общаться на "старом языке", который понимают обе стороны. Рассмотрим, как это сделать:
1.2.Важное примечание: Версия 1.2 является стабильной и содержит объект СписаниеТоваров, который корректно распознается старыми правилами. После того как обе конфигурации будут обновлены до актуальных релизов, где эта ошибка исправлена разработчиками, можно будет вернуть версию формата на автоматическое определение.
Рассмотрим ситуацию, когда нам необходимо работать именно на актуальном формате (например, 1.5 или выше), но типовые правила в конфигурации содержат ошибку. Для ПРОФ-версий 1С предусмотрена возможность подключения внешних правил без снятия с поддержки.
Проанализируем алгоритм действий:
.epf.ЗаполнитьПравилаОбработкиДанных (внутри модуля менеджера) найдем строку, инициализирующую правило для списания.ОбъектВыборкиФормат с Документ.СписаниеТоваров на Документ.СписаниеЗапасов.Это позволит системе успешно находить тип XDTO в фабрике даже на новых версиях формата:
// Пример исправления в правилах
ПОД = ПравилаОбработкиДанных.Добавить();
ПОД.Имя = "Документ_СписаниеЗапасов_Приемка";
ПОД.ОбъектВыборкиМетаданные = Метаданные.Документы.СписаниеТоваров;
ПОД.ОбъектВыборкиФормат = "Документ.СписаниеЗапасов"; // Было СписаниеТоваров
Если документов немного и обмен нужно восстановить "здесь и сейчас", воспользуемся стандартной обработкой "Выгрузка загрузка данных EnterpriseData", которая входит в состав многих типовых решений и доступна на ИТС.
Разберем, как это помогает решить проблему:
1.2.Этот метод позволяет обойти жесткие настройки узла плана обмена и передать данные в обход сломавшихся автоматических алгоритмов.
Подведем итог нашему анализу. Ошибки обмена в 1С при обновлении — это следствие эволюции формата EnterpriseData. Когда одна база "уходит вперед" по версии формата, а вторая не успевает обновиться, возникает конфликт имен объектов (СписаниеТоваров vs СписаниеЗапасов).
Рекомендации для стабильной работы:
1.2.ОбменДаннымиXDTOСервер, обращая внимание на переменную ПОД.ОбъектВыборкиФормат и результат функции ФабрикаXDTO.Тип().