Всем, кто начинает работать с 8.2 после 8.1, не сразу становится понятным, зачем было настолько усложнять работу программистам.
На сервере мы можем выполнить запрос, на управляемую форму бросить таблицу значений, но вот передать результат запроса прямо в таблицу возможности нет. Я решил слегка упростить данный момент для разработки. Вот что у меня получилось.
Как всегда - стала задача разработки проекта для работы через http. Руководство сказало - есть 8.2, там есть веб-клиент. Вперед и с песней.
До тех пор, пока на формы бросались динамические списки или таблицы привязывались к регистрам - все было вроде понятно и разработка шла хорошо, но на определенном этапе понадобилось делать выборки и забрасывать результат именно в таблицы. И тут оказалось, что сделать это выгрузкой результата в таблицу невозможно. В результате в коде начало появляться множество функций &НаСервере, которые, по сути, были идентичные. Читабельность кода от этого не повысилась.
В результате мною коллегам был предложен следующий алгоритм.
В общем модуле, который доступен и серверу и управляемой форме (у меня модуль называется ОбщегоНазначенияКлиентСервер) создаем функцию ВыполнитьЗапросВТаблицу. Она будет выполнять полученный запрос, делать обход результата запроса, формировать структуру из каждой строки результата и каждую заполненную структуру добавлять в массив.
&НаСервере
Функция ВыполнитьЗапросВТаблицу(ЗапросТекст, СтруктураПараметров) Экспорт
З = Новый Запрос(ЗапросТекст);
Для каждого Параметр из СтруктураПараметров Цикл
З.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);
КонецЦикла;
Результат = З.Выполнить().Выгрузить();
СтрокаСтруктуры = "";
МассивКолонок = Новый Массив;
Для каждого Рез из Результат.Колонки Цикл
Если НЕ СтрокаСтруктуры = "" Тогда
СтрокаСтруктуры = СтрокаСтруктуры + ", ";
КонецЕсли;
СтрокаСтруктуры = СтрокаСтруктуры + Рез.Имя;
МассивКолонок.Добавить(Рез.Имя);
КонецЦикла;
МассивСтрок = Новый Массив;
Для каждого Рез из Результат Цикл
СтруктураСтроки = Новый Структура(СтрокаСтруктуры);
Для каждого кол из МассивКолонок Цикл
СтруктураСтроки.Вставить(кол, Рез[кол]);
КонецЦикла;
МассивСтрок.Добавить(СтруктураСтроки);
КонецЦикла;
Возврат МассивСтрок;
КонецФункции
&НаСервере
Функция ПолучитьДанныеЗапроса(ТекстЗапроса, СтруктураПараметров)
Возврат ОбщегоНазначенияКлиентСервер.ВыполнитьЗапросВТаблицу(ТекстЗапроса, СтруктураПараметров);
КонецФункции
&НаКлиенте
Процедура ПоместитьДанныеЗапросаВТаблицу(ТекстЗапроса, СтруктураПараметров, _ТаблицаПолучатель)
_РезультатЗапроса = ПолучитьДанныеЗапроса(ТекстЗапроса, СтруктураПараметров);
_ТаблицаПолучатель.Очистить();
Для каждого Рез из _РезультатЗапроса Цикл
НоваяСтрока = _ТаблицаПолучатель.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Рез);
КонецЦикла;
КонецПроцедуры
ТекстЗапроса = "ВЫБРАТЬ ... далее текст запроса ... ";
СтруктураПараметров = Новый Структура("Параметр1, Параметр2, Параметр3", ЗначениеПараметра1, ЗначениеПараметра2, ЗначениеПараметра3);
// Будем считать, что на форме есть ТаблицаЗначений с именем НашаТаблица
ПоместитьДанныеЗапросаВТаблицу(ТекстЗапроса, СтруктураПараметров, НашаТаблица);
Vofka @ 17.12.11, 13:57
,
Скажите а как передать параметр объекта с формы в вывод. То есть как передать название номенклатуры (Вулиця широка)чтобы только оно отображалось. ну можно было его потом выбрать и затянуться в строку Партия.
burza @ Сегодня, 10:57
,
ТекстЗапроса = "ВЫБРАТЬ
| ПоступлениеТоваровУслугТовары.Номенклатура КАК Номен,
| ПоступлениеТоваровУслугТовары.Цена КАК Цена,
| ПоступлениеТоваровУслугТовары.Ссылка.Партнер,
| ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК Дата,
| ПоступлениеТоваровУслугТовары.Ссылка
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
|ГДЕ
| ПоступлениеТоваровУслугТовары.Номенклатура = &Номенклатура
|УПОРЯДОЧИТЬ ПО
| Дата ";
СтруктураПараметров = Новый Структура("Номенклатура", );
// Будем считать, что на форме есть ТаблицаЗначений с именем НашаТаблица
ПоместитьДанныеЗапросаВТаблицу(ТекстЗапроса, СтруктураПараметров, Партия);
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua