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

Решение задачи зависит от версии платформы (1С 8.2 или 1С 8.3), типа формы (управляемая или обычная) и даже от конкретной конфигурации (Бухгалтерия 3.0, УТ 11, ЗУП 3.1). В этой статье мы разберём все актуальные способы — от простых настроек через конфигуратор до программного кода на встроенном языке. Вы узнаете, как сделать так, чтобы при открытии списка автоматически применялся отбор по дате, контрагенту, организации или любому другому реквизиту.

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

📊 Какой тип форм вы чаще используете в 1С?
Управляемые формы
Обычные формы
Не знаю разницы
Не работаю с формами

1. Настройка отбора через свойства формы в конфигураторе

Самый простой способ — использовать встроенные механизмы конфигуратора. Он подходит для управляемых форм в 1С 8.3 и не требует написания кода. Рассмотрим пошаговую инструкцию на примере списка документов РеализацияТоваровУслуг.

Откройте конфигуратор в режиме 1С:Предприятие и найдите нужную форму списка через дерево объектов: Объекты → Документы → РеализацияТоваровУслуг → Формы → ФормаСписка. Дважды кликните по форме, чтобы открыть её в редактор.

В панели свойств формы найдите раздел "Отбор". Здесь можно добавить условия фильтрации прямо в визуальном редакторе:

  1. Нажмите кнопку Добавить в таблице отборов.
  2. В колонке Поле выберите реквизит, по которому будет отбор (например, Дата или Контрагент).
  3. В колонке Тип сравнения укажите оператор (=, >, В списке и т.д.).
  4. В колонке Значение введите фиксированное значение или выберите динамический параметр (например, &ТекущаяДата).

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

Как проверить, что отбор работает?

Откройте форму списка в режиме 1С:Предприятие и убедитесь, что в строке отбора (обычно вверху таблицы) отображаются заданные условия. Если отбор не применяется, проверьте права пользователя на изменение настроек формы или наличие конфликтующих обработчиков событий.

2. Динамический отбор через параметры формы

Если условия отбора должны меняться в зависимости от контекста (например, текущий пользователь или выбранная организация), используйте параметры формы. Этот метод также не требует программирования, но предоставляет больше гибкости.

В конфигураторе откройте форму списка и перейдите на вкладку Параметры. Добавьте новый параметр с именем, например, ОтборПоДате, и укажите тип Структура. Затем в свойствах формы найдите событие ПриСозданииНаСервере и создайте обработчик:

Процедура ФормаСпискаПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ПараметрыОтбора = Новый Структура();

ПараметрыОтбора.Вставить("Дата", НачалоДня(ТекущаяДата()));

ПараметрыОтбора.Вставить("Организация", Пользователь.ТекущаяОрганизация());

Элементы.Список.Отбор.Параметры = ПараметрыОтбора;

КонецПроцедуры

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

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка", Новый Структура("ОтборПоДате", МояСтруктураОтбора));

Убедитесь, что параметр добавлен в форму|Проверьте корректность типа данных (Структура, Массив и т.д.)|Тестируйте отбор в режиме отладки|Сверьте права доступа к реквизитам отбора-->

3. Программная установка отбора в модуле формы

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

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

Процедура ПриОткрытии(Отказ)

Отбор = Новый Структура();

Отбор.Вставить("ПометкаУдаления", Ложь); // Исключаем помеченные на удаление

Отбор.Вставить("Дата", НачалоМесяца(ТекущаяДата()));

// Применяем отбор к элементу "Список" (имя может отличаться!)

Элементы.Список.Отбор.Установить(Отбор);

КонецПроцедуры

Для обычных форм (1С 8.2) код будет немного другим:

Процедура ПриАктивизации()

Отбор = Новый Структура("ДатаС, ДатаПо", НачалоДня(ТекущаяДата()), КонецДня(ТекущаяДата()));

Список.Отбор = Отбор;

КонецПроцедуры

Критическая деталь: имена элементов формы (например, Элементы.Список) могут отличаться в разных конфигурациях. Всегда проверяйте актуальные имена в инспекторе форм (Ctrl+Shift+I в конфигураторе).

💡

Если отбор не применяется, проверьте последовательность событий: в управляемых формах сначала срабатывает ПриСозданииНаСервере, затем ПриОткрытии. Избегайте дублирования кода в обоих обработчиках.

4. Отбор через расширения конфигурации

Если вы работаете с типовыми конфигурациями (Бухгалтерия 3.0, УТ 11, ЗУП 3.1) и не хотите модифицировать оригинальные объекты, используйте расширения. Это безопасный способ добавить отбор без изменения исходного кода.

Создайте новое расширение через меню Конфигурация → Поддержка → Расширения конфигурации → Добавить. В расширении найдите нужную форму списка и добавьте обработчик события ПриОткрытии. Пример кода для отбора по текущему месяцу:

#Если Сервер Тогда

Процедура ФормаСпискаПриОткрытии(Отказ) Экспорт

Отбор = Новый Структура();

Отбор.Вставить("Дата", НачалоМесяца(ТекущаяДата()));

Объект.Элементы.Список.Отбор.Установить(Отбор);

КонецПроцедуры

#КонецЕсли

Преимущества метода:

  • 🔹 Сохраняется поддержка типовой конфигурации (обновления не сломают ваш код).
  • 🔹 Можно отключать/включать отбор без удаления кода.
  • 🔹 Подходит для облачных решений (1С:Fresh), где модификация конфигурации запрещена.

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

