При открытии форм справочников или документов в управляемом приложении (в частности, в отраслевых конфигурациях, построенных на базе Библиотеки стандартных подсистем) разработчики нередко сталкиваются с аварийным завершением работы интерфейса. Платформа выдает исключение о том, что метод КодОсновногоЯзыка не обнаружен. Попытка вручную добавить функцию в общий модуль часто не дает результата или приводит к новым синтаксическим ошибкам. Разберем по шагам, почему возникает эта проблема, какие типичные ошибки допускаются при ее самостоятельном исправлении и как правильно восстановить работоспособность конфигурации.
Проанализируем контекст вызова. Метод КодОсновногоЯзыка входит в состав базовых подсистем БСП и стандартно располагается в общем модуле ОбщегоНазначенияКлиентСервер. Данный модуль имеет установленные свойства Клиент (управляемое приложение) и Сервер, что позволяет обращаться к его методам из любого контекста без лишних серверных вызовов.
Исчезновение этой функции из модуля обычно происходит по двум причинам:
ОбщегоНазначенияКлиентСервер, типовой модуль БСП полностью замещается урезанным библиотечным модулем, содержащим лишь несколько служебных процедур.Рассмотрим распространенную ошибку: разработчик вручную добавляет функцию в общий модуль ОбщегоНазначенияКлиентСервер в следующем виде:
&НаСервере
Функция КодОсновногоЯзыка() Экспорт
Возврат Метаданные.ОсновнойЯзык.КодЯзыка;
КонецФункции
После этого платформа продолжает сообщать, что метод не обнаружен при вызове с тонкого клиента. Выясним, почему это происходит:
&НаСервере, &НаКлиенте, &НаСервереБезКонтекста используются исключительно в модулях управляемых форм и команд. В общих модулях разграничение логики по средам исполнения выполняется только инструкциями препроцессора (#Если, #Иначе, #КонецЕсли). Наличие директив компиляции внутри общего модуля нарушает процесс сборки модуля.Метаданные на тонком клиенте запрещено и вызовет исключение времени выполнения. Клиентская ветка общего модуля не может напрямую считывать реквизиты метаданных без обращения к серверу или специальным закэшированным параметрам.Посмотрим на пример правильного кода, используемого в актуальных версиях Библиотеки стандартных подсистем. Функция должна быть доступна и на сервере, и на тонком клиенте. При этом на клиенте значение извлекается из кэша параметров работы, инициализированных при старте системы, а на сервере считывается напрямую из дерева метаданных.
Откроем общий модуль ОбщегоНазначенияКлиентСервер и добавим корректный экспортный метод:
// Возвращает код основного языка конфигурации.
//
// Возвращаемое значение:
// Строка - код основного языка (например, "ru").
//
Функция КодОсновногоЯзыка() Экспорт
#Если НЕ ТонкийКлиент И НЕ ВебКлиент Тогда
Возврат Метаданные.ОсновнойЯзык.КодЯзыка;
#Иначе
Возврат СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().КодОсновногоЯзыка;
#КонецЕсли
КонецФункции
В этом коде директива препроцессора #Если НЕ ТонкийКлиент И НЕ ВебКлиент Тогда отсекает клиентские контексты, позволяя серверу безопасно прочитать Метаданные.ОсновнойЯзык.КодЯзыка. В режиме тонкого или веб-клиента управление передается повторно используемому модулю СтандартныеПодсистемыКлиентПовтИсп, что исключает постоянные сетевые вызовы на сервер ради получения кода языка.
Если конфигурация сильно модифицирована, подсистема СтандартныеПодсистемыКлиентПовтИсп повреждена или отсутствует, а восстановить доступ к справочнику нужно срочно, допустимо использовать статичный возврат кода локализации. Для русскоязычных баз достаточно вернуть строковый литерал:
Функция КодОсновногоЯзыка() Экспорт
Возврат "ru";
КонецФункции
Такая заглушка не требует разделения контекстов препроцессором, одинаково успешно отрабатывает и на сервере, и на тонком клиенте, мгновенно снимая блокирующую ошибку при открытии формы.
Для того чтобы исключить проявление скрытых ошибок в будущем, выполним комплексную проверку системы:
ОбщегоНазначенияКлиентСервер. Если в рабочей конфигурации модуль содержит значительно меньше процедур, чем у поставщика, восстановим его текст полностью.ragent (или службу сервера 1С) и очистим локальный кэш пользователя, запустив тонкий клиент с ключом /ClearCache.