К статье
Практический материал

Справочники и Данные · 10 мин

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

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

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

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

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

Как выделить все элементы в форме списка справочника

Самый быстрый способ — открыть справочник, установить курсор в табличную часть списка и нажать Ctrl+A. Выделяются все строки, которые в данный момент отображаются в списке. Альтернатива — меню «Ещё» (или кнопка действий списка) → команда «Выделить все». В тонком клиенте и веб-клиенте поведение одинаковое.

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

После выделения доступны групповые действия: «Пометить на удаление / Снять пометку», «Переместить в группу», а в типовых конфигурациях — «Изменить выделенные» (групповое изменение реквизитов). Команда группового изменения открывает форму, где можно задать новое значение реквизита сразу для всех выделенных строк.

Порядок действий в форме списка
  1. 1
    Откройте справочник и снимите все отборы и поиск
  2. 2
    Переключите вид списка при необходимости: «Список» показывает все элементы без группировки
  3. 3
    Установите курсор в список и нажмите Ctrl+A
  4. 4
    Проверьте, что выделены нужные строки, затем выполните групповое действие
  5. 5
    После операции обновите список (F5) и убедитесь в результате

Особенности выделения в иерархических справочниках

В иерархических справочниках (с группами и элементами) режим просмотра влияет на то, что именно будет выделено. В режиме «Дерево» выделение через Ctrl+A охватывает раскрытые узлы; свёрнутые группы могут остаться неохваченными. В режиме «Список» отображаются все элементы плоским перечнем, и выделение работает предсказуемо.

Если нужно выделить только элементы одной группы вместе с подгруппами, проще установить отбор по родителю или перейти в группу и включить режим «Иерархический список», а затем уже применять Ctrl+A. Это надёжнее, чем вручную выделять ветки дерева с зажатой клавишей Shift.

При групповом перемещении учтите: группы и элементы — разные виды записей. Перенос группы внутрь самой себя платформа заблокирует, но массовый перенос большого числа элементов в другую группу может занять заметное время в клиент-серверном варианте.

Программный перебор всех элементов через запрос

Для разработчика основной и самый производительный способ получить все элементы справочника — запрос. Запрос возвращает только нужные поля, не создаёт объектов в памяти и позволяет сразу наложить условия.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка,

| Номенклатура.Наименование КАК Наименование

|ИЗ

| Справочник.Номенклатура КАК Номенклатура";

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

Пока Выборка.Следующий() Цикл

// Обработка элемента: Выборка.Ссылка, Выборка.Наименование

КонецЦикла;

Чтобы исключить помеченные на удаление элементы, добавьте условие ГДЕ НЕ Номенклатура.ПометкаУдаления. Для иерархического справочника можно отфильтровать группы условием ГДЕ НЕ Номенклатура.ЭтоГруппа — это частая потребность, потому что группы обычно не участвуют в обработке данных.

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

bsl
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ НЕ ПометкаУдаления И НЕ ЭтоГруппа");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Объект = Выборка.Ссылка.ПолучитьОбъект();
	// изменение реквизитов
	Объект.Записать();
КонецЦикла;

Перебор через метод Выбрать() менеджера справочника

Объектный способ без запроса — метод Выбрать() менеджера справочника. Он поддерживает отбор, порядок и обход с учётом иерархии.

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

Пока Выборка.Следующий() Цикл

Если Выборка.ЭтоГруппа Тогда

Продолжить;

КонецЕсли;

// Работа со ссылкой: Выборка.Ссылка

КонецЦикла;

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

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

Сравнение способов

Ctrl+A в форме списка

Для разовых интерактивных операций пользователем. Ограничение: действует только на видимые с учётом отборов строки.

Запрос

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

Метод Выбрать()

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

Групповая обработка «Изменить выделенные»

Для типового массового изменения реквизитов без программирования. Ограничение: доступна не во всех конфигурациях и требует соответствующих прав.

Права, блокировки и ограничения

