Почему возникает ошибка «Метод КодОсновногоЯзыка не обнаружен» и как её исправить в 1С?

Программист 1С v8.3 (Управляемые формы) Сфера услуг, туризм и социальный сектор
← На главную

При открытии форм справочников или документов в управляемом приложении (в частности, в отраслевых конфигурациях, построенных на базе Библиотеки стандартных подсистем) разработчики нередко сталкиваются с аварийным завершением работы интерфейса. Платформа выдает исключение о том, что метод КодОсновногоЯзыка не обнаружен. Попытка вручную добавить функцию в общий модуль часто не дает результата или приводит к новым синтаксическим ошибкам. Разберем по шагам, почему возникает эта проблема, какие типичные ошибки допускаются при ее самостоятельном исправлении и как правильно восстановить работоспособность конфигурации.

Выясним причину возникновения ошибки

Проанализируем контекст вызова. Метод КодОсновногоЯзыка входит в состав базовых подсистем БСП и стандартно располагается в общем модуле ОбщегоНазначенияКлиентСервер. Данный модуль имеет установленные свойства Клиент (управляемое приложение) и Сервер, что позволяет обращаться к его методам из любого контекста без лишних серверных вызовов.

Исчезновение этой функции из модуля обычно происходит по двум причинам:

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

Почему не работает самостоятельное добавление функции с директивой &НаСервере

Рассмотрим распространенную ошибку: разработчик вручную добавляет функцию в общий модуль ОбщегоНазначенияКлиентСервер в следующем виде:


&НаСервере
Функция КодОсновногоЯзыка() Экспорт
    Возврат Метаданные.ОсновнойЯзык.КодЯзыка;
КонецФункции

После этого платформа продолжает сообщать, что метод не обнаружен при вызове с тонкого клиента. Выясним, почему это происходит:

  1. Директивы компиляции не предназначены для общих модулей: директивы &НаСервере, &НаКлиенте, &НаСервереБезКонтекста используются исключительно в модулях управляемых форм и команд. В общих модулях разграничение логики по средам исполнения выполняется только инструкциями препроцессора (#Если, #Иначе, #КонецЕсли). Наличие директив компиляции внутри общего модуля нарушает процесс сборки модуля.
  2. Изоляция контекстов: даже если платформа проигнорирует директиву, прямое обращение к объекту Метаданные на тонком клиенте запрещено и вызовет исключение времени выполнения. Клиентская ветка общего модуля не может напрямую считывать реквизиты метаданных без обращения к серверу или специальным закэшированным параметрам.

Эталонная реализация метода из БСП

Посмотрим на пример правильного кода, используемого в актуальных версиях Библиотеки стандартных подсистем. Функция должна быть доступна и на сервере, и на тонком клиенте. При этом на клиенте значение извлекается из кэша параметров работы, инициализированных при старте системы, а на сервере считывается напрямую из дерева метаданных.

Откроем общий модуль ОбщегоНазначенияКлиентСервер и добавим корректный экспортный метод:


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

КонецФункции

В этом коде директива препроцессора #Если НЕ ТонкийКлиент И НЕ ВебКлиент Тогда отсекает клиентские контексты, позволяя серверу безопасно прочитать Метаданные.ОсновнойЯзык.КодЯзыка. В режиме тонкого или веб-клиента управление передается повторно используемому модулю СтандартныеПодсистемыКлиентПовтИсп, что исключает постоянные сетевые вызовы на сервер ради получения кода языка.

Быстрое временное решение (заглушка)

Если конфигурация сильно модифицирована, подсистема СтандартныеПодсистемыКлиентПовтИсп повреждена или отсутствует, а восстановить доступ к справочнику нужно срочно, допустимо использовать статичный возврат кода локализации. Для русскоязычных баз достаточно вернуть строковый литерал:


Функция КодОсновногоЯзыка() Экспорт
    Возврат "ru";
КонецФункции

Такая заглушка не требует разделения контекстов препроцессором, одинаково успешно отрабатывает и на сервере, и на тонком клиенте, мгновенно снимая блокирующую ошибку при открытии формы.

Пошаговый план полного исправления и диагностики конфигурации

Для того чтобы исключить проявление скрытых ошибок в будущем, выполним комплексную проверку системы:

  1. Проверим целостность модуля через сравнение с поставщиком: перейдем в меню Конфигурация — Поддержка — Настройка поддержки и выполним сравнение с конфигурацией поставщика. Проанализируем модуль ОбщегоНазначенияКлиентСервер. Если в рабочей конфигурации модуль содержит значительно меньше процедур, чем у поставщика, восстановим его текст полностью.
  2. Проверим синтаксис во всех режимах: запустим проверку метаданных через Конфигурация — Проверка конфигурации. Обязательно установим флаги проверки для режимов Тонкий клиент, Сервер и Внешнее соединение. Это позволит убедиться, что в модулях отсутствуют недопустимые обращения к серверным объектам из клиентского кода.
  3. Сбросим кэш метаданных: если код был исправлен, но тонкий клиент продолжает выдавать ошибку об отсутствии метода, причиной является закэшированное описание модуля на стороне сервера или клиента (часто возникает после «динамического обновления»). Перезапустим рабочий процесс кластера серверов ragent (или службу сервера 1С) и очистим локальный кэш пользователя, запустив тонкий клиент с ключом /ClearCache.
← На главную