Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
19 Янв 2018, 22:41
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

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

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

Оффлайн donyab

  • *
  • Сообщений: 22
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-12-19
  • Сайт: 
  • Профессия: Программист 8.1
Доброго дня, вот и докатился я до управляемых приложений, ну и встал на элементарном
Надо сделать запрос и его результат передать на клиент, ан нет у типа "ВыборкаИзРезультатовЗапроса"  Доступность:
Сервер, толстый клиент, внешнее соединение. А как же в тонком клиенте передать ее?
попробовал даже через ВременноеХранилище - ругается матом
Вопрос как сделать "ЭТО" красиво ???

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

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


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


Оффлайн donyab

  • *
  • Сообщений: 22
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-12-19
  • Сайт: 
  • Профессия: Программист 8.1
В отправленном куске кода стоит
РезЗ = ЗапросНак.Выполнить().Выбрать();
вместо
выгрузить()
но это ситуацию не улучшает.

Оффлайн sergejK74

  • *****
  • Сообщений: 1093
  • РЕПУТАЦИЯ: 458
  • КПД: 42%
  • Всегда готов помочь!
  • Регистрация: 2011-07-08
  • Сайт: 
  • Профессия: Ученик 1С
вместо
    ВХ = ПоместитьВоВременноеХранилище(РезЗ,ЭтаФорма.УникальныйИдентификатор);
    Возврат ВХ;
Попробуй
Если Следующий() Тогда   
    Возврат РезЗ.КоличествоЕсть;
Иначе
    Возврат 0;
КонецЕсли;
Кнопочка Спасибо - слева!

Оффлайн TsiuninaAnna

  • *
  • Сообщений: 3
  • РЕПУТАЦИЯ: 1
  • КПД: 33%
  • Регистрация: 2012-02-16
  • Сайт: 
  • Профессия: Программист 1С
 Вы можете обойти результат запроса в серверной процедуре и заполнить структуру с ключем - наименованим (кодом) номенклатуры и значением - остатком, передать структуру на клиент и в ней по ключу получите доступ к остатку номенклатуры. P.S. пользуйтесь параметрами вируальных таблиц в запросе))

Оффлайн donyab

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

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



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

Оффлайн donyab

  • *
  • Сообщений: 22
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-12-19
  • Сайт: 
  • Профессия: Программист 8.1
Вы можете обойти результат запроса в серверной процедуре и заполнить структуру с ключем - наименованим (кодом) номенклатуры и значением - остатком, передать структуру на клиент и в ней по ключу получите доступ к остатку номенклатуры. P.S. пользуйтесь параметрами вируальных таблиц в запросе))
имеет право на жизнь, на других форумах такой же вариант видел, буду пользовать в дальнейшем, а по поводу виртуальных таблиц, переделал запрос, только удалось воткнуть всего один параметр, второй через
ГДЕ
вставил

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

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

Оффлайн sergejK74

  • *****
  • Сообщений: 1093
  • РЕПУТАЦИЯ: 458
  • КПД: 42%
  • Всегда готов помочь!
  • Регистрация: 2011-07-08
  • Сайт: 
  • Профессия: Ученик 1С
	Запрос.Текст = 
"ВЫБРАТЬ
| ЗапасыНаСкладахОстатки.КоличествоОстатокОстаток КАК КоличествоЕсть
|ИЗ
| РегистрНакопления.ЗапасыНаСкладах.Остатки(
| ,
| СтруктурнаяЕдиница = &Склад
| И Номенклатура = &Номенклатура) КАК ЗапасыНаСкладахОстатки";

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

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

Оффлайн donyab

  • *
  • Сообщений: 22
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-12-19
  • Сайт: 
  • Профессия: Программист 8.1
 ТЗ.Свернуть("Номенклатура","Количество");
 
 Массив1 = Новый Массив;
 Массив2 = Новый Массив;
 Массив1.Добавить(Массив2);
 Массив1.Добавить(Массив2);
  СчМ=0;
 Для Каждого СтрТЗап Из ТЗ Цикл
РезЗ = ЗапросОстатков(СтрТЗап.Номенклатура,ЭтаФорма.Объект.Склад);

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

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

Оффлайн donyab

  • *
  • Сообщений: 22
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-12-19
  • Сайт: 
  • Профессия: Программист 8.1
В итоге сделал так, только не знаю на сколько это оптимально?

 ТЗ.Свернуть("Номенклатура","Количество");
 
 МассивГлавный = Новый Массив;
 Массив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

  • *****
  • Сообщений: 1093
  • РЕПУТАЦИЯ: 458
  • КПД: 42%
  • Всегда готов помочь!
  • Регистрация: 2011-07-08
  • Сайт: 
  • Профессия: Ученик 1С
Чем такой запутанный код использовать - используй инструкцию &НаСервере (кстати ты ее и используешь) и заполняй реквизиты своей формы напрямую на сервере. Проще будет для тебя разобраться. Лучше приложи усилия и постарайся получить все нужные данные одним запросом к базе.
Кнопочка Спасибо - слева!


Теги:
 

Из запроса не выводятся значения полей - выводятся пустые значения

Автор Alex1111Раздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 24
Просмотров: 12594
Последний ответ 14 Июн 2012, 17:44
от Alex1111
"ПОДОБНО" в условие связи запроса

Автор Станиславъ ЗверевъРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 8
Просмотров: 3503
Последний ответ 11 Май 2016, 15:29
от LexaK
"Таблица значений" в результате запроса - 1С

Автор mvk843Раздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 8
Просмотров: 873
Последний ответ 15 Июн 2017, 07:53
от mvk843
Возможно ли языком запросов без конкатенации текста запроса и без СКД преобразовать строки таблицы в столбцы (колонки) выходной таблицы?

Автор acces969Раздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 3
Просмотров: 520
Последний ответ 29 Май 2017, 15:29
от alex0402
Ошибка при выполнении запроса - "неоднозначное поле"

Автор Marta_LiРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 14
Просмотров: 12199
Последний ответ 21 Апр 2011, 16:00
от Marta_Li

* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
101 Сообщений
AIFrame
78 Сообщений
alex0402
33 Сообщений
kiksi
30 Сообщений
pavl_vs
24 Сообщений
andron81_81
18 Сообщений
alexandr_ll
17 Сообщений
Norfolk
15 Сообщений
KOI8-R
14 Сообщений
MuI_I_Ika MuI_I_Ika
13 Сообщений

* Кто онлайн

  • Точка Гостей: 262
  • Точка Скрытых: 0
  • Точка Пользователей: 3
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal