При внедрении «1С:Библиотеки подключаемого оборудования» (БПО) в самописную или типовую конфигурацию программисты часто сталкиваются с загадочной ситуацией: в Конфигураторе справочник ДрайверыОборудования содержит предопределенные элементы, но в режиме «1С:Предприятие» список оказывается абсолютно пустым. Попытки программно обратиться к этим элементам могут вызывать ошибку «Предопределенный элемент отсутствует в данных». Рассмотрим подробно, почему так происходит, и разберем по шагам все способы решения этой задачи.
Ситуация, когда метаданные содержат описание предопределенных элементов, а база данных — нет, обусловлена механизмом работы платформы 1С 8.3 и спецификой самой БПО. Проанализируем основные факторы:
Авто, платформа может не создать записи в таблицах БД мгновенно после объединения конфигураций.Первым делом попробуем стандартный механизм платформы для инициализации обновлений. Рассмотрим ситуацию, когда база «не поняла», что ей нужно создать новые системные записи. Запустим информационную базу с ключом:
/ЗапуститьОбновлениеИнформационнойБазы
Этот параметр заставляет систему выполнить процедуры, прописанные в обработчиках обновления БСП (если она используется) и инициирует сверку предопределенных данных метаданных с данными в таблицах SQL или файловой базы.
Если обновление через ключ запуска не помогло, необходимо принудительно запустить процедуру инициализации поставляемых драйверов. В составе БПО есть специальные методы, которые считывают данные из макетов и создают/обновляют элементы справочника ДрайверыОборудования.
Для версий БПО старого образца (например, 2.1) используем следующий код, который можно выполнить во внешней обработке или в консоли кода с ИИ-помощником:
МенеджерОборудованияВызовСервераПереопределяемый.ОбновитьПоставляемыеДрайвера();
Этот метод просканирует метаданные, найдет все предопределенные драйверы и заполнит их реквизиты данными из соответствующих макетов конфигурации.
В новых редакциях библиотеки (3.1 и выше) структура модулей изменилась. Рассмотрим, как программно восстановить драйверы в этом случае. Разберем пример вызова метода из общего модуля:
МенеджерОборудования.ОбновитьПоставляемыеДрайвера();
Проанализируем ситуацию подробнее: часто программисты замечают, что даже в консоли запросов предопределенные элементы не видны. Это происходит потому, что в БПО на справочник могут быть наложены функциональные опции или ограничения, которые скрывают записи с незаполненными ключевыми полями. Вызов указанной выше процедуры гарантированно заполняет эти поля, после чего элементы «проявляются» в интерфейсе.
Если программные методы не помогают, проверим настройки самого объекта метаданных. Выясним, как установлено управление данными:
ДрайверыОборудования.Не обновлять автоматически, то платформа никогда не создаст элементы сама. Установим значение Обновлять автоматически.Важный нюанс: для распределенных информационных баз (РИБ) значение Авто в подчиненном узле эквивалентно Не обновлять автоматически. Если вы внедряете БПО в периферийную базу, создание элементов должно произойти в главном узле и прийти через обмен, либо нужно временно установить режим Обновлять автоматически непосредственно в узле.
Если вы столкнулись с ошибкой «Предопределенный элемент отсутствует в данных» при попытке получить ссылку через Справочники.ДрайверыОборудования.ИмяЭлемента, можно воспользоваться низкоуровневым методом платформы для восстановления связи метаданных и таблиц базы данных:
Справочники.ДрайверыОборудования.СоздатьПредопределенныеДанные();
Этот метод рекомендуется использовать с осторожностью. После его выполнения обязательно запустите процедуру из Решения 3 (ОбновитьПоставляемыеДрайвера), чтобы наполнить созданные «пустышки» реальными файлами драйверов и настройками.
Если после всех манипуляций справочник всё еще пуст, проанализируем следующие моменты:
ИспользоватьПодключаемоеОборудование. Часто видимость элементов в формах БПО завязана именно на этот флаг.ДрайверыОборудования.Таким образом, внедрение БПО требует не только механического переноса объектов, но и запуска внутренних механизмов инициализации данных. Использование метода ОбновитьПоставляемыеДрайвера является наиболее эффективным и правильным способом решения проблемы «исчезнувших» драйверов.