Приветствую Вас ГостьСуббота, 18.05.2024, 12:15

Каталог статей


Отбор записей в таблице значений по сложным условиям

Задача: вывести на форме две таблицы: в первой список абонентов, во второй список оборудования выбранного абонента.

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

В целом по отборам можно почитать здесь: https://programmist1s.ru/otboryi-v-1s-8-3-upravlyaemyie-formyi/

Для отбора строк из таблицы значений можно использовать 4 способа:

  1. перебор строк из исходной таблицы
  2. использовать метод НайтиСтроки() - отбор только по сравнению "Равно"
  3. использовать построитель запросов - опишем ниже.
  4. использовать расширение таблицы формы ОтборСтрок по фиксированной структуре (ТЗ.ОтборСтрок = Новый ФиксированнаяСтруктура(Отбор) ) - отбор только по типу условия Равно, но не нужно добавлять дополнительную таблицу значений. Используется в основном для поиска и может подтормаживать при большом количестве строк.

Решено было использовать построитель запросов и 3 таблицы значений:

  1. Список абонентов (Колонки: Абонент, Адрес...) -  выведено на форму
  2. Список оборудования (Колонки: Абонент, Тип оборудования, Состояние...) - не выводится на форму, а используется только для хранения данных
  3. Оборудование абонента (аналогичный набор колонок) - выведено на форму

Сначала заполняем таблицы "Список абонентов" и "Список оборудования".

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

&НаКлиенте
Процедура СписокАбонентовПриАктивизацииСтроки(Элемент)
    ОтфильтроватьОборудованиеАбонента();
КонецПроцедуры

&НаКлиенте
Процедура ОтфильтроватьОборудованиеАбонента()
    ТД = Элементы.СписокАбонентов.ТекущиеДанные;
    Если ТД <> Неопределено Тогда
        Абонент = ТД.Абонент;
        ОтфильтроватьОборудованиеАбонентаНаСервере(Абонент);
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ОтфильтроватьОборудованиеАбонентаНаСервере(Абонент)
    ОборудованиеАбонента.Очистить();                
    
    ПостроительЗапр = Новый ПостроительЗапроса;    
    ПостроительЗапр.ИсточникДанных = Новый ОписаниеИсточникаДанных(СписокОборудования.Выгрузить());
    
    т_Отбор = ПостроительЗапр.Отбор.Добавить("Абонент");    
    т_Отбор.ВидСравнения = ВидСравнения.Равно;    
    т_Отбор.Значение = Абонент;    
    т_Отбор.Использование = Истина;    
    
    // заполняем в зависимости от данных на форме
    ДобавитьОтборПоУсловиям(ПостроительЗапр);  
    
    ПостроительЗапр.Выполнить();    
    ОборудованиеАбонента.Загрузить(ПостроительЗапр.Результат.Выгрузить());
    
КонецПроцедуры

&НаСервере
Процедура ДобавитьОтборПоУсловиям(ПостроительЗапр)
    
    Если ЗначениеЗаполнено(СостояниеОборудования) Тогда
        т_Отбор = ПостроительЗапр.Отбор.Добавить("Состояние");    
        т_Отбор.ВидСравнения = ВидСравнения.Равно;    
        т_Отбор.Значение = СостояниеОборудования;    
        т_Отбор.Использование = Истина;          
    КонецЕсли;    
    
    Если ЗначениеЗаполнено(ТипыОборудования) Тогда
        т_Отбор = ПостроительЗапр.Отбор.Добавить("ТипОборудования");    
        т_Отбор.ВидСравнения = ВидСравнения.ВСписке;    
        т_Отбор.Значение = ТипыОборудования;    
        т_Отбор.Использование = Истина;          
    КонецЕсли;

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

Пояснения:

Если выбранная строка содержит данные, то из таблицы списка оборудования отбираем строки по нужным условиям отбора: создаем объект ПостроительЗапроса, определяем источник - ТаблицаЗначений и добавляем отбор. В отборе можно использовать не только операцию "Равно", то и другие, например ВидСравнения.ВСписке, которая используется в процедуре ДобавитьОтборПоУсловиям().

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

После того, как пользователь заполнил список абонентов и определился, какое оборудование хочет обрабатывать в запускаем процедуру обработки.

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

 

Категория: Формы | Добавил: leshic (23.06.2022)
Просмотров: 663 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Категории раздела
СКД [48]
Регистры [7]
Формы [41]
Администрирование [35]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [29]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0