Открытие формы выбора с отбором

1. Johney20 02.04.19 14:25 Сейчас в теме
У внешней обработки есть табличная часть. Среди ее реквизитов есть "Категория" - спр.КатегорииЗапросов и "Тип" - Пер.ТипыЗапросов. Между собой они связаны следующим образом:

В спр. "КатегорииЗапросов" есть реквизит "Тип" - пер. "ТипыЗапросов". И вот необходимо, чтобы при выборе категорий, в списке можно было увидеть только те, у кого тип = тип из тч.

Как правильно поставить такой отбор? Это обработчик события "Началовыбора", верно? А что внутри? Можно пример?
По теме из базы знаний
Найденные решения
16. dhurricane 02.04.19 15:46 Сейчас в теме
(15) Тогда Вам придется таки определять обработчики событий "НачалоВыбора" и еще кое какие. Но сделать это можно чуть проще. При этом связи параметров выбора оставляем настроенными. А обработчики следующие:
&НаКлиенте
Процедура ТаблицаКатегорияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	// Этот обработчик сработает, когда пользователь нажмет кнопку "..."
	
	ТекущаяСтрока = Элементы.Таблица.ТекущиеДанные;
	
	Если Не ЗначениеЗаполнено(ТекущаяСтрока.Тип) Тогда
		СтандартнаяОбработка = Ложь;
		ОткрытьФорму("Справочник.КатегорииЗапросов.ФормаВыбора", , Элемент);
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ТаблицаКатегорияОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
	
	// Этот обработчик сработает, когда пользователь введет текст и нажемет "Таб"
	
	Перем ЗначениеОтбора;
	
	Если ПараметрыПолученияДанных.Отбор.Свойство("Тип", ЗначениеОтбора) И Не ЗначениеЗаполнено(ЗначениеОтбора) Тогда
		ПараметрыПолученияДанных.Отбор.Удалить("Тип");
	КонецЕсли; 
	
КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. arsen_botashev 02.04.19 14:28 Сейчас в теме
(1)мне кажется можно сделать просто связь по типу, но это не точно.
4. independ 1520 02.04.19 14:31 Сейчас в теме
(1)
&НаКлиенте
Процедура МагазинНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	фиксНастройки = Новый НастройкиКомпоновкиДанных;
	Отбор = фиксНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
	Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
	Отбор.ПравоеЗначение = ПолучитьСписоЗначенийНаСервере(Элементы.ИмяТЧ.ТекущиеДанные.КакойтоРеквизит);
	Отбор.Использование = Истина;
	Отбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ФиксированныеНастройки", фиксНастройки);
	ОткрытьФорму("Справочник.Магазины.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
Показать
Fatenm; ja1ck; Drivingblind; qazaz2; isupovalex; slige; wowik; dreamerr7; Olenevod; Xershi; PhoenixAOD; SedovSU@mail.ru; SlavaKron; +13 Ответить
5. Johney20 02.04.19 14:35 Сейчас в теме
(4) А в функции "ПолучитьСписокЗначенийНаСервере" мне нужно написать запрос с отбором по типу и получить возможные категории?
6. independ 1520 02.04.19 14:36 Сейчас в теме
(5) да, верно, и вернуть списокзначений
8. Johney20 02.04.19 14:42 Сейчас в теме
(6) Сделала так, но форма открывается пустая.

&НаКлиенте
Процедура СписокЗапросовКатегорияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	фиксНастройки = Новый НастройкиКомпоновкиДанных;
	Отбор = фиксНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
	Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
	Отбор.ПравоеЗначение = ПолучитьСписокЗначенийНаСервере(Элементы.СписокЗапросов.ТекущиеДанные.Тип);
	Отбор.Использование = Истина;
	Отбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ФиксированныеНастройки", фиксНастройки);
	ОткрытьФорму("Справочник.КатегорииДанных.ФормаВыбора", ПараметрыФормы, Элемент);

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

Функция ПолучитьСписокЗначенийНаСервере(ТипЗапроса)
	
	Запрос = новый Запрос;
	
	Запрос.УстановитьПараметр("Тип", ТипЗапроса);
	Запрос.Текст = "ВЫБРАТЬ
	               |	КатегорииЗапросов.Ссылка
	               |ИЗ
	               |	Справочник.КатегорииЗапросов КАК КатегорииЗапросов
	               |ГДЕ
	               |	КатегорииЗапросов.Тип = &Тип";
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	СписокКатегорий = Новый СписокЗначений;
	
	Пока Выборка.Следующий() Цикл
		
		СписокКатегорий.Добавить(Выборка.Ссылка);
		
	КонецЦикла;
	
	Возврат СписокКатегорий;
	
КонецФункции


Показать
7. dhurricane 02.04.19 14:42 Сейчас в теме
(1) Вам ни к чему такие сложности с событием "НачалоВыбора". Настройте свойство "СвязиПараметровВыбора" у реквизита "Категория" - делается это в 2 клика. Остальное на себя возьмет платформа.
9. Johney20 02.04.19 14:47 Сейчас в теме
(7) Действительно, сработало! Спасибо большое! А если наоборот? То есть теперь в зависимости от категории нужно выбирать нужный тип, но тип это перечисление. Тогда все таки понадобится НачалоВыбора?
10. dhurricane 02.04.19 14:49 Сейчас в теме
(9) Извините, не понял задачу. Каким образом должен сработать отбор "наоборот"?
11. Johney20 02.04.19 14:54 Сейчас в теме
(10) Так же нужно при выборе реквизита "Тип" смотреть, какая категория выбрана и в зависимости от нее ограничить список возможных типов. (Тип - перечисление "Типы запросов")

Кстати, при установленных связях параметров выбора, если поле "Тип" не заполнено, то форма открывается пустая(
12. dhurricane 02.04.19 14:59 Сейчас в теме
(11)
ограничить список возможных типов

Меня и интересует это ограничение. В запросе у Вас уже указан тип. Так какое ожидается ограничение типов? Он ведь один будет.

то форма открывается пустая

Так это же здорово. Пока не укажешь тип, не выберешь и запрос, т.о. они всегда соответствуют друг другу. Или Вы ожидаете другое поведение?
13. Johney20 02.04.19 15:02 Сейчас в теме
(12) Суть задачи такова: Вот обе эти значения пустые. Пользователь, например, выбирает категорию и так как тип не заполнен, ему доступны все категории. Далее он выбирает тип. Но здесь уже должен сработать отбор, та как категория заполнена.

И наоборот:

Пользователь выбирает тип (доступны все типы, т.к. категория не заполнена), далее он выбирает категорию и тут уже формируется список категорий, у которых тип такой же, как указан в табличной части обработки.
14. dhurricane 02.04.19 15:18 Сейчас в теме
(13) Пожалуй, такую задачу мышкой не решить. В качестве решения первой задачи предлагаю Вам следующее: не ограничивать Тип, а заполнять его из категории при выборе. Для этого потребуется определить обработчик события "ПриИзменении" для колонки категории:
&НаКлиенте
Процедура ТаблицаКатегорияПриИзменении(Элемент)

   ТекущаяСтрока = Элементы.Таблица.ТекущиеДанные;
   Если ЗначениеЗаполнено(ТекущаяСтрока.Категория) И Не ЗначениеЗаполнено(ТекущаяСтрока.Тип) Тогда
      ТекущаяСтрока.Тип = ПолучитьТипЗапросаНаСервере(ТекущаяСтрока.Категория);
   КонецЕсли;

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

&НаСервереБезКонтекста
Функция ПолучитьТипЗапросаНаСервере(Категория)

   Запрос = Новый Запрос("ВЫБРАТЬ Тип ИЗ Справочник.КатегорииЗапросов ГДЕ Ссылка = &Категория");
   Запрос.УстановитьПараметр("Категория", Категория);

   Выборка = Запрос.Выполнить().Выбрать();
   Если Выборка.Следующий() Тогда
      Возврат Выборка.Тип;
   Иначе
      Возврат Перечисления.ТипыЗапросов.ПустаяСсылка();
   КонецЕсли;

КонецФункции
Показать

А вот по поводу второй уже есть вопрос. Как я понимаю, вносить в конфигурацию изменения нельзя?
15. Johney20 02.04.19 15:27 Сейчас в теме
(14) Нет, нельзя, нужно ограничиться только разработкой в обработке..

Сейчас разберу Ваш пример.
16. dhurricane 02.04.19 15:46 Сейчас в теме
(15) Тогда Вам придется таки определять обработчики событий "НачалоВыбора" и еще кое какие. Но сделать это можно чуть проще. При этом связи параметров выбора оставляем настроенными. А обработчики следующие:
&НаКлиенте
Процедура ТаблицаКатегорияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	// Этот обработчик сработает, когда пользователь нажмет кнопку "..."
	
	ТекущаяСтрока = Элементы.Таблица.ТекущиеДанные;
	
	Если Не ЗначениеЗаполнено(ТекущаяСтрока.Тип) Тогда
		СтандартнаяОбработка = Ложь;
		ОткрытьФорму("Справочник.КатегорииЗапросов.ФормаВыбора", , Элемент);
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ТаблицаКатегорияОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
	
	// Этот обработчик сработает, когда пользователь введет текст и нажемет "Таб"
	
	Перем ЗначениеОтбора;
	
	Если ПараметрыПолученияДанных.Отбор.Свойство("Тип", ЗначениеОтбора) И Не ЗначениеЗаполнено(ЗначениеОтбора) Тогда
		ПараметрыПолученияДанных.Отбор.Удалить("Тип");
	КонецЕсли; 
	
КонецПроцедуры
Показать
17. Johney20 02.04.19 16:37 Сейчас в теме
(16) Спасибо Вам огромное! С Категориями все верно работает!

Что касается типов, то нужно поразмыслить, это же перечисление, и формы у него нет.
18. dhurricane 02.04.19 16:44 Сейчас в теме
(17) Пожалуйста. :)

Но я до сих пор не понимаю, как Вы хотите отбирать типы. Положим пользователь выбрал категорию "К1", в которой указан тип "Т1". Какой список выбора должен увидеть пользователь в обработке?
24. Johney20 03.04.19 08:01 Сейчас в теме
(18) В такой ситуации должен быть для выбора доступен только тип "Т1" )
26. dhurricane 03.04.19 08:28 Сейчас в теме
(24) Прокомментируйте тогда третий абзац сообщения (25).
20. tusv 211 02.04.19 17:46 Сейчас в теме
(17) Форма у Перечисления есть, Но проще воспользоваться Списком выбора элемента

МассивЭлементов = Новый Массив;
МассивЭлементов.Добавить(ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС18");
МассивЭлементов.Добавить(ПредопределенноеЗначение("Перечисление.СтавкиНДС.БезНДС");
Элементы.ТабличнаяЧастьСтавкаНДС.СписокВыбора.ЗагрузитьЗначения(МассивЭлементов);;
19. tusv 211 02.04.19 17:38 Сейчас в теме
(13)(16) Можно просто Программно добавляя или очищая Связи параметров выбора или Параметров выбора, в зависимости от заполненности элемента в Начало выбора и При Изменении. Без вызова Открытия формы Например
&НаКлиенте
Процедура ТабличнаяЧастьВидЦеныНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ДанныеСтроки = Элемент.Родитель.ТекущиеДанные;
	МассивЭлементов	= Новый Массив;
	Если Не ДанныеСтроки.Партнер.Пустая() Тогда
		НовыйПараметр	= Новый ПараметрВыбора("Отбор.Владелец", ДанныеСтроки.Партнер);
		МассивЭлементов.Добавить(НовыйПараметр);
	КонецЕсли;	
	Элемент.ПараметрыВыбора=Новый ФиксированныйМассив(МассивЭлементов);
		
КонецПроцедуры

&НаКлиенте
Процедура ТабличнаяЧастьВидЦеныПриИзменении(Элемент)
	ДанныеСтроки = Элемент.Родитель.ТекущиеДанные;
	МассивЭлементов	= Новый Массив;
	Если Не ДанныеСтроки.ВидЦены.Пустая() Тогда
		НовыйПараметр = Новый ПараметрВыбора("Отбор.Ссылка"
		,ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(ДанныеСтроки.ВидЦены,"Владелец"));
		МассивЭлементов.Добавить(НовыйПараметр);
	КонецЕсли;	
	Элементы.ТабличнаяЧастьПартнер.ПараметрыВыбора = Новый ФиксированныйМассив(МассивЭлементов);	
КонецПроцедуры
Показать
21. dhurricane 02.04.19 20:21 Сейчас в теме
(19)
Можно просто
И в чем же простота?

Во-первых, событие "ПриИзменении" не подходит. Параметры выбора ведь распространяются на всю колонку цеником. Что, если тип будет изменен в одной строке, а после этого категория выбирается в другой? Или еще проще: только что открыт ранее сохраненный документ, тип не перевыбирается, изменяется только категория?

Во-вторых, событие "НачалоВыбора" срабатывает перед открытием формы выбора. А как же ввод по строке?

И когда Вы учтете все нюансы, неужели код в итоге будет проще?
22. dhurricane 03.04.19 07:19 Сейчас в теме
(19) (1) Я с утра переосмыслил Ваше предложение, и пришел к выводу, что погорячился вчера. :) Ваша реализация неверная, но вот предложение менять параметры выбора "на лету" - вполне работоспособно. Так даже будет нагляднее, чем предложенный мной ранее способ. Можно попробовать.

Итак, нужно удалить связь параметров выбора между типом и категорией и реализовать всего 2 обработчика события: "ПриИзменении" для типа и "ПриАктивизацииСтроки" для таблицы:
&НаКлиенте
Процедура ТаблицаТипПриИзменении(Элемент)

	Элементы.Таблица.ТекущиеДанные.Категория = Неопределено;
	
	НастроитьВыборКатегории();
	
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаПриАктивизацииСтроки(Элемент)

	НастроитьВыборКатегории();
	
КонецПроцедуры

&НаКлиенте
Процедура НастроитьВыборКатегории()

	ТекущаяСтрока = Элементы.Таблица.ТекущиеДанные;
	
	ПараметрыВыбора = Новый Массив;
	Если ЗначениеЗаполнено(ТекущаяСтрока.Тип) Тогда
		НовыйПараметр = Новый ПараметрВыбора("Отбор.Тип", ТекущаяСтрока.Тип);
		ПараметрыВыбора.Добавить(НовыйПараметр);
	КонецЕсли;
	
	Элементы.ТаблицаКатегория.ПараметрыВыбора = Новый ФиксированныйМассив(ПараметрыВыбора);
	
КонецПроцедуры
Показать
23. tusv 211 03.04.19 07:53 Сейчас в теме
(22) (1)То был просто пример и идея
Ну раз пошла такая пьянка
При Активации строки плохо, Лишние вызовы и при редактировании потеряется..
Для справочника достаточно воспользоваться событием Автоподбор. И Выбор будет работать, и ввод по строке
&НаКлиенте
Процедура ТаблицаНомеклатураАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	ДанныеСтроки = Элемент.Родитель.ТекущиеДанные;
	Массив = Новый Массив;
	ЗначениеОтбора = ДанныеСтроки.ТипНомеклатуры;
	Если не ЗначениеОтбора.Пустая() Тогда
		Массив.Добавить(Новый ПараметрВыбора("Отбор.ТипНоменклатуры",ЗначениеОтбора));	
	КонецЕсли;	
	Элемент.ПараметрыВыбора = Новый ФиксированныйМассив(Массив);
КонецПроцедуры
Показать

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

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

В общем полностью работающий код. Ну там ПриИзменении добавить очистку и мои имена поменять на свои
25. dhurricane 03.04.19 08:13 Сейчас в теме
(23) На счет АвтоПодбора не совсем понял. Согласен, что его удобнее всего использовать. Только не вижу смысла настраивать параметры выбора колонки. На мой вкус гораздо нагляднее и эффективнее вставить нужный отбор в параметр "ПараметрыПолученияДанных". А вот событие выбора (нажатие "...") никак не связано с авто подбором. Как Вы здесь предлагаете поступить? Таки переопределить "НачалоВыбора"?

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

Взгляните на свое решение. Если пользователь сначала выберет категорию, у него будет ограничен выбор типа одним значением. Зачем его тогда ограничивать, если можно просто этим значением заполнить колонку? Ну допустим, нужно ограничивать. Пользователь выбирает этот единственный элемент, все хорошо. Но затем он осознал, что неправильно выбрал категорию. Получается патовая ситуация: другую категорию (с другим типом) выбрать не можем, потому что выбор ограничен типом, но и другой тип выбрать не можем, потому что выбор ограничен категорией. В этом случае нужно сначала очистить категорию, потом тип, а потом уже выбрать нужную категорию. В общем совершенно ненужный пользователю квест. :)
27. tusv 211 03.04.19 10:22 Сейчас в теме
(25) При настройках элемента по умолчанию , событие Автоподбор вызывается первым и через него передается параметр выбора в элемент, который автоматом перейдет в Выбор. (нажатие "..." или F4) . Все. делается в одном событии. Других танцев с бубном не нужно

Про перечисление. Пусть (1) ArBot скакжет
28. dhurricane 03.04.19 10:26 Сейчас в теме
3. arsen_botashev 02.04.19 14:29 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот