|
СКД. Не ВСЕГДА инициализируются доступные настройки компоновщика. | ☑ | ||
---|---|---|---|---|
0
GANR
20.07.12
✎
18:37
|
Платформа 8.2.15.301. Готовлю СКД следующим кодом:
ИД = СКД.ИсточникиДанных.Добавить(); ИД.Имя = "ИсточникДанных"; ИД.ТипИсточникаДанных = "Local"; НаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); НаборДанных.Имя = "ОсновнойНабор"; НаборДанных.ИсточникДанных = "ИсточникДанных"; НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; ПолноеИмя = Метаданные[ТипМетаданных][ИмяОбъекта].ПолноеИмя(); НаборДанных.Запрос = "ВЫБРАТЬ | _Таблица_.* |ИЗ | " + ПолноеИмя + " КАК _Таблица_"; //затем инициализирую список доступных настроек //компоновки данных идн = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСКД); КомпоновщикНастроек.Инициализировать(идн); Почему список доступных полей выбора, отбора и пр. КомпоновщикНастроек инициализируется НЕ КАЖДЫЙ раз? Иной раз - всё нормально, а иной - все списки доступных полей просто пусты, хотя текст запроса синтаксически правилен. ПолноеИмя - это имя произвольного объекта в базе (справочник, документ, регистр сведений или их табличные части) |
|||
1
GANR
23.07.12
✎
09:47
|
up
|
|||
2
izekia
23.07.12
✎
09:53
|
(0) закономерность не выявил?
|
|||
3
GANR
23.07.12
✎
10:58
|
(2) Удалил все роли, кроме "Полные права", общие реквизиты удалил из конфигурации - ничего не меняется. Запустил на простенькой почти самописоной базе - по всем объектам отчет строится. Куда-же копать дальше?
|
|||
4
GANR
23.07.12
✎
11:10
|
+(3) Да, кстати, одну закономерность забыл: если отчет не строится по полному имени самого объекта, то он не строится и по полным именам всех его табличных частей.
|
|||
5
TormozIT
гуру
23.07.12
✎
11:11
|
Возможно похожая проблема http://partners.v8.1c.ru/forum/thread.jsp?id=1062381#1062381
Там правда предположительно с разделением данных связано. Открыть приложенную внешнюю обработку в толстом клиенте обычном приложении базы с конфигурацией, содержащей БСП. Выполнится код Для Каждого ОбъектМД Из Метаданные.РегистрыСведений Цикл Схема = Новый СхемаКомпоновкиДанных; ИсточникДанных = Схема.ИсточникиДанных.Добавить(); ИсточникДанных.Имя = "ИсточникДанных1"; ИсточникДанных.ТипИсточникаДанных = "Local"; НаборДанных = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); НаборДанных.Имя = "Набор1"; НаборДанных.ИсточникДанных = ИсточникДанных.Имя; НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; ПолноеИмяТаблицыБД = ОбъектМД.ПолноеИмя(); ТекстЗапроса = "ВЫБРАТЬ Т.* ИЗ " + ПолноеИмяТаблицыБД + " КАК Т"; НаборДанных.Запрос = ТекстЗапроса; Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных; Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема)); Если Компоновщик.Настройки.ДоступныеПоляВыбора.Элементы.Количество() = 1 Тогда Сообщить("Нет доступных полей для регистра - " + ПолноеИмяТаблицыБД); Иначе Сообщить("Есть доступные поля для регистра - " + ПолноеИмяТаблицыБД); КонецЕсли; КонецЦикла; |
|||
6
GANR
23.07.12
✎
11:20
|
(5) А не могли-бы вы рассказать, была-ли она там решена и как? А то у меня нет доступа к http://partners.v8.1c.ru/forum/thread.jsp?id=1062381#1062381 (я не франчайзи).
|
|||
7
GANR
23.07.12
✎
11:26
|
Я здесь тоже поднял ветку http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=597982 - никто пока не дал окончательного ответа. Хорошо-бы разработчиков этого узелка
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных; Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема)); найти. А то ещё долго можно решать 1 уравнение с 25 неизвестными (((. |
|||
8
TormozIT
гуру
23.07.12
✎
11:27
|
(6) Нет, не была.
Я опубликовал проблему 17.07.2012 и отправил отчет о ней в 1с тогда же. |
|||
9
GANR
23.07.12
✎
11:29
|
(8) А вот за это спасибо :-).
|
|||
10
TormozIT
гуру
23.07.12
✎
11:34
|
Так и не понял, воспроизвелась ли проблема (5) у тебя? Иными словами, насколько родственны наши проблемы?
|
|||
11
TormozIT
гуру
23.07.12
✎
11:37
|
Прочитал ветку из (7). Проблема с большой вероятностью та же самая. Ее даже еще не исследовали в тех. поддержке. Так что исправление будет не скоро. Надо искать обходной путь.
|
|||
12
GANR
23.07.12
✎
12:04
|
(10) Последствия в (0) и (5) одинаковы. И запросы точно как у меня кодом генерируются один в один. Только я в конструктор объекта ИсточникДоступныхНастроекКомпоновкиДанных посылаю не саму СКД, а её адрес во временном хранилище. Кстати, когда начал туда пихать СКД - вообще для всех таблиц в моей ИБ перестало работать. Может попробуешь так:
АдресСКД = ПоместитьВоВременноеХранилище(СКД, ЭтаФорма.УникальныйИдентификатор); Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных; Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСКД )); Очень вероятно, что тогда хотя-бы у тебя заработают многие таблицы (если не все). + (11) Я попробовал вот таким кодом открыть собранную в конструкторе СКД #Если ТолстыйКлиентУправляемоеПриложение ИЛИ ТолстыйКлиентОбычноеПриложение Тогда Конструктор = Новый КонструкторСхемыКомпоновкиДанных; Конструктор.УстановитьСхему(ПолучитьИзВременногоХранилища(АдресСКД)); Конструктор.Редактировать(ЭтаФорма); #КонецЕсли Опять не заполняются доступные настройки. Зато попробовал 1. создать внешний отчет 2. сохранить настройки из конструктора 3. загрузить настройки в основную СКД отчета(1) и в конфигураторе доступные настройки заполнились. Я думаю, что на уровне платформы эта проблема ЛЕГКО решаема. |
|||
13
TormozIT
гуру
23.07.12
✎
13:26
|
(12) Использование временного хранилища не меняет поведения.
|
|||
14
GANR
23.07.12
✎
15:49
|
(13) У тебя нет идей насчет конкретного обходного пути? Я попробовал выгрузить результат запроса в ТЗ, затем ТЗ подцепить в качестве набора данных и судя по этой странице http://it-buh.narod.ru/fmista/v8/v8_1/v8_1_019/439955.htm пришел к выводу, что сделать доступными поля внешнего набора данных мне не удастся. Или, может, все-таки можно?
|
|||
15
GANR
23.07.12
✎
16:03
|
+(14) Ага... Нужно попробовать заполнить доступные поля набора, присвоив им тип значения, поместить такую СКД во временное хранилище, а затем прогнать эти строки
Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных; Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСКД )); |
|||
16
GANR
23.07.12
✎
16:10
|
+(15) Заработает - выложу код. Не заработает - просто отпишусь.
|
|||
17
GANR
23.07.12
✎
16:52
|
(11) Вот и обходной путь нужно этот код
ИД = СКД.ИсточникиДанных.Добавить(); ИД.Имя = "ИсточникДанных"; ИД.ТипИсточникаДанных = "Local"; НаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); НаборДанных.Имя = "ОсновнойНабор"; НаборДанных.ИсточникДанных = "ИсточникДанных"; НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; ПолноеИмя = Метаданные[ТипМетаданных][ИмяОбъекта].ПолноеИмя(); НаборДанных.Запрос = "ВЫБРАТЬ | _Таблица_.* |ИЗ | " + ПолноеИмя + " КАК _Таблица_"; //затем инициализирую список доступных настроек //компоновки данных идн = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСКД); КомпоновщикНастроек.Инициализировать(идн); заменить этим ИД = СКД.ИсточникиДанных.Добавить(); ИД.Имя = "ИсточникДанных"; ИД.ТипИсточникаДанных = "Local"; НаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); НаборДанных.Имя = "ОсновнойНабор"; НаборДанных.ИсточникДанных = "ИсточникДанных"; НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; ПолноеИмя = ИмяТипаМетаданныхВЕдинственномЧисле(ТипМетаданных) + "." + ИмяОбъекта + ?(ИмяВиртуальнойТаблицы <> "", "." + ИмяВиртуальнойТаблицы, ""); ТекстЗапроса = "ВЫБРАТЬ | _Таблица_.* |ИЗ | " + ПолноеИмя + " КАК _Таблица_"; НаборДанных.Запрос = ТекстЗапроса; ПоместитьВоВременноеХранилище(СКД, АдресСКД); КомпоновщикНастроек.ЗагрузитьНастройки(Новый НастройкиКомпоновкиДанных); идн = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСКД); КомпоновщикНастроек.Инициализировать(идн); ОдниПапки = Истина; Для Каждого Поле Из КомпоновщикНастроек.Настройки.ДоступныеПоляВыбора.Элементы Цикл Если Не Поле.Папка Тогда ОдниПапки = Ложь; Прервать; КонецЕсли; КонецЦикла; Если ОдниПапки Тогда СКД.НаборыДанных.Очистить(); НаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных")); НаборДанных.Имя = "ОсновнойНабор"; НаборДанных.ИсточникДанных = "ИсточникДанных"; НаборДанных.ИмяОбъекта = "ОсновнаяТаблица"; ПоляНабора = НаборДанных.Поля; Запрос = Новый Запрос(ТекстЗапроса); ТаблЗнач = Запрос.Выполнить().Выгрузить(); ВнешниеНаборы = Новый Структура; ВнешниеНаборы.Вставить("ОсновнаяТаблица", ТаблЗнач); Для Каждого Колонка Из ТаблЗнач.Колонки Цикл Если Колонка.ТипЗначения.СодержитТип(Тип("ТаблицаЗначений")) Тогда ТаблЗнач.Колонки.Удалить(Колонка.Имя); Продолжить; КонецЕсли; НовоеПоле = ПоляНабора.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); НовоеПоле.Поле = Колонка.Имя; НовоеПоле.ПутьКДанным = Колонка.Имя; НовоеПоле.Заголовок = Колонка.Заголовок; НовоеПоле.ТипЗначения = Колонка.ТипЗначения; КонецЦикла; АдресВнешниеНаборы = ПоместитьВоВременноеХранилище(ВнешниеНаборы, ЭтаФорма.УникальныйИдентификатор); ПоместитьВоВременноеХранилище(СКД, АдресСКД); КомпоновщикНастроек.ЗагрузитьНастройки(Новый НастройкиКомпоновкиДанных); идн = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСКД); КомпоновщикНастроек.Инициализировать(идн); КонецЕсли; |
|||
18
GANR
23.07.12
✎
16:53
|
+(17) Спойлер для портянок кода не заметил фразу "заменить этим" и не разбил одну портянку на две
|
|||
19
GANR
23.07.12
✎
17:03
|
+(17) (18) Потом при формировании отчета на этапе компоновки данных нужно не забыть поместить структуру с внешними наборами данных в метод процессора КД
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ПолучитьИзВременногоХранилища(АдресВнешниеНаборы), др); |
|||
20
TormozIT
гуру
23.07.12
✎
19:47
|
(17) Я же написал, что мне не помогает временное хранилище.
|
|||
21
GANR
23.07.12
✎
20:37
|
(20) Там НЕ про временное хранилище - там реальный обходной путь решения проблемы, описанной в самом начале ветки в (0) (тебе нужно лишь адаптировать код (17) под свои идентификаторы - только и всего).
|
|||
22
TormozIT
гуру
23.07.12
✎
20:53
|
(21) Кажется что в твоем обходном пути оба варианта отличаются фактически только строками
идн = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСКД); КомпоновщикНастроек.Инициализировать(идн); заменено на идн = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСКД); КомпоновщикНастроек.Инициализировать(идн); |
|||
23
TormozIT
гуру
23.07.12
✎
20:54
|
(22) +
У тебя там по всей видимости еще и неточность в оригинальном фрагменте идн = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД); КомпоновщикНастроек.Инициализировать(идн); заменено на ПоместитьВоВременноеХранилище(СКД, АдресСКД); идн = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСКД); КомпоновщикНастроек.Инициализировать(идн); |
|||
24
TormozIT
гуру
23.07.12
✎
20:57
|
А хотя понял, ты там решил через замену на НаборДанныхОбъект делать. Но мне он к сожалению не подходит.
|
|||
25
GANR
23.07.12
✎
20:59
|
(24) А почему?
|
|||
26
TormozIT
гуру
23.07.12
✎
21:05
|
(25) Кажется затратно программировать всю автоматику по заполнению свойств полей набора данных, которую делает сама компоновка при инициализации источника доступных настроек. Например, это роли и ограничения полей.
Но за идею спасибо. Может быть в будущем пригодится. |
|||
27
GANR
24.07.12
✎
18:27
|
(27) А у тебя нет, случайно, ещё каких-нибудь вариантов, кроме (17) ?
|
|||
28
acsent
24.07.12
✎
18:48
|
(26) либо затратно либо ждать у моря погоды от 1с
|
|||
29
acsent
24.07.12
✎
18:49
|
(17) когда выполняешь запрос делай ВЫБРАТЬ ПЕРВЫЕ 1
|
|||
30
GANR
24.07.12
✎
19:07
|
(29) не прошло (((
|
|||
31
GANR
24.07.12
✎
19:11
|
(29) а зачем ??? может я недопонял что-то?
|
|||
32
GANR
15.08.12
✎
10:57
|
ап
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |