СКД - отбор значений. Форма подбора подчиненных значений при выборе нескольких Владельцев

16.02.14

Разработка - СКД

Как недавно выяснилось - в СКД не реализован механизм подбора подчиненных значений при выборе нескольких Владельцев. Типовые средства выдают для выбора весь справочник с подчинениями при типе значения ВСписке у Владельца. Частичное решение данной проблемы описано в данной статье.

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

Форма выбора открывается, когда и у Подчиненного и у Владельца указан тип значения (ВСписке)!!!

Для реализации нам требуется:

1) создать произвольную форму в СКД с названием "ФормаВыбораПодчинения"
и следующими реквизитами (соответственно реквизиты ВладелецВыбор и ПодчиненныйВыбор должны иметь правильную ссылку)

В коде формы необходимо подставить название справочника подчиненных элементов в переменную строкаСпрПодчинененныхЭлементов (например "Договоры")

Все остальное без изменений. В коде дал подробные разъяснения что и зачем.

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

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


2) В КомпоновщикНастроекПользовательскиеНастройки (см. пост выше) на ПередНачаломИзменения вешаем приведенный ниже обработчик.
Все, что нам необходимо ввести в обработчике событий, это строковое название реквизита владельца и подчиненного в переменные

НазваниеРеквизитаВладельца,

НазваниеРеквизитаПодчиненного.

&НаКлиенте
Процедура КомпоновщикНастроекПользовательскиеНастройкиПередНачаломИзменения(Элемент, Отказ)
    
    // Название реквизитов Владельца и Подчиненного
    НазваниеРеквизитаВладельца = "ОбъектСтроительства";
    НазваниеРеквизитаПодчиненного = "Ось";
    
    // Структуры для хранения текущих отборов и передачи их в форму
    СтруктураПодчиненного = Новый Структура;
    СтруктураВладельца = Новый Структура;
    СтруктураДляПередачиВФорму = Новый Структура;
    
    //Поехали! Если пытаются изменить отбор подчиненного элемента, тогда...
    Если Элемент.ТекущиеДанные.Настройка = НазваниеРеквизитаПодчиненного Тогда
        
        // ... считываем текущие отборы и помещаем в СтруктураПодчиненного и СтруктураВладельца
        Для каждого строкаНастройки из Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[0].Элементы Цикл
            Если Строка(строкаНастройки.ЛевоеЗначение) = НазваниеРеквизитаПодчиненного Тогда
                // добавляем структуру отбора Подчиненного
                СтруктураПодчиненного.Очистить();
                СтруктураПодчиненного.Вставить("ЛевоеЗначение", Строка(строкаНастройки.ЛевоеЗначение));
                СтруктураПодчиненного.Вставить("ПравоеЗначение", строкаНастройки.ПравоеЗначение);
                СтруктураПодчиненного.Вставить("ВидСравнения", Строка(строкаНастройки.ВидСравнения));
                СтруктураПодчиненного.Вставить("Использование", строкаНастройки.Использование);
                
            ИначеЕсли Строка(строкаНастройки.ЛевоеЗначение) = НазваниеРеквизитаВладельца Тогда
                // добавляем структуру отбора Владельца
                СтруктураВладельца.Очистить();
                СтруктураВладельца.Вставить("ЛевоеЗначение", Строка(строкаНастройки.ЛевоеЗначение));
                СтруктураВладельца.Вставить("ПравоеЗначение", строкаНастройки.ПравоеЗначение);
                СтруктураВладельца.Вставить("ВидСравнения", Строка(строкаНастройки.ВидСравнения));
                СтруктураВладельца.Вставить("Использование", строкаНастройки.Использование);
                
            КонецЕсли;
        КонецЦикла;
        
        // Если Владелец присутствует в списке и используется...
        Если СтруктураВладельца.Количество() > 0 Тогда
            Если СтруктураВладельца.Использование
                И СтруктураВладельца.ВидСравнения = Строка(ВидСравненияКомпоновкиДанных.ВСписке)
                И СтруктураПодчиненного.Использование
                И СтруктураПодчиненного.ВидСравнения = Строка(ВидСравненияКомпоновкиДанных.ВСписке)
                Тогда
                //... вот только в этом случае мы открываем нашу форму выбора
                СтруктураДляПередачиВФорму.Очистить();
                СтруктураДляПередачиВФорму.Вставить("СтруктураПодчиненного", СтруктураПодчиненного);
                СтруктураДляПередачиВФорму.Вставить("СтруктураВладельца", СтруктураВладельца);
                
                ФормаВыбора = ПолучитьФорму("Отчет.рзмкПанельОбеспеченияМеталлом.Форма.ФормаВыбораПодчинения", СтруктураДляПередачиВФорму, Элемент);
                ИтоговыйПодбор = ФормаВыбора.ОткрытьМодально();
                Если Не ИтоговыйПодбор = Неопределено тогда
                    Для каждого строкаНастройки из Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы[0].Элементы Цикл
                        Если Строка(строкаНастройки.ЛевоеЗначение) = НазваниеРеквизитаПодчиненного Тогда
                            Если Не ТипЗнч(ИтоговыйПодбор.списокзначенийПодчиненные) = Тип("СписокЗначений") Тогда
                                Продолжить;
                            КонецЕсли;
                            строкаНастройки.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
                            строкаНастройки.ПравоеЗначение.Очистить();
                            Для каждого строкаНовойНастройки Из ИтоговыйПодбор.списокзначенийПодчиненные Цикл
                                строкаНастройки.ПравоеЗначение.Добавить(строкаНовойНастройки.Значение);
                            КонецЦикла;
                            
                        ИначеЕсли Строка(строкаНастройки.ЛевоеЗначение) = НазваниеРеквизитаВладельца Тогда
                            
                            Если Не ТипЗнч(ИтоговыйПодбор.списокзначенийВладельцы) = Тип("СписокЗначений") Тогда
                                Продолжить;
                            КонецЕсли;
                            
                            строкаНастройки.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
                            строкаНастройки.ПравоеЗначение.Очистить();
                            Для каждого строкаНовойНастройки Из ИтоговыйПодбор.списокзначенийВладельцы Цикл
                                строкаНастройки.ПравоеЗначение.Добавить(строкаНовойНастройки.Значение);
                            КонецЦикла;
                            
                        КонецЕсли;
                    КонецЦикла;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

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

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    124609    681    389    

