Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
12 дек 2024, 13:41

Передача Выборки из результатов запроса с сервера на клиент в управляемом прил-и

Автор donyab, 16 фев 2012, 19:31

0 Пользователей и 1 гость просматривают эту тему.

donyab

Доброго дня, вот и докатился я до управляемых приложений, ну и встал на элементарном
Надо сделать запрос и его результат передать на клиент, ан нет у типа "ВыборкаИзРезультатовЗапроса"  Доступность:
Сервер, толстый клиент, внешнее соединение. А как же в тонком клиенте передать ее?
попробовал даже через ВременноеХранилище - ругается матом
Вопрос как сделать "ЭТО" красиво ???

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

&НаКлиенте
Процедура Проверить()
ВХ = ЗапросОстатков(ЭтаФорма.Объект.Номенклатура,ЭтаФорма.Объект.Склад);
РезЗ = ПолучитьИзВременногоХранилища(ВХ);
Сч=0;
Пока РезЗ.Следующий() Цикл
Табл = ЭтаФорма.Объект.Нехватка.Вставить(Сч);
Сч=Сч+1;
Табл.Номенклатура = РезЗ.Номенклатура;
Табл.КоличествоЕсть = РезЗ.КоличествоЕсть;
КонецЦикла;


КонецПроцедуры

donyab

В отправленном куске кода стоит
РезЗ = ЗапросНак.Выполнить().Выбрать();
вместо выгрузить()
но это ситуацию не улучшает.

sergejK74

вместо
    ВХ = ПоместитьВоВременноеХранилище(РезЗ,ЭтаФорма.УникальныйИдентификатор);
    Возврат ВХ;
Попробуй
Если Следующий() Тогда   
    Возврат РезЗ.КоличествоЕсть;
Иначе
    Возврат 0;
КонецЕсли;
Кнопочка Спасибо - слева!

TsiuninaAnna

 Вы можете обойти результат запроса в серверной процедуре и заполнить структуру с ключем - наименованим (кодом) номенклатуры и значением - остатком, передать структуру на клиент и в ней по ключу получите доступ к остатку номенклатуры. P.S. пользуйтесь параметрами вируальных таблиц в запросе))

donyab

Цитата: sergejK74 от 16 фев 2012, 20:14
вместо
    ВХ = ПоместитьВоВременноеХранилище(РезЗ,ЭтаФорма.УникальныйИдентификатор);
    Возврат ВХ;
Попробуй
Если Следующий() Тогда   
    Возврат РезЗ.КоличествоЕсть;
Иначе
    Возврат 0;
КонецЕсли;
Сделал как посоветовал К74, спасибо, но вот интересно, если такие ограничения наложены 1с, значит это как то обоснованно..ну или есть какие то методические указания для этого случая, т.к. мое личное мнение-намного быстрее и удобнее заполнить какую нить таблицу прямо из результатов запроса, чем постоянно обращаться к серверной процедуре
&НаСервере
Функция ЗапросОстатков (Номенклатура,Склад)
ЗапросНак = Новый Запрос;
ЗапросНак.Текст =
"ВЫБРАТЬ
| ЗапасыНаСкладахОстатки.КоличествоОстаток КАК КоличествоЕсть,
| ЗапасыНаСкладахОстатки.Номенклатура
|ИЗ
| РегистрНакопления.ЗапасыНаСкладах.Остатки КАК ЗапасыНаСкладахОстатки
|ГДЕ
| ЗапасыНаСкладахОстатки.Номенклатура = &Номенклатура
| И ЗапасыНаСкладахОстатки.СтруктурнаяЕдиница = &Склад";
ЗапросНак.УстановитьПараметр("Номенклатура",Номенклатура);
ЗапросНак.УстановитьПараметр("Склад",Склад);
РезЗ = ЗапросНак.Выполнить().Выбрать();
Если РезЗ.Следующий() Тогда   
    Возврат РезЗ.КоличествоЕсть;
Иначе
    Возврат 0;
КонецЕсли;
//ВХ = ПоместитьВоВременноеХранилище(РезЗ,ЭтаФорма.УникальныйИдентификатор);
//Возврат ВХ;
КонецФункции

&НаКлиенте
Процедура Проверить()
ВХ = ЗапросОстатков(ЭтаФорма.Объект.Номенклатура,ЭтаФорма.Объект.Склад);
Стр = ЭтаФорма.Объект.Нехватка.Добавить();
Стр.Номенклатура = ЭтаФорма.Объект.Номенклатура;
Стр.КоличествоЕсть = ВХ;



КонецПроцедуры


donyab

Цитата: TsiuninaAnna от 16 фев 2012, 22:59
Вы можете обойти результат запроса в серверной процедуре и заполнить структуру с ключем - наименованим (кодом) номенклатуры и значением - остатком, передать структуру на клиент и в ней по ключу получите доступ к остатку номенклатуры. P.S. пользуйтесь параметрами вируальных таблиц в запросе))
имеет право на жизнь, на других форумах такой же вариант видел, буду пользовать в дальнейшем, а по поводу виртуальных таблиц, переделал запрос, только удалось воткнуть всего один параметр, второй через ГДЕ вставил

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


не подскажете как передать в вирт таблицу оба параметра

sergejK74

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

Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Склад", Склад);


мое личное мнение-намного быстрее и удобнее заполнить какую нить таблицу прямо из результатов запроса, чем постоянно обращаться к серверной процедуре На клиенте просто недоступен такой тип как ВыборкаИзРезультатаЗапроса - поэтому лучше передавать значение через простые типы данных - например Структура (сразу для всей выборки номенклатуры) или по одному значению, как здесь (но это не оптимальный результат)
Кнопочка Спасибо - слева!

donyab

ТЗ.Свернуть("Номенклатура","Количество");

Массив1 = Новый Массив;
Массив2 = Новый Массив;
Массив1.Добавить(Массив2);
Массив1.Добавить(Массив2);
  СчМ=0;
Для Каждого СтрТЗап Из ТЗ Цикл
РезЗ = ЗапросОстатков(СтрТЗап.Номенклатура,ЭтаФорма.Объект.Склад);

Если РезЗ.Количество()>0 Тогда
КолЗ = РезЗ[0].КоличествоЕсть;
Иначе
КолЗ = 0;
КонецЕсли;


Это были просто наметки, на самом деле у меня номенклатура состоит из других позиций номенклатуры, которые возвращаются с количеством, т.е. мне надо передать разом( не хочется сто раз к серверу обращаться), список номенклатуры с количеством.
Решил передать через массив, но так как мне надо вернуть номенклатуру и количество, взялся за многомерный массив, ток как в него данные добавлять не понял .

donyab

В итоге сделал так, только не знаю на сколько это оптимально?

ТЗ.Свернуть("Номенклатура","Количество");

МассивГлавный = Новый Массив;
Массив2 = Новый Массив;
Массив3 = Новый Массив;
Массив4 = Новый Массив;
МассивГлавный.Добавить(Массив2);
МассивГлавный.Добавить(Массив3);
МассивГлавный.Добавить(Массив4);
  СчМ=0;
Для Каждого СтрТЗап Из ТЗ Цикл
РезЗ = ЗапросОстатков(СтрТЗап.Номенклатура,ЭтаФорма.Объект.Склад);

Если РезЗ.Количество()>0 Тогда
КолЗ = РезЗ[0].КоличествоЕсть;
КолНадо = СтрТЗап.Количество;
Иначе
КолЗ = 0;
КонецЕсли;

Массив2.Вставить(СчМ,СтрТЗап.Номенклатура);
Массив3.Вставить(СчМ,КолЗ);
Массив4.Вставить(СчМ,КолНадо);
СчМ=СчМ+1;

КонецЦикла;
     Возврат МассивГлавный;

КонецФункции

&НаКлиенте
Процедура Проверить()
МассивГлавный = Выборка(ЭтаФорма.Объект.Номенклатура,ЭтаФорма.Объект.Количество);
Для СчМ2 =0 По МассивГлавный[0].Количество()-1 Цикл
Стр = ЭтаФорма.Объект.Нехватка.Добавить();
Стр.Номенклатура = МассивГлавный[0][СчМ2];
Стр.КоличествоЕсть = МассивГлавный[1][СчМ2];
Стр.КоличествоНадо = МассивГлавный[2][СчМ2];
КонецЦикла;



КонецПроцедуры


sergejK74

Чем такой запутанный код использовать - используй инструкцию &НаСервере (кстати ты ее и используешь) и заполняй реквизиты своей формы напрямую на сервере. Проще будет для тебя разобраться. Лучше приложи усилия и постарайся получить все нужные данные одним запросом к базе.
Кнопочка Спасибо - слева!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск