- Что такое "программное открытие форм списка" и зачем это нужно
- Основы работы с динамическими списками
- Способ первый: передача параметра "Отбор"
- Способ второй: использование элементов отбора компоновки данных
- Способ третий: отбор через обработчик "ПриСозданииНаСервере"
- Работа с отбором в формах выбора
- Использование параметризованных команд
- Особенности и подводные камни
- Комплексный пример установки отборов при открытии списка документов
- Практические советы
Что такое "программное открытие форм списка" и зачем это нужно
Представь ситуацию: ты работаешь с большим списком контрагентов, и тебе постоянно нужно показывать только определенную их часть – например, только поставщиков или только клиентов из конкретного города. Каждый раз вручную настраивать отбор – это потеря времени. Гораздо удобнее открыть форму списка программно уже с готовым отбором одной кнопкой.
Программное открытие форм с отбором – это базовый навык любого 1С-разработчика. Освоив его, ты сможешь создавать удобные интерфейсы, которые экономят время пользователей и делают работу в системе более комфортной.
Основы работы с динамическими списками
Прежде чем погружаться в код, важно понимать, что отбор работает только с формами, у которых основным реквизитом является Динамический список. Это касается форм списка и форм выбора справочников, документов и других объектов.
Динамический список – это специальный тип реквизита, который автоматически формирует запрос к базе данных и отображает результат в табличном виде. Именно благодаря ему мы можем гибко управлять отбором и сортировкой данных.
Способ первый: передача параметра "Отбор"
Самый простой и понятный способ – передать отбор прямо в параметрах открытия формы. Вот как это работает:
&НаКлиенте Процедура ОткрытьСписокПоставщиков(Команда) // Создаем структуру отбора ЗначениеОтбора = Новый Структура("ЭтоПоставщик", Истина); // Упаковываем отбор в параметры формы ПараметрыФормы = Новый Структура("Отбор", ЗначениеОтбора); // Открываем форму с отбором ОткрытьФорму("Справочник.Контрагенты.ФормаСписка", ПараметрыФормы); КонецПроцедуры
В этом примере мы создали отбор по полю "ЭтоПоставщик" со значением Истина. Ключ структуры должен точно соответствовать имени поля в основной таблице динамического списка.
Можно создать отбор сразу по нескольким полям:
&НаКлиенте Процедура ОткрытьСписокМосковскихПоставщиков(Команда) ЗначениеОтбора = Новый Структура; ЗначениеОтбора.Вставить("ЭтоПоставщик", Истина); ЗначениеОтбора.Вставить("Город", "Москва"); ПараметрыФормы = Новый Структура("Отбор", ЗначениеОтбора); ОткрытьФорму("Справочник.Контрагенты.ФормаСписка", ПараметрыФормы); КонецПроцедуры
Этот способ работает только с условием "Равно". Если нужны более сложные условия – переходи к следующему способу.
Способ второй: использование элементов отбора компоновки данных
Когда простого равенства недостаточно, используем более мощный инструмент – элементы отбора компоновки данных. Они позволяют задавать различные виды сравнения: больше, меньше, содержит, в списке и так далее.
&НаКлиенте Процедура ОткрытьСписокДокументовЗаПериод(Команда) // Создаем настройки компоновки данных НастройкиКД = Новый НастройкиКомпоновкиДанных; // Добавляем первый элемент отбора - дата больше или равна началу месяца ЭлементОтбора = НастройкиКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно; ЭлементОтбора.ПравоеЗначение = НачалоМесяца(ТекущаяДата()); ЭлементОтбора.Использование = Истина; // Добавляем второй элемент отбора - дата меньше или равна концу месяца ЭлементОтбора = НастройкиКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно; ЭлементОтбора.ПравоеЗначение = КонецМесяца(ТекущаяДата()); ЭлементОтбора.Использование = Истина; // Передаем настройки в форму ПараметрыФормы = Новый Структура("ФиксированныеНастройки", НастройкиКД); ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка", ПараметрыФормы); КонецПроцедуры
Обратите внимание на несколько важных моментов:
Использование = Истина– без этого отбор не работаетФиксированныеНастройки– именно такое имя параметра нужно использоватьРежимОтображенияможно установить вНедоступный, чтобы пользователь не мог изменить или удалить отбор
Способ третий: отбор через обработчик "ПриСозданииНаСервере"
Иногда удобнее настроить отбор не при открытии формы, а уже внутри неё. Для этого используем обработчик ПриСозданииНаСервере:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) // Проверяем, передан ли параметр отбора Если Параметры.Свойство("ОтборПоСтатусу") Тогда ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Статус"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = Параметры.ОтборПоСтатусу; ЭлементОтбора.Использование = Истина; ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; КонецЕсли; КонецПроцедуры
А открывать такую форму можно так:
&НаКлиенте Процедура ОткрытьАктивныеДокументы(Команда) ПараметрыФормы = Новый Структура("ОтборПоСтатусу", "Активный"); ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка", ПараметрыФормы); КонецПроцедуры
Работа с отбором в формах выбора
Формы выбора работают точно так же, как формы списка. Единственное отличие – в имени формы и дополнительных параметрах:
&НаКлиенте Процедура ВыбратьАктивногоКонтрагента(Команда) ЗначениеОтбора = Новый Структура("Активность", Истина); ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("Отбор", ЗначениеОтбора); ПараметрыФормы.Вставить("РежимВыбора", Истина); ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Истина); // Устанавливаем оповещение для получения результата выбора ОповещениеОВыборе = Новый ОписаниеОповещения("ПослеВыбораКонтрагента", ЭтотОбъект); ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", ПараметрыФормы, ЭтотОбъект, УникальныйИдентификатор,,, ОповещениеОВыборе); КонецПроцедуры &НаКлиенте Процедура ПослеВыбораКонтрагента(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт Если ВыбранныйЭлемент <> Неопределено Тогда Сообщить("Выбран контрагент: " + ВыбранныйЭлемент); КонецЕсли; КонецПроцедуры
Использование параметризованных команд
Элегантный способ создания универсальных команд – использование параметризованных команд. Создаешь глобальную команду, указываешь тип параметра, и она автоматически появляется в командном интерфейсе нужных объектов:
// Обработчик параметризованной команды &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) ОтборПоКонтрагенту = Новый Структура("Контрагент", ПараметрКоманды); ПараметрыФормы = Новый Структура("Отбор", ОтборПоКонтрагенту); ОткрытьФорму("Документ.ПоступлениеТоваров.ФормаСписка", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка); КонецПроцедуры
Особенности и подводные камни
Проверяй имена полей. Самая частая ошибка – неправильное имя поля в отборе. Имя должно точно соответствовать полю в основном запросе динамического списка.
Не забывай про флаг "Использование". Без Использование = Истина элемент отбора не работает.
Учитывай регистр символов. 1С чувствительна к регистру, поэтому "контрагент" и "Контрагент" – разные поля.
Помни про производительность. Отбор по неиндексированным полям может замедлить работу системы при больших объемах данных.
Комплексный пример установки отборов при открытии списка документов
Вот более сложный пример, который показывает, как можно комбинировать разные типы отборов:
&НаКлиенте Процедура ОткрытьСписокДокументовСМножественнымОтбором(Команда) НастройкиКД = Новый НастройкиКомпоновкиДанных; // Отбор по дате - текущий месяц ЭлементОтбора = НастройкиКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Интервал; ЭлементОтбора.ПравоеЗначение = Новый СтандартныйПериод(ВидПериода.Месяц, ТекущаяДата()); ЭлементОтбора.Использование = Истина; // Отбор по сумме - больше 10000 ЭлементОтбора = НастройкиКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СуммаДокумента"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; ЭлементОтбора.ПравоеЗначение = 10000; ЭлементОтбора.Использование = Истина; // Отбор по списку статусов СписокСтатусов = Новый СписокЗначений; СписокСтатусов.Добавить("Проведен"); СписокСтатусов.Добавить("КПроведению"); ЭлементОтбора = НастройкиКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Статус"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; ЭлементОтбора.ПравоеЗначение = СписокСтатусов; ЭлементОтбора.Использование = Истина; ПараметрыФормы = Новый Структура("ФиксированныеНастройки", НастройкиКД); ОткрытьФорму("Документ.РеализацияТоваров.ФормаСписка", ПараметрыФормы); КонецПроцедуры
Практические советы
Создавай универсальные процедуры. Вместо дублирования кода для каждого отбора, создавай общие процедуры:
&НаКлиенте Процедура ОткрытьФормуСОтборомПоПолю(ИмяФормы, ИмяПоля, ЗначениеПоля) ЗначениеОтбора = Новый Структура(ИмяПоля, ЗначениеПоля); ПараметрыФормы = Новый Структура("Отбор", ЗначениеОтбора); ОткрытьФорму(ИмяФормы, ПараметрыФормы); КонецПроцедуры
Документируй свой код. Всегда добавляй комментарии, поясняющие логику отбора – это сэкономит время при последующих доработках.
Тестируй на разных данных. Проверяй работу отбора как на полных, так и на пустых данных.
Программное открытие форм с отбором – это мощный инструмент, который делает интерфейс 1С более удобным и функциональным. Освоив эти приемы, ты сможешь создавать решения, которые действительно экономят время пользователей и повышают эффективность их работы. Начни с простых примеров, постепенно усложняй логику, и вскоре эти техники станут твоими надежными помощниками в ежедневной разработке.













































