При работе в 1С после очередного обновления программы пользователи могут столкнуться со сбоем при записи элементов справочников (например, контрагентов). В окне сообщения выдается ошибка выполнения обработчика ПередЗаписью со следующим текстом:
{ОбщийМодуль.дмнУправлениеНСИ.Модуль(28)}: Ошибка при вызове метода контекста (РольДоступна)
Недопустимое значение параметра (параметр номер '1')
Рассмотрим подробнее причины возникновения этой технической проблемы и разберем по шагам, как её правильно исправить.
Проанализируем работу встроенной функции платформы РольДоступна(). Этот метод принимает в качестве аргумента имя роли в виде строки или объект метаданных роли. Особенность метода заключается в том, что если передать в него имя роли, которой нет в дереве метаданных конфигурации и подключенных расширениях, платформа 1С не возвращает значение Ложь, а генерирует исключение: «Недопустимое значение параметра (параметр номер 1)».
Выясним, почему ролевая модель или объекты с префиксами (например, дмнРедактированиеНСИ) могут «пропасть» из базы:
.cfu или .cf от типовой «Бухгалтерии предприятия» (БП 3.0), все доработки поставщика отраслевого решения стираются..cfe), после обновления платформы или изменения режима совместимости расширение могло деактивироваться из-за ошибок валидации.Разберем практические шаги по устранению этой ошибки в зависимости от причины её появления.
В первую очередь необходимо проверить, правильным ли дистрибутивом была обновлена информационная база:
Если функционал НСИ был вынесен в расширение, проверим его активность:
Если конфигурация находится на типовой поддержке без возможности редактирования, добавить отсутствующую роль можно через расширение конфигурации:
дмнРедактированиеНСИ (или соответствующим именем из вашей ошибки).РольДоступна("дмнРедактированиеНСИ") перестанет вызывать ошибку.Посмотрим на примеры безопасного написания кода, если у вас есть доступ к доработке общего модуля или расширению.
Вариант 1. Проверка наличия роли в метаданных перед вызовом функции:
Перед тем как вызывать функцию РольДоступна(), проверим, существует ли объект метаданных роли с помощью метода Найти():
Если Метаданные.Роли.Найти("дмнРедактированиеНСИ") <> Неопределено
И РольДоступна("дмнРедактированиеНСИ") Тогда
// Безопасный вызов логики при наличии роли
КонецЕсли;
Вариант 2. Использование конструкции перехвата исключений:
Оборачиваем вызов метода в блок Попытка ... Исключение, что предотвращает критическую остановку программы, если роль отсутствует в метаданных:
РольНазначена = Ложь;
Попытка
РольНазначена = РольДоступна("дмнРедактированиеНСИ");
Исключение
// Роль отсутствует в конфигурации или произошла ошибка
РольНазначена = Ложь;
КонецПопытки;
Если ЗапретРедактированияНСИ И НЕ РольНазначена Тогда
// Обработка ограничения доступа
КонецЕсли;
Использование подобных проверок делает программный код устойчивым к изменениям метаданных при обновлениях конфигурации.