Имя: Пароль:
1C
1С v8
передача результат запроса на клиент
0 Kurbash
 
06.05.14
14:38
ситуация такая: создаю документ, командой посылаю на сервер ссылку на него. На сервере выполняется запрос, который возвращает нужные мне данные, которые должны потом занестись в ТЧ документа. хочу сделать выполнение запроса функцией на сервере, которая вернет на клиент результат запроса типа Выполнить().Выгрузить(), т.е. на клиенте у меня будет т=запроснасервере(); не канает пишет ошибку. что не так делаю?
1 ДенисЧ
 
06.05.14
14:39
На клиенте не существует ТЗ...
2 Ненавижу 1С
 
гуру
06.05.14
14:39
заполняй ТЧ непосредственно на сервере
3 Kurbash
 
06.05.14
14:39
блин..че делать тогда...
4 Kurbash
 
06.05.14
14:39
через получитьОбъект()?
5 H A D G E H O G s
 
06.05.14
14:40
Верни Массив Структур
6 H A D G E H O G s
 
06.05.14
14:40
Выборка=Запрос.Выполнить().Выбрать();
    МассивВозврата=Новый Массив;
    Пока Выборка.Следующий() Цикл
        СтруктураВозврата=Новый Структура;
        СтруктураВозврата.Вставить("Ссылка",Выборка.Ссылка);
        СтруктураВозврата.Вставить("Представление",Выборка.Представление);
        СтруктураВозврата.Вставить("КПП",Выборка.КПП);
        
        МассивВозврата.Добавить(СтруктураВозврата);
    КонецЦикла;
    Возврат МассивВозврата;
7 VikingKosmo
 
06.05.14
14:41
(3) внимательно читать (2)
8 Kurbash
 
06.05.14
14:51
Попробовал-пишет что Нельзя изменять поле, содержащее объект данных формы
9 Рэйв
 
06.05.14
14:54
(8)Получи из объекта формы просто нормальный объект, измени и положит где взял.
10 Kurbash
 
06.05.14
14:58
&НаКлиенте
Процедура НоменклатураПриИзменении(Элемент)
    НоменклатураПриИзмененииНаСервере(Объект);
    прочитать();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура НоменклатураПриИзмененииНаСервере(док)
    Запрос=новый запрос;
    ...текст запроса
результат=запрос.Выполнить().Выбрать();

пока результат.Следующий() цикл
тч=док.ТЧ.добавить();    
...тра та та
конеццикла;
            
    КонецПроцедуры
11 Kurbash
 
06.05.14
14:58
где ошибка?
12 DmitrO
 
06.05.14
15:00
контектсный метод вам поможет )
13 Рэйв
 
06.05.14
15:01
(10)>>НаСервереБезКонтекста - Это на кой? Формы же в этом случае нет
14 DmitrO
 
06.05.14
15:01
&НаСервере
Процедура НоменклатураПриИзмененииНаСервере()
    Запрос=новый запрос;
    ...текст запроса
    Объект.ТЧ.Загрузить(запрос.Выполнить().Выгрузить());

КонецПроцедуры
15 Рэйв
 
06.05.14
15:02
(14)Вот щас помоему как раз и ругнется как сабже:-)
16 DexterMorgan
 
06.05.14
15:03
(8) ЗначениеВРеквизитФормы
17 Kurbash
 
06.05.14
15:03
(16)-чего туда пихнуть?
18 DexterMorgan
 
06.05.14
15:04
(6) извращенец
19 Kurbash
 
06.05.14
15:06
(14) не канает
20 Рэйв
 
06.05.14
15:06
(17)
Об=РеквизитФормыВЗначение("Объект");
//меняем об как объект
ЗначениеВРеквизитФормы(Об,"Объект");
21 Kurbash
 
06.05.14
15:07
(20)-я просмто не понимаю как это использовать можно
22 Рэйв
 
06.05.14
15:07
(21)Объект на форме  - это просто определенная структура с полями объекта.Напрямую ее на сервере менять нельзя, поэтому надо создавать нормальный человеческий объект
23 DexterMorgan
 
06.05.14
15:08
(19) гонишь, так тоже можно
24 Рэйв
 
06.05.14
15:08
в потом пихать его в форму обратно
25 DmitrO
 
06.05.14
15:08
(19)что не канает-то? исходя из (10) все должно канать.
26 H A D G E H O G s
 
06.05.14
15:09
(18) Это в 100500 раз лучше в 80%
27 Рэйв
 
06.05.14
15:11
(18)Очень удобно у меня даже функция написана на это дело

Функция РазложитьТЗ(ТЗ) Экспорт
    мТЗ=Новый Массив;
    
    Для каждого Стр Из ТЗ Цикл
        струкСтрока=Новый Структура;
        Для каждого Кол Из ТЗ.Колонки Цикл
            СтрукСтрока.Вставить(Кол.Имя,Стр[Кол.Имя]);
        КонецЦикла;    
        мТЗ.Добавить(струкСтрока);
    КонецЦикла;
    
    Возврат мТЗ
    
КонецФункции
28 Рэйв
 
06.05.14
15:11
+удобно еще тем, что потом перебирается это дело как обычная ТЗ
29 Kurbash
 
06.05.14
15:13
(25)-что интересно работает, но опять же пишет что Нельзя изменять поле, содержащее объект данных формы, но строки добавляются
30 DmitrO
 
06.05.14
15:17
(29) чета ты темнишь.. на какую именно строку так пишет?
31 Kurbash
 
06.05.14
15:18
(30)-сейчас отловлю
32 Господин ПЖ
 
06.05.14
15:18
массив можно, тз нельзя - в чем сила?
33 Kurbash
 
06.05.14
15:19
НоменклатураПриИзмененииНаСервере(Объект);
34 Kurbash
 
06.05.14
15:19
нажимаю на закрыть при ошибке-все нормально
35 DmitrO
 
06.05.14
15:24
(32) подозреваю что сила только в лени. ТЗ объект сложный, добавление/удаление колонок, индексы опять же.. Свернуть()..
сравнение значений..
не охота им его делать чтобы еще и в веб-клиенте это все работало..
36 DmitrO
 
06.05.14
15:25
(33) да штожтакоета!.. А у меня как написано? Есть в моем коде этот формальный параметр (Объект)?
37 Господин ПЖ
 
06.05.14
15:27
(35) ну тз можно представить как набор массивов... есть система DocVision там "табличных частей" нет официально, а то что есть как раз массив массивов
38 Рэйв
 
06.05.14
15:30
(37)Да это все на массивах построено. Просто классы написаны по разному и методы в классах для приватных массивов разнае.
39 DexterMorgan
 
06.05.14
15:48
(28) зачем это делать на клиенте?
40 DexterMorgan
 
06.05.14
15:50
(26) гы, чем лучше то
41 H A D G E H O G s
 
06.05.14
17:04
(35) Ты не поверишь :-)
42 Zhuravlik
 
06.05.14
17:32
(41) А так быстрее? У 1С в методических рекомендациях на ИТС сказано, что так делать не рекомендуется, а почему - не сказано (из-за производительности или читаемости).
43 H A D G E H O G s
 
06.05.14
17:33
(42) Это я к тому, что ТЗ вполне себе реализовано на Клиенте, даже формочка выбора элемента есть :-)
44 Zhuravlik
 
06.05.14
17:54
(43) Ну да, как ДанныеФормыКоллекция, она позволяет те же самые операции сделать что и тз.
Я имел в виду про массив структур (к (26)) - не нашел сейчас статью на итс, но точно помню слова "Не рекомендуется") Уже давно привык что 1С - это сплошной костыль, очень много "нюансов". Интересно просто, чем именно это по-вашему лучше? по производительности, или по другим соображениям?
45 hhhh
 
06.05.14
18:01
(44) сделайте реквизит на форме типа таблица значений, с ним и работайте. Оно прекрасно работает. Вот на фига вам голову себе забивать всякими коллекциями.
46 Zhuravlik
 
06.05.14
18:47
(45) "реквизит на форме типа таблица значений" - оно и есть "ДанныеФормыКоллекция" =)
Я понять хочу, почему утверждается опытным специалистом, что массив структур - "Это в 100500 раз лучше в 80%" чем "ЗначениеВРеквизитФормы" (26).
47 Serginio1
 
06.05.14
18:57
(27) ОбщегоНазначения
Функция ТаблицаЗначенийВМассив(ТаблицаЗначений) Экспорт
    
    Массив = Новый Массив();
    СтруктураСтрокой = "";
    НужнаЗапятая = Ложь;
    Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
        Если НужнаЗапятая Тогда
            СтруктураСтрокой = СтруктураСтрокой + ",";
        КонецЕсли;
        СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя;
        НужнаЗапятая = Истина;
    КонецЦикла;
    Для Каждого Строка Из ТаблицаЗначений Цикл
        НоваяСтрока = Новый Структура(СтруктураСтрокой);
        ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
        Массив.Добавить(НоваяСтрока);
    КонецЦикла;
    Возврат Массив;

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