Почему документ 1С, проведенный через COM-соединение, не формирует движения в регистрах?

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

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

Рассмотрим подробно причины возникновения такой ситуации, проанализируем ошибки в коде и разберем способы их устранения.

Главная причина: блокировка кода инструкциями препроцессора

Основной причиной отсутствия движений при проведении документов через COMConnector или Application является использование инструкций препроцессора, ограничивающих выполнение кода клиентским контекстом.

Сеанс, открытый через COM-соединение, выполняется исключительно на сервере в контексте внешнего соединения. Если алгоритм заполнения табличных частей, расчета сумм или формирование наборов движений в объекте обернут в директиву #Если Клиент Тогда, то при COM-подключении этот блок кода просто игнорируется платформой.

Проанализируем пример неисправного кода в модуле документа:


#Если Клиент Тогда
    // Код расчета и заполнения движений
    Движения.Хозрасчетный.Записать();
#КонецЕсли

В этом случае при вызове метода Записать(РежимЗаписиДокумента.Проведение) через COM platform меняет статус документа на Проведен, но сам обработчик проведения пропускает логику, предназначенную только для клиента. Чтобы решить эту проблему, необходимо удалить условие #Если Клиент или перенести алгоритм формирования движений в серверный контекст (модуль объекта или общий модуль с флагом Внешнее соединение).

Правильная установка ссылки и проведение документа через COM

При программном создании документов через COM-соединение иногда требуется заранее получить ссылку на создаваемый объект (например, для заполнения аналитики или шапки документа ссылкой на самого себя). Разберем, как правильно обращаться к конструкторам и объектам внешней базы 1С.

При работе с внешним соединением все объекты platform 1C необходимо создавать через менеджер COM-объекта (например, через переменную v8):


// Создание уникального идентификатора во внешней базе
НовыйGUID = v8.NewObject("УникальныйИдентификатор");

// Получение ссылки на новый документ
НоваяСсылка = v8.Документы.Поступление.ПолучитьСсылку(НовыйGUID);

// Создание документа и установка ссылки
ДокументОбъект = v8.Документы.Поступление.СоздатьДокумент();
ДокументОбъект.УстановитьСсылкуНового(НоваяСсылка);

// Заполнение реквизитов и однократное проведение
ДокументОбъект.Записать(v8.РежимЗаписиДокумента.Проведение);

Обратите внимание: выполнять проведение документа дважды (сначала запись, потом проведение) не рекомендуется, так как это увеличивает нагрузку на систему и создаёт лишние транзакции.

Чек-лист проверки при отсутствии движений через COM

Если документ проводится без ошибок, но движения в регистрах не появляются, рекомендуем выполнить следующие шаги по диагностике:

  1. Проверьте директивы компиляции и инструкции препроцессора: убедитесь, что в модуле документа и вызываемых общих модулях отсутствуют условия #Если Клиент, &НаКлиенте или #Если НаКлиенте в процедуре ОбработкаПроведения.
  2. Проверьте свойства общих модулей: в Конфигураторе у общих модулей, участвующих в проведении, должен быть установлен флаг Внешнее соединение.
  3. Проверьте флаг обмена данными: убедитесь, что перед проведением кодом не устанавливается параметр ОбменДанными.Загрузка = Истина. При включенном режиме загрузки стандартная процедура проведения полностью отключается.
  4. Проверьте права учетной записи: пользователь, под которым выполняется COM-подключение, должен иметь права на запись во все регистры, по которым документ должен сформировать движения.
← На главную