Имя: Пароль:
1C
1С v8
Как передать с сервера на клиент таблицу значений в управляемом приложении
,
0 Demetres
 
04.12.11
12:36
подскажите пожалуйста как можно передать с сервера на клинт ТаблицаЗначений
1 DEVIce
 
04.12.11
12:36
Через массив.
2 Demetres
 
04.12.11
12:37
&НаКлиенте
Процедура ПартияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
   
   //Устанавливаем дату в соответствии с датоф документа партии
   Объект.Дата = ПолучитьДатуИзПартии(ВыбранноеЗначение);
   //Предупреждение("Дата документа изменена на дату документа партии",,"Внимание!!!");
   
   //Заполняем ТЧ и разбиваем сумму доп. расходов пропорционально количеству товара в партии
   Объект.КолТоваровПартии.Загрузить(РаспеределениеДопРасходов(ВыбранноеЗначение));
   //РаспеределениеДопРасходов(ВыбранноеЗначение);
   
КонецПроцедуры

//Производим распределение доп расходов по кличеству возвращаем таблицу значений
&НаСервере
Функция РаспеределениеДопРасходов(Партия)
   
   ТаблицаЗначений = Новый ТаблицаЗначений;
   ТаблицаЗначений.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));    
   ТаблицаЗначений.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15,2,ДопустимыйЗнак.Неотрицательный)));
   ТаблицаЗначений.Колонки.Добавить("Себестоимость", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15,3,ДопустимыйЗнак.Неотрицательный)));
   ТаблицаЗначений.Колонки.Добавить("ДопЗатраты", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15,2,ДопустимыйЗнак.Неотрицательный)));
   
   //Получаем Общее количество товара из партии
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
                  |    ОстаткиТоваровОбороты.КоличествоПриход
                  |ИЗ
                  |    РегистрНакопления.ОстаткиТоваров.Обороты(, , , Партия = &Партия) КАК ОстаткиТоваровОбороты";
   Запрос.УстановитьПараметр("Партия", Партия);                              
   КоличествоТовараВПратии        = Запрос.Выполнить().Выгрузить()[0].КоличествоПриход;
   ДопЗатратыНаЕдНоменклатуры    = Объект.Сумма/КоличествоТовараВПратии;
   
   //Заполняем таблицу значений данными
   Запрос.Текст = "ВЫБРАТЬ
                  |    ОстаткиТоваровОбороты.Номенклатура,
                  |    ОстаткиТоваровОбороты.КоличествоПриход,
                  |    ОстаткиТоваровОбороты.СебестоимостьПартииНоменклатурыПриход
                  |ИЗ
                  |    РегистрНакопления.ОстаткиТоваров.Обороты(, , , Партия = &Партия) КАК ОстаткиТоваровОбороты";
   Запрос.УстановитьПараметр("Партия", Партия);                  
   РезультатЗапроса = Запрос.Выполнить().Выбрать();
   Пока  РезультатЗапроса.Следующий() Цикл
       НоваяСтрокаТЗ                = ТаблицаЗначений.Добавить();
       НоваяСтрокаТЗ.Номенклатура    = РезультатЗапроса.Номенклатура;
       НоваяСтрокаТЗ.Количество    = РезультатЗапроса.КоличествоПриход;
       НоваяСтрокаТЗ.Себестоимость = РезультатЗапроса.СебестоимостьПартииНоменклатурыПриход;
       НоваяСтрокаТЗ.ДопЗатраты    = ДопЗатратыНаЕдНоменклатуры*РезультатЗапроса.КоличествоПриход;
   КонецЦикла;
   
   Возврат ТаблицаЗначений;
   
КонецФункции
3 DEVIce
 
04.12.11
12:37
ТЗ не передается между сервером и клиентом.
4 Armando
 
04.12.11
12:38
Для чего?
5 Demetres
 
04.12.11
12:39
(1) это единственный способ?
6 Demetres
 
04.12.11
12:40
(4) на сервере я заполняю ТЧ документа, а потом переношу её на клиент
7 Demetres
 
04.12.11
12:40
(3) а есть какой-нибудь аналог
8 DEVIce
 
