При разработке прикладных решений на платформе 1С:Предприятие часто возникает задача получить список всех предопределенных элементов конкретного справочника. Например, это требуется при первоначальной инициализации настроек, пакетной обработке системных данных или проверке корректности заполнения информационной базы.
В зависимости от поставленной задачи получить такие элементы можно двумя путями: через метаданные конфигурации (состав элементов, заложенный в конфигураторе) или через запрос к физической таблице базы данных. Разберем по шагам каждый из способов, а также рассмотрим важные нюансы работы с предопределенными данными.
Если нам необходимо получить список элементов, которые жестко описаны в структуре конфигурации (в дереве метаданных), воспользуемся методом ПолучитьИменаПредопределенных() объекта метаданных справочника. Этот метод возвращает одномерный массив строк, содержащий имена предопределенных элементов.
Посмотрим на пример программного обхода массива имен и получения соответствующих ссылок через менеджер справочника:
ИмяСправочника = "Номенклатура";
ОбъектМетаданных = Метаданные.Справочники[ИмяСправочника];
МассивИмен = ОбъектМетаданных.ПолучитьИменаПредопределенных();
Для Каждого ИмяЭлемента Из МассивИмен Цикл
СсылкаНаЭлемент = Справочники[ИмяСправочника][ИмяЭлемента];
// Проверяем, существует ли физическая ссылка в базе
Если Не СсылкаНаЭлемент.Пустая() Тогда
// Выполняем необходимые действия с элементом
Сообщить("Предопределенный элемент: " + СсылкаНаЭлемент);
Иначе
Сообщить("Элемент " + ИмяЭлемента + " объявлен в метаданных, но не создан в базе данных!");
КонецЕсли;
КонецЦикла;
Разберем важные особенности и ограничения данного метода:
ПолучитьИменаПредопределенных() возвращает плоский массив строк. Он не хранит иерархию (родительские связи) и не указывает, является ли элемент группой или обычным элементом.Справочники[ИмяСправочника][ИмяЭлемента] может вернуть пустую ссылку. Поэтому проверка Ссылка.Пустая() обязательна.ИмяПредопределенныхДанных). Метод метаданных ПолучитьИменаПредопределенных() такие элементы не возвращает, так как они отсутствуют в дереве конфигурации.Если требуется получить элементы, которые уже физически записаны в информационной базе (включая иерархию, реквизиты и элементы, созданные в режиме «1С:Предприятие»), оптимально использовать запрос к таблице справочника.
В языке запросов 1С доступны два ключевых стандартных реквизита:
Рассмотрим пример запроса для выборки всех предопределенных элементов справочника:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Спр.Ссылка КАК Ссылка,
| Спр.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных,
| Спр.ПометкаУдаления КАК ПометкаУдаления
|ИЗ
| Справочник.Номенклатура КАК Спр
|ГДЕ
| Спр.Предопределенный = ИСТИНА";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Найдена ссылка: " + Строка(Выборка.Ссылка) + " (Имя: " + Выборка.ИмяПредопределенныхДанных + ")");
КонецЦикла;
Если в запросе требуется сослаться на конкретный предопределенный элемент, описанный в конфигураторе, используется конструкция ЗНАЧЕНИЕ. Проанализируем пример такого отбора:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Спр.Ссылка КАК Ссылка,
| Спр.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Спр
|ГДЕ
| Спр.Ссылка = ЗНАЧЕНИЕ(Справочник.Номенклатура.ОсновнаяГруппа)";
Выборка = Запрос.Выполнить().Выбрать();
Выясним, когда какой подход следует применять:
Метаданные.Справочники[Имя].ПолучитьИменаПредопределенных(), когда нужно проанализировать состав конфигурации до обращения к таблицам базы или выполнить проверку целостности данных после обновления.Предопределенный = ИСТИНА, когда нужно получить актуальные ссылки, значения реквизитов и учесть элементы, созданные программно в пользовательском режиме.