Как исправить ошибку «Недопустимое значение параметра (параметр номер 1)» при записи контрагента в 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Промышленность, строительство и АПК
← На главную

При работе в 1С после очередного обновления программы пользователи могут столкнуться со сбоем при записи элементов справочников (например, контрагентов). В окне сообщения выдается ошибка выполнения обработчика ПередЗаписью со следующим текстом:

{ОбщийМодуль.дмнУправлениеНСИ.Модуль(28)}: Ошибка при вызове метода контекста (РольДоступна)
Недопустимое значение параметра (параметр номер '1')

Рассмотрим подробнее причины возникновения этой технической проблемы и разберем по шагам, как её правильно исправить.

Причины возникновения ошибки на уровне платформы

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

Выясним, почему ролевая модель или объекты с префиксами (например, дмнРедактированиеНСИ) могут «пропасть» из базы:

  1. Обновление отраслевой базы типовым релизом: Если отраслевая конфигурация (например, «Бухгалтерия сельскохозяйственного предприятия» — БСХП) была ошибочно обновлена файлом поставки .cfu или .cf от типовой «Бухгалтерии предприятия» (БП 3.0), все доработки поставщика отраслевого решения стираются.
  2. Отключение или сбой расширения: Если роль находилась в расширении конфигурации (.cfe), после обновления платформы или изменения режима совместимости расширение могло деактивироваться из-за ошибок валидации.
  3. Ошибки при трехстороннем объединении: При обновлении через Конфигуратор флажок с роли мог быть случайно снят или перетерт правилом объединения.
  4. Ошибка в релизе разработчика: Разработчик отраслевого решения мог переименовать или удалить роль в новой версии, не скорректировав обращения к ней в коде общего модуля.

Способы решения проблемы

Разберем практические шаги по устранению этой ошибки в зависимости от причины её появления.

Шаг 1. Проверка конфигурации поставщика и дистрибутива обновления

В первую очередь необходимо проверить, правильным ли дистрибутивом была обновлена информационная база:

  1. Перейдем в окно Справка — О программе и выясним точное полное наименование конфигурации.
  2. Откроем Конфигуратор и зайдем в меню Конфигурация — Поддержка — Настройка поддержки.
  3. Если отраслевая база БСХП была обновлена дистрибутивом типовой БП, необходимо восстановить информационную базу из резервной копии и повторить процедуру обновления с использованием правильного файлового обновления от отраслевого разработчика.

Шаг 2. Проверка состояния расширений

Если функционал НСИ был вынесен в расширение, проверим его активность:

  1. В режиме «1С:Предприятие» откроем раздел Администрирование — Печатные формы, отчеты и обработки — Расширения.
  2. Проверим наличие ошибок подключения и при необходимости перезапустим или обновим файл расширения.

Шаг 3. Добавление роли без снятия с поддержки

Если конфигурация находится на типовой поддержке без возможности редактирования, добавить отсутствующую роль можно через расширение конфигурации:

  1. В Конфигураторе зайдем в меню Конфигурация — Расширения конфигурации и добавим новое расширение.
  2. В дереве метаданных расширения создадим роль с именем дмнРедактированиеНСИ (или соответствующим именем из вашей ошибки).
  3. Платформа 1С корректно видит роли из подключенных расширений, поэтому метод РольДоступна("дмнРедактированиеНСИ") перестанет вызывать ошибку.

Безопасные варианты проверки роли в коде 1С

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

Вариант 1. Проверка наличия роли в метаданных перед вызовом функции:

Перед тем как вызывать функцию РольДоступна(), проверим, существует ли объект метаданных роли с помощью метода Найти():


Если Метаданные.Роли.Найти("дмнРедактированиеНСИ") <> Неопределено 
    И РольДоступна("дмнРедактированиеНСИ") Тогда
    
    // Безопасный вызов логики при наличии роли
КонецЕсли;

Вариант 2. Использование конструкции перехвата исключений:

Оборачиваем вызов метода в блок Попытка ... Исключение, что предотвращает критическую остановку программы, если роль отсутствует в метаданных:


РольНазначена = Ложь;
Попытка
    РольНазначена = РольДоступна("дмнРедактированиеНСИ");
Исключение
    // Роль отсутствует в конфигурации или произошла ошибка
    РольНазначена = Ложь;
КонецПопытки;

Если ЗапретРедактированияНСИ И НЕ РольНазначена Тогда
    // Обработка ограничения доступа
КонецЕсли;

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

← На главную