Имя: Пароль:
1C
1С v8
Вывести на управляемую форму результат произвольного запроса.
,
0 Bot01
 
28.06.13
16:20
Доброго времени суток.
8.2, УТ 11.1.
Режим управляемого приложения (+ тонкий клиент и web).
Сделал "обработку" без реквизитов. В форме обработки сделал реквизит "ТекстЗапроса"(строка), "Результат"("(Таблица значений)" без колонок) и кнопочку "Запрос". В "ТекстЗапроса" пользователем заносится запрос на T-SQL и, по нажатию кнопки выполняется на стороннем SQL сервере, т.е. ни количество столбцов, ни их наименование мне заранее неизвестно (я их получаю разбирая результат запроса).
Вопрос: как правильно занести результат запроса в (ТЗ)"Результат"  и показать его в этой же форме?
1 YF
 
28.06.13
16:21
Обязательно ТЗ или можно табличный документ?
2 shuhard
 
28.06.13
16:22
(0) нтмл
3 Asmody
 
28.06.13
16:24
(0) в ТЗ можно динамически создать колонки v8: УФ Как динамически добавить колонку в ТабличнуюЧасть
4 drcrasher
 
28.06.13
16:25
выводи в табдок на форме.
5 drcrasher
 
28.06.13
16:27
изучай вот это: http://nashe1c.ru/materials-view.jsp?id=307
6 GROOVY
 
28.06.13
16:27
// *******************************************************************************************
// ПРИМЕЧАНИЕ:
//        Эту процедуру можно разместить в общем модуле, для дальнейшего вызова из любого места
//        Для отображения таблицы необходиом чтобы на форме предварительно был создан реквизит типа "таблица значений",
//            и чтобы он был размещен среди элементов формы (по аналогии, как в этой форме)
//
// ОПИСАНИЕ:
//        Создает и отображает на управляемой форме (8.2) таблицу значений, переданную в качестве параметра
//        Дополнительно может подключить обработчики событий для таблицы
//
// ПАРАМЕТРЫ:
//        УФ - управляемая форма, на которую нужно вывести ТЗ
//        ТЗ - таблица значений, которую нужно отобразить на форме
//      ТЗОбработчиковСобытий - таблица со структурой данных, описывающих обработчики событий. Не обязательна.
//            Процедура обработки события должна именоваться как <ИмяЭлемента + ИмяСобытия>
//
&НаСервере
Процедура ВывестиТаблицуНаФорму(УФ,ИмяТЗНаФорме,ТЗ, ТЗОбработчиковСобытий = Неопределено) Экспорт
   
   // СОЗДАНИЕ РЕКВИЗИТОВ ФОРМЫ
   МассивДобавляемыхРеквизитов = Новый Массив;
   
   Для Каждого Колонка Из ТЗ.Колонки Цикл
       МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения,ИмяТЗНаФорме ,Колонка.Заголовок));    
   КонецЦикла;
   
   МассивУдаляемыхРеквизитов = УФ.ПолучитьРеквизиты(ИмяТЗНаФорме);
   МассивИменУдаляемыхРеквизитов = Новый Массив;
   
   Для каждого Элемент Из МассивУдаляемыхРеквизитов Цикл
       МассивИменУдаляемыхРеквизитов.Добавить(ИмяТЗНаФорме + "." + Элемент.Имя);
   КонецЦикла;
   
   УФ.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов,МассивИменУдаляемыхРеквизитов);
   
   // СОЗДАНИЕ ЭЛЕМЕНТОВ ФОРМЫ
   Для каждого Элемент Из МассивУдаляемыхРеквизитов Цикл
       УдаляемыйЭлемент = УФ.Элементы.Найти(ИмяТЗНаФорме + Элемент.Имя);
       УФ.Элементы.Удалить(УдаляемыйЭлемент);
   КонецЦикла;
   
   Для Каждого Колонка Из ТЗ.Колонки Цикл
       НоваяКолонка = УФ.Элементы.Добавить(ИмяТЗНаФорме + Колонка.Имя, Тип("ПолеФормы"), УФ.Элементы[ИмяТЗНаФорме]);
       НоваяКолонка.Заголовок = Колонка.Заголовок;
       НоваяКолонка.ПутьКДанным = ИмяТЗНаФорме + "." + Колонка.Имя;
       НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
       НоваяКолонка.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;    
   КонецЦикла;    
   
   УФ[ИмяТЗНаФорме].Загрузить(ТЗ);
   
   // Привязка обработчиков событий
   Если ТЗОбработчиковСобытий = Неопределено Тогда
       Возврат;
   КонецЕсли;    
   
   Для Каждого Строка Из ТЗОбработчиковСобытий Цикл
       УФ.Элементы[Строка.ИмяЭлемента].УстановитьДействие(Строка.ИмяСобытия, Строка.ИмяЭлемента + Строка.ИмяСобытия);
   КонецЦикла;    
   
КонецПроцедуры


К сожалению не помню чье, спер с инфостарта.
7 МихаилМ
 
28.06.13
16:28
у всех интерфейсов доступа к бд (oldb(ado..),cdo,rdp,dmo)
есть методы получения коллекций полей с типами точностями и
размерами.

на основе коллекции создаете колонки ТЗ.
далее заполняете.
8 Bot01
 
01.07.13
14:47
Большое спасибо всем, кто откликнулся.
Воспользовался примером приведённым GROOVY.
Вот только не осилил я передать управляемую форму как ПАРАМЕТР в серверную процедуру (отказался от передачи этого параметра,сделал всё в одном модуле формы).
При попытке выполнить код в модуле управляемой формы:

&НаКлиенте
Процедура Тест();
Проба(ЭтаФорма);
КонецПроцедуры

&НаСервере //В модуле УФ или В Общем модуле...
Процедура Проба(Ф);
КонецПроцедуры

Появляется ошибка:

{Обработка.SQLзапросКБазе.Форма.Форма.Форма(148)}: Ошибка при вызове метода контекста (Проба)
Проба(ЭтаФорма);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
   форма: Элемент
   имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'УправляемаяФорма'

И, полагаю, так, может, оно и должно быть...
А как тогда передать управляемую форму в качестве параметра в серверную процедуру?
9 Поросенок Петр
 
01.07.13
14:50
А нахрена её в контекстном вызове ещё и передавать?
10 kosts
 
01.07.13
14:51
(8) Передавай не сервер только текст запроса.
11 Bot01
 
01.07.13
17:26
(8),(9) Посмотрите пример (6)

Процедура ВывестиТаблицуНаФорму(УФ,ИмяТЗНаФорме,ТЗ, ТЗОбработчиковСобытий = Неопределено) Экспорт

// УФ - управляемая форма, на которую нужно вывести ТЗ

Интересно же...