Имя: Пароль:
1C
1С v8
Программное создание СКД
,
0 Momus
 
16.12.19
16:10
Создаю СКД на основе запроса вида "выбрать *, ДопПоле из ...". Затем инициализирую компоновщик настроек на основе созданного СКД. Как убрать мое поле ДопПоле из доступных элементов отбора компоновщика настроек? Какого-то свойства или метода для этого не нашел. ДопПоле необходимо для дальнейших вычислений.
1 Momus
 
16.12.19
16:12
Еще момент: при создании СКД на основе запроса использую АвтоЗаполнениеДоступныхПолей, т.к. заранее с каким объектом имеем дело (известно что это регистр сведений или накопления).
2 Momus
 
16.12.19
16:20
Если бы не условие (1), то убрал бы при добавлении набора данных. А так не знаю как можно сделать...
3 fisher
 
16.12.19
16:20
ПолеНабораДанныхСхемыКомпоновкиДанных.ОграничениеИспользования
4 Momus
 
16.12.19
16:26
да, так бы и сделал как в (3) но с автозаполнением не знаю как. В какой момент происходит автозаполнение, чтобы его перехватить и исправить?
Делаю так:
СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
    
ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "ИсточникДанных1";
ИсточникДанных.ТипИсточникаДанных = "local";
    
НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
НаборДанных.ИсточникДанных = "ИсточникДанных1";
НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
НаборДанных.Запрос = ТекстЗапроса;
НаборДанных.Имя = "НаборДанных1";

АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор);
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
5 Радим1987
 
16.12.19
16:29
НаборДанных.Поля[0].ОграничениеИспользование
6 Momus
 
16.12.19
16:32
(5) инициализация СКД, как я понял, происходит в последней строке кода выше. До этого наборданных не заполнен, если я правильно понял о чем идет речь.
7 Радим1987
 
16.12.19
16:35
(6) наверное тут СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
8 Momus
 
16.12.19
16:37
(7) хм, тогда не  инициализация СКД, а заполнение(?), применение(?) заданных настроек. В любом случае при добавлении набора данных полей нет.
9 Momus
 
16.12.19
16:39
Думаю для компоновщика настроек нужно использовать отдельную схему без дополнительных полей. ДопПоле нужно потом, после применения отбора.
10 fisher
 
16.12.19
16:42
Хм... Ну, я бы попробовал нужное поле добавить вручную с ограничением (только одно это поле) и посмотрел на результат после автозаполнения настроек.
11 fisher
 
16.12.19
16:45
Еще идея. Можно не включать автозаполнение настроек, а запрос генерить с фигурными скобками из которых все настройки и заполнятся.
12 Радим1987
 
16.12.19
16:49
(10) Это прокатит
13 Радим1987
 
16.12.19
16:50
СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных инициализация здесь, дальше просто заполняем свойства
14 Momus
 
16.12.19
16:56
(10), (12) Прокатило)
(5), (13) честно говоря не понял как сделать. При добавлении набора данных из свойств заполнено только
НаборДанных.ИсточникДанных = "ИсточникДанных1";
НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
НаборДанных.Запрос = ТекстЗапроса;
НаборДанных.Имя = "НаборДанных1";

НаборДанных.Поля - пустая. После
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
они заполнены, но сделать уже ничего нельзя.
15 Радим1987
 
16.12.19
17:09
ТекстЗапроса =
        "ВЫБРАТЬ
        |    """" КАК ДопПоле";
    
    
    
    
    СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
    
ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "ИсточникДанных1";
ИсточникДанных.ТипИсточникаДанных = "local";
    
НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
НаборДанных.ИсточникДанных = "ИсточникДанных1";
НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
НаборДанных.Запрос = ТекстЗапроса;
НаборДанных.Имя = "НаборДанных1";

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

АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор);
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
КонецПроцедуры
16 Momus
 
16.12.19
17:13
(15) это я сделал и проверил - работает. Но спасибо)

(14) это ответ на предыдущие ваши сообщения. Я подумал, что где-то что-то упустил и при автозаполнении поля набора данных где-то можно перехватить
17 Радим1987
 
16.12.19
17:18
НаборДанныхЗапросСхемыКомпоновкиДанных (DataCompositionSchemaDataSetQuery)
АвтоЗаполнениеДоступныхПолей (AutoFillAvailableFields)
Использование:

Чтение и запись.
Описание:

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

Доступность:

Сервер, толстый клиент, внешнее соединение.
18 Радим1987
 
16.12.19
17:18
Наверное придется без автозаполнения
19 Momus
 
16.12.19
17:24
(18) да нет же, все ок.
(10) решает мою проблему. Добавил фиктивное поле в запросе (иначе не работает) и все сработало. Видимо у нас небольшое недопонимание возникло :)
20 Радим1987
 
16.12.19
17:28
(19) А почему тогда у меня не работает
21 Momus
 
16.12.19
17:30
(20) думаю из-за свойства "Поле".
Поле.Поле = "ДопПоле";
22 Радим1987
 
16.12.19
17:33
Ааа блин точно.
23 Dzenn
 
гуру
16.12.19
18:11
Я прошу прощения, но что за задача такая замороченная, что нужно собирать СКД программно?
24 Алексей_Р
 
17.12.19
04:02
(23) Если у Вас возникают такие вопросы, значит Вам это не нужно)
25 Momus
 
17.12.19
09:24
(23) есть огромная самописная база, большую часть которую занимают регистры. Необходима обработка для удаления данных независимых регистров сведений, а также нужна возможность удалять данные регистров, подчиненных регистратору. Часто возникают задвоения продажи при обмене с РИБ (Розница 2.1). В регистрах присутствуют движения как от чека ККМ, так и от ОРП.
26 fisher
 
17.12.19
10:20
(23) Любой универсальный инструмент, где целевые виды объектов не предопределены.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший