Работа с данными в 1С:Предприятие часто требует фильтрации информации по определённым критериям. Без грамотного отбора таблицы превращаются в хаос из тысяч строк, где найти нужные сведения сложнее, чем иголку в стоге сена. Эта статья поможет разобраться, как сделать отбор в таблице 1С — от базовых методов до продвинутых техник с использованием языка запросов и программного кода.
Мы рассмотрим не только стандартные инструменты платформы (например, отбор в динамических списках или отчётах), но и программные способы фильтрации через Запрос, Объект.НайтиСтроки и другие методы. Особое внимание уделим типичным ошибкам, которые приводят к пустым результатам или зависанию системы. Если вы когда-нибудь сталкивались с тем, что отбор"не работает" или возвращает неожиданные данные — здесь вы найдёте причины и решения.
Статья будет полезна как начинающим пользователям, так и разработчикам, которые хотят оптимизировать обработку больших объёмов данных. Все примеры приведены для актуальных версий платформы 1С:Предприятие 8.3, но большинство методов работают и в более ранних редакциях.
1. Базовые способы отбора в таблицах 1С
Начнём с простейших инструментов, которые доступны даже без знания программирования. Эти методы подойдут для быстрой фильтрации данных в интерфейсе 1С.
Самый очевидный способ — использовать панель отбора в динамических списках или отчётах. Она появляется при нажатии на кнопку"Отбор" (обычно изображается как воронка) в верхней части таблицы. Здесь можно:
- 🔍 Добавить условие по любому столбцу (например,"Дата больше 01.01.2026")
- 📌 Сохранить часто используемые фильтры как"избранные"
- 🔄 Применить несколько условий одновременно (с логикой"И"/"ИЛИ")
Для примера, если вам нужно найти все документы"Реализация товаров" за текущий месяц, достаточно:
- Открыть журнал документов.
- Нажать"Отбор" → добавить условие по полю
ВидДокумента="Реализация товаров". - Добавить второе условие по полю
Датас диапазоном"С 01.05.2026 по 31.05.2026". - Применить фильтр.
Такой подход удобен для разовых задач, но имеет ограничения: нельзя сохранять сложные условия для повторного использования, а производительность может падать на больших объёмах данных (более 10 000 строк).
Если панель отбора не отображается, проверьте настройки формы: иногда она скрыта в параметрах"Дополнительно" или"Настройки списка".
2. Отбор через язык запросов (Запрос.Текст)
Для гибкой фильтрации данных в 1С часто используют язык запросов. Это мощный инструмент, который позволяет задавать условия отбора с помощью SQL-подобного синтаксиса. Основное преимущество — высокая скорость работы даже с миллионами записей.
Базовая структура запроса с отбором выглядит так:
ВЫБРАТЬ
Номенклатура.Наименование,
ДокументРеализации.Дата,
ДокументРеализации.СуммаДокумента
ИЗ
Документ.РеализацияТоваровУслуг КАК ДокументРеализации
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
ПО ДокументРеализации.Номенклатура = Номенклатура.Ссылка
ГДЕ
ДокументРеализации.Дата МЕЖДУ &НачалоПериода И &КонецПериода
И ДокументРеализации.СуммаДокумента > 10000
УПОРЯДОЧИТЬ ПО
ДокументРеализации.Дата УБЫВ
Ключевые моменты при работе с отбором в запросах:
- 📅 Для дат используйте параметры (
&НачалоПериода) — это безопаснее, чем жёсткое указание значений. - 🔢 Для числовых полей (например, суммы) можно применять операторы
>,<,=,МЕЖДУ. - 🔤 Для строковых полей доступны
СОДЕРЖИТ,НАЧИНАЕТСЯ,В(например,Номенклатура.Наименование СОДЕРЖИТ"Ноутбук"). - 🔄 Для сложных условий используйте скобки и логические операторы
И/ИЛИ.
Пример запроса с несколькими условиями и параметрами:
ВЫБРАТЬ
Контрагент.Наименование КАК Поставщик,
ДокументПоступления.Номер,
ДокументПоступления.Дата
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ДокументПоступления
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагент
ПО ДокументПоступления.Контрагент = Контрагент.Ссылка
ГДЕ
ДокументПоступления.Дата >= &ДатаНачала
И (Контрагент.Наименование СОДЕРЖИТ &ПоискПоНаименованию
ИЛИ ДокументПоступления.Номер СОДЕРЖИТ &ПоискПоНомеру)
И ДокументПоступления.ПометкаУдаления = ЛОЖЬ
3. Программный отбор с помощью метода НайтиСтроки
Если вам нужно фильтровать данные непосредственно в табличной части документа или справочника, удобно использовать метод НайтиСтроки. Он возвращает массив строк, соответствующих заданным критериям.
Синтаксис метода:
МассивСтрок = Объект.ТабличнаяЧасть.НайтиСтроки(СтруктураОтбора);
Где СтруктураОтбора — это коллекция пар"ИмяКолонки — Значение". Пример для табличной части документа"РеализацияТоваровУслуг":
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", Справочники.Номенклатура.НайтиПоНаименованию("Ноутбук Dell XPS 13"));
Отбор.Вставить("Количество", 2);
НайденныеСтроки = ДокументОбъект.Товары.НайтиСтроки(Отбор);
// Обработка результатов
Для Каждого Строка Из НайденныеСтроки Цикл
Сообщить(Строка.Номенклатура.Наименование +":" + Строка.Количество);
КонецЦикла;
Важные нюансы:
- 🔍 Метод чувствителен к регистру имён колонок (должны совпадать с именами в метаданных).
- 📌 Для дат и чисел используйте точные значения (например,
Дата(2026, 05, 15)вместо строки"15.05.2026"). - ⚠️ Если в структуре отбора указано несуществующее поле, метод вернёт ошибку.
Для сложных условий (например,"количество больше 5 ИЛИ цена меньше 1000") придётся комбинировать несколько вызовов НайтиСтроки или использовать цикл по всем строкам с ручной проверкой.
Как ускорить НайтиСтроки на больших таблицах?
Если табличная часть содержит более 10 000 строк, предварительно отфильтруйте данные на уровне запроса или используйте индексированные поля (например, ссылки на справочники). Метод НайтиСтроки работает медленно на неиндексированных колонках типа Строка или Число.
4. Отбор в отчётах и обработках 1С
Многие стандартные отчёты 1С (например,"Анализ продаж","Оборотно-сальдовая ведомость") имеют встроенные механизмы отбора. Они позволяют фильтровать данные без изменения кода, но часто скрывают часть функциональности.
Рассмотрим, как настроить отбор в отчёте на примере"Ведомость по товарам":
- Откройте отчёт через меню
Отчёты → Ведомость по товарам. - В форме отчёта найдите кнопку"Показать настройки" (обычно в правом верхнем углу).
- Перейдите на вкладку"Отбор". Здесь можно добавить условия по:
- 📦 Номенклатуре (конкретные товары или группы)
- 📅 Периоду (дата начала/окончания)
- 🏢 Организации или складу
- 💰 Валюте или типу цен
Если стандартных полей отбора недостаточно, можно модифицировать отчёт через Конфигуратор:
- Откройте отчёт в режиме редактирования (
Конфигуратор → Отчёты). - Найдите процедуру
ПриКомпоновкеРезультатаилиПриОткрытии. - Добавьте программный код для динамического формирования отбора. Например:
- 🔍 Использовать
В ИЕРАРХИИдля работы с группами справочников. - 📌 Подзапросы в условии
ГДЕмогут замедлять выполнение — оптимизируйте их. - ⚠️ При работе с регистрами накопления не забывайте указывать период (
Остатки(&КонецДня)). - 🔄 Права доступа — возможно, у пользователя нет прав на просмотр части данных.
- 📅 Актуальность данных — если работаете с регистрами, убедитесь, что период закрыт.
- 🔄 Транзакции — незафиксированные изменения в базе могут влиять на результат.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
Отбор = Новый Структура;
Отбор.Вставить("Период", НачалоДня(ТекущаяДата));
Отбор.Вставить("Организация", Справочники.Организации.ТекущаяОрганизация);
КомпоновщикНастроек.Настройки.Отбор.Очистить;
Для Каждого Ключ, Значение Из Отбор Цикл
ЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Добавить(Ключ);
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.Значение = Значение;
КонецЦикла;
КонецПроцедуры
Указан корректный период|Выбрана нужная организация|Отбор по номенклатуре не конфликтует с другими условиями|Проверены права доступа к данным-->
5. Сложные условия отбора: примеры и решения
Иногда требуется фильтрация по нескольким связанным таблицам или с использованием подзапросов. Рассмотрим типичные сценарии и их реализацию.
Задача 1: Найти все реализации товаров, где сумма документа превышает среднюю сумму реализаций за последний месяц.
Решение через запрос:
ВЫБРАТЬ
Реализация.Ссылка КАК Ссылка,
Реализация.Дата,
Реализация.СуммаДокумента
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Дата МЕЖДУ НачалоМесяца(&ТекущаяДата) И &ТекущаяДата
И Реализация.СуммаДокумента >
(ВЫБРАТЬ
СРЕДНЕЕ(Реал.СуммаДокумента)
ИЗ
Документ.РеализацияТоваровУслуг КАК Реал
ГДЕ
Реал.Дата МЕЖДУ НачалоМесяца(&ТекущаяДата) И &ТекущаяДата)
Задача 2: Отобрать номенклатуру, которая есть на складе"Основной", но отсутствует на складе"Резервный".
Решение:
ВЫБРАТЬ РАЗЛИЧНЫЕ
ОстаткиОсновной.Номенклатура КАК Номенклатура
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&КонецДня, Склад = &ОсновнойСклад) КАК ОстаткиОсновной
ГДЕ
НЕ СУЩЕСТВУЕТ (
ВЫБРАТЬ
1
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&КонецДня, Склад = &РезервныйСклад) КАК ОстаткиРезервный
ГДЕ
ОстаткиРезервный.Номенклатура = ОстаткиОсновной.Номенклатура
)
Задача 3: Фильтрация по частичному совпадению в иерархическом справочнике (например, найти все товары из группы"Электроника" и её подгрупп).
Решение:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа = ЛОЖЬ
И Номенклатура.Родитель В ИЕРАРХИИ (&ГруппаЭлектроника)
Для таких запросов важно:
Сложные условия отбора лучше реализовывать на уровне запроса, а не в программном коде. Это ускорит выполнение и снизит нагрузку на сервер.
6. Типичные ошибки и их решения
Даже опытные пользователи 1С сталкиваются с проблемами при настройке отбора. Вот наиболее распространённые ошибки и способы их исправления:
| Ошибка | Причина | Решение |
|---|---|---|
| Отбор не применяется | Не нажата кнопка"Применить" или"Выполнить" после настройки фильтра. | Всегда проверяйте, что изменения сохранены. В некоторых формах нужно нажать F5 для обновления. |
| Пустой результат при корректных данных | Опечатка в имени поля или неверный тип сравнения (например, строка вместо даты). | Используйте Сообщить(ТипЗнч(Значение)) для проверки типов данных. |
| Зависание при выполнении отбора | Слишком широкий фильтр по неиндексированным полям (например, по полю"Комментарий"). | Сужьте период или добавьте индексы в конфигураторе для часто используемых полей. |
| Не работает отбор по дате | Не учтено время в значении даты (например, сравнение с ТекущаяДата без обнуления времени). |
Используйте НачалоДня или КонецДня для точного сравнения. |
| Ошибка"Поле не найдено" | Опечатка в имени колонки или обращение к несуществующему реквизиту. | Проверьте имена полей в метаданных (Конфигуратор → Объект → Реквизиты). |
Ещё одна частая проблема — несовпадение типов данных. Например, если в отборе вы указываете число как строку ("1000" вместо 1000), запрос может не вернуть результатов. Всегда проверяйте типы с помощью функции ТипЗнч:
Сообщить(ТипЗнч(Отбор.Количество)); // Должно вернуть"Число", а не"Строка"
Если отбор работает нестабильно (то находит данные, то нет), проверьте:
Для отладки сложных отборов используйте конструктор запросов в Конфигураторе (Файл → Новый → Запрос). Он подсвечивает синтаксические ошибки и показывает план выполнения.
7. Оптимизация отборов для больших баз данных
Если ваша база 1С содержит миллионы записей, неоптимизированные отборы могут приводить к зависаниям или ошибкам по таймауту. Вот ключевые рекомендации для ускорения работы:
1. Используйте индексы
Добавьте индексы для полей, по которым часто выполняется отбор. Это можно сделать в Конфигураторе:
- Откройте объект (например, справочник"Номенклатура").
- Перейдите на вкладку"Индексы".
- Добавьте новый индекс и укажите поля, по которым будет выполняться поиск (например,
Артикул,Наименование).
2. Ограничивайте период
При работе с документами или регистрами всегда указывайте минимально необходимый период:
ГДЕ
Документ.Дата МЕЖДУ НачалоКвартала(&ТекущаяДата) И &ТекущаяДата
// Вместо:
ГДЕ
Документ.Дата <= &ТекущаяДата // Это может выбрать данные за годы!
3. Избегайте ВЫБРАТЬ *
Всегда перечисляйте только необходимые поля:
ВЫБРАТЬ
Документ.Ссылка,
Документ.Дата,
Документ.Номер
// Вместо:
ВЫБРАТЬ
Документ.*
4. Используйте временные таблицы
Для сложных отчётов с несколькими соединениями разбейте запрос на части с использованием временных таблиц:
ВЫБРАТЬ
Товары.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТПолныеТовары
ИЗ
Справочник.Номенклатура КАК Товары
ГДЕ
Товары.ЭтоГруппа = ЛОЖЬ;
//////////////////////////////////////////////
ВЫБРАТЬ
ПТ.Ссылка,
ПТ.Наименование,
Ост.КоличествоОстаток
ИЗ
ВТПолныеТовары КАК ПТ
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&КонецДня) КАК Ост
ПО ПТ.Ссылка = Ост.Номенклатура
5. Кэшируйте часто используемые данные
Если одни и те же данные запрашиваются многократно (например, справочник контрагентов), загрузите их один раз в переменную:
Контрагенты = Справочники.Контрагенты.Выбрать;
Пока Контрагенты.Следующий Цикл
КэшКонтрагентов.Добавить(Контрагенты.Ссылка, Контрагенты.Наименование);
КонецЦикла;
Оптимизация отборов — это не роскошь, а необходимость для баз с объёмом данных от 100 000 записей. Даже простая индексация ключевых полей может ускорить выполнение в 10–100 раз.
FAQ: Частые вопросы по отбору в 1С
Как сделать отбор по нескольким значениям одного поля (например, несколько номенклатур)?
Используйте оператор В (аналог IN в SQL):
ГДЕ
Номенклатура.Ссылка В (&МассивНоменклатур)
Где &МассивНоменклатур — массив ссылок на элементы справочника. Например:
МассивНоменклатур = Новый Массив;
МассивНоменклатур.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Товар 1"));
МассивНоменклатур.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Товар 2"));
Почему отбор по дате не работает, если указываю ТекущаяДата?
Функция ТекущаяДата возвращает дату с временем (например,"15.05.2026 14:30:00"). Если сравнивать её с датой документа (которая может быть"15.05.2026 00:00:00"), условие не сработает.
Решение: используйте НачалоДня(ТекущаяДата) или КонецДня(ТекущаяДата).
Можно ли сохранить часто используемый отбор для повторного использования?
Да, есть несколько способов:
- В отчётах: Сохраните настройки как пользовательский вариант (кнопка"Сохранить настройки").
- В динамических списках: Используйте"Избранные настройки отбора" (если поддерживается конфигурацией).
- Программно: Сохраните структуру отбора в справочник или реквизит формы:
Процедура СохранитьОтбор(Отбор)
Запись = Справочники.СохраненныеОтборы.СоздатьЭлемент;
Запись.Наименование ="Мой отбор по продажам";
Запись.Отбор = Отбор; // Сериализуем структуру
Запись.Записать;
КонецПроцедуры
Как сделать отбор по полю, которого нет в таблице (например, по расчётному полю)?
Добавьте вычисляемое поле в запрос с помощью ВЫРАЗИТЬ:
ВЫБРАТЬ
Документ.Ссылка,
(Документ.СуммаДокумента / Документ.Количество) КАК СредняяЦена
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ГДЕ
(Документ.СуммаДокумента / Документ.Количество) > 1000 // Отбор по средней цене
Или используйте временную таблицу:
ВЫБРАТЬ
Документ.Ссылка КАК Ссылка,
Документ.СуммаДокумента / Документ.Количество КАК СредняяЦена
ПОМЕСТИТЬ ВТСредниеЦены
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ;
//////////////////////////////////////////////
ВЫБРАТЬ
ВТ.Ссылка
ИЗ
ВТСредниеЦены КАК ВТ
ГДЕ
ВТ.СредняяЦена > 1000
Почему при отборе по справочнику не находятся данные, хотя они есть?
Возможные причины:
- Неверная ссылка: Вы передаёте наименование вместо ссылки. Всегда используйте
Ссылка, а неНаименование. - Пометка удаления: Элемент помечен на удаление. Добавьте условие
И НЕ Элемент.ПометкаУдаления. - Иерархия: Если ищете по группе справочника, используйте
В ИЕРАРХИИ. - Права доступа: У пользователя нет прав на просмотр данных. Проверьте роли.
Диагностика:
Сообщить(Справочники.Номенклатура.НайтиПоНаименованию("Товар").Ссылка.УникальныйИдентификатор);
Сообщить(Отбор.Номенклатура.УникальныйИдентификатор); // Сравните идентификаторы