Отбор строк в табличной части управляемых форм

09 августа 2014

Предисловие

После долгого перерыва в написании статей решил опубликовать небольшой материал по скрытию строк в табличной части документа на управляемой форме.

Задача довольно распространенная. Нужно при нажатии на строку в одной табличной части отобразить в зависимой табличной части только те строки, которые относятся к выделенной строке.

Задача

В конфигурации есть документ со следующей структурой метаданных:

Структура метаданных документа с главной и подчиненной табличной частьюЗависимая таблица "Аналоги" связана с главной таблицей "Товары" через поле "Товар". В форме документа при добавлении новой строки в таблицу "Аналоги" срабатывает событие "ПриАктивизацииСтроки" со следующим обработчиком:

// Запоминаем флаг модифицированности объекта
МодифицированностьДоОпераций = Модифицированность;
// Получаем текущие данные главной таблицы
ТекДанные = Элементы.Аналоги.ТекущиеДанные;
Если ТекДанные <> Неопределено Тогда      
 // Если тек. данные главной таблицы присутствуют,
 // то получаем тек. данные зависимой таблицы
 ТекСтр = Элементы.Товары.ТекущиеДанные;
 Если ТекСтр <> Неопределено Тогда
  // Если есть данные зависимой и главной таблицы,
  // то в зависимой таблицы заполняем реквизит 
  // "Товар" для связи с записью с записью в
  // главной таблицы
  Номенклатура =  ТекСтр.Номенклатура;
  ТекДанные.Товар = Номенклатура;   
 КонецЕсли;
КонецЕсли;     
// Возвращаем флаг модифицированности в исходное состояние
Модифицированность = МодифицированностьДоОпераций;

Этот обработчик заполняет поле "Товар" при добавлении новых строк в таблицу "Аналоги".

В обработчике формы "ПередЗаписью" выполняется очистка зависимой таблица "Аналоги" от записей с пустыми полями или теми записями, которые не относятся ни к одному товару из таблицы "Товары":

КоличествоСтрок = Объект.Аналоги.Количество(); 
Пока КоличествоСтрок > 0 Цикл
 ТекСтрИндекс = КоличествоСтрок-1;
 ТекСтр = Объект.Аналоги.Получить(ТекСтрИндекс);
 Если НЕ ЗначениеЗаполнено(ТекСтр.Товар)
  ИЛИ НЕ ЗначениеЗаполнено(ТекСтр.Аналог) Тогда
  Объект.Аналоги.Удалить(ТекСтрИндекс);
 Иначе
  СтруктураПоиска = Новый Структура("Номенклатура", ТекСтр.Товар);
  РезультатПоиска = Объект.Товары.НайтиСтроки(СтруктураПоиска);
  Если РезультатПоиска.Количество() = 0 Тогда
   Объект.Аналоги.Удалить(ТекСтрИндекс); 
  КонецЕсли;
 КонецЕсли;
 КоличествоСтрок = КоличествоСтрок - 1;
КонецЦикла;

Осталось скрыть строки, не относящиеся к текущей выбранной строке в таблице "Товары".

Быстрые решения

Рассмотрим два быстрых варианта решения задачи.

Вариант №1

Эту задачу можно решить без единой строчки кода! Да, Вы не ослышались! Поможет нам условное оформление! В форме документа откроем настройки условного оформления. Настроим следующим образом:

Настройки условного оформления формы для скрытия строк табличной части управляемой формы

В качестве левого и правого значения в отборе устанавливаются поля компоновки данных, соответствующие данным таблиц формы. Если значения в полях не равный, то видимость элемента формы "АналогиАналог" устанавливается в ЛОЖЬ.

Вариант №2

Есть классический вариант решения, который используется для обычных форм. При активизации строки главной таблицы "Товары" на форме вызывается обработчик "ПриАктивизацииСтроки" табличной части и выполняет следующий алгоритм:

// Получаем текущие данные таблицы
ТекДанные = Элементы.Товары.ТекущиеДанные;
Если ТекДанные = Неопределено Тогда
 Возврат;
КонецЕсли;

// Создаем структуру отбора по полю "Товар"
Отбор = Новый Структура;
Отбор.Вставить("Товар", ТекДанные.Номенклатура);
// Задаем фиксированную структуру отбора для таблицы формы
Элементы.Аналоги.ОтборСтрок = Новый ФиксированнаяСтруктура(Отбор);

Установив отборы программно мы получим то же результат, что и при использовании условного оформления в первом варианте решения.

Проблемы

Зачем может понадобиться использовать второе решение с программным отбором, если условное оформление проще и быстрее решает задачу? Вопрос  справедливый. Хоть предложенные решения полностью работаю в режиме тонкого/толстого клиента управляемого приложения, но давайте протестируем их в веб-клиенте!

При запуске формы с решением через условное оформление мы столкнемся с ошибкой "Cannot read property "ID" of undefined":

Ошибка при использовании условного оформления в управляемой форме при запуске веб-клиента

Тест проводился на платформе 8.2.19.83. О наличии этой ошибки в других версиях платформы информации нет. Используемый браузер: Google Chrome.

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

Итог

В случае, если веб-клиент не используется в Вашей организации, то с описанной ошибкой Вы никогда не столкнетесь. Однако, разрабатывая интерфейс для веб-клиента Вы столкнетесь ни один раз с непредсказуемыми проблемами как эта.

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


comments powered by Disqus