💡

Расширения — единственный безопасный способ кастомизации типовой конфигурации. Всегда используйте их вместо прямого изменения объектов, если планируете обновляться.

5. Отбор с использованием внешних обработок

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

Создайте новую обработку через меню Файл → Новый → Внешняя обработка. В модуле обработки добавьте функцию для открытия формы с отбором:

Процедура ОткрытьСписокСОтбором(Команда)

Отбор = Новый Структура();

Отбор.Вставить("Контрагент", Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка"));

ПараметрыФормы = Новый Структура("Отбор", Отбор);

ОткрытьФорму("Документ.ЗаказПокупателя.ФормаСписка", ПараметрыФормы);

КонецПроцедуры

Чтобы запустить обработку, сохраните её в файл (.epf) и подключите через меню Файл → Открыть в режиме 1С:Предприятие. Этот способ полезен для:

  • 📌 Тестирования отборов перед внедрением в конфигурацию.
  • 📌 Разовых задач (например, анализ документов за конкретный период).
  • 📌 Работы в облачных базах, где нет доступа к конфигуратору.
⚠️ Внимание: Внешние обработки не сохраняются в базе данных. После закрытия 1С:Предприятие их придётся подключать заново. Для постоянного использования перенесите код в конфигурацию или расширение.

Сравнение методов установки отбора

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

Метод Требуется конфигуратор Подходит для типовой конфигурации Гибкость (динамические условия) Сложность реализации
Свойства формы Да Нет (изменяет конфигурацию) Низкая Просто
Параметры формы Да Нет Средняя Средне
Модуль формы Да Нет Высокая Сложно
Расширения Да Да Высокая Средне
Внешние обработки Нет Да Высокая Просто

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

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

При настройке отборов разработчики и администраторы часто сталкиваются с типичными проблемами. Рассмотрим самые распространённые ошибки и способы их исправления.

1. Отбор не применяется при открытии формы

  • 🔍 Проверьте имя элемента формы (например, Элементы.Список может называться Элементы.ТаблицаДокументов).
  • 🔍 Убедитесь, что код выполняется на сервере (для управляемых форм используйте ПриСозданииНаСервере).
  • 🔍 Проверьте права пользователя на чтение реквизитов, используемых в отборе.

2. Отбор работает в конфигураторе, но не в режиме предприятия

  • 🔧 Возможно, в коде используются объекты, недоступные в пользовательском режиме (например, прямые обращения к метаданным). Замените их на безопасные методы.
  • 🔧 Проверьте, не переопределяется ли отбор в другом обработчике (например, в ПриАктивизации).

3. Медленная работа формы с отбором

  • ⚡ Оптимизируйте запрос: избегайте отборов по неиндексируемым полям (например, по полнотекстовому поиску).
  • ⚡ Используйте ИндексироватьПо для часто используемых реквизитов.
  • ⚡ Для больших баз данных применяйте ПакетныйРежим или ЛегкийЗапрос.
⚠️ Внимание: Если в отборе используются динамические параметры (например, ТекущаяДата()), убедитесь, что они корректно инициализируются на сервере. В управляемых формах клиентский код не имеет доступа к некоторым глобальным функциям.

FAQ: Частые вопросы по отборам в 1С

Как сделать отбор по нескольким значениям (например, список контрагентов)?

Используйте тип сравнения В списке и передавайте массив значений. Пример:

Отбор.Вставить("Контрагент", Новый Массив(Контрагент1, Контрагент2));

Для динамического списка (например, из другого справочника) используйте запрос или программное формирование массива.

Можно ли сохранить отбор между сеансами работы?

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

ПользовательскиеНастройки.ОтборДокументов = Элементы.Список.Отбор;

А при открытии формы (ПриОткрытии) восстановите его:

Если ПользовательскиеНастройки.Свойство("ОтборДокументов") Тогда

Элементы.Список.Отбор.Установить(ПользовательскиеНастройки.ОтборДокументов);

КонецЕсли;

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

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

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

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

"ВЫБРАТЬ РАЗЛИЧНЫЕ Документ.Ссылка КАК Ссылка

|ГДЕ Документ.ТабличнаяЧасть.Номенклатура = &Номенклатура";

Запрос.УстановитьПараметр("Номенклатура", Номенклатура);

Результат = Запрос.Выполнить();

Отбор.Вставить("Ссылка", Новый Массив(Результат.ВыгрузитьКолонку("Ссылка")));

Почему отбор не работает в мобильном клиенте 1С?

Мобильный клиент имеет ограничения на выполнение серверного кода. Убедитесь, что:

  • Отбор устанавливается в обработчике ПриСозданииНаСервере (не на клиенте!).
  • Используемые реквизиты доступны в мобильной версии (некоторые поля могут быть скрыты).
  • Форма адаптирована для мобильного интерфейса (проверьте свойство МобильныйКлиент).

Для отладки используйте Сообщить() с выводом в журнал регистрации.

Как отладить код отбора, если он не работает?

Используйте следующие приёмы:

  1. Добавьте Сообщить() в ключевых точках кода, чтобы проверить, выполняется ли он.
  2. Включите Режим отладки в конфигураторе и установите точки останова.
  3. Проверьте журнал регистрации (Администрирование → Журнал регистрации) на ошибки.
  4. Для управляемых форм используйте Диагностика → Протокол работы формы.

Типичная ошибка: код выполняется на клиенте, а должен — на сервере (или наоборот).