Как обойти все предопределенные элементы справочника в 1С?

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

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

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

Способ 1. Получение имен через метод метаданных ПолучитьИменаПредопределенных

Если нам необходимо получить список элементов, которые жестко описаны в структуре конфигурации (в дереве метаданных), воспользуемся методом ПолучитьИменаПредопределенных() объекта метаданных справочника. Этот метод возвращает одномерный массив строк, содержащий имена предопределенных элементов.

Посмотрим на пример программного обхода массива имен и получения соответствующих ссылок через менеджер справочника:


ИмяСправочника = "Номенклатура";
ОбъектМетаданных = Метаданные.Справочники[ИмяСправочника];

МассивИмен = ОбъектМетаданных.ПолучитьИменаПредопределенных();

Для Каждого ИмяЭлемента Из МассивИмен Цикл
    СсылкаНаЭлемент = Справочники[ИмяСправочника][ИмяЭлемента];
    
    // Проверяем, существует ли физическая ссылка в базе
    Если Не СсылкаНаЭлемент.Пустая() Тогда
        // Выполняем необходимые действия с элементом
        Сообщить("Предопределенный элемент: " + СсылкаНаЭлемент);
    Иначе
        Сообщить("Элемент " + ИмяЭлемента + " объявлен в метаданных, но не создан в базе данных!");
    КонецЕсли;
КонецЦикла;

Разберем важные особенности и ограничения данного метода:

  1. Плоская структура: метод ПолучитьИменаПредопределенных() возвращает плоский массив строк. Он не хранит иерархию (родительские связи) и не указывает, является ли элемент группой или обычным элементом.
  2. Физическое наличие в базе: если в конфигурации отключено обновление предопределенных данных или база еще не прошла процедуру реструктуризации/обновления, обращение к менеджеру справочника вида Справочники[ИмяСправочника][ИмяЭлемента] может вернуть пустую ссылку. Поэтому проверка Ссылка.Пустая() обязательна.
  3. Элементы, созданные в режиме Предприятия: начиная с версии платформы 8.3, предопределенные элементы могут создаваться программно в пользовательском режиме (путем заполнения свойства ИмяПредопределенныхДанных). Метод метаданных ПолучитьИменаПредопределенных() такие элементы не возвращает, так как они отсутствуют в дереве конфигурации.

Способ 2. Обход предопределенных элементов через запрос к базе данных

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

В языке запросов 1С доступны два ключевых стандартных реквизита:

  1. Предопределенный — булевый флаг, указывающий, что запись является предопределенной.
  2. ИмяПредопределенныхДанных — строковое имя предопределенного элемента, совпадающее с именем в конфигураторе или назначенное программно.

Рассмотрим пример запроса для выборки всех предопределенных элементов справочника:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Спр.Ссылка КАК Ссылка,
    |	Спр.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных,
    |	Спр.ПометкаУдаления КАК ПометкаУдаления
    |ИЗ
    |	Справочник.Номенклатура КАК Спр
    |ГДЕ
    |	Спр.Предопределенный = ИСТИНА";

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    Сообщить("Найдена ссылка: " + Строка(Выборка.Ссылка) + " (Имя: " + Выборка.ИмяПредопределенныхДанных + ")");
КонецЦикла;

Обращение к конкретному элементу в запросе

Если в запросе требуется сослаться на конкретный предопределенный элемент, описанный в конфигураторе, используется конструкция ЗНАЧЕНИЕ. Проанализируем пример такого отбора:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Спр.Ссылка КАК Ссылка,
    |	Спр.Наименование КАК Наименование
    |ИЗ
    |	Справочник.Номенклатура КАК Спр
    |ГДЕ
    |	Спр.Ссылка = ЗНАЧЕНИЕ(Справочник.Номенклатура.ОсновнаяГруппа)";

Выборка = Запрос.Выполнить().Выбрать();

Итоги и рекомендации

Выясним, когда какой подход следует применять:

  1. Используйте Метаданные.Справочники[Имя].ПолучитьИменаПредопределенных(), когда нужно проанализировать состав конфигурации до обращения к таблицам базы или выполнить проверку целостности данных после обновления.
  2. Используйте запрос к базе данных с отбором по Предопределенный = ИСТИНА, когда нужно получить актуальные ссылки, значения реквизитов и учесть элементы, созданные программно в пользовательском режиме.
← На главную