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