Почему перестали работать COM-вызовы при проведении документов в Бухгалтерии 3.0 и как это исправить

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

При обновлении типовых конфигураций «1С», в частности «Бухгалтерии предприятия 3.0» до релиза 3.0.148.41, многие разработчики столкнулись с неприятной ситуацией: внешние интеграции через COM-соединение перестали корректно записывать и проводить документы, такие как РеализацияТоваровУслуг и ПоступлениеТоваровУслуг. При этом в обычном режиме (через тонкий или толстый клиент) всё работает исправно.

В этой статье мы подробно разберем причины возникновения данной ошибки, проанализируем программный код, вызвавший сбой, и рассмотрим несколько способов решения проблемы — от установки официальных патчей до ручной правки через расширения.

Выясняем причину ошибки: анализ общего модуля

Давайте проанализируем ситуацию. После обновления в модулях объектов многих документов (товарооборота и не только) в обработчике ПередЗаписью появился вызов новой процедуры:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // ... существующий код ...
    ОбщегоНазначенияБПВызовСервера.ЗаполнитьИдентификаторыСтрок(ЭтотОбъект);
    // ... существующий код ...
КонецПроцедуры

Эта процедура ЗаполнитьИдентификаторыСтрок необходима для корректной работы механизмов прослеживаемости товаров (РНПТ) и партионного учета. Она генерирует уникальные идентификаторы для каждой строки табличных частей. Проблема заключается не в самой процедуре, а в настройках общего модуля ОбщегоНазначенияБПВызовСервера, в котором она расположена. В релизе 3.0.148.41 у этого модуля был снят флаг «Внешнее соединение» (External Connection). Когда мы подключаемся к базе через COM-объект (например, из другой конфигурации 1С), код выполняется именно в контексте внешнего соединения. Поскольку флаг был снят, система «не видит» этот модуль в данном контексте, что приводит к критической ошибке: Переменная не определена (ОбщегоНазначенияБПВызовСервера). В результате выполнение кода прерывается, и документ не записывается.

Как отладить COM-соединение и поймать ошибку

Рассмотрим подробнее вопрос о том, как увидеть эту ошибку в отладчике, если стандартные методы не помогают. Работа с COM-соединением специфична, так как это отдельный сеанс. Чтобы поймать событие записи, выполним следующие шаги:

  1. Убедимся, что сервер «1С» запущен с ключом отладки -debug.
  2. В конфигураторе перейдем в меню Отладка — Настройка отладки.
  3. В открывшемся окне установим флаг «Отладка внешних соединений».
  4. Используем автоматическое подключение: Отладка — Подключение — Автоматическое подключение, где нужно выбрать пункт «Внешние соединения».
  5. Если отладка всё равно не «цепляется», можно применить метод записи в Журнал регистрации. Обернем проблемный участок кода в блок попытки:

Попытка
    ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
    ЗаписьЖурналаРегистрации("ОшибкаCOM", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;

После выполнения этого кода в Журнале регистрации появится детальное описание причины отказа, которое подтвердит отсутствие доступа к модулю ОбщегоНазначенияБПВызовСервера.

Вариант решения №1: Установка официального патча

Компания «1С» оперативно отреагировала на данную проблему. Если вы столкнулись с этой ошибкой, первым делом проверьте наличие доступных исправлений в разделе «Поддержка — Обновление программ — Исправления (патчи)». Для устранения этой конкретной ошибки был выпущен патч с идентификатором EF_60012225. Этот патч программно восстанавливает необходимые флаги использования общего модуля. Рассмотрим, почему это важно: установка патча позволяет избежать внесения изменений в основную конфигурацию и сохраняет возможность типового обновления. В последующих минорных релизах (начиная с 3.0.149.х) эта ошибка уже исправлена в основном коде.

Вариант решения №2: Использование расширения конфигурации

Если по каким-то причинам вы не можете установить патч (например, база находится на жесткой поддержке без доступа к интернету или используется сильно кастомизированная версия), разберем, как исправить проблему с помощью расширения. Это более правильный путь, чем «обход» процедуры через Вместо, так как процедура ЗаполнитьИдентификаторыСтрок действительно важна для учета.

  1. Создадим новое расширение или используем существующее.
  2. Добавим в расширение общий модуль ОбщегоНазначенияБПВызовСервера (правой кнопкой мыши по модулю — «Добавить в расширение»).
  3. В свойствах модуля в расширении найдем раздел «Использование» и установим галочку «Внешнее соединение».
  4. Обратите внимание: чтобы свойства модуля в расширении применились, режим совместимости расширения должен совпадать с режимом совместимости основной конфигурации.

Проанализируем результат: теперь при вызове из COM-соединения система успешно найдет модуль в расширении (где флаг установлен) и выполнит процедуру записи документа без ошибок.

Масштаб проблемы и дополнительные документы

Важно понимать, что проблема затрагивает не только «Реализацию» и «Поступление». Проанализировав дерево метаданных, мы увидим, что вызов ЗаполнитьИдентификаторыСтрок добавлен во множество объектов. Проблема может проявиться в следующих документах:

Именно поэтому вариант с расширением модуля (установка флага) или установка патча является предпочтительным. Если вы начнете «обходить» вызовы в каждом конкретном документе через расширение модуля объекта, это приведет к избыточному коду и трудностям при последующих обновлениях.

Резюме

Мы выяснили, что причина сбоя при COM-соединении в релизе 3.0.148.41 кроется в программной ошибке — отсутствии флага «Внешнее соединение» у критически важного общего модуля. Для решения проблемы рекомендуется:

  1. Установить патч EF_60012225 через стандартный механизм управления исправлениями.
  2. Или обновить конфигурацию до версии 3.0.149.х и выше.
  3. В качестве временной меры — включить использование внешнего соединения для модуля ОбщегоНазначенияБПВызовСервера через расширение.

Использование любого из этих методов позволит восстановить работоспособность ваших интеграций и обеспечит корректное заполнение идентификаторов строк для целей прослеживаемости товаров.

← На главную