Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: форма выбора с отбором по реквизиту табличной части
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование управляемых форм 1С 8.2
Цибир
Здравствуйте.

Есть Справочник Факультет. В табличной части есть реквизит Кафедры(Справочник Кафедра).
Есть Справочник Адрес. В табличной части есть реквизит Факультет(Справочник Факультет) и реквизит Кафедра(Справочник Кафедра).
Нужен алгоритм, согласно которому в табличной части справочника Адрес будет вестись отбор по факультету. То есть, выбрав факультет, при выборе кафедры будут присутствовать только кафедры данного факультета.

Посоветуйте, пожалуйста, пример алгоритма для решения данной задачи.
Спасибо.
logist
Логичней использовать Справочник "Кафедры" который подчинен справочнику "Факультеты", в таком случае для поля выбора можно использовать свойство Связи параметров выбора указав Владельца
Цибир
Конечно логичней и проще. Но решение нужно данной задачи.
logist
Ну тогда "ПриИзменении" факультета собираете список значений из ТЧ кафедры и запихиваете его в поле ввода соотв. колонки.
Цибир
Спасибо. Нам бы развернутый ответ. Мы тут нашли решение, но оно немного кривовато. Хотелось бы посмотреть другие решения и выявить наиболее удачные.
logist
Давайте сюда ваше кривоватое, будем разбираться.
Цибир
Итак, у нас СпрКафедры, СпрФакультет с реквизитом табличной части Кафедра(СпрКафедра) и СпрАдрес с реквизитами табличной части Факультет(СпрФакультет) и Кафедра(СпрКафедра). Нам необходимо сделать отбор кафедр по факультету в табличной части справочника Адрес.
В форме элемента СпрАдрес для реквизита табличной части "Кафедра" назначаем событие(еще ставим кнопки выбора и списка "Да"):

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


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


&НаСервереБезКонтекста
Функция ПолучитьСсылкуНаСервере(О)
    ВыбСсылка=Справочники.Кафедра.НайтиПоНаименованию(СокрЛП(О)).Ссылка;
    Возврат ВыбСсылка;
КонецФункции


В итоге, после выбора факультета мы выбираем кафедры. В списке будут отобранные по факультету, а в выборе - все имеющие.
По сути, наша задача выполнена, и отбор идет. Но какой-то не оч красивый способ. Нужен красивый)
logist
Ну, как-то так
&НаКлиенте
Процедура Поле1НачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
    
    СтрокаТабличнойЧасти = Элементы.Табчасть.ТекущиеДанные;
        
    Элемент.СписокВыбора.Очистить();
    Если Не ЗначениеЗаполнено(СтрокаТабличнойЧасти.Факультет) Тогда
        Возврат;
    КонецЕсли;    
    
    СписокКафедр = ПолучитьДанныеКафедр(СтрокаТабличнойЧасти.Факультет);
        
    Для каждого ЭлСписка Из СписокКафедр Цикл
        Элемент.СписокВыбора.Добавить(ЭлСписка.Значение, ЭлСписка.Представление);
    КонецЦикла;    
    
КонецПроцедуры

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