Имя: Пароль:
1C
 
Программное формирование СКД, автозаполнение полей набора данных
0 YV
 
26.04.11
22:38
Создаю СКД программно

   СКД = Новый СхемаКомпоновкиДанных();
   
   // Создаем пустой источник данных СКД (без него не будет работать набор данных)
   ИсточникДанныхСКД                    = СКД.ИсточникиДанных.Добавить();
   ИсточникДанныхСКД.Имя                = "ИсточникДанныхСКД";
   ИсточникДанныхСКД.СтрокаСоединения   = "";
   ИсточникДанныхСКД.ТипИсточникаДанных = "Local";
   
   // Создаем набор данных СКД типа "Запрос"
   ТипНаборДанныхЗапросСКД             = Тип("НаборДанныхЗапросСхемыКомпоновкиДанных");    
   НаборДанныхЗапросСКД                = СКД.НаборыДанных.Добавить(ТипНаборДанныхЗапросСКД);
   НаборДанныхЗапросСКД.Имя            = "ОстаткиТоваров";
   НаборДанныхЗапросСКД.ИсточникДанных = "ИсточникДанныхСКД";
   НаборДанныхЗапросСКД.АвтоЗаполнениеДоступныхПолей = Истина;
       
   // Задаем текст запроса
   НаборДанныхЗапросСКД.Запрос =
   "ВЫБРАТЬ
   |    ОстаткиТоваровОстатки.Склад,
   |    ОстаткиТоваровОстатки.Номенклатура,
   |    ОстаткиТоваровОстатки.КоличествоОстаток КАК Количество
   |ИЗ
   |    РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки";



Соответственно устанавливаю свойство "АвтоЗаполнениеДоступныхПолей" набора данных в "Истина". Поля не заполняються. Подскажите пожалуйста, что еще нужно сделать для автоматического заполнения полей?



Нагуглил такой вариант

   ИсточникДоступныхНастроекКД = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД);
   
   КомпоновщикНастроекСКД = Новый КомпоновщикНастроекКомпоновкиДанных();
   КомпоновщикНастроекСКД.Инициализировать(ИсточникДоступныхНастроекКД);
но он не помогает.
1 acsent
 
26.04.11
22:40
зачем програмно создавать?
2 YV
 
26.04.11
22:43
(1) Хочу понять как это работает.
3 YV
 
26.04.11
22:44
(2)+ Чисто в учебных целях. В реальной работе естественно создавать все программно - изврат.
4 acsent
 
26.04.11
22:46
(3) Как проверяешь что не заполняются?
5 YV
 
26.04.11
22:47
(4) Через отладчик, посмотреть свойство
СКД.НаборыДанных.ОстаткиТоваров.Поля
6 Nexux
 
27.04.11
00:09
а если:  НаборДанныхЗапросСКД.Запрос =
   "ВЫБРАТЬ * ИЗ РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки"; ?
7 YV
 
27.04.11
06:49
(6) Текст запроса здесь не играет роли. В интерактивном режиме все заполняет, независимо от текста запроса.
8 Рэйв
 
27.04.11
07:08
(0)Когда то давно делал тоже в учебных целях вывод на печать расходной накладной.
Может пригодится.


   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
   |РасходнаяНакладнаяПереченьНоменклатуры.Номенклатура,
   |РасходнаяНакладнаяПереченьНоменклатуры.Количество,
   |РасходнаяНакладнаяПереченьНоменклатуры.Цена,
   |РасходнаяНакладнаяПереченьНоменклатуры.Сумма
   |ИЗ Документ.РасходнаяНакладная.ПереченьНоменклатуры КАК РасходнаяНакладнаяПереченьНоменклатуры
   |    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная КАК РасходнаяНакладная
   |    ПО РасходнаяНакладнаяПереченьНоменклатуры.Ссылка = РасходнаяНакладная.Ссылка
   |ГДЕ РасходнаяНакладная.Контрагент = &Контрагент";
   Запрос.УстановитьПараметр("Контрагент",ДокументОбъект.Контрагент);
   Результат = Запрос.Выполнить();
   СписокПродаж = Результат.Выгрузить();
   
   ВнешниеНаборыДанных = Новый Структура;
   ВнешниеНаборыДанных.Вставить("Продажи",СписокПродаж);
   
   СхемаКомпоновкиДанных = ПолучитьМакет("МоиПродажиКонтрагента");
   Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
   
   КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
   МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
   
   ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
   ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);
   
   ДокументРезультат = Новый ТабличныйДокумент;
   ПроцессорВывода = Новый    ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
   
   ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
   ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
   ДокументРезультат.ОтображатьСетку=Ложь;
   ДокументРезультат.ОтображатьЗаголовки=Ложь;
   ДокументРезультат.Показать();

9 luns
 
27.04.11
07:14
(0) подя надо самому добавлять. автозаполнения недостаточно.
вот пример: http://luns-it.ru/2010/03/пример-программной-работы-с-компонов/
возможно поможет
10 YV
 
27.04.11
09:00
(8)(9) Спасибо
(9) Жаль конечно если так. Больно уж много нужно дозаполнять.
11 Defender aka LINN
 
27.04.11
09:15
(10) А если Автозаполнение ПОСЛЕ текста запроса установить?
З.Ы. Автозаполнение - зло :)
12 YV
 
27.04.11
09:29
(11) Пробовал, не помогает. Как я понял установка значения для этого свойства не выполняет никаких действий. Нужно вызвать какой-то метод.
А пройтись по уже заполненным полям и скорректировать их проще, чем создавать все поля с нуля. Но скорее всего придется все-таки добавлять поля самому. Тем более что в типовых тоже вроде так.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший