Почему в 1С возникает ошибка «Предопределенный элемент отсутствует в данных» при сбоях лицензирования СЛК?

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

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

Разберем природу ошибки: почему исчезают предопределенные данные

Для начала проанализируем ситуацию, описанную в Журнале регистрации. Ошибка возникает при попытке программного обращения к конкретному значению:


{Справочник.рестМеню.Форма.ФормаСписка.Форма(57)}:
ОтборВладелец = Справочники.рестВидыМеню.ОсновнойВидМеню;
по причине:
Справочник.рестВидыМеню.ОсновнойВидМеню. Предопределенный элемент отсутствует в данных

Многие разработчики привыкли считать, что если элемент является предопределенным (создан в конфигураторе), то он всегда доступен в коде через точку. Но в платформе 1С:Предприятие 8.3 механизм работы с такими элементами изменился. Теперь наличие имени в конфигураторе не гарантирует наличие записи в таблице базы данных или доступность этой записи для текущего пользователя.

Рассмотрим основные причины, почему система «не видит» элемент:

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

Проанализируем влияние системы СЛК на доступ к функционалу

Система СЛК работает как отдельный сервис (служба Windows), к которой 1С обращается для подтверждения права на использование защищенных объектов. Рассмотрим подробнее, как именно происходит блокировка:

Защищенные модули Раруса часто содержат обфусцированный (запутанный) код, который периодически опрашивает сервер лицензий. Если в момент открытия формы списка рестМеню лицензия оказывается недоступна, выполнение кода прерывается именно на этапе инициализации параметров, завязанных на защищенные справочники. Это сделано специально: лицензия закрывает не только функционал (кнопки, отчеты), но и доступ к базовым элементам настроек, без которых работа модуля невозможна.

Пошаговое решение проблемы и профилактика сбоев

Выясним, какие действия необходимо предпринять для устранения этой ошибки и стабилизации работы 1С.

Шаг 1: Диагностика состояния данных

Первым делом нам нужно понять: действительно ли элемент отсутствует в базе или его блокирует защита. Для этого откроем справочник рестВидыМеню через меню «Все функции» (Функции для технического специалиста). Если элемент «Основной вид меню» виден в списке и открывается, значит, с базой данных всё в порядке, и проблема на 100% заключается в RLS или защищенных модулях, которые не видят лицензию.

Шаг 2: Стабилизация сервера СЛК

Так как первопричиной является «вылет» СЛК, проанализируем настройки сервера лицензирования. Чаще всего сбои происходят по следующим причинам:

Шаг 3: Программное восстановление связи предопределенных данных

Если вы подозреваете, что связь между конфигуратором и базой данных действительно нарушена (например, после некорректного обновления), можно заставить платформу обновить эти связи. Разберем, как это сделать с помощью встроенного языка 1С. Создайте внешнюю обработку и выполните следующий код:


Процедура ВосстановитьПредопределенные(ИмяСправочника)
    // Устанавливаем режим обновления предопределенных данных для конкретного справочника
    Справочники[ИмяСправочника].УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
    
    // Вызываем фоновое обновление
    Справочники[ИмяСправочника].ВыполнитьОбновлениеПредопределенныхДанных();
    
    Сообщить("Обновление для справочника " + ИмяСправочника + " завершено.");
КонецПроцедуры

Для справочника из нашего примера вызов будет выглядеть так: ВосстановитьПредопределенные("рестВидыМеню").

Шаг 4: Использование расширений для обхода жестких привязок

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

Резюме

Мы проанализировали ситуацию и выяснили, что ошибка Предопределенный элемент отсутствует в данных в решениях от Рарус — это не баг платформы, а следствие работы механизма защиты. Система лицензирования ограничивает права доступа (RLS), из-за чего предопределенные записи становятся «невидимыми» для кода. Основное решение заключается в обновлении компонентов СЛК до последних версий (не ниже 3.0.19) и настройке стабильного соединения с ключом защиты.

← На главную