Справочники и Данные · 10 мин
Как выделить все элементы справочника в 1С
Способы выделить все элементы справочника 1С: горячие клавиши в форме списка, выборка запросом и обходом в коде, обработка групп и помеченных на удаление.
Задача выделить все элементы справочника в 1С возникает в двух разных ситуациях. Первая — работа пользователя в форме списка, когда нужно выделить записи для групповой обработки: пометить на удаление, перенести в группу, распечатать или изменить реквизит. Вторая — работа разработчика, когда требуется программно перебрать все элементы справочника для расчёта, выгрузки или пакетного изменения данных.
Подходы принципиально различаются. В интерфейсе достаточно сочетания клавиш и стандартной команды «Выделить все», а в коде используются запросы, выборки через объектную модель или метод Выбрать() менеджера справочника. У каждого способа есть ограничения по производительности, учёту иерархии и обработке помеченных на удаление объектов.
Ниже разобраны оба сценария: интерактивное выделение в форме списка и программный обход всех элементов с примерами кода, типичными ошибками и способами проверить результат.
Как выделить все элементы в форме списка справочника
Самый быстрый способ — открыть справочник, установить курсор в табличную часть списка и нажать Ctrl+A. Выделяются все строки, которые в данный момент отображаются в списке. Альтернатива — меню «Ещё» (или кнопка действий списка) → команда «Выделить все». В тонком клиенте и веб-клиенте поведение одинаковое.
Важный нюанс: выделяются только те элементы, которые соответствуют текущим настройкам списка. Если установлен отбор, включён режим просмотра «Иерархический список» с раскрытой конкретной группой или действует отбор по владельцу, выделение распространится только на видимые записи. Перед групповой операцией убедитесь, что отборы сняты: иначе часть элементов останется вне обработки, а часть попадёт в неё ошибочно.
После выделения доступны групповые действия: «Пометить на удаление / Снять пометку», «Переместить в группу», а в типовых конфигурациях — «Изменить выделенные» (групповое изменение реквизитов). Команда группового изменения открывает форму, где можно задать новое значение реквизита сразу для всех выделенных строк.
- 1Откройте справочник и снимите все отборы и поиск
- 2Переключите вид списка при необходимости: «Список» показывает все элементы без группировки
- 3Установите курсор в список и нажмите Ctrl+A
- 4Проверьте, что выделены нужные строки, затем выполните групповое действие
- 5После операции обновите список (F5) и убедитесь в результате
Особенности выделения в иерархических справочниках
В иерархических справочниках (с группами и элементами) режим просмотра влияет на то, что именно будет выделено. В режиме «Дерево» выделение через Ctrl+A охватывает раскрытые узлы; свёрнутые группы могут остаться неохваченными. В режиме «Список» отображаются все элементы плоским перечнем, и выделение работает предсказуемо.
Если нужно выделить только элементы одной группы вместе с подгруппами, проще установить отбор по родителю или перейти в группу и включить режим «Иерархический список», а затем уже применять Ctrl+A. Это надёжнее, чем вручную выделять ветки дерева с зажатой клавишей Shift.
При групповом перемещении учтите: группы и элементы — разные виды записей. Перенос группы внутрь самой себя платформа заблокирует, но массовый перенос большого числа элементов в другую группу может занять заметное время в клиент-серверном варианте.
Программный перебор всех элементов через запрос
Для разработчика основной и самый производительный способ получить все элементы справочника — запрос. Запрос возвращает только нужные поля, не создаёт объектов в памяти и позволяет сразу наложить условия.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Обработка элемента: Выборка.Ссылка, Выборка.Наименование
КонецЦикла;
Чтобы исключить помеченные на удаление элементы, добавьте условие ГДЕ НЕ Номенклатура.ПометкаУдаления. Для иерархического справочника можно отфильтровать группы условием ГДЕ НЕ Номенклатура.ЭтоГруппа — это частая потребность, потому что группы обычно не участвуют в обработке данных.
Если элементов много и планируется их изменение, имеет смысл получать результат пачками (обход результата запроса с последующей записью объектов внутри транзакции) либо использовать пакетную обработку, чтобы не держать длинную транзакцию на всю таблицу.
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ НЕ ПометкаУдаления И НЕ ЭтоГруппа");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
// изменение реквизитов
Объект.Записать();
КонецЦикла;Перебор через метод Выбрать() менеджера справочника
Объектный способ без запроса — метод Выбрать() менеджера справочника. Он поддерживает отбор, порядок и обход с учётом иерархии.
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
// Работа со ссылкой: Выборка.Ссылка
КонецЦикла;
Метод ВыбратьИерархически(Родитель) обходит элементы внутри заданной группы, включая вложенные. Это удобно, когда нужно обработать только одну ветку справочника. В параметры Выбрать() можно передать отбор, например по владельцу для подчинённого справочника: Справочники.ЕдиницыИзмерения.Выбрать(, ВладелецСсылка).
По скорости выборка через Выбрать() обычно сопоставима с запросом на чтение, но запрос гибче: позволяет получить сразу несколько полей, соединения с другими таблицами и группировки. Для сложных условий предпочитайте запрос.
Сравнение способов
Для разовых интерактивных операций пользователем. Ограничение: действует только на видимые с учётом отборов строки.
Для программной обработки любых объёмов, сложных условий и соединений. Ограничение: требует прав на разработку или внешнюю обработку.
Для простого обхода с иерархией или отбором по владельцу. Ограничение: менее гибкий при сложных условиях, чем запрос.
Для типового массового изменения реквизитов без программирования. Ограничение: доступна не во всех конфигурациях и требует соответствующих прав.
Права, блокировки и ограничения
Интерактивное выделение доступно любому пользователю с правом просмотра справочника, но групповые действия требуют прав на изменение или интерактивное удаление. Если команда «Пометить на удаление» недоступна — проверьте роли пользователя.
При программной записи большого числа элементов в клиент-серверной базе возможны блокировки: другие пользователи, работающие с теми же элементами, получат ошибки конфликта. Рекомендуется выполнять массовые обработки вне пиковой нагрузки и записывать объекты порциями с фиксацией транзакции, а не одной длинной транзакцией на всю выборку.
Ещё одно ограничение: обход выборки на сервере в фоновом задании не имеет доступа к интерфейсу, поэтому интерактивные команды (Ctrl+A, «Выделить все») из кода недоступны — только запросы и объектная модель.
Как проверить, что обработаны все элементы
После групповой операции или программной обработки полезно сверить количество. Простой способ — запросом посчитать записи: ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Справочник.Номенклатура ГДЕ НЕ ПометкаУдаления — и сравнить с числом обработанных в цикле элементов (для этого ведите счётчик).
В форме списка ориентиром служит строка состояния или счётчик выделенных строк в групповой обработке: типовые механизмы показывают, сколько объектов будет изменено, до подтверждения операции. Не подтверждайте действие, пока число не совпадёт с ожидаемым.
Если обработка прервалась ошибкой, повторный запуск должен быть безопасен: проектируйте код так, чтобы повторная обработка уже изменённого элемента не портила данные (идемпотентность), либо ведите учёт обработанных ссылок.
Как проверить результат
Совпадает с числом записей по запросу без помеченных на удаление
Меньше ожидаемого: вероятно, сработал отбор, фильтр или обход прервался
Выделены все строки списка, отборы сняты
Выделена часть строк, в заголовке списка виден активный отбор
Реквизиты изменены у всех целевых элементов, пометки удаления корректны
У части элементов старые значения или ошибочно изменены группы
Частые вопросы
Почему Ctrl+A выделяет не все элементы справочника?
Чаще всего причина в активном отборе, строке поиска или режиме просмотра «Дерево» со свёрнутыми группами. Снимите отборы, очистите поиск и переключитесь в режим «Список», затем повторите выделение.
Как выделить элементы только одной группы со всеми подгруппами?
Установите курсор на нужную группу и включите режим «Иерархический список» — отобразятся элементы группы и вложенных подгрупп. После этого Ctrl+A выделит именно эту ветку. Программно используйте ВыбратьИерархически(Родитель) или запрос с условием Ссылка В ИЕРАРХИИ(&Группа).
Как в запросе исключить помеченные на удаление элементы?
Добавьте в текст запроса условие ГДЕ НЕ Справочник.ПометкаУдаления. При обходе через Выбрать() проверяйте свойство Выборка.ПометкаУдаления внутри цикла и пропускайте такие записи.
Чем отличается перебор через Выбрать() от запроса?
Запрос позволяет выбирать произвольные поля, соединять таблицы и накладывать сложные условия — он предпочтителен для больших объёмов. Метод Выбрать() проще в написании и удобен для иерархического обхода или отбора по владельцу, но менее гибок.
Можно ли отменить групповое изменение элементов?
Штатной кнопки отмены нет: изменения записываются в базу сразу. Восстановить данные можно только из резервной копии или повторной обработкой с прежними значениями. Поэтому перед массовой операцией делайте выгрузку базы или тестируйте на копии.
Как обработать миллион элементов без блокировок?
Используйте фоновое задание с обработкой порциями: выбирайте пачку ссылок запросом, изменяйте и записывайте их в короткой транзакции, фиксируйте прогресс и переходите к следующей порции. Запускайте обработку в период минимальной активности пользователей.
Что важно запомнить
В форме списка все видимые элементы выделяются через Ctrl+A при снятых отборах; в иерархических справочниках используйте режим «Список» или «Иерархический список». Программно применяйте запрос с фильтрами по пометке удаления и группам либо метод Выбрать(). Перед массовыми изменениями проверяйте состав выборки и делайте резервную копию.