Имя: Пароль:
1C
1С v8
СКД. Не ВСЕГДА инициализируются доступные настройки компоновщика.
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
ап
Независимо от того, куда вы едете — это в гору и против ветра!