732

Генератор схемы компоновки данных (СКД), написание кода схемы программно

Инструментарий разработчика СКД Платформа 1С v8.3 Конфигурации 1cv8 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

По выбранной схеме компоновки данных генерирует программный код, который генерирует СКД, аналогичную исходной схеме. Есть дополнительные инструменты для просмотра дерева схемы, сравнение исходной схемы и полученной по коду, а также сравнение изменений в сгенерированном коде для исходной схемы и для измененной.

3 стартмани

05.02.2024    4344    30    obmailok    19    

67

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2138    2    Yashazz    0    

30

СКД на JavaScript в 1С

СКД WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    8351    20    John_d    25    

123

Использование менеджера временных таблиц в СКД

СКД Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

Рассмотрим еще не получивший широкого распространения способ работы с внешними данным в СКД. В процессе обсуждения работы с СКД выяснилось, что многие не знакомы со способом помещения туда временной таблицы, полученной предварительно. Статья будет полезна разработчикам, знакомым с программным созданием СКД.

05.12.2023    4892    PROSTO-1C    13    

62

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    5994    15    kalyaka    5    

86

Пользовательские настройки отчетов 1С. Часть 1. Простые и расширенные настройки

СКД Инструкции пользователю Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Простые приемы работы с отчетами на СКД. Что нужно знать пользователю про настройку отчетов, чтобы использовать их на полную катушку.

18.09.2023    7277    accounting_cons    7    

29

Разрыв страницы в СКД. Легко!

СКД Платформа 1С v8.3 Система компоновки данных Бесплатно (free)

Когда отчет надо разделить по страницам, это всегда проблема для разработчика. Поскольку в СКД нет стандартных вариантов, как это сделать. Нашел (на свой взгляд) самое простое и оптимальное решение.

01.09.2023    4736    KVIKS    15    

80
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. vardo 53 19.02.14 07:42 Сейчас в теме
Как недавно выяснилось - в СКД не реализован механизм подбора подчиненных значений при выборе нескольких Владельцев

Где это выяснилось? А для чего тогда в "Группе из списка"?
Прикрепленные файлы:
2. ikar-nikolay 103 19.02.14 12:00 Сейчас в теме
(1) vardo, да тут мы пообщались: http://forum.infostart.ru/forum26/topic104485/

Нет отбора по подчиненным элементам при выборе нескольких Владельцев.
В группе из списка тоже не спасает. Ты выбираешь несколько Владельцев, открываешь для подбора подчиненные и вываливается весь список без отбора по выбранным Владельцам.

Если не так, то скажи, что не так делаю? Мне этот механизм был нужен очень срочно, поэтому писал на коленке без большого анализа. Конечный код немного поменялся - в текущем не хватает нескольких условий, как доотчитаюсь до конца, перезалью.
3. vardo 53 19.02.14 13:42 Сейчас в теме
Я может не понимаю цели, но если нужно в отчете отобрать контрагента и его договора, то это вообще делается запросом с левым соединением в наборе данных СКД. И отбирай нужных контрагентов всписке отбором
5. ikar-nikolay 103 20.02.14 01:39 Сейчас в теме
(3) vardo, цель простая - в СКД выбираешь для отбора 3 контрагентов, начинаешь выбирать договора - кликаешь в отборе Договора и у тебя появляется список договоров только выбранных тобою 3-х контрагентов.
Типовая реализация - вываливается список со всеми существующими в конфигурации договорами без какого-либо отбора.
6. artfa 58 22.09.14 00:32 Сейчас в теме
(5) да это так, но в УТ 11 в общей форме отчетов работает, другие конфы не смотрел
4. _LEV_ 19.02.14 23:49 Сейчас в теме
тоже столкнулся с данной проблемой - как в отборах выбрать значение свойства по владельцу, а владельцев несколько.. вываливается весь список..
Оставьте свое сообщение