При разработке и обновлении конфигураций на платформе 1С:Предприятие 8.3 разработчики часто сталкиваются с ситуацией, когда стандартный код, годами работавший в типовых решениях (например, в ERP, КА или УТ), внезапно начинает вызывать ошибку «Метод объекта не обнаружен» в новых или самописных базах. Особенно часто это происходит с процедурами Библиотеки стандартных подсистем (БСП), такими как Подключаемый_ВыполнитьКомандуНаСервере.
В этой статье мы подробно разберем механизмы взаимодействия контекстов управляемой формы и общих модулей, выясним глубинную причину изменения поведения платформы начиная с версии 8.3.13, а также рассмотрим по шагам, как правильно адаптировать код под новые требования безопасности и инкапсуляции.
Рассмотрим классический пример интеграции подключаемых команд БСП в форму прикладного объекта. В модуле формы размещается стандартный обработчик:
&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Элементы.Список, Результат);
КонецПроцедуры
Обратите внимание, что у данной процедуры отсутствует ключевое слово Экспорт. Тем не менее, эта процедура успешно вызывается из клиентского общего модуля БСП ПодключаемыеКомандыКлиент следующим образом:
Контекст.Форма.Подключаемый_ВыполнитьКомандуНаСервере(СерверныйКонтекст, Результат);
Ситуация кажется парадоксальной: метод, объявленный в модуле формы как приватный (неэкспортный), без проблем вызывается «извне» — из общего модуля. В старых версиях платформы или в конфигурациях, работающих в режиме совместимости, это не вызывало никаких ошибок системы.
Причина такого поведения кроется в особенностях работы механизма выполнения кода на платформе 1С. До версии платформы 8.3.13.1198 существовала техническая особенность (которую многие разработчики и сама фирма «1С» долгое время использовали как штатную возможность), позволявшая обходить стандартные правила видимости методов управляемой формы.
Когда контекст формы (переданный через ЭтотОбъект или полученный иным образом) передавался во внешний общий модуль, платформа предоставляла этому модулю полный доступ ко всем методам переданного объекта. Общий модуль мог обращаться к любым процедурам и функциям формы на сервере, игнорируя отсутствие директивы Экспорт. Это поведение нарушало базовый принцип объектно-ориентированного программирования — инкапсуляцию (сокрытие внутренней реализации объекта от внешнего мира).
Начиная с версии платформы 8.3.13, разработчики технологической платформы устранили это некорректное поведение системы:
Экспорт.Рассмотрим, как правильно решить возникшую проблему без нарушения стандартов разработки и обеспечения совместимости с современными версиями платформы.
Самый простой, правильный и рекомендуемый фирмой «1С» способ решения — сделать вызываемую процедуру экспортной. Нам необходимо открыть модуль формы, где локализована ошибка, найти требуемую процедуру и добавить к её объявлению ключевое слово Экспорт.
Было:
&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Элементы.Список, Результат);
КонецПроцедуры
Стало:
&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Элементы.Список, Результат);
КонецПроцедуры
Изменения в платформе затронули не только подключаемые команды. Если вы обновляете режим совместимости конфигурации или переносите код из старых версий БСП, обязательно проверьте наличие ключевого слова Экспорт у следующих предопределенных процедур в модулях управляемых форм:
Подключаемый_ВыполнитьКоманду(Команда) Экспорт (на клиенте);Подключаемый_ОбновитьКоманды() Экспорт (на клиенте);Подключаемый_ВыполнитьКомандуПечати(НаправлениеВывода, ПараметрыПечати) Экспорт (для подсистемы печати);Подключаемый_ОбновитьКонтактнуюИнформацию() Экспорт (для подсистемы контактной информации).Помимо модулей управляемых форм, аналогичное ужесточение правил коснулось и серверных модулей объектов (справочников, документов, обработок). Если ранее вы передавали ЭтотОбъект прикладного решения в общий модуль и вызывали оттуда его внутренние вспомогательные функции, убедитесь, что эти функции также объявлены как Экспорт.
Например, следующий вызов в общем модуле будет работать только при наличии ключевого слова Экспорт у метода модуля объекта:
// Вызов в общем модуле:
ИмяОбъекта.ВыполнитьВнутреннийРасчет(); // Метод "ВыполнитьВнутреннийРасчет" обязан быть Экспортным в модуле объекта!
Исправление ошибки «Метод объекта не обнаружен» при переходе на платформу 8.3.13+ требует от разработчика понимания границ применимости контекстов. Использование ключевого слова Экспорт для процедур управляемых форм, вызываемых из общих модулей, теперь является обязательным стандартом разработки. Своевременный аудит кода по шаблону Подключаемый_ позволит избежать неожиданных сбоев при обновлении платформы и снятии режимов совместимости.