При настройке обмена данными между базами 1С с помощью конфигурации «Конвертация данных» программисты часто сталкиваются с загадочным поведением: документы, которые прекрасно загружаются и проводятся через промежуточный XML-файл, категорически отказываются проводиться при использовании прямого подключения (через COM-соединение). Документ создается в базе-приемнике, остается в состоянии «записан», но при попытке программного проведения выдает общую ошибку без деталей. Если же зайти в документ интерактивно и нажать «Провести», он проводится без проблем.
Рассмотрим подробно причины этой ситуации и разберем пошаговый алгоритм диагностики и устранения проблемы, опираясь на технические особенности платформы и опыт работы с отраслевыми решениями (например, от «Агрософт»).
Первая и самая главная проблема при прямом подключении — это «молчаливые» ошибки. Когда обмен идет через файл, загрузка происходит в текущем сеансе пользователя, и все сообщения об ошибках выводятся в окно сообщений. В случае с COM-соединением код выполняется в контексте внешнего соединения, и стандартный метод Сообщить() часто уходит в никуда.
Проанализируем ситуацию: чтобы понять, почему документ не проводится, нам нужно получить детальное описание ошибки из базы-приемника. Для этого в ПКО (Правила конвертации объектов) в обработчике ПослеЗагрузки необходимо реализовать перехват исключения с записью в Журнал регистрации базы-приемника.
Применим следующий код для детальной диагностики:
Попытка
Объект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
// Записываем детальную ошибку в журнал регистрации базы-приемника
ТекстОшибки = "Ошибка при проведении документа " + Строка(Объект) + ": " + ОписаниеОшибки();
ЗаписьЖурналаРегистрации("ОбменДанными.Загрузка", УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки);
КонецПопытки;
Важный нюанс: при прямом подключении база-источник может «проглатывать» ошибку, поэтому проверять результат нужно именно в Журнале регистрации той базы, куда вы грузите данные.
Разберем типичную ошибку в написании кода обработчиков. В конфигурации «Конвертация данных» (особенно старых версий или при работе с обычными формами) разработчики иногда путают типы перечислений. Рассмотрим правильный вариант установки режима записи.
В обработчике ПередЗагрузкой или ПослеЗагрузки для принудительного проведения следует использовать:
РежимЗаписи = "Проведение"; (это стандартный механизм универсальной обработки обмена).Объект.Записать(РежимЗаписиДокумента.Проведение);.Обратите внимание на правильное использование системного перечисления: нужно использовать именно РежимЗаписиДокумента.Проведение, а не сокращенные или строковые варианты, которые могут не поддерживаться в контексте внешнего соединения. Если вы используете РежимЗаписи = "Проведение", убедитесь, что в самой обработке «Универсальный обмен данными» не установлена блокировка проведения документов.
Выясним причину, почему через файл все работает, а через COM — нет. Основное отличие заключается в инициализации параметров сеанса и глобальных переменных.
При обмене через файл загрузка выполняется в полноценном сеансе. При COM-подключении создается облегченный сеанс (внешнее соединение). В этом режиме:
ПередЗаписью, ПриЗаписи) могут обращаться к глобальному контексту, который в COM-соединении пуст или ограничен.Если конфигурация (как в случае с решениями «Агрософт») проверяет какие-то специфические права или настройки пользователя при проведении, документ «отвалится» по ошибке прав или незаполненных данных, которые при обычном открытии подставляются автоматически (в процедуре ПриОткрытии).
Проанализируем ситуацию с модифицированностью документа. Часто в отраслевых решениях при интерактивном открытии документа срабатывает код, который дозаполняет скрытые реквизиты (например, аналитику учета затрат или специфические статусы). При программной загрузке через COM эти поля остаются пустыми, и документ не проходит проверки в процедуре ОбработкаПроведения.
Что нужно сделать:
ПриЗагрузке принудительно заполнить значения по умолчанию для критически важных полей, которые обычно заполняются «автоматом».Если вы используете отложенное проведение (галочка в настройках правил), помните, что в этом случае документ при загрузке только записывается, а в специальный регистр сведений (например, БуферОпераций или аналоги в зависимости от БСП) вносится запись о необходимости проведения. Если в базе-приемнике не настроено регламентное задание по обработке этой очереди, документы так и останутся не проведенными.
При прямом подключении иногда возникает конфликт транзакций: если база-источник открывает транзакцию на запись, база-приемник в рамках того же COM-вызова может иметь ограничения на завершение вложенных транзакций проведения. Попробуйте в настройках обработки обмена снять флаг «Использовать одну транзакцию». Это позволит каждому документу фиксироваться в базе независимо, что часто решает проблему блокировок при проведении через COM.
Подведем итог действий, которые помогут решить проблему:
РежимЗаписиДокумента.Проведение вместо упрощенных конструкций.