1. user623969_dusa 23.07.19 17:33 Сейчас в теме

Передача Таблицы значений на тонкий клиент

а как быть если с сервера таблицу значений нельзя передавать на клиент но очень хочется ее там видеть? массив структур использовать или можно как-то попроще??

ругается что отсутствует отображение типов для ValueTable
Найденные решения
2. aka Любитель XML 23.07.19 17:35 Сейчас в теме
На клиенте нет таблицы значений, передавай либо массив структур, либо через хранилще
user623969_dusa; +1 Ответить
15. spacecraft 24.07.19 11:03 Сейчас в теме
(13)
задача стояла передать из формы в форму таблицу для заполнения табличной части

Зачем тогда ТЗ (или массив структур) передавать на клиент?
Используйте временное хранилище.
&НаКлиенте
Процедура ОткрытьНужнуюФорму()
    АдресТЗ = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
    ПолучитьАдресТЗ(АдресТЗ);
    // добавляете в передаваемые параметры АдресТЗ
    ....
КонецПроцедуры

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

    Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);	
    ТЗ = Запрос.Выполнить().Выгрузить(); 
    ПоместитьВоВременноеХранилище(ТЗ, Адрес)
КонецПроцедуры
Показать


В открываемой форме получаете АдресТЗ и получаете ТЗ:
ТЗ = ПолучитьИзВременногоХранилища(АдресТЗ);
Остальные ответы
Избранное Подписка Сортировка: Древо
6. Shilov 4 23.07.19 18:55 Сейчас в теме
(1) Можно добавить как перемененную на форму и не париться.
8. tusv 176 23.07.19 19:37 Сейчас в теме
(6)Переменные на сервере и на клиенте не видят друг друга, а на сервере еще и обнуляется без повт. исп.
9. spacecraft 23.07.19 19:54 Сейчас в теме
(1) создаете реквизит формы типа "(ТаблицаЗначений)". Обратите внимание на скобки. На самом деле это ДанныеФормыКоллекция, а не тип ТаблицаЗначений. Хотя при выборе типа нужно выбирать именно ТаблицаЗначений. Вот такой каламбур.
На сервере в новый реквизит формы можно загрузить ТЗ. Имена и тип колонок должны соответствовать.
ИмяРеквизита.Загрузить(ТЗ)
2. aka Любитель XML 23.07.19 17:35 Сейчас в теме
На клиенте нет таблицы значений, передавай либо массив структур, либо через хранилще
user623969_dusa; +1 Ответить
7. tusv 176 23.07.19 19:33 Сейчас в теме
(2)Через хранилище ТЗ на клиент не передать, как и Объект коллекции на сервер. Тут однозначно массив структур рулит
aka Любитель XML; +1 Ответить
3. VmvLer 23.07.19 17:45 Сейчас в теме
модные пацаны вместо хранилища уже костылят через МВТ.
4. user623969_dusa 23.07.19 17:49 Сейчас в теме
(3) менеджера временных таблиц тоже нет на тонком
11. YannikAlx 24.07.19 09:39 Сейчас в теме
(4) А каким образом вы заполняете свою табличную часть на клиенте? Данными с сервера?
Не проще создать у Объекта создать табличную часть вынести ее на форму и загружать в нее результаты запроса скажем и обрабатывать сразу на сервере?
5. aka Любитель XML 23.07.19 17:55 Сейчас в теме
(3) а че не вэб-сервис замутили? ))))
10. furman2000 12 24.07.19 06:05 Сейчас в теме
Тоже иногда стоит такая задача.
А как через массив структур??? Можно пример.
13. user623969_dusa 24.07.19 10:36 Сейчас в теме
(10) задача стояла передать из формы в форму таблицу для заполнения табличной части - БСП нет, обработку заполнения табличной части не создать как в учебниках, поэтому таблица нужна была на клиенте и при создании на сервере второй формы сравнить ее с имеющейся табличной частью документа

ПараметрыФормы = Новый Структура;
Если ЗначениеЗаполнено(ДокументСобытий) Тогда
//добавлять в существующий документ событий
ПараметрыФормы.Вставить("Ключ", ДокументСобытий);
ПараметрыФормы.Вставить("ДополнительныеПараметры", Новый Структура("ДобавляемыеУдержания", ПолучитьМассивСтруктурУдержаний()));

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

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

удобно тем что обход идет так же как таблицы значений
для каждого эл из ТЗ цикл
Эл.Дата
и т.д.
конеццикла
15. spacecraft 24.07.19 11:03 Сейчас в теме
(13)
задача стояла передать из формы в форму таблицу для заполнения табличной части

Зачем тогда ТЗ (или массив структур) передавать на клиент?
Используйте временное хранилище.
&НаКлиенте
Процедура ОткрытьНужнуюФорму()
    АдресТЗ = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
    ПолучитьАдресТЗ(АдресТЗ);
    // добавляете в передаваемые параметры АдресТЗ
    ....
КонецПроцедуры

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

    Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);	
    ТЗ = Запрос.Выполнить().Выгрузить(); 
    ПоместитьВоВременноеХранилище(ТЗ, Адрес)
КонецПроцедуры
Показать


В открываемой форме получаете АдресТЗ и получаете ТЗ:
ТЗ = ПолучитьИзВременногоХранилища(АдресТЗ);
16. user623969_dusa 24.07.19 11:36 Сейчас в теме
17. g1uk 07.11.19 12:40 Сейчас в теме
(15) Так будет работать только в режиме "Толстый клиент", "Тонкий клиент" выдаст ошибку
18. spacecraft 07.11.19 12:43 Сейчас в теме
(17) в каком месте и какую ошибку?
19. g1uk 07.11.19 13:31 Сейчас в теме
(18) Ошибку выдаст "Ошибка отображения типов", в случае если в форме не добавлена эта таблица. В этом случае нужно использовать преобразование ТЗ в структуру, как описано в (13)
20. spacecraft 07.11.19 13:46 Сейчас в теме
(19) какое отображение типов? ТЗ не передается на клиент от слова совсем. Внимательно код посмотрите. Передается только адрес хранилища.
В открываемой форме, в обработчике ПриСозданииНаСервере, получается ТЗ из хранилища и заполняются данные ТЧ. Все на сервере. Никуда на клиент ТЗ не передается.
24. g1uk 07.11.19 14:34 Сейчас в теме
(20) Я в курсе. Ниже в (23) я разместил код который использовал, думаю вы меня поймете
25. spacecraft 07.11.19 14:46 Сейчас в теме
(24) получили массив структур на клиент, дальше что? На клиенте в цикле заполнять ТЧ?
Смотрите (13) : "задача стояла передать из формы в форму таблицу для заполнения табличной части - БСП нет" И приведен запрос получения таблицы. Т.е. на первой форме никакой таблицы нет в реквизитах.
27. g1uk 07.11.19 15:03 Сейчас в теме
Короче видимо не под эту задачу... В моем случае: если нужно таблицу передать на клиент и там использовать для обработки, не создавая реквизит формы
26. spacecraft 07.11.19 14:50 Сейчас в теме
(24)
Я в курсе.

Тогда про ошибку отображения типов не упоминали. И что не будет работать на тонком клиенте, тоже.
12. JohnGalt 44 24.07.19 10:32 Сейчас в теме
Вообще все зависит от того, что дальше хотите с этими данными делать. Зачем именно ТЗ ? В зависимости от задач может оказаться, что нужно преобразовать в строку, например. Если нужно пару колонок и с ними проводить операции сортировки, например, можно использовать СписокЗначений.
14. user623969_dusa 24.07.19 10:36 Сейчас в теме
21. starik-2005 1979 07.11.19 13:59 Сейчас в теме
Вообще не совсем понятно, нахрена это нужно. Правильные пацаны делают так:
1. Создают реквизит формы с таблицей - но лучше создать реквизит объекта, куда суют все эти колонки, которые надо потом с чем-нить сравнивать.
2. Открывают эту форму.
3. Загружают туда данные (в эту таблицу на форме или, что лучше, в реквизит объекта).
4. Открывают форму, указывая текущую форму в качестве владельца.
5. В открывшейся форме что на клиенте, что на сервере будет доступна форма-владелец и, соответственно, реквизит с таблицей.
22. g1uk 07.11.19 14:07 Сейчас в теме
(21) Это делается для того чтобы не создавать реквизит формы, если таблица нужна только для обработки данных
23. g1uk 07.11.19 14:30 Сейчас в теме
Мой вариант такой, чтобы работало на "тонком клиенте":

На первой форме формируем массив из таблицы

&НаКлиенте
Процедура КакаяТоПроцедураНаПервойФорме()

        АдресТЗТовары = МассивИзТаблицыВХранилище("Товары");

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

&НаСервере
Функция МассивИзТаблицыВХранилище(ИмяТаблицы)
	
	МассивИзТЗ = ТаблицаЗначенийВМассив(Объект[ИмяТаблицы].Выгрузить());
	
	ВозвращаемыйАдрес = ПоместитьВоВременноеХранилище(МассивИзТЗ, УникальныйИдентификатор);
	
	Возврат ВозвращаемыйАдрес;
	
КонецФункции

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

КонецФункции
Показать


и ловим готовый массив из таблицы значений на другой форме

&НаКлиенте
Процедура ОбработатьТаблицуНаКлиенте(АдресТЗТовары)
    
    Товары = ПолучитьИзВременногоХранилища(АдресТЗТовары);

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


в переменной "Товары" будет сидеть массив из структур, каждая структура - это строка таблицы

Ну конечно еще часть кода нужно написать для передачи АдресаТЗ между первой и второй формой, это может быть передано в структуре с другими параметрами
28. Fux 04.12.19 04:44 Сейчас в теме
(23) А в чем смысл преобразования ТЗ в массив, при работе с временным хранилищем? Можно же саму ТЗ в хранилище сохранять..
29. g1uk 04.12.19 08:41 Сейчас в теме
Таблицу потом не получить из хранилища в тонком клиенте. Ну например если в клиентском общем модуле захотите таблицу обработать, или в другой форме без добавления таблицы в качестве реквизита формы
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Санкт-Петербург
зарплата от 80 000 руб. до 130 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Программист/Cтарший программист 1С
Москва
зарплата от 100 000 руб. до 250 000 руб.
Полный день

Программист 1С
Калининград
зарплата от 60 000 руб. до 80 000 руб.
Полный день

Руководитель проектов 1С
Санкт-Петербург
Полный день