Имя: Пароль:
1C
1С v8
Динамический список. Колонка дополнительных сведений
0 LordCMEPTb
 
03.02.14
13:16
Доброго дня! Есть типовая конфигурация БП 3.0, которая работает на управляемых формах. Нужно сделать обработку, которая бы выводила динамический список справочника со свойствами из РС.ЗначенияСвойствОбъектов.
Задача простая до невозможности:
1. Создаем свойства в ПВХ:
<code>
Функция СоздатьСвойствоВПланеВидовХарактеристик(Знач НаименованиеСвойства, Знач НазначениеСвойства = Неопределено, Знач ТипЗначения = Неопределено);

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

    Возврат НужноеСвойство.Ссылка;
    
КонецФункции
</code>
2. Создаем на форме динамический список с произвольным запросом (допустим, будем мучать справочник договоров контрагентов):
<code>
ВЫБРАТЬ
    ДоговорыКонтрагентов.Организация КАК Организация,
    ДоговорыКонтрагентов.Владелец КАК Контрагент,
    ДоговорыКонтрагентов.Ссылка КАК ДоговорКонтрагента,
    NULL КАК НетДанных
ИЗ
    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
{ХАРАКТЕРИСТИКИ
    ТИП(Справочник.ДоговорыКонтрагентов)
    ВИДЫХАРАКТЕРИСТИК ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения
    ПОЛЕКЛЮЧА Ссылка
    ПОЛЕИМЕНИ Наименование
    ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения
    ЗНАЧЕНИЯХАРАКТЕРИСТИК РегистрСведений.ДополнительныеСведения
    ПОЛЕОБЪЕКТА Объект
    ПОЛЕВИДА Свойство
    ПОЛЕЗНАЧЕНИЯ Значение }
</code>
3. Подцепить свойства, созданные в пункте 1, к динамическому списку:
<code>
Для Каждого СвойствоДоговора Из Объект.СписокСвойств Цикл // Объект.СписокСвойств - список значений, в котором хранятся все созданные свойства
    // Получается, что СвойствоДоговора - элемент списка значений, который содержит одно из свойств, созданных в пункте 1
    НаименованиеКолонкиФормы = "СписокДоговоров" + РеквизитФормыВЗначение("Объект").УбратьПробелыИзНаименования(СвойствоДоговора.Значение.Заголовок);
    НоваяКолонка             = Элементы.Добавить(НаименованиеКолонкиФормы, Тип("ПолеФормы"), Элементы.СписокДоговоров);
    НоваяКолонка.Заголовок     = СвойствоДоговора.Значение.Заголовок;
    НоваяКолонка.Вид         = ВидПоляФормы.ПолеНадписи;
    НоваяКолонка.Подсказка     = СвойствоДоговора.Значение.Заголовок;
    НоваяКолонка.Формат         = "ЧДЦ=2; ДФ=дд.ММ.гггг;";
    НоваяКолонка.ПутьКДанным = "СписокДоговоров.ДоговорКонтрагента.[" + СвойствоДоговора.Значение.Наименование + "]";
    НоваяКолонка.РастягиватьПоГоризонтали = Истина;
КонецЦикла;
</code>
И здесь начинается самое смешное: в 8.2 колонки успешно добавляются, в 8.3 на строке с указанием пути к данным возникает ошибка "Недопустимое значение". Возможно, у кого-то возникнет вопрос: "Почему же смешное?". А ответ прост: код отбора по тому же полю работает. То есть, если мы создадим свойство "Булевое значение" (в действительности создастся свойство с наименованием "Булевое значение (Договор контрагента)") с типом значения Булево и добавим отбор:
<code>
НовыйЭлементОтбора                    = СписокДоговоров.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлементОтбора.ЛевоеЗначение    = Новый ПолеКомпоновкиДанных("ДоговорКонтрагента.[Булевое значение (Договор контрагента)]");
НовыйЭлементОтбора.ПравоеЗначение    = Истина;
НовыйЭлементОтбора.Использование    = Истина;
</code>
то будут показаны лишь те элементы, у которых значение данного свойства задано и равно Истина.
Почему же в 8.2 колонки создаются, а в 8.3 не хотят? Нужно сделать, чтобы везде было все одинаково, а потому, если в качестве выбора характеристик не таблицу, а свой запрос, т.е. в качестве запроса динамического списка установить такой запрос:
<code>
ВЫБРАТЬ
    ДоговорыКонтрагентов.Организация КАК Организация,
    ДоговорыКонтрагентов.Владелец КАК Контрагент,
    ДоговорыКонтрагентов.Ссылка КАК ДоговорКонтрагента,
    NULL КАК НетДанных
ИЗ
    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
{ХАРАКТЕРИСТИКИ
    ТИП(Справочник.ДоговорыКонтрагентов)
    ВИДЫХАРАКТЕРИСТИК (ВЫБРАТЬ
            ДополнительныеРеквизитыИСведения.Ссылка КАК Ссылка,
            ДополнительныеРеквизитыИСведения.Заголовок + " (Доп. свойство)" КАК Заголовок,
            ДополнительныеРеквизитыИСведения.ТипЗначения КАК ТипЗначения
        ИЗ
            ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
        ГДЕ
            НЕ ДополнительныеРеквизитыИСведения.ПометкаУдаления
            И ДополнительныеРеквизитыИСведения.ЭтоДополнительноеСведение
            И ДополнительныеРеквизитыИСведения.НаборСвойств = ЗНАЧЕНИЕ(Справочник.НаборыДополнительныхРеквизитовИСведений.Справочник_ДоговорыКонтрагентов))
    ПОЛЕКЛЮЧА Ссылка
    ПОЛЕИМЕНИ Заголовок
    ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения
    ЗНАЧЕНИЯХАРАКТЕРИСТИК (ВЫБРАТЬ
            ВЫРАЗИТЬ(ДополнительныеСведения.Объект КАК Справочник.ДоговорыКонтрагентов) КАК Объект,
            ДополнительныеСведения.Свойство КАК Свойство,
            ДополнительныеСведения.Значение КАК Значение
        ИЗ
            РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
        ГДЕ
            ДополнительныеСведения.Объект ССЫЛКА Справочник.ДоговорыКонтрагентов)
    ПОЛЕОБЪЕКТА Объект
    ПОЛЕВИДА Свойство
    ПОЛЕЗНАЧЕНИЯ Значение }
</code>
то получаем ситуацию, что код добавления элемента по наименованию:
<code>
Для Каждого СвойствоДоговора Из Объект.СписокСвойств Цикл // Объект.СписокСвойств - список значений, в котором хранятся все созданные свойства
    // Получается, что СвойствоДоговора - элемент списка значений, который содержит одно из свойств, созданных в пункте 1
    НаименованиеКолонкиФормы = "СписокДоговоров" + РеквизитФормыВЗначение("Объект").УбратьПробелыИзНаименования(СвойствоДоговора.Значение.Заголовок);
    НоваяКолонка             = Элементы.Добавить(НаименованиеКолонкиФормы, Тип("ПолеФормы"), Элементы.СписокДоговоров);
    НоваяКолонка.Заголовок     = СвойствоДоговора.Значение.Заголовок;
    НоваяКолонка.Вид         = ВидПоляФормы.ПолеНадписи;
    НоваяКолонка.Подсказка     = СвойствоДоговора.Значение.Заголовок;
    НоваяКолонка.Формат         = "ЧДЦ=2; ДФ=дд.ММ.гггг;";
    НоваяКолонка.ПутьКДанным = "СписокДоговоров.ДоговорКонтрагента.[" + СвойствоДоговора.Значение.Заголовок + " (Доп. свойство)]";
    НоваяКолонка.РастягиватьПоГоризонтали = Истина;
КонецЦикла;
</code>
начинает ругаться на строку с присвоением пути к данным, в то время как код с отбором:
<code>
НовыйЭлементОтбора                    = СписокДоговоров.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлементОтбора.ЛевоеЗначение    = Новый ПолеКомпоновкиДанных("ДоговорКонтрагента.[Булевое значение ((Доп. свойство))]");
НовыйЭлементОтбора.ПравоеЗначение    = Истина;
НовыйЭлементОтбора.Использование    = Истина;
</code>
нормально отрабатывает, но зато поведение одинаковое, что в 8.2, что в 8.3.

К чему я все это описал: каким должен быть путь к данным, чтобы колонку можно было добавить программно?
1 Wobland
 
03.02.14
13:19
а в каком поле запроса у тебя то, что нужно?
//разумеется, не читал
2 LordCMEPTb
 
03.02.14
13:34
Парадокс в том, что у меня в произвольном запросе нет как такового поля. Оно появляется из-за подключения характеристик к справочнику. Написать в самом запросе левые соединения с регистром сведений, содержащим эти свойства, можно, но свойств у меня может накопиться порядка 10-15 штук, и все нужные, а демонический список с таким запросом обновляется секунд 40-60 при 10к договорах, а тот же список с характеристиками - секунд 5
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн