Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 3
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )

> Передача результата запроса в таблицу управляемой формы. Мой алгоритм.          
Vofka Подменю пользователя
сообщение 17.12.11, 12:57
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 12692
Из: Киев
Спасибо сказали: 3808 раз
Рейтинг: 2926.7

Всем, кто начинает работать с 8.2 после 8.1, не сразу становится понятным, зачем было настолько усложнять работу программистам.
На сервере мы можем выполнить запрос, на управляемую форму бросить таблицу значений, но вот передать результат запроса прямо в таблицу возможности нет. Я решил слегка упростить данный момент для разработки. Вот что у меня получилось.


Как всегда - стала задача разработки проекта для работы через http. Руководство сказало - есть 8.2, там есть веб-клиент. Вперед и с песней.

До тех пор, пока на формы бросались динамические списки или таблицы привязывались к регистрам - все было вроде понятно и разработка шла хорошо, но на определенном этапе понадобилось делать выборки и забрасывать результат именно в таблицы. И тут оказалось, что сделать это выгрузкой результата в таблицу невозможно. В результате в коде начало появляться множество функций &НаСервере, которые, по сути, были идентичные. Читабельность кода от этого не повысилась.

В результате мною коллегам был предложен следующий алгоритм.

В общем модуле, который доступен и серверу и управляемой форме (у меня модуль называется ОбщегоНазначенияКлиентСервер) создаем функцию ВыполнитьЗапросВТаблицу. Она будет выполнять полученный запрос, делать обход результата запроса, формировать структуру из каждой строки результата и каждую заполненную структуру добавлять в массив.

&НаСервере
Функция ВыполнитьЗапросВТаблицу(ЗапросТекст, СтруктураПараметров) Экспорт
    З = Новый Запрос(ЗапросТекст);
    Для каждого Параметр из СтруктураПараметров Цикл
        З.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);
    КонецЦикла;
    Результат = З.Выполнить().Выгрузить();
    СтрокаСтруктуры = "";
    МассивКолонок = Новый Массив;
    Для каждого Рез из Результат.Колонки Цикл
        Если НЕ СтрокаСтруктуры = "" Тогда
            СтрокаСтруктуры = СтрокаСтруктуры + ", ";
        КонецЕсли;
        СтрокаСтруктуры = СтрокаСтруктуры + Рез.Имя;
        МассивКолонок.Добавить(Рез.Имя);
    КонецЦикла;
    МассивСтрок = Новый Массив;
    Для каждого Рез из Результат Цикл
        СтруктураСтроки = Новый Структура(СтрокаСтруктуры);
        Для каждого кол из МассивКолонок Цикл
            СтруктураСтроки.Вставить(кол, Рез[кол]);
        КонецЦикла;
        МассивСтрок.Добавить(СтруктураСтроки);
    КонецЦикла;
    Возврат МассивСтрок;
КонецФункции


В управляемой форме нам понадобится одна функция на &НаСервере на всю форму, которая будет вызывать функцию общего модуля и передавать ей параметры, потому что из процедуры или функции &НаКлиенте управляемой формы сделать это не получается.

&НаСервере
Функция ПолучитьДанныеЗапроса(ТекстЗапроса, СтруктураПараметров)
    Возврат ОбщегоНазначенияКлиентСервер.ВыполнитьЗапросВТаблицу(ТекстЗапроса, СтруктураПараметров);
КонецФункции


Далее нам нужна еще одна процедура на управляемой форме &НаКлиенте, с помощью которой мы будем полученный результат вставлять в таблицу на форме.

&НаКлиенте
Процедура ПоместитьДанныеЗапросаВТаблицу(ТекстЗапроса, СтруктураПараметров, _ТаблицаПолучатель)
    _РезультатЗапроса = ПолучитьДанныеЗапроса(ТекстЗапроса, СтруктураПараметров);
    _ТаблицаПолучатель.Очистить();
    Для каждого Рез из _РезультатЗапроса Цикл
        НоваяСтрока = _ТаблицаПолучатель.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, Рез);
    КонецЦикла;
КонецПроцедуры


Все. Подготовительная часть закончена. После этого для заполнения таблицы значений на управляемой форме результатом запроса нужно в коде вписать вызов последней процедуры следующим образом:

ТекстЗапроса = "ВЫБРАТЬ ... далее текст запроса ... ";
СтруктураПараметров = Новый Структура("Параметр1, Параметр2, Параметр3", ЗначениеПараметра1, ЗначениеПараметра2, ЗначениеПараметра3);
// Будем считать, что на форме есть ТаблицаЗначений с именем НашаТаблица
ПоместитьДанныеЗапросаВТаблицу(ТекстЗапроса, СтруктураПараметров, НашаТаблица);


Важно: Запрос должен быть составлен таким образом, чтобы возвращаемый результат был структурно идентичен нашей таблице значений, то есть типы значений колонок в результате запроса должны совпадать с типами значений колонок нашей таблицы значений и имена колонок в результате запроса должны совпадать с именами колонок таблицы значений.

Вот такой вот алгоритм. Код разжевывать не буду, по-моему там и так все понятно. Мега-гуру просьба не пинать сильно.

[необходимо зарегистрироваться для просмотра ссылки]


Signature
Услуги 1С программиста

Спасибо сказали: alul, lvk, shurik_shurik,

burza Подменю пользователя
сообщение 09.08.18, 10:13
Сообщение #2

Завсегдатай
****
Группа: Пользователи
Сообщений: 148
Спасибо сказали: 0 раз
Рейтинг: 0

Vofka @ 17.12.11, 13:57 * ,

Скажите а как передать параметр объекта с формы в вывод. То есть как передать название номенклатуры (Вулиця широка)чтобы только оно отображалось. ну можно было его потом выбрать и затянуться в строку Партия.


burza @ Сегодня, 10:57 * ,
    ТекстЗапроса = "ВЫБРАТЬ 
        |    ПоступлениеТоваровУслугТовары.Номенклатура КАК Номен,
        |    ПоступлениеТоваровУслугТовары.Цена КАК Цена,
        |    ПоступлениеТоваровУслугТовары.Ссылка.Партнер,
        |    ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК Дата,
        |    ПоступлениеТоваровУслугТовары.Ссылка
        |ИЗ
        |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
        |ГДЕ
        |    ПоступлениеТоваровУслугТовары.Номенклатура = &Номенклатура
        |УПОРЯДОЧИТЬ ПО
        |    Дата ";
    СтруктураПараметров = Новый Структура("Номенклатура", );
// Будем считать, что на форме есть ТаблицаЗначений с именем НашаТаблица
ПоместитьДанныеЗапросаВТаблицу(ТекстЗапроса, СтруктураПараметров, Партия);


burza @ Сегодня, 11:03 * ,
Сейчас тянет всю номенклатуру

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 14.08.18, 17:28
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!

Курсы валют: доллар США к гривне Курсы валют: евро к гривне Курсы валют: российский рубль к гривне