При работе с отраслевыми решениями, такими как «Рарус: Фаст-фуд», специалисты часто сталкиваются с нестабильной работой системы лицензирования конфигураций (СЛК). Одной из наиболее странных и труднообъяснимых ошибок в такой ситуации является сообщение: Предопределенный элемент отсутствует в данных. На первый взгляд кажется, что это системный сбой метаданных, не связанный с лицензированием напрямую. Однако в этой статье мы разберем, почему именно «отвал» СЛК приводит к невозможности обращения к предопределенным элементам справочников, и как с этим бороться.
Для начала проанализируем ситуацию, описанную в Журнале регистрации. Ошибка возникает при попытке программного обращения к конкретному значению:
{Справочник.рестМеню.Форма.ФормаСписка.Форма(57)}:
ОтборВладелец = Справочники.рестВидыМеню.ОсновнойВидМеню;
по причине:
Справочник.рестВидыМеню.ОсновнойВидМеню. Предопределенный элемент отсутствует в данных
Многие разработчики привыкли считать, что если элемент является предопределенным (создан в конфигураторе), то он всегда доступен в коде через точку. Но в платформе 1С:Предприятие 8.3 механизм работы с такими элементами изменился. Теперь наличие имени в конфигураторе не гарантирует наличие записи в таблице базы данных или доступность этой записи для текущего пользователя.
Рассмотрим основные причины, почему система «не видит» элемент:
Справочники.рестВидыМеню.ОсновнойВидМеню, платформа выполняет запрос к базе данных, но из-за RLS получает пустой результат. Итог — ошибка «отсутствует в данных».Система СЛК работает как отдельный сервис (служба Windows), к которой 1С обращается для подтверждения права на использование защищенных объектов. Рассмотрим подробнее, как именно происходит блокировка:
Защищенные модули Раруса часто содержат обфусцированный (запутанный) код, который периодически опрашивает сервер лицензий. Если в момент открытия формы списка рестМеню лицензия оказывается недоступна, выполнение кода прерывается именно на этапе инициализации параметров, завязанных на защищенные справочники. Это сделано специально: лицензия закрывает не только функционал (кнопки, отчеты), но и доступ к базовым элементам настроек, без которых работа модуля невозможна.
Выясним, какие действия необходимо предпринять для устранения этой ошибки и стабилизации работы 1С.
Первым делом нам нужно понять: действительно ли элемент отсутствует в базе или его блокирует защита. Для этого откроем справочник рестВидыМеню через меню «Все функции» (Функции для технического специалиста). Если элемент «Основной вид меню» виден в списке и открывается, значит, с базой данных всё в порядке, и проблема на 100% заключается в RLS или защищенных модулях, которые не видят лицензию.
Так как первопричиной является «вылет» СЛК, проанализируем настройки сервера лицензирования. Чаще всего сбои происходят по следующим причинам:
C:\Program Files (x86)\1C\Licence\) в список исключений системы предотвращения выполнения данных (DEP).Если вы подозреваете, что связь между конфигуратором и базой данных действительно нарушена (например, после некорректного обновления), можно заставить платформу обновить эти связи. Разберем, как это сделать с помощью встроенного языка 1С. Создайте внешнюю обработку и выполните следующий код:
Процедура ВосстановитьПредопределенные(ИмяСправочника)
// Устанавливаем режим обновления предопределенных данных для конкретного справочника
Справочники[ИмяСправочника].УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
// Вызываем фоновое обновление
Справочники[ИмяСправочника].ВыполнитьОбновлениеПредопределенныхДанных();
Сообщить("Обновление для справочника " + ИмяСправочника + " завершено.");
КонецПроцедуры
Для справочника из нашего примера вызов будет выглядеть так: ВосстановитьПредопределенные("рестВидыМеню").
Если проблема с СЛК носит неустранимый характер (например, из-за особенностей виртуализации сервера), программисты иногда прибегают к использованию расширений. Рассмотрим этот метод: в расширении можно перехватить процедуру ПриСозданииНаСервере формы списка и программно заполнить отбор, обращаясь к элементу не через точку (как к предопределенному), а через поиск по наименованию или коду. Это позволит форме открыться даже при временном сбое связи с лицензией, хотя основной функционал (проведение чеков) все равно потребует работающего СЛК.
Мы проанализировали ситуацию и выяснили, что ошибка Предопределенный элемент отсутствует в данных в решениях от Рарус — это не баг платформы, а следствие работы механизма защиты. Система лицензирования ограничивает права доступа (RLS), из-за чего предопределенные записи становятся «невидимыми» для кода. Основное решение заключается в обновлении компонентов СЛК до последних версий (не ниже 3.0.19) и настройке стабильного соединения с ключом защиты.