Интерактивное выделение доступно любому пользователю с правом просмотра справочника, но групповые действия требуют прав на изменение или интерактивное удаление. Если команда «Пометить на удаление» недоступна — проверьте роли пользователя.

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

Ещё одно ограничение: обход выборки на сервере в фоновом задании не имеет доступа к интерфейсу, поэтому интерактивные команды (Ctrl+A, «Выделить все») из кода недоступны — только запросы и объектная модель.

Типичные ошибки
01
Ctrl+A при активном отборе: обрабатывается только часть элементов, остальные пропускаются незаметно
02
Отсутствие фильтра ЭтоГруппа: группы попадают в обработку как обычные элементы и искажают результат
03
Игнорирование пометки удаления: в выгрузку или расчёт попадают фактически удалённые записи
04
Изменение объекта через Ссылка.ПолучитьОбъект() внутри цикла без необходимости: резкое падение производительности на больших объёмах
05
Запись всех элементов одной транзакцией в многопользовательской базе: блокировки и откат при ошибке на последнем элементе

Как проверить, что обработаны все элементы

После групповой операции или программной обработки полезно сверить количество. Простой способ — запросом посчитать записи: ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Справочник.Номенклатура ГДЕ НЕ ПометкаУдаления — и сравнить с числом обработанных в цикле элементов (для этого ведите счётчик).

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

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

Контрольные точки

Как проверить результат

Количество обработанных элементов
Норма

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

Тревожный признак

Меньше ожидаемого: вероятно, сработал отбор, фильтр или обход прервался

Состав выделения в форме
Норма

Выделены все строки списка, отборы сняты

Тревожный признак

Выделена часть строк, в заголовке списка виден активный отбор

Состояние данных после изменения
Норма

Реквизиты изменены у всех целевых элементов, пометки удаления корректны

Тревожный признак

У части элементов старые значения или ошибочно изменены группы

Частые вопросы

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

Чаще всего причина в активном отборе, строке поиска или режиме просмотра «Дерево» со свёрнутыми группами. Снимите отборы, очистите поиск и переключитесь в режим «Список», затем повторите выделение.

Как выделить элементы только одной группы со всеми подгруппами?

Установите курсор на нужную группу и включите режим «Иерархический список» — отобразятся элементы группы и вложенных подгрупп. После этого Ctrl+A выделит именно эту ветку. Программно используйте ВыбратьИерархически(Родитель) или запрос с условием Ссылка В ИЕРАРХИИ(&Группа).

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

Добавьте в текст запроса условие ГДЕ НЕ Справочник.ПометкаУдаления. При обходе через Выбрать() проверяйте свойство Выборка.ПометкаУдаления внутри цикла и пропускайте такие записи.

Чем отличается перебор через Выбрать() от запроса?

Запрос позволяет выбирать произвольные поля, соединять таблицы и накладывать сложные условия — он предпочтителен для больших объёмов. Метод Выбрать() проще в написании и удобен для иерархического обхода или отбора по владельцу, но менее гибок.

Можно ли отменить групповое изменение элементов?

Штатной кнопки отмены нет: изменения записываются в базу сразу. Восстановить данные можно только из резервной копии или повторной обработкой с прежними значениями. Поэтому перед массовой операцией делайте выгрузку базы или тестируйте на копии.

Как обработать миллион элементов без блокировок?

Используйте фоновое задание с обработкой порциями: выбирайте пачку ссылок запросом, изменяйте и записывайте их в короткой транзакции, фиксируйте прогресс и переходите к следующей порции. Запускайте обработку в период минимальной активности пользователей.

Итог

Что важно запомнить

В форме списка все видимые элементы выделяются через Ctrl+A при снятых отборах; в иерархических справочниках используйте режим «Список» или «Иерархический список». Программно применяйте запрос с фильтрами по пометке удаления и группам либо метод Выбрать(). Перед массовыми изменениями проверяйте состав выборки и делайте резервную копию.