У внешней обработки есть табличная часть. Среди ее реквизитов есть "Категория" - спр.КатегорииЗапросов и "Тип" - Пер.ТипыЗапросов. Между собой они связаны следующим образом:
В спр. "КатегорииЗапросов" есть реквизит "Тип" - пер. "ТипыЗапросов". И вот необходимо, чтобы при выборе категорий, в списке можно было увидеть только те, у кого тип = тип из тч.
Как правильно поставить такой отбор? Это обработчик события "Началовыбора", верно? А что внутри? Можно пример?
В спр. "КатегорииЗапросов" есть реквизит "Тип" - пер. "ТипыЗапросов". И вот необходимо, чтобы при выборе категорий, в списке можно было увидеть только те, у кого тип = тип из тч.
Как правильно поставить такой отбор? Это обработчик события "Началовыбора", верно? А что внутри? Можно пример?
По теме из базы знаний
- Программисту на заметку: отбор в динамическом списке формы выбора справочника по вхождению значения отбора в заданный список значений
- Управляемое приложение: правильное программное открытие форм
- Как скрыть "пустые" группы справочника при открытии формы выбора? (только для УФ)
- Установка отбора по списку значений при открытии формы выбора справочника из реквизита обработки
- Параметры открытия формы выбора отборов и параметров СКД ("связи параметров выбора" списочных значений СКД)
Найденные решения
(15) Тогда Вам придется таки определять обработчики событий "НачалоВыбора" и еще кое какие. Но сделать это можно чуть проще. При этом связи параметров выбора оставляем настроенными. А обработчики следующие:
&НаКлиенте
Процедура ТаблицаКатегорияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Этот обработчик сработает, когда пользователь нажмет кнопку "..."
ТекущаяСтрока = Элементы.Таблица.ТекущиеДанные;
Если Не ЗначениеЗаполнено(ТекущаяСтрока.Тип) Тогда
СтандартнаяОбработка = Ложь;
ОткрытьФорму("Справочник.КатегорииЗапросов.ФормаВыбора", , Элемент);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТаблицаКатегорияАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
// Этот обработчик сработает, когда пользователь введет текст и на секунду остановится
Перем ЗначениеОтбора;
Если ПараметрыПолученияДанных.Отбор.Свойство("Тип", ЗначениеОтбора) И Не ЗначениеЗаполнено(ЗначениеОтбора) Тогда
ПараметрыПолученияДанных.Отбор.Удалить("Тип");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТаблицаКатегорияОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
// Этот обработчик сработает, когда пользователь введет текст и нажемет "Таб"
Перем ЗначениеОтбора;
Если ПараметрыПолученияДанных.Отбор.Свойство("Тип", ЗначениеОтбора) И Не ЗначениеЗаполнено(ЗначениеОтбора) Тогда
ПараметрыПолученияДанных.Отбор.Удалить("Тип");
КонецЕсли;
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
&НаКлиенте
Процедура МагазинНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
фиксНастройки = Новый НастройкиКомпоновкиДанных;
Отбор = фиксНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
Отбор.ПравоеЗначение = ПолучитьСписоЗначенийНаСервере(Элементы.ИмяТЧ.ТекущиеДанные.КакойтоРеквизит);
Отбор.Использование = Истина;
Отбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ФиксированныеНастройки", фиксНастройки);
ОткрытьФорму("Справочник.Магазины.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
Показать
(6) Сделала так, но форма открывается пустая.
&НаКлиенте
Процедура СписокЗапросовКатегорияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
фиксНастройки = Новый НастройкиКомпоновкиДанных;
Отбор = фиксНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
Отбор.ПравоеЗначение = ПолучитьСписокЗначенийНаСервере(Элементы.СписокЗапросов.ТекущиеДанные.Тип);
Отбор.Использование = Истина;
Отбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ФиксированныеНастройки", фиксНастройки);
ОткрытьФорму("Справочник.КатегорииДанных.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
Функция ПолучитьСписокЗначенийНаСервере(ТипЗапроса)
Запрос = новый Запрос;
Запрос.УстановитьПараметр("Тип", ТипЗапроса);
Запрос.Текст = "ВЫБРАТЬ
| КатегорииЗапросов.Ссылка
|ИЗ
| Справочник.КатегорииЗапросов КАК КатегорииЗапросов
|ГДЕ
| КатегорииЗапросов.Тип = &Тип";
Выборка = Запрос.Выполнить().Выбрать();
СписокКатегорий = Новый СписокЗначений;
Пока Выборка.Следующий() Цикл
СписокКатегорий.Добавить(Выборка.Ссылка);
КонецЦикла;
Возврат СписокКатегорий;
КонецФункции
Показать
(10) Так же нужно при выборе реквизита "Тип" смотреть, какая категория выбрана и в зависимости от нее ограничить список возможных типов. (Тип - перечисление "Типы запросов")
Кстати, при установленных связях параметров выбора, если поле "Тип" не заполнено, то форма открывается пустая(
Кстати, при установленных связях параметров выбора, если поле "Тип" не заполнено, то форма открывается пустая(
(11)
Меня и интересует это ограничение. В запросе у Вас уже указан тип. Так какое ожидается ограничение типов? Он ведь один будет.
Так это же здорово. Пока не укажешь тип, не выберешь и запрос, т.о. они всегда соответствуют друг другу. Или Вы ожидаете другое поведение?
ограничить список возможных типов
Меня и интересует это ограничение. В запросе у Вас уже указан тип. Так какое ожидается ограничение типов? Он ведь один будет.
то форма открывается пустая
Так это же здорово. Пока не укажешь тип, не выберешь и запрос, т.о. они всегда соответствуют друг другу. Или Вы ожидаете другое поведение?
(12) Суть задачи такова: Вот обе эти значения пустые. Пользователь, например, выбирает категорию и так как тип не заполнен, ему доступны все категории. Далее он выбирает тип. Но здесь уже должен сработать отбор, та как категория заполнена.
И наоборот:
Пользователь выбирает тип (доступны все типы, т.к. категория не заполнена), далее он выбирает категорию и тут уже формируется список категорий, у которых тип такой же, как указан в табличной части обработки.
И наоборот:
Пользователь выбирает тип (доступны все типы, т.к. категория не заполнена), далее он выбирает категорию и тут уже формируется список категорий, у которых тип такой же, как указан в табличной части обработки.
(13) Пожалуй, такую задачу мышкой не решить. В качестве решения первой задачи предлагаю Вам следующее: не ограничивать Тип, а заполнять его из категории при выборе. Для этого потребуется определить обработчик события "ПриИзменении" для колонки категории:
А вот по поводу второй уже есть вопрос. Как я понимаю, вносить в конфигурацию изменения нельзя?
&НаКлиенте
Процедура ТаблицаКатегорияПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Таблица.ТекущиеДанные;
Если ЗначениеЗаполнено(ТекущаяСтрока.Категория) И Не ЗначениеЗаполнено(ТекущаяСтрока.Тип) Тогда
ТекущаяСтрока.Тип = ПолучитьТипЗапросаНаСервере(ТекущаяСтрока.Категория);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьТипЗапросаНаСервере(Категория)
Запрос = Новый Запрос("ВЫБРАТЬ Тип ИЗ Справочник.КатегорииЗапросов ГДЕ Ссылка = &Категория");
Запрос.УстановитьПараметр("Категория", Категория);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Тип;
Иначе
Возврат Перечисления.ТипыЗапросов.ПустаяСсылка();
КонецЕсли;
КонецФункции
ПоказатьА вот по поводу второй уже есть вопрос. Как я понимаю, вносить в конфигурацию изменения нельзя?
(15) Тогда Вам придется таки определять обработчики событий "НачалоВыбора" и еще кое какие. Но сделать это можно чуть проще. При этом связи параметров выбора оставляем настроенными. А обработчики следующие:
&НаКлиенте
Процедура ТаблицаКатегорияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Этот обработчик сработает, когда пользователь нажмет кнопку "..."
ТекущаяСтрока = Элементы.Таблица.ТекущиеДанные;
Если Не ЗначениеЗаполнено(ТекущаяСтрока.Тип) Тогда
СтандартнаяОбработка = Ложь;
ОткрытьФорму("Справочник.КатегорииЗапросов.ФормаВыбора", , Элемент);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТаблицаКатегорияАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
// Этот обработчик сработает, когда пользователь введет текст и на секунду остановится
Перем ЗначениеОтбора;
Если ПараметрыПолученияДанных.Отбор.Свойство("Тип", ЗначениеОтбора) И Не ЗначениеЗаполнено(ЗначениеОтбора) Тогда
ПараметрыПолученияДанных.Отбор.Удалить("Тип");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТаблицаКатегорияОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
// Этот обработчик сработает, когда пользователь введет текст и нажемет "Таб"
Перем ЗначениеОтбора;
Если ПараметрыПолученияДанных.Отбор.Свойство("Тип", ЗначениеОтбора) И Не ЗначениеЗаполнено(ЗначениеОтбора) Тогда
ПараметрыПолученияДанных.Отбор.Удалить("Тип");
КонецЕсли;
КонецПроцедуры
Показать
(17) Форма у Перечисления есть, Но проще воспользоваться Списком выбора элемента
МассивЭлементов = Новый Массив;
МассивЭлементов.Добавить(ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС18");
МассивЭлементов.Добавить(ПредопределенноеЗначение("Перечисление.СтавкиНДС.БезНДС");
Элементы.ТабличнаяЧастьСтавкаНДС.СписокВыбора.ЗагрузитьЗначения(МассивЭлементов);;
МассивЭлементов = Новый Массив;
МассивЭлементов.Добавить(ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС18");
МассивЭлементов.Добавить(ПредопределенноеЗначение("Перечисление.СтавкиНДС.БезНДС");
Элементы.ТабличнаяЧастьСтавкаНДС.СписокВыбора.ЗагрузитьЗначения(МассивЭлементов);;
(13)(16) Можно просто Программно добавляя или очищая Связи параметров выбора или Параметров выбора, в зависимости от заполненности элемента в Начало выбора и При Изменении. Без вызова Открытия формы Например
&НаКлиенте
Процедура ТабличнаяЧастьВидЦеныНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ДанныеСтроки = Элемент.Родитель.ТекущиеДанные;
МассивЭлементов = Новый Массив;
Если Не ДанныеСтроки.Партнер.Пустая() Тогда
НовыйПараметр = Новый ПараметрВыбора("Отбор.Владелец", ДанныеСтроки.Партнер);
МассивЭлементов.Добавить(НовыйПараметр);
КонецЕсли;
Элемент.ПараметрыВыбора=Новый ФиксированныйМассив(МассивЭлементов);
КонецПроцедуры
&НаКлиенте
Процедура ТабличнаяЧастьВидЦеныПриИзменении(Элемент)
ДанныеСтроки = Элемент.Родитель.ТекущиеДанные;
МассивЭлементов = Новый Массив;
Если Не ДанныеСтроки.ВидЦены.Пустая() Тогда
НовыйПараметр = Новый ПараметрВыбора("Отбор.Ссылка"
,ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(ДанныеСтроки.ВидЦены,"Владелец"));
МассивЭлементов.Добавить(НовыйПараметр);
КонецЕсли;
Элементы.ТабличнаяЧастьПартнер.ПараметрыВыбора = Новый ФиксированныйМассив(МассивЭлементов);
КонецПроцедуры
Показать
(19)
Во-первых, событие "ПриИзменении" не подходит. Параметры выбора ведь распространяются на всю колонку цеником. Что, если тип будет изменен в одной строке, а после этого категория выбирается в другой? Или еще проще: только что открыт ранее сохраненный документ, тип не перевыбирается, изменяется только категория?
Во-вторых, событие "НачалоВыбора" срабатывает перед открытием формы выбора. А как же ввод по строке?
И когда Вы учтете все нюансы, неужели код в итоге будет проще?
Можно просто
И в чем же простота?
Во-первых, событие "ПриИзменении" не подходит. Параметры выбора ведь распространяются на всю колонку цеником. Что, если тип будет изменен в одной строке, а после этого категория выбирается в другой? Или еще проще: только что открыт ранее сохраненный документ, тип не перевыбирается, изменяется только категория?
Во-вторых, событие "НачалоВыбора" срабатывает перед открытием формы выбора. А как же ввод по строке?
И когда Вы учтете все нюансы, неужели код в итоге будет проще?
(19) (1) Я с утра переосмыслил Ваше предложение, и пришел к выводу, что погорячился вчера. :) Ваша реализация неверная, но вот предложение менять параметры выбора "на лету" - вполне работоспособно. Так даже будет нагляднее, чем предложенный мной ранее способ. Можно попробовать.
Итак, нужно удалить связь параметров выбора между типом и категорией и реализовать всего 2 обработчика события: "ПриИзменении" для типа и "ПриАктивизацииСтроки" для таблицы:
Итак, нужно удалить связь параметров выбора между типом и категорией и реализовать всего 2 обработчика события: "ПриИзменении" для типа и "ПриАктивизацииСтроки" для таблицы:
&НаКлиенте
Процедура ТаблицаТипПриИзменении(Элемент)
Элементы.Таблица.ТекущиеДанные.Категория = Неопределено;
НастроитьВыборКатегории();
КонецПроцедуры
&НаКлиенте
Процедура ТаблицаПриАктивизацииСтроки(Элемент)
НастроитьВыборКатегории();
КонецПроцедуры
&НаКлиенте
Процедура НастроитьВыборКатегории()
ТекущаяСтрока = Элементы.Таблица.ТекущиеДанные;
ПараметрыВыбора = Новый Массив;
Если ЗначениеЗаполнено(ТекущаяСтрока.Тип) Тогда
НовыйПараметр = Новый ПараметрВыбора("Отбор.Тип", ТекущаяСтрока.Тип);
ПараметрыВыбора.Добавить(НовыйПараметр);
КонецЕсли;
Элементы.ТаблицаКатегория.ПараметрыВыбора = Новый ФиксированныйМассив(ПараметрыВыбора);
КонецПроцедуры
Показать
(22) (1)То был просто пример и идея
Ну раз пошла такая пьянка
При Активации строки плохо, Лишние вызовы и при редактировании потеряется..
Для справочника достаточно воспользоваться событием Автоподбор. И Выбор будет работать, и ввод по строке
А вот с перечислениемп Параметры выбора не катят. Потому воспользуемся событиями: НачалоВыбора ,ОкончаниеВводаТекста, ИзменениеТекстаРедактирования,. Определим ДанныеВыбора и отрегулируем ввод по строке
В общем полностью работающий код. Ну там ПриИзменении добавить очистку и мои имена поменять на свои
Ну раз пошла такая пьянка
При Активации строки плохо, Лишние вызовы и при редактировании потеряется..
Для справочника достаточно воспользоваться событием Автоподбор. И Выбор будет работать, и ввод по строке
&НаКлиенте
Процедура ТаблицаНомеклатураАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
ДанныеСтроки = Элемент.Родитель.ТекущиеДанные;
Массив = Новый Массив;
ЗначениеОтбора = ДанныеСтроки.ТипНомеклатуры;
Если не ЗначениеОтбора.Пустая() Тогда
Массив.Добавить(Новый ПараметрВыбора("Отбор.ТипНоменклатуры",ЗначениеОтбора));
КонецЕсли;
Элемент.ПараметрыВыбора = Новый ФиксированныйМассив(Массив);
КонецПроцедуры
ПоказатьА вот с перечислениемп Параметры выбора не катят. Потому воспользуемся событиями: НачалоВыбора ,ОкончаниеВводаТекста, ИзменениеТекстаРедактирования,. Определим ДанныеВыбора и отрегулируем ввод по строке
&НаКлиенте
Процедура УстановитьДанныеВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ДанныеСтроки = Элемент.Родитель.ТекущиеДанные;
Если Не ДанныеСтроки.Номенклатура.Пустая() Тогда
СтандартнаяОбработка = Ложь;
ДанныеВыбора = Новый СписокЗначений;
Значение = ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(ДанныеСтроки.Номенклатура,"ТипНоменклатуры");
ДанныеВыбора.Добавить(Значение, Значение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТаблицаТипНомеклатурыНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
УстановитьДанныеВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура ТаблицаТипНомеклатурыОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
УстановитьДанныеВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура ТаблицаТипНомеклатурыИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
ДанныеСтроки = Элемент.Родитель.ТекущиеДанные;
Если Не ДанныеСтроки.Номенклатура.Пустая() Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
ПоказатьВ общем полностью работающий код. Ну там ПриИзменении добавить очистку и мои имена поменять на свои
(23) На счет АвтоПодбора не совсем понял. Согласен, что его удобнее всего использовать. Только не вижу смысла настраивать параметры выбора колонки. На мой вкус гораздо нагляднее и эффективнее вставить нужный отбор в параметр "ПараметрыПолученияДанных". А вот событие выбора (нажатие "...") никак не связано с авто подбором. Как Вы здесь предлагаете поступить? Таки переопределить "НачалоВыбора"?
По поводу перечисления, тут вообще постановка задачи непонятная. А деталей я добиться не смог.
Взгляните на свое решение. Если пользователь сначала выберет категорию, у него будет ограничен выбор типа одним значением. Зачем его тогда ограничивать, если можно просто этим значением заполнить колонку? Ну допустим, нужно ограничивать. Пользователь выбирает этот единственный элемент, все хорошо. Но затем он осознал, что неправильно выбрал категорию. Получается патовая ситуация: другую категорию (с другим типом) выбрать не можем, потому что выбор ограничен типом, но и другой тип выбрать не можем, потому что выбор ограничен категорией. В этом случае нужно сначала очистить категорию, потом тип, а потом уже выбрать нужную категорию. В общем совершенно ненужный пользователю квест. :)
По поводу перечисления, тут вообще постановка задачи непонятная. А деталей я добиться не смог.
Взгляните на свое решение. Если пользователь сначала выберет категорию, у него будет ограничен выбор типа одним значением. Зачем его тогда ограничивать, если можно просто этим значением заполнить колонку? Ну допустим, нужно ограничивать. Пользователь выбирает этот единственный элемент, все хорошо. Но затем он осознал, что неправильно выбрал категорию. Получается патовая ситуация: другую категорию (с другим типом) выбрать не можем, потому что выбор ограничен типом, но и другой тип выбрать не можем, потому что выбор ограничен категорией. В этом случае нужно сначала очистить категорию, потом тип, а потом уже выбрать нужную категорию. В общем совершенно ненужный пользователю квест. :)
(25) При настройках элемента по умолчанию , событие Автоподбор вызывается первым и через него передается параметр выбора в элемент, который автоматом перейдет в Выбор. (нажатие "..." или F4) . Все. делается в одном событии. Других танцев с бубном не нужно
Про перечисление. Пусть (1) ArBot скакжет
Про перечисление. Пусть (1) ArBot скакжет
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот