Как выбрать все элементы справочника в 1С без использования запроса

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

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

Стандартный метод обхода справочника

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

Проанализируем базовый программный код:


Выборка = Справочники.Номенклатура.Выбрать();

Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Наименование);
КонецЦикла;

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

Работа с помеченными на удаление элементами

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

Посмотрим на пример с фильтрацией удаленных объектов:


Выборка = Справочники.Контрагенты.Выбрать();

Пока Выборка.Следующий() Цикл
    Если Выборка.ПометкаУдаления Тогда
        Продолжить; // Пропускаем «мусорные» записи
    КонецЕсли;
    
    // Здесь выполняем полезные действия
    Сообщить("Обрабатываем клиента: " + Выборка.Наименование);
КонецЦикла;

Таким образом, мы гарантируем, что логика будет применена только к актуальным данным, сохраняя при этом простоту кода без использования запросов.

Расширенные возможности метода Выбрать()

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

  1. Параметр Родитель: Если справочник иерархический, мы можем выбрать элементы только внутри конкретной группы. Это избавляет от необходимости перебирать весь справочник целиком.
  2. Параметр Владелец: Крайне важен для подчиненных справочников (например, «Договоры контрагентов»). Указав владельца, мы получим только те записи, которые относятся к конкретному объекту.
  3. Параметр Отбор: Это структура, позволяющая задать фильтрацию по определенным полям. Однако важно помнить: отбор будет работать эффективно только по тем реквизитам, для которых в Конфигураторе установлено свойство «Индексировать».
  4. Параметр Порядок: Позволяет задать сортировку, например, по коду или наименованию.

Разберем пример использования отбора и родителя:


СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("ВидНоменклатуры", Перечисления.ВидыНоменклатуры.Товар);

ГруппаДляПоиска = Справочники.Номенклатура.НайтиПоНаименованию("Запчасти");

Выборка = Справочники.Номенклатура.Выбрать(ГруппаДляПоиска, , СтруктураОтбора, "Наименование");

Пока Выборка.Следующий() Цикл
    // Код обработки товаров из группы "Запчасти"
КонецЦикла;

Иерархическая выборка элементов

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

Этот метод работает аналогично, но выстраивает дерево объектов. Проанализируем ситуацию: если мы строим отчет или визуальное дерево, ВыбратьИерархически() станет незаменимым инструментом, так как он логически группирует данные.

Сравнение с запросами: производительность и память

Важно понимать технические нюансы работы платформы при использовании объектного метода Выбрать() в сравнении с Запросом. Рассмотрим основные отличия:

Чтение данных: Когда мы используем запрос, мы можем выбрать только нужные поля (например, Ссылка и Артикул). Метод Выбрать() считывает объект целиком со всеми его реквизитами, табличными частями и дополнительными сведениями. Если справочник «тяжелый» (содержит много данных), это создаст серьезную нагрузку на сеть и сервер приложений.

Потребление памяти: Здесь у метода Выбрать() есть преимущество перед выгрузкой запроса в Таблицу Значений. Выборка считывает данные порциями (динамически). Если в справочнике миллион элементов, попытка выгрузить их все в таблицу через запрос может привести к переполнению оперативной памяти. Цикл по выборке в этом случае будет работать стабильнее, так как в памяти одновременно находится только текущий объект.

Сложность условий: Запросы позволяют строить сложные связи (ЛЕВОЕ СОЕДИНЕНИЕ), использовать агрегатные функции (СУММА, МАКСИМУМ) и сложные условия (ГДЕ Реквизит В (...)). Метод Выбрать() ограничен лишь простейшим равенством в структуре отбора.

Когда стоит использовать Выбрать()?

Проанализировав все возможности, мы можем выделить сценарии, где этот метод будет наиболее уместен:

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

← На главную