Как восстановить скрытые или отсутствующие предопределенные элементы справочника в 1С?

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

В практике разработчика 1С нередко встречается ситуация, когда в конфигураторе мы видим предопределенные элементы справочника, но при запуске программы в режиме «Предприятие» они отсутствуют в списках. Более того, даже консоль запросов показывает пустой результат при попытке выбрать эти данные. Особенно часто это происходит при работе с типовыми конфигурациями, использующими БПО (Библиотеку подключаемого оборудования), или при попытках восстановить «обрезанные» базы. Разберемся детально, почему так происходит и как это исправить.

Анализ механизмов платформы 1С 8.3 по работе с предопределенными данными

Начиная с версии платформы 8.3, механизм управления предопределенными данными претерпел значительные изменения. Если раньше платформа безусловно создавала элементы в базе данных при обновлении конфигурации, то теперь этот процесс стал гибко настраиваемым. Проанализируем ключевое свойство объекта метаданных — «Обновление предопределенных данных».

Рассмотрим три возможных значения этого свойства:

  1. Авто: Стандартное поведение, при котором платформа автоматически синхронизирует список элементов в конфигураторе с таблицами базы данных при каждом обновлении конфигурации базы данных.
  2. Не обновлять автоматически: В этом режиме платформа полностью игнорирует предопределенные данные при реструктуризации. Элементы будут существовать в метаданных, но физических записей в таблицах SQL или файловой базы не появится.
  3. Обновлять только при создании: Элементы будут созданы один раз при первом запуске информационной базы. Дальнейшие изменения (например, добавление новых элементов в конфигураторе) не приведут к их автоматическому появлению в режиме «Предприятие».

В ситуациях с «обрезанными» или сильно кастомизированными конфигурациями разработчики часто устанавливают значение «Не обновлять автоматически». Это делается для того, чтобы управлять созданием данных программно или исключить лишние элементы, которые не планируется использовать в конкретной сборке системы.

Почему элементы не видны в консоли запросов?

Выясним причину, по которой консоль запросов не видит такие данные. Важно понимать разницу между описанием объекта в метаданных и записью объекта в базе. Когда мы создаем предопределенный элемент в конфигураторе, мы создаем ссылку с определенным именем (идентификатором). Однако физическая запись в таблице базы данных (например, в таблице _ReferenceXX) появляется только в момент синхронизации. Если синхронизация отключена, запрос к таблице не находит строк с соответствующими внутренними идентификаторами (GUID), и результат остается пустым.

При обращении в коде через точку, например Справочники.ДрайверыОборудования.СканерШтрихкода, платформа вернет ссылку, которая внешне может выглядеть как объект, но метод ПолучитьОбъект() для нее вернет Неопределено, а обращение к реквизитам вызовет ошибку или вернет пустые значения.

Программное восстановление предопределенных данных

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

Для принудительного обновления можно использовать глобальный метод менеджера справочника. Разберем по шагам пример кода, который можно выполнить во внешней обработке:


// Включаем режим автоматического обновления для справочника
Справочники.ДрайверыОборудования.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.Авто);

// Принудительно вызываем синхронизацию данных
Справочники.ДрайверыОборудования.ОбновитьПредопределенныеДанные();

// Сообщаем о завершении процесса
Сообщить("Синхронизация предопределенных элементов завершена успешно.");

После выполнения этого кода платформа проверит соответствие метаданных и данных в таблицах и создаст недостающие записи. Однако стоит помнить, что в сложных библиотеках, таких как БПО, этого может быть недостаточно.

Особенности работы с Библиотекой подключаемого оборудования (БПО)

Проанализируем ситуацию, специфичную для БПО. В этой библиотеке справочник ДрайверыОборудования управляется не только платформенными механизмами, но и прикладной логикой. Часто предопределенные элементы в конфигураторе — это лишь «заготовки», а их реальное наполнение (связь с макетами драйверов, установка идентификаторов) происходит через специальные процедуры обновления.

Для восстановления данных в конфигурациях, использующих БПО, следует обратить внимание на общий модуль МенеджерОборудованияВызовСервераПереопределяемый. В нем обычно содержится процедура, отвечающая за актуализацию списка драйверов. Посмотрим на пример вызова, который помог решить проблему в обсуждаемой теме:


// Вызов штатного метода БПО для инициализации драйверов
МенеджерОборудованияВызовСервераПереопределяемый.ОбновитьПоставляемыеДрайвера();

Что происходит внутри этой процедуры? Проанализируем алгоритм ее работы:

  1. Система обращается к программному перечню (массиву структур), в котором описаны все поддерживаемые драйверы (включая ТСД, сканеры, ККТ).
  2. Для каждого элемента из списка проверяется наличие соответствующего предопределенного элемента в базе данных.
  3. Если элемент найден в метаданных, но отсутствует в базе, процедура создает его, заполняет необходимые реквизиты (например, ИдентификаторОбъекта, ОбработчикДрайвера) и записывает.

Если в вашей «обрезанной» конфигурации процедура ОбновитьПоставляемыеДрайвера() была модифицирована (например, из нее удалили строки, отвечающие за терминалы сбора данных), вам придется сначала вернуть эти строки в программный код модуля, а затем запустить процедуру обновления повторно.

Пошаговая инструкция по поиску и отображению скрытых элементов

Рассмотрим общий алгоритм действий, если вы столкнулись с подобной проблемой:

Шаг 1: Проверка в конфигураторе. Найдите нужный справочник и перейдите на закладку «Прочее». Проверьте значение поля «Обновление предопределенных данных». Если там стоит «Не обновлять автоматически», это и есть корень проблемы.

Шаг 2: Проверка функциональных опций. Выясним, не привязан ли предопределенный элемент к какой-либо функциональной опции. Если функциональная опция выключена, элемент будет скрыт в интерфейсе (в формах списков и выбора), хотя в базе данных он физически существует. Если это ваш случай — просто включите соответствующую опцию в константах или настройках программы.

Шаг 3: Программная инициализация. Если функциональные опции ни при чем, создайте внешнюю обработку и выполните метод ОбновитьПредопределенныеДанные(), как было рассмотрено выше. Это «оживит» ссылки, созданные в конфигураторе.

Шаг 4: Поиск специализированных обработчиков. Проанализируйте модули на предмет поиска процедур со словами Обновить, Заполнить, Инициализировать в сочетании с именем вашего справочника. В типовых решениях (БСП, БПО) всегда есть механизмы, которые отрабатывают при первом запуске или при обновлении версии ИБ. Именно они зачастую «досоздают» то, что не создала платформа автоматически.

Шаг 5: Проверка прав доступа. В редких случаях элементы могут быть не видны из-за ограничений на уровне записей (RLS). Попробуйте выполнить запрос к данным под пользователем с полными правами, чтобы исключить этот фактор.

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

← На главную