Задача: вывести на форме две таблицы: в первой список абонентов, во второй список оборудования выбранного абонента.
Динамическим списком делать не стал, так как после заполнение таблиц, оборудование по всем абонентам надо было обработать и получение оборудования по всему списку абонентов потребует формирование динамического списка в цикле, то очччень плохое решение.
В целом по отборам можно почитать здесь: https://programmist1s.ru/otboryi-v-1s-8-3-upravlyaemyie-formyi/.
Для отбора строк из таблицы значений можно использовать 4 способа:
- перебор строк из исходной таблицы
- использовать метод НайтиСтроки() - отбор только по сравнению "Равно"
- использовать построитель запросов - опишем ниже.
- использовать расширение таблицы формы ОтборСтрок по фиксированной структуре (ТЗ.ОтборСтрок = Новый ФиксированнаяСтруктура(Отбор) ) - отбор только по типу условия Равно, но не нужно добавлять дополнительную таблицу значений. Используется в основном для поиска и может подтормаживать при большом количестве строк.
Решено было использовать построитель запросов и 3 таблицы значений:
- Список абонентов (Колонки: Абонент, Адрес...) - выведено на форму
- Список оборудования (Колонки: Абонент, Тип оборудования, Состояние...) - не выводится на форму, а используется только для хранения данных
- Оборудование абонента (аналогичный набор колонок) - выведено на форму
Сначала заполняем таблицы "Список абонентов" и "Список оборудования".
В событии "При активизации строки" списка абонентов вызываем процедуру фильтрации оборудования:
&НаКлиенте
Процедура СписокАбонентовПриАктивизацииСтроки(Элемент)
ОтфильтроватьОборудованиеАбонента();
КонецПроцедуры
&НаКлиенте
Процедура ОтфильтроватьОборудованиеАбонента()
ТД = Элементы.СписокАбонентов.ТекущиеДанные;
Если ТД <> Неопределено Тогда
Абонент = ТД.Абонент;
ОтфильтроватьОборудованиеАбонентаНаСервере(Абонент);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОтфильтроватьОборудованиеАбонентаНаСервере(Абонент)
ОборудованиеАбонента.Очистить();
ПостроительЗапр = Новый ПостроительЗапроса;
ПостроительЗапр.ИсточникДанных = Новый ОписаниеИсточникаДанных(СписокОборудования.Выгрузить());
т_Отбор = ПостроительЗапр.Отбор.Добавить("Абонент");
т_Отбор.ВидСравнения = ВидСравнения.Равно;
т_Отбор.Значение = Абонент;
т_Отбор.Использование = Истина;
// заполняем в зависимости от данных на форме
ДобавитьОтборПоУсловиям(ПостроительЗапр);
ПостроительЗапр.Выполнить();
ОборудованиеАбонента.Загрузить(ПостроительЗапр.Результат.Выгрузить());
КонецПроцедуры
&НаСервере
Процедура ДобавитьОтборПоУсловиям(ПостроительЗапр)
Если ЗначениеЗаполнено(СостояниеОборудования) Тогда
т_Отбор = ПостроительЗапр.Отбор.Добавить("Состояние");
т_Отбор.ВидСравнения = ВидСравнения.Равно;
т_Отбор.Значение = СостояниеОборудования;
т_Отбор.Использование = Истина;
КонецЕсли;
Если ЗначениеЗаполнено(ТипыОборудования) Тогда
т_Отбор = ПостроительЗапр.Отбор.Добавить("ТипОборудования");
т_Отбор.ВидСравнения = ВидСравнения.ВСписке;
т_Отбор.Значение = ТипыОборудования;
т_Отбор.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Пояснения:
Если выбранная строка содержит данные, то из таблицы списка оборудования отбираем строки по нужным условиям отбора: создаем объект ПостроительЗапроса, определяем источник - ТаблицаЗначений и добавляем отбор. В отборе можно использовать не только операцию "Равно", то и другие, например ВидСравнения.ВСписке, которая используется в процедуре ДобавитьОтборПоУсловиям().
Процедуру ОтфильтроватьОборудованиеАбонента() так же включаем в событие изменений параметров отбора на форме (реквизиты формы СостояниеОборудования и ТипыОборудования).
После того, как пользователь заполнил список абонентов и определился, какое оборудование хочет обрабатывать в запускаем процедуру обработки.
В процедуре обработки так же создаем построитель запроса, только не ставим отбор по абонентам, а оставляем отбор по условиям отбора, выведенным на форму - ДобавитьОтборПоУсловиям(). Полученный список оборудования уже обрабатываем нужным способом.
|