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

Разработка и Конфигурация · 9 мин

Как выбрать все строки в 1С: интерфейс и программные методы

Как выбрать все строки табличной части, списка или запроса в 1С: горячие клавиши, методы ВыбратьСтроки, выборка запроса, примеры кода и ошибки.

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

В пользовательском интерфейсе «Такси» выделение всех строк выполняется стандартным сочетанием клавиш Ctrl+A либо через меню «Ещё» табличной части. В программном коде для обхода строк используются коллекции: цикл Для Каждого Строка Из ... Цикл, методы ВыбратьСтроки(), НайтиСтроки() и выборка результата запроса через Выбрать().

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

Выделение всех строк в форме документа или списка

В интерфейсе «Такси» установите курсор в любую строку табличной части и нажмите Ctrl+A — будут выделены все строки текущей таблицы. Альтернатива — кнопка «Ещё» в командной панели табличной части, где доступна команда «Выделить все». Это работает в табличных частях документов, списках справочников, журналах документов и динамических списках.

Выделенные строки можно массово обработать: удалить (Delete), скопировать в буфер обмена (Ctrl+C), изменить реквизит через обработку группового изменения или перенести в другой документ через буфер. В списках справочников и документов для массовых операций удобна стандартная обработка «Групповое изменение реквизитов», которая работает именно с выделенными строками.

Порядок действий в форме
  1. 1
    Откройте документ или список и установите курсор в табличную часть
  2. 2
    Нажмите Ctrl+A или выберите «Ещё → Выделить все»
  3. 3
    Убедитесь, что все строки подсвечены
  4. 4
    Выполните нужное действие: удаление, копирование, групповое изменение
  5. 5
    Проверьте результат до записи или проведения документа

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

Перебор всех строк табличной части в коде

Табличная часть объекта — это коллекция, поэтому все её строки перебираются циклом. Типовой код на сервере выглядит так:

Для Каждого СтрокаТовары Из Объект.Товары Цикл

СтрокаТовары.Сумма = СтрокаТовары.Количество * СтрокаТовары.Цена;

КонецЦикла;

Если нужно удалить все строки, не используйте цикл с удалением — это медленно и чревато ошибками индексации. Для очистки табличной части предназначен метод Очистить():

Объект.Товары.Очистить();

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

Выбор всех строк запросом

Для получения всех строк таблицы базы данных используется запрос без предложения ГДЕ. Результат обходится через выборку:

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

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

"ВЫБРАТЬ

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

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

|ИЗ

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

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

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

Сообщить(Выборка.Наименование);

КонецЦикла;

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

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

Сравнение способов выбора строк

Выбор метода зависит от задачи: визуальное выделение, обход данных объекта, отбор по условию или чтение из базы. Сопоставление основных вариантов:

СпособГде применяетсяЧто возвращаетОграничение
Ctrl+A / «Выделить все»Форма, табличная часть, списокВизуальное выделениеТолько интерактивно, не в коде
Для Каждого ... ЦиклТабличная часть, таблица значенийСтроки по очередиНельзя менять состав коллекции внутри цикла
НайтиСтроки(отбор)Табличная часть, таблица значенийМассив строк по условиюОтбор только на равенство
Запрос.Выполнить().Выбрать()Данные информационной базыВыборка (курсор)Только последовательный обход
Результат.Выгрузить()Результат запросаТаблица значенийВесь результат в памяти

Сравнение вариантов

Цикл по коллекции

Подходит для обработки строк уже загруженного объекта; не работает с данными, которые ещё не прочитаны из базы

Запрос с выборкой

Подходит для чтения произвольных таблиц базы; требует аккуратности с объёмом и не даёт изменять данные напрямую

НайтиСтроки

Подходит для отбора по точному равенству в таблице значений; не поддерживает условия «больше», «содержит»

Проверка результата и контроль количества строк

После выбора строк полезно убедиться, что обработано ожидаемое количество. У табличной части и таблицы значений число строк возвращает метод Количество(). У выборки запроса заранее узнать число строк нельзя — можно только подсчитать их в цикле или выполнить отдельный запрос с КОЛИЧЕСТВО(*).

Признак корректной работы цикла — счётчик обработанных строк совпадает с Количество() коллекции. Если внутри цикла строки удалялись, счётчик будет меньше, и это сигнал ошибки логики. Для выборки запроса контролируйте, что Следующий() вернул Ложь только после обработки всех записей.

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

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

Счётчик обработанных строк
Норма

Равен Количество() коллекции

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

Меньше — строки пропущены, вероятно удаление внутри цикла

Выборка запроса
Норма

Следующий() перебрал все записи до конца

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

Цикл завершился раньше из-за Прервать или исключения

Выделение в форме
Норма

Подсвечены все строки таблицы

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

Выделена часть — список подгружается порциями

Типичные ошибки и ограничения

Самая распространённая ошибка — модификация коллекции внутри цикла Для Каждого: при удалении текущей строки следующая «перепрыгивает» через позицию. Вторая частая проблема — попытка использовать ВыбратьСтроки() для получения данных: метод только выделяет строки на форме и ничего не возвращает для обработки.

Третья группа ошибок связана с запросами: обращение к полю выборки, которого нет в тексте запроса, вызывает исключение; попытка повторно обойти выборку после полного прохода не даст результата — выборка однопроходная. Также нельзя изменять данные базы напрямую через выборку — только чтение; для записи получайте объект по ссылке.

Типичные ошибки
01
Удаление строк внутри цикла Для Каждого — часть строк пропускается из-за сдвига индексов; сначала соберите строки в массив
02
Использование ВыбратьСтроки() для получения данных — метод только выделяет строки визуально, для обработки нужен цикл или НайтиСтроки
03
Повторный обход выборки запроса — выборка однопроходная, для повторного доступа выгружайте результат в таблицу значений
04
Выбор всех строк большой таблицы без отбора — риск нехватки памяти и блокировок, обрабатывайте порциями
Итог

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

В форме все строки выделяются через Ctrl+A, в коде — циклом «Для Каждого» по коллекции или выборкой запроса. Не изменяйте состав коллекции внутри цикла, а для больших таблиц используйте отборы и порционную обработку.

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

Как выделить все строки табличной части без мыши?

Установите фокус в табличную часть (щелчком или клавишей Tab) и нажмите Ctrl+A. Если фокус находится в другом элементе формы, сочетание сработает не для таблицы, поэтому сначала убедитесь, что курсор находится в строке табличной части.

Чем НайтиСтроки отличается от цикла с условием?

НайтиСтроки принимает структуру отбора и сравнивает только на равенство, но работает быстро и возвращает готовый массив. Цикл с условием «Если» позволяет любые проверки — сравнения, поиск подстроки, вычисляемые условия. Для сложных условий используйте цикл или запрос.

Как удалить все строки табличной части одной командой?

Вызовите метод Очистить(): Объект.Товары.Очистить(). Это быстрее и надёжнее, чем удаление в цикле. В форме пользователь может сделать то же самое через «Ещё → Удалить» после выделения всех строк.

Почему запрос без отбора работает медленно на большой таблице?

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

Можно ли изменить данные базы через выборку запроса?

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

Как узнать количество строк, которые вернёт запрос, до обхода?

У выборки нет свойства количества. Варианты: выполнить отдельный запрос с функцией КОЛИЧЕСТВО(*), выгрузить результат в таблицу значений и проверить Количество(), либо подсчитать строки в цикле обхода. Первый вариант не тратит память на сами данные.