Не добавляется программно Отбор в КомпоновщикСКД

1. sys1c 15.08.24 08:38 Сейчас в теме
Всем привет.

Форма обработки. на Форме КомпоновщикНастроекСКД-Настройки-Отбор.

В команде, СхемаЗапроса формируется полностью программно.
В Схему добавлен программно "Отбор", и он появляется на форме в Отборе КомпоновщикаНастроекСКД
Но, поле отбора "Номенклатура" - с перечеркнутым красным крестом, и если попытаться выбрать значение Номенклатуры - дает только Тип - Строка, Число.

Что я нет так сделал с формированием Отбора в СхемеКомпоновки?

СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
	
	ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
	ИсточникДанных.Имя = "ИсточникДанных1";
	ИсточникДанных.ТипИсточникаДанных = "Local";
	
	НаборДанныхОбъектСхемыКомпоновкиДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
	НаборДанныхОбъектСхемыКомпоновкиДанных.Имя = "НаборДанных1";
	НаборДанныхОбъектСхемыКомпоновкиДанных.ИсточникДанных = "ИсточникДанных1";
	НаборДанныхОбъектСхемыКомпоновкиДанных.Запрос = ТекстЗапроса();
	
	ПолеНабораДанныхСхемыКомпоновкиДанных = НаборДанныхОбъектСхемыКомпоновкиДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
	ПолеНабораДанныхСхемыКомпоновкиДанных.Поле = "Номенклатура";
	ПолеНабораДанныхСхемыКомпоновкиДанных.ПутьКДанным = "Номенклатура";
	ПолеНабораДанныхСхемыКомпоновкиДанных.Заголовок = "Номенклатура";	
	
	ПолеНабораДанныхСхемыКомпоновкиДанных = НаборДанныхОбъектСхемыКомпоновкиДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
	ПолеНабораДанныхСхемыКомпоновкиДанных.Поле = "Склад";
	ПолеНабораДанныхСхемыКомпоновкиДанных.ПутьКДанным = "Склад";
	ПолеНабораДанныхСхемыКомпоновкиДанных.Заголовок = "Склад";			

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

	ПараметрСКД = СхемаКомпоновкиДанных.Параметры.Добавить();
	ПараметрСКД.Использование = ИспользованиеПараметраКомпоновкиДанных.Авто;
	ПараметрСКД.Имя = "НачалоПериода";
	ПараметрСКД.Заголовок = "Начало периода";

	ПараметрСКД = СхемаКомпоновкиДанных.Параметры.Добавить();
	ПараметрСКД.Использование = ИспользованиеПараметраКомпоновкиДанных.Авто;
	ПараметрСКД.Имя = "КонецПериодаПериода";
	ПараметрСКД.Заголовок = "Конец периода";

	КомпоновщикНастроекСКД.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);	
Показать
Прикрепленные файлы:
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. truba 15.08.24 09:03 Сейчас в теме
Это значит что компоновщик настроек считает, что его нет в доступных полях Источников данных. У полей данных кроме собственно Имени и Пути к данным и заголовков есть еще свойства по доступам и роли.

Компоновщик инициализируется в общем случае схемой СКД через промежуточный объект ИсточникДоступныхНастроекКомпоновкиДанных. Схема содержит поля и описание доступа этих полей.
Изменили схему - переинициируйте компоновщик, перезагружайте настройки.

КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
3. sys1c 15.08.24 09:10 Сейчас в теме
(2) есть еще свойства по доступам и роли.

Смотрел Схему - программно и смотрел Схему конструктором созданную.
Абсолютно одинаковые значение
Но в первом случае, не работает, а во втором работает..



ОграничениеИспользования ОграничениеИспользованияПоляСхемыКомпоновкиДанных ОграничениеИспользованияПоляСхемыКомпоновкиДанных
Группировка Ложь Булево
Поле Ложь Булево
Порядок Ложь Булево
Условие Ложь Булево
ОграничениеИспользованияРеквизитов ОграничениеИспользованияПоляСхемыКомпоновкиДанных ОграничениеИспользованияПоляСхемыКомпоновкиДанных
Группировка Ложь Булево
Поле Ложь Булево
Порядок Ложь Булево
Условие Ложь Булево
4. truba 15.08.24 09:12 Сейчас в теме
Что насчет гипотезы что "Номенклатура" отсутствует в полях СКД перед инициализацией компоновщика?
Компоновщик сериализуется? его можно в xml перегнать и глянуть что там у него под капотом?
5. sys1c 15.08.24 09:37 Сейчас в теме
(4)
вот так выглядит

Кусок запроса отвечающий за поле "Номенклатура" и XML

Сам запрос, если сохранить в консоль запроса - без проблем открывается в Конструкторе запросов - т.е. валидный.
Прикрепленные файлы:
7. truba 15.08.24 10:53 Сейчас в теме
(5) Сдается что информации по доступным полям компоновки данных там нет, только настройки, плёхо.

Выборка поля в тексте запроса не гарантирует его наличие в списке доступных полей компоновки данных.

Туда оно попадает в GUI конструктора СКД при установленной кнопке "автозаполнение" на форме редактора источника данных (запроса).

При этом вызывается конструктор-помощник, скорее всего базирующийся на библиотеке ПостроителяЗапроса, который получает список полей запроса и уже дальше из него делает список полей СКД этого источника на основе своих представлений о прекрасном. Этот список полей всех источников данных - пересекающиеся поля при объединении + вычисляемые поля - наложение прав полей - и есть список доступных полей для компоновщика настроек.

Вот объект "ИсточникДоступныхНастроекКомпоновщикаДанных" - на вход получает схему СКД (список полей и их настройки) и на выход для компоновщикаНастроек выдает уже доступный список полей для каждого возможного действия (условия, выбор) в GUI настроек.

Красный крест ставится на поле если оно есть в списке настроек, но нет в списке доступных для действия полей.

Информация о доступных полях в компоновщике однозначно есть - раз есть крест, но она не сериализуется, что обидно.

Можно попробовать сериализовать ИсточникНастроек глянуть. Можно посмотреть всю последовательность от СКД -> ИсточникДоступных -> КомпоновщикНастроек что бы понять где теряется поле, но походу источник не сериализуется и никаких методов и свойств у него нет, тупо сервисный объект сведения всех полей в общий список.
8. sys1c 15.08.24 10:58 Сейчас в теме
(7) все это установлено (см. картинку)

более того, я сделал простейший код:
И даже в этом простейшем коде - Поле Номенклатура - горит крестом.. и нет доступных полей для выбора.




&НаСервере
Функция ТекстЗапроса()
	
	Возврат 
	 "ВЫБРАТЬ
	 |	Номенклатура.Ссылка КАК Номенклатура
	 |ИЗ
	 |	Справочник.Номенклатура КАК Номенклатура";
	
КонецФункции	

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

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

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

Показать
Прикрепленные файлы:
11. truba 15.08.24 11:49 Сейчас в теме
(8) В ОграниченияИспользования ничего такого быть не может ограничивающее выбор?
12. sys1c 15.08.24 11:50 Сейчас в теме
(11) вы были правы по части Инициализации, но ее делать надо было вот так


ИсточникДоступныхНастроек = 
    Новый ИсточникДоступныхНастроекКомпоновкиДанных(ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор));
    
    ЭтаФорма.КомпоновщикНастроекСКД.Инициализировать(ИсточникДоступныхНастроек);        
    ЭтаФорма.КомпоновщикНастроекСКД.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
13. truba 15.08.24 12:11 Сейчас в теме
(12) УФ да, там переопределен Конструктор у Источника.

Насколько я понимаю (а я не сильно понимаю)
ИсточникДоступныхНастроек доступен в мобильном клиенте, т.е. инициализироваться может из клиентского контекста, что в общем логично. А СКД не доступна на мобильном клиенте, только на сервере. Поэтому решили унифицировать работу конструктора Источника и переопределить его аргументы на адрес, который будет работать и на клиенте и на сервере.
6. sys1c 15.08.24 10:43 Сейчас в теме
как прописать "Доступные поля" при программном формировании Схеме Компоновки?
какой объект я еще упускаю?
9. truba 15.08.24 11:01 Сейчас в теме
(6) Поля компоновки данных. Это коллекция с описаниями полей.

В общем случае поле из текста запроса (окно внизу GUI) попадает в список полей компоновки (Таб поле вверху GUI) в результате действия помощника с установленной кнопкой "Автозаполнение" при каждом успешном изменении текста запроса. Нет гарантии что этот мастер отрабатывает при програмном изменении текста запроса.

Это первая гипотеза.

Вторая гипотеза что не переинициируется КомпоновщикНастроек согласно новой измененной схемы.
10. sys1c 15.08.24 11:47 Сейчас в теме
Оставьте свое сообщение

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