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