Имя: Пароль:
1C
1С v8
Получить Из Временного Хранилища
,
0 Zmitrok62
 
05.02.15
14:13
Приветствую! Создаю обработку, хочу передать данные с сервера на клиент, но говорит следующее:

{Обработка.ЗаписьФайла.Форма.Форма.Форма(26)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)
         Выборка = ПолучитьИзВременногоХранилища(ВыборкаВХ);
по причине:
Ошибка получения значения из временного хранилища
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: {http://v8.1c.ru/8.2/mngsrv/ws}response    Форма: Элемент    Тип: {http://v8.1c.ru/8.1/data/core}ValueTable
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа '{http://v8.1c.ru/8.1/data/core}ValueTable'



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



&НаКлиенте
Процедура Старт(Команда)
                
         ВыборкаВХ = ПолучитьСписокТоваров();
         Выборка = ПолучитьИзВременногоХранилища(ВыборкаВХ);
        
         Текст = Новый ТекстовыйДокумент;        
         Для Каждого Стов Из Выборка Цикл
              Текст.Прочитать("/home/dmitry/nomenklatura.txt");
              Текст.ДобавитьСтроку(Выборка);
              Текст.Записать("/home/dmitry/nomenklatura.txt");
         КонецЦикла;

     КонецПроцедуры
1 H A D G E H O G s
 
05.02.15
14:27
(0) Таблицу значений нельзя передавать на клиент
2 eklmn
 
гуру
05.02.15
14:28
охрень, чуть мозг не вывехнул от кода
3 GROOVY
 
05.02.15
14:37
А чего бы на сервере все не сделать?
4 Zmitrok62
 
05.02.15
14:42
Да можно и на сервере, это просто эксперимент и больше всего интересно почему не удается получить из ВХ.
5 GROOVY
 
05.02.15
14:43
Потому-что (1).
ТЗ не модет существовать на клиенте, ТЗ на клиенте - это сконвертированные в данные формы записи.
6 Zmitrok62
 
05.02.15
15:02
Вот чувак предлагает решение: http://infostart.ru/public/240022/
7 GROOVY
 
05.02.15
15:14
(6) Вот это полная бредятина. Еще можно массив многомерный сделать. А зачем? Зачем передавать на клиент данные, которые там нафиг ненужны?
8 H A D G E H O G s
 
05.02.15
15:19
(7) Прекрасное решение.
9 H A D G E H O G s
 
05.02.15
15:21
(7) Программист должен сам решать, какие данные нужны на клиенте, а какие- на сервере. Без всяких контекстных вызовов по каждому чиху - которые шарашаться в большинстве методичек от "именнитых авторов" УФ.
10 Гёдза
 
05.02.15
15:29
(7) Мы сами знаем что вам нужно, а что нет (с) 1С
11 GROOVY
 
05.02.15
15:31
Ну давайте на старенький планшет ТЗ передадим с овер 9000 строк и колонок. Ну-ну... Это нам так надо.
12 H A D G E H O G s
 
05.02.15
15:37
(11) Хреновый пример.

Точно также на планшет можно передать 9000 строк и колонок в составе
ДанныеФормыКоллекция
13 GROOVY
 
05.02.15
15:37
ДанныеФормы целиком на клиент не передаются.
14 GROOVY
 
05.02.15
15:38
Тут срабатывает правило (10)
15 H A D G E H O G s
 
05.02.15
15:43
(12) Причем где-то на 10-12 пользователе, работающем с такой таблицей, сервер 1С двинет кони.
16 H A D G E H O G s
 
05.02.15
15:44
(13) Это не помешает пользователю отскроллить таблицу, поимев ее полностью на клиенте + нехилые тормоза сервера 1С
17 H A D G E H O G s
 
05.02.15
15:46
Точно также можно зашарашить в ДанныеФормы 100000 строк и  дождаться 1-ого скролла около минуты.
18 Demetres
 
05.02.15
15:53
(4) Типа такого на клиенте нет
19 Zmitrok62
 
05.02.15
16:12
(18) м?
20 H A D G E H O G s
 
05.02.15
16:14
Это я к чему, GROOVY , говорю.

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

Вот и в своей методичке ты отработал по шаблонам, не умудрившись подумать. Рекомендую поправить:
http://1c.chistov.pro/2010/06/1-82.html
21 Demetres
 
05.02.15
16:17
(19)у!
22 Zmitrok62
 
05.02.15
16:35
(21) д
23 ам794123
 
05.02.15
16:46
(0) Вместо временного хранилища используй ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр()
24 Zmitrok62
 
05.02.15
16:48
(23) Спасибо, попробую!
25 H A D G E H O G s
 
05.02.15
16:48
(23) Класс!
26 Гёдза
 
05.02.15
16:50
И что на клиенте появится ТЗ?
27 ShoGUN
 
05.02.15
16:52
(23) Голь на выдумку хитра...
28 Гёдза
 
05.02.15
16:54
На кллиенте нет такого метода (((
29 ам794123
 
05.02.15
16:57
(28) Не все клиенты одинаково полезны. Клиент должен быть толстым)
30 GROOVY
 
05.02.15
17:23
(20) Вот тебе методика по шаблонам с объяснениями: http://1c.chistov.pro/2013/07/blog-post_25.html специально еще раз написал.
31 H A D G E H O G s
 
05.02.15
17:37
(30) Хехе, шутник.
32 H A D G E H O G s
 
05.02.15
17:46
(30) В первой статье первый запрос говорит о том, что вы не понимаете механизьма регистра остатков.

Правильный запрос выглядит примерно так:

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Товары.Номенклатура,
    Товары.Количество,
    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток
ИЗ
    Товары КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
        ПО Товары.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
            И (ТоварыНаСкладахОстатки.Склад = &Склад)
33 H A D G E H O G s
 
05.02.15
17:48
(32) Конечно, на экзамене по Спецу любой получит двойку.
34 Гёдза
 
05.02.15
17:48
(32) несущественное улучшение.
35 H A D G E H O G s
 
05.02.15
17:50
(34) Пфф.

Улучшение, которое убирает 1- внешний цикл.

Улучшение, которое позволяет сократить на порядок обращение к таблице остатков.

По шаблону количество обращений будет n^2, где n-число строк ТЧ товары.
По варианту - всего n обращений.
36 GROOVY
 
05.02.15
17:53
(35) Ну если это где-то документировано, то я признаю что полный даун в запросах.
37 Гёдза
 
05.02.15
17:53
(35) какой внешний цикл?
38 Гёдза
 
05.02.15
17:53
Ты какой метод соединения предполагешь?
39 GROOVY
 
05.02.15
17:54
(37) Это он про план запроса на sql-сервере в который мутирует запрос 1С.
40 H A D G E H O G s
 
05.02.15
17:54
(37) nestep loops
41 Гёдза
 
05.02.15
17:56
Единственное что на вложенной выборке нет индекса, но если меньше 100 записей то ваще не влияет
42 GROOVY
 
05.02.15
17:56
Только вот перед соединением, не на оперативный момент, нужно еще остатки как бы рассчитать.
43 Гёдза
 
05.02.15
17:57
(42) А где неоперативный то момент? в этом то и суть хоть и несущественная
44 H A D G E H O G s
 
05.02.15
17:58
(41) Шта?
(42) У тебя - на оперативный.
Счаст вся типовота считает остатки на оперативный, насколько я помню (могу и ошибаться)
45 H A D G E H O G s
 
05.02.15
17:58
Счаст ради "Высшей справедливости" найду док с 1000 строк
46 GROOVY
 
05.02.15
17:59
(44) И чего, мне в методической статье описывать все варианты с точки зрения оптимальности на сервере sql?
Тема - не эксперт по технологическим вопросам.
47 Гёдза
 
05.02.15
17:59
сделай замер. эти выигрышные микросекунды не суть
48 GROOVY
 
05.02.15
18:00
Это как разбирать механизм сцепления у автомобиля и доказывать всем, что припаять намертво было бы быстрее, надежнее и дешевле!
49 H A D G E H O G s
 
05.02.15
18:03
(46) По твоим стопам пойдут тысячи юнных программистов, которые будут мыслить щаблонами и не пытаться "подергать".
50 ДенисЧ
 
05.02.15
18:04
Казалось бы,, элементарный вопрос...
Но нет... Пришёл Ёжик и всё свёл к нестед лупам и прочей нечисти...
51 ShoGUN
 
05.02.15
18:07
(50) Нестед луп - это вложенный цикл. Что в нём такого нечестивого?
52 GROOVY
 
05.02.15
18:07
(49) Я был бы рад, если тысячи мыслили по рекомендациям 1С, а де делали запросы в циклах, получение представления отдельно и предупреждений при проведении.
53 H A D G E H O G s
 
05.02.15
18:12
(51) На 1021 строке nestep loops превращается в mergejoin

По шаблону - 2 mergejoin-а, у меня - один.

Да, вот теперь выигрыш не такой критичный.
54 GROOVY
 
05.02.15
18:21
(53) Ты мне лучше скажи, почему условие (А,Б) в (ВЫБРАТЬ А,Б Из Х) выполняется медленнее чем А = Х.А и Б = Х.Б?

Я понимаю что медленнее, но почему?!
55 К_Дач
 
05.02.15
18:25
(54) это особенности самой СУБД. Оператор in () - вообще довольно медленная штука. К тому же, по сути, оптимизатор запросов превращает in в join.

А по поводу холивара с тов. Ежовым - я не гуру, но у вас, имхо, у обоих неоптимально.

Надо бы сначала поместить выборку из виртуальной таблицы во временную и потом по соединяться с ней.

Полностью согласен с книжкой "эксперт по технологическим вопросам, цитирую "виртуальные таблицы.... могут разворачиваться в подзапросы при трансляции в язык СУБД...."
56 Serginio1
 
05.02.15
18:27
(54) На опыте во многих сценариях Left Join  предочтительнее EXISTS и In
57 К_Дач
 
05.02.15
18:31
(56) это потому что при джойне вместо нестед лупс может и мердж использоваться, а для В (...) наверняка всегда только циклы, хотя могу ошибаться
58 Wern
 
05.02.15
18:33
(0) Сделай текстовый документ на сервере, а не на клиенте и передавай на клиент его.
59 Serginio1
 
05.02.15
18:39
(57) Весьма вероятно и оптимизатор берет неправильный план. Вот один из примеров которых огромное множество
v8: Подзапросы с Выбрать Первые
60 Serginio1
 
05.02.15
18:44
61 К_Дач
 
05.02.15
18:54
Когда 1С наконец-таки прикрутит в язык запросов инструкцию для того КАК соединять (аналог ключевых слов sql) - это будет радость и веселье
62 GROOVY
 
05.02.15
18:58
(61) Ну это будет в версии 10.3.12.5987375.