Доброго времени суток! Вы столкнулись с распространенной проблемой после обновления конфигурации 1С, которая проявляется в виде ошибки "Синтаксическая ошибка "Параметр ОграничениеДоступаНаУровнеЗаписейВключено не существует"". Эта ошибка возникает при запуске программы у части пользователей и указывает на проблемы с механизмом ограничения доступа на уровне записей (RLS). Давайте вместе разберем причины этой ошибки и найдем эффективные способы ее устранения.
Причиной этой синтаксической ошибки является изменение наименования системного параметра в Библиотеке стандартных подсистем (БСП), которая лежит в основе большинства современных конфигураций 1С. В процессе развития БСП параметр, отвечающий за включение ограничения доступа на уровне записей, был переименован:
ОграничениеДоступаНаУровнеЗаписейВключеноОграничениеДоступаНаУровнеЗаписейИспользуетсяКогда вы обновляете конфигурацию, типовые роли и связанные с ними шаблоны ограничений доступа автоматически адаптируются к новому наименованию параметра. Однако, если в вашей базе присутствуют доработанные или скопированные с типовых роли, их шаблоны ограничений могут не обновиться автоматически. В таких ролях продолжает использоваться старое наименование параметра, которое система уже не может найти, что и приводит к ошибке.
Ошибка проявляется при выполнении запросов к данным (например, к справочнику Организации), когда включаются ограничения доступа. Если в шаблоне RLS такой доработанной роли есть строка, ссылающаяся на несуществующий параметр, запрос завершается с синтаксической ошибкой.
Наиболее прямолинейным и эффективным решением этой проблемы является обновление наименования параметра во всех пользовательских или доработанных ролях, где оно встречается. Давайте рассмотрим, как это сделать.
Шаг 1: Определяем проблемные роли
Чаще всего ошибка возникает в ролях, которые были созданы путем копирования типовых ролей, таких как Базовые права БСП (Чтение) или других ролей, имеющих шаблоны ограничения доступа.
Шаг 2: Ручное переименование параметра в одной роли
Если проблемных ролей немного, или вы хотите сначала проверить решение на одной из них, выполните следующие действия:
Конфигурация - Роли.Базовые права БСП (Чтение), если она у вас доработана).Шаблоны ограничений. Здесь вы увидите текст шаблонов, которые определяют RLS для этой роли.Установить текст шаблона) и нажмите ее, чтобы открыть редактор текста шаблона.Ctrl+H (или меню Правка - Заменить...).#ОграничениеДоступаНаУровнеЗаписейВключено.#ОграничениеДоступаНаУровнеЗаписейИспользуется.Заменить все.Шаг 3: Массовое переименование параметра с помощью глобальной замены
Если у вас много доработанных ролей, ручное переименование может быть трудоемким. Для таких случаев 1С предоставляет удобный механизм глобальной замены:
Правка - Глобальная замена....#ОграничениеДоступаНаУровнеЗаписейВключено.#ОграничениеДоступаНаУровнеЗаписейИспользуется.Роли. Это гарантирует, что замена будет произведена только в ролях.Не открывать редакторы при замене.Заменить. Конфигуратор выполнит поиск и замену во всех ролях, где встретит указанный текст.Обновление прав доступа (оперативное) или Обновить параметры ограничения доступа (эту процедуру можно найти в общем модуле УправлениеДоступомСлужебный).После выполнения этих шагов ошибка должна исчезнуть, и пользователи смогут нормально входить в систему.
В некоторых случаях, когда конфигурацию нельзя снять с поддержки для изменения ролей, или когда требуется более гибкий подход, можно использовать программное добавление параметра сеанса. Этот метод позволит временно "подложить" отсутствующий параметр системе. Однако, мы обращаем ваше внимание на то, что изменение типовых модулей может усложнить дальнейшие обновления конфигурации и должно использоваться с осторожностью.
Давайте разберем по шагам, как реализовать это решение:
ОбщийМодуль.УправлениеДоступомСлужебный. Это основной модуль БСП, отвечающий за управление доступом.УстановкаПараметровСеанса. Эта процедура вызывается при старте сеанса каждого пользователя и устанавливает значения всех необходимых параметров для корректной работы системы доступа.
// Начало блока для обеспечения совместимости со старыми шаблонами RLS
// Этот код добавляет или устанавливает параметр 'ОграничениеДоступаНаУровнеЗаписейВключено'
// для поддержки старых шаблонов ограничений доступа, которые еще могут его использовать.
Если НЕ ПараметрыСеанса.Свойство("ОграничениеДоступаНаУровнеЗаписейИспользуется") Тогда
// Если по какой-то причине нового параметра нет (что маловероятно в актуальных релизах),
// то мы не сможем корректно установить старый, так как не знаем его логики.
// Однако, основной сценарий - это когда новый параметр есть, а старый ищется в ролях.
// Этот блок для случая, если в каких-то конфигурациях новый параметр отсутствует,
// но старый нужен для корректной работы.
// В большинстве случаев этот "Если" не сработает или не понадобится,
// так как "ОграничениеДоступаНаУровнеЗаписейИспользуется" будет присутствовать.
// Тем не менее, для обеспечения максимальной совместимости, можно рассмотреть его.
КонецЕсли;
// Основная логика: добавляем или устанавливаем старый параметр, если он еще ожидается.
// Проверяем, существует ли уже параметр 'ОграничениеДоступаНаУровнеЗаписейВключено'
// в текущих параметрах сеанса. Это может быть актуально, если параметр был временно добавлен
// или если конфигурация имеет особенности.
Если ПараметрыСеанса.Свойство("ОграничениеДоступаНаУровнеЗаписейВключено") Тогда
// Если параметр уже существует, просто устанавливаем его значение в Истина.
// Это гарантирует, что RLS будет пытаться использовать его, если шаблон его запросит.
ПараметрыСеанса.ОграничениеДоступаНаУровнеЗаписейВключено = Истина;
Иначе
// Если параметра 'ОграничениеДоступаНаУровнеЗаписейВключено' нет в параметрах сеанса,
// добавляем его динамически и устанавливаем значение в Истина.
// Это имитирует его присутствие, необходимое для старых шаблонов RLS.
ПараметрыСеанса.Вставить("ОграничениеДоступаНаУровнеЗаписейВключено", Истина);
КонецЕсли;
// Конец блока для обеспечения совместимости
Важное замечание: Приведенный код предполагает, что старый параметр должен иметь значение Истина для корректной работы. В большинстве случаев это так. Однако, прежде чем применять этот код, настоятельно рекомендуем создать резервную копию базы данных. После внесения изменений в модуль, обновите базу данных конфигурации и попросите пользователей перезапустить свои сеансы.
Давайте рассмотрим некоторые нюансы, с которыми вы можете столкнуться в процессе решения проблемы.
Галочка "Ограничивать доступ на уровне записей не включена"
Некоторые пользователи отмечают, что ошибка "Параметр ОграничениеДоступаНаУровнеЗаписейВключено не существует" может возникать, даже если в функциональных опциях конфигурации флажок Ограничивать доступ на уровне записей не установлен. Это происходит потому, что ошибка относится к синтаксису шаблона ограничения, а не к фактическому включению RLS. Даже если RLS отключен, система все равно парсит шаблоны ролей, и если находит в них ссылку на несуществующий параметр, генерирует ошибку.
Ошибка в полностью типовой конфигурации без доработанных ролей
В редких случаях пользователи сообщают о такой ошибке даже в полностью типовых конфигурациях, которые не снимались с поддержки и не имеют собственных ролей. Это может указывать на более глубокие проблемы, связанные с:
Обновление прав доступа (оперативное) или Обновить параметры ограничения доступа.Проблемы с опечатками
При ручном или даже глобальном переименовании будьте крайне внимательны к опечаткам. Малейшая неточность в написании нового имени параметра (например, ОграничениеДоступаНаУровнеЗаписейИспользуется вместо ОграничениеДоступаНаУровнеЗаписейИспользуется) приведет к новой ошибке: "Синтаксическая ошибка "Параметр ОграничениеДоступаНаУровнеЗаписейИспользуется не существует"". Всегда перепроверяйте правильность написания.
Регламентные задания
После любых изменений, касающихся RLS, крайне важно убедиться, что система корректно пересчитала и применила новые правила доступа. Для этого необходимо выполнять регламентные задания, такие как:
Обновление прав доступа (оперативное)Обновить параметры ограничения доступа (эта процедура обычно находится в общем модуле УправлениеДоступомСлужебный и может быть вызвана через обработку или консоль запросов).Эти задания актуализируют служебные регистры и кеши, используемые механизмом RLS, гарантируя, что все пользователи получат корректные права доступа.
Синтаксическая ошибка "Параметр ОграничениеДоступаНаУровнеЗаписейВключено не существует" является типичным примером проблем совместимости, возникающих после обновления конфигураций 1С, активно использующих механизмы БСП. Мы рассмотрели два основных подхода к ее решению: прямое переименование параметра в шаблонах ролей (ручное или глобальное) и программное добавление параметра сеанса для более сложных случаев.
Мы настоятельно рекомендуем начинать с метода переименования в шаблонах ролей, как наиболее безопасного и соответствующего логике БСП. Всегда выполняйте резервное копирование базы данных перед внесением серьезных изменений в конфигурацию, особенно в типовые модули. Внимательный подход к обновлениям и адаптации пользовательских решений под новые версии БСП поможет избежать подобных проблем в будущем.