04.12.11
12:41
(6). Н сервере получай данные например запросом, а перебирай их на клиенте, то же можно и через массив сделать.
9 DEVIce
 
04.12.11
12:41
(7). Массив.
10 Demetres
 
04.12.11
12:49
(9)
Пока РезультатЗапроса.Следующий() Цикл
   Массив.Добавить(РезультатЗапроса);
КонецЦикла;
Возврат Массив;

Такая конструкция?
11 nicxxx
 
04.12.11
12:53
на клиенте для этого существует ДанныеФормыКоллекция
12 Азат
 
04.12.11
12:55
(8) а чо нельзя там же на сервере и перебрать массив?
13 Demetres
 
04.12.11
12:56
(11) сейчас попробую
14 Demetres
 
04.12.11
13:02
(11) что-то я не пойму как этой коллекцией пользоваться, если не трудно можете написать
15 Demetres
 
04.12.11
13:03
(11) пробовал создать переменную с таким типом на клиенте для передачи на сервер, но ничего не вышло
16 Нуф-Нуф
 
04.12.11
13:05
вроде ТЗ суют в реквизит формы с типом табличное поле
17 Demetres
 
04.12.11
14:47
(16) и через реквизит не получается пишет ошибку
{Документ.ДополнительныеЗатраты.Форма.ФормаДокумента.Форма(11)}: Ошибка при установке значения атрибута контекста (ТабЗнач)
   РаспеределениеДопРасходов(ВыбранноеЗначение, ТабЗнач);
Нельзя изменять поле, содержащее объект данных формы
18 Азат
 
04.12.11
14:56
да блин, в чем проблема-то?

Массив = Новый Массив;
Для К = 0 По ТЗ.Колонки.Количество() - 1 Цикл
   Массив.Добавить(ТЗ.ВыгрузитьКолонку(К));
КонецЦикла;
19 МишельЛагранж
 
04.12.11
15:08
в управляемом приложении между клиентов и сервером передаются только ПРОСТЫЕ типы - поэтому, все получаете и обрабатываете на сервере (запросы, ТЗ формируете и т.д.), а на клиент - уже только полученные данные забирают.
20 Demetres
 
04.12.11
15:11
Вышел из положения таким способом:

   Пока  РезультатЗапроса.Следующий() Цикл
       Структура.Очистить();
       Структура.Вставить("Номенклатура", РезультатЗапроса.Номенклатура);
       Структура.Вставить("Количество", РезультатЗапроса.КоличествоПриход);
       Структура.Вставить("Себестоимость", РезультатЗапроса.СебестоимостьПартииНоменклатурыПриход);
       Структура.Вставить("ДопЗатраты", ДопЗатратыНаЕдНоменклатуры*РезультатЗапроса.КоличествоПриход);
       МассивЗначений.Добавить(Структура);
       
   КонецЦикла;
   
   Возврат МассивЗначений;
21 nicxxx
 
04.12.11
15:29
читай про ДанныеФормыВЗначение() и РеквизитФормыВЗначение()
22 Immortal
 
04.12.11
15:34
(19)ложь, звездежь и провокация.
23 tridog
 
04.12.11
15:48
(6) Вот стараются вас отучить так делать, стараются... Правильный вариант в (21). Обрабатывать ТЧ нужно на сервере. А на клиенте вся ТЧ не нужна, только отображаемая часть - до тех пор пока пользователь сам ее не прокрутит.
24 Demetres
 
04.12.11
16:08
Поправка

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

И обращаться потом удобно через точку, как для таблицы значений
25 Immortal
 
04.12.11
16:15
самое главное, что ты изобретаешь велосипед
26 Immortal
 
04.12.11
16:15
представляешь?-)
27 Юрий Лазаренко
 
04.12.11
18:09
(24) Работать будет, но это полный отстой.
(0) Напиши конкретнее: какие именно действия и в каких масштабах ты собираешься делать на клиенте? В зависимости от этого уже надо решать, оптимальнее их выполнять на клиентской стороне или лучше сделать на сервере.
28 nicxxx
 
05.12.11
01:00
(23) я в табличке меняю одно число и надо пересчитать итоги в двух местах - мне что, из-за этого ее всю на сервер и обратно гонять? всяко проще проще на клиенте арифметикой заниматься
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.