При организации программного обмена данными между конфигурациями 1С часто используется механизм COM-соединения. Разберем распространенную проблему: документ создается и успешно проводится через внешний COM-коннектор без каких-либо ошибок в платформе, однако при проверке выясняется, что записи в регистрах накопления или сведений полностью отсутствуют. В то же время, если запустить аналогичный код проведения непосредственно в самой базе-приемнике, все движения формируются корректно.
Рассмотрим подробно причины возникновения такой ситуации, проанализируем ошибки в коде и разберем способы их устранения.
Основной причиной отсутствия движений при проведении документов через COMConnector или Application является использование инструкций препроцессора, ограничивающих выполнение кода клиентским контекстом.
Сеанс, открытый через COM-соединение, выполняется исключительно на сервере в контексте внешнего соединения. Если алгоритм заполнения табличных частей, расчета сумм или формирование наборов движений в объекте обернут в директиву #Если Клиент Тогда, то при COM-подключении этот блок кода просто игнорируется платформой.
Проанализируем пример неисправного кода в модуле документа:
#Если Клиент Тогда
// Код расчета и заполнения движений
Движения.Хозрасчетный.Записать();
#КонецЕсли
В этом случае при вызове метода Записать(РежимЗаписиДокумента.Проведение) через COM platform меняет статус документа на Проведен, но сам обработчик проведения пропускает логику, предназначенную только для клиента. Чтобы решить эту проблему, необходимо удалить условие #Если Клиент или перенести алгоритм формирования движений в серверный контекст (модуль объекта или общий модуль с флагом Внешнее соединение).
При программном создании документов через COM-соединение иногда требуется заранее получить ссылку на создаваемый объект (например, для заполнения аналитики или шапки документа ссылкой на самого себя). Разберем, как правильно обращаться к конструкторам и объектам внешней базы 1С.
При работе с внешним соединением все объекты platform 1C необходимо создавать через менеджер COM-объекта (например, через переменную v8):
// Создание уникального идентификатора во внешней базе
НовыйGUID = v8.NewObject("УникальныйИдентификатор");
// Получение ссылки на новый документ
НоваяСсылка = v8.Документы.Поступление.ПолучитьСсылку(НовыйGUID);
// Создание документа и установка ссылки
ДокументОбъект = v8.Документы.Поступление.СоздатьДокумент();
ДокументОбъект.УстановитьСсылкуНового(НоваяСсылка);
// Заполнение реквизитов и однократное проведение
ДокументОбъект.Записать(v8.РежимЗаписиДокумента.Проведение);
Обратите внимание: выполнять проведение документа дважды (сначала запись, потом проведение) не рекомендуется, так как это увеличивает нагрузку на систему и создаёт лишние транзакции.
Если документ проводится без ошибок, но движения в регистрах не появляются, рекомендуем выполнить следующие шаги по диагностике:
#Если Клиент, &НаКлиенте или #Если НаКлиенте в процедуре ОбработкаПроведения.ОбменДанными.Загрузка = Истина. При включенном режиме загрузки стандартная процедура проведения полностью отключается.