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