Имя: Пароль:
1C
1С v8
Как выгрузить ТаблицуЗначений по отбору с условием (зн<0)
,
0 Программист_НУ
 
07.12.12
17:28
Можно ли в выгрузить таблицу значений по отбору

По Синтаксису В качестве отбора выступает структура,

("ИмяКолонки", ЗначениеОтбора)
Можно ли как то вписать условие в  ЗначениеОтбора, например отобрать все записи <0
1 Нуф-Нуф
 
07.12.12
17:29
да. запрос.
2 Жан Пердежон
 
07.12.12
17:29
нет. запрос.
3 YHVVH
 
07.12.12
17:29
куда выгрузить ?
4 shuhard
 
07.12.12
17:29
(1) или построитель запроса
5 Программист_НУ
 
07.12.12
17:30
Выгрузить собираюсь в новую ТаблицуЗначений

Понял, только запросом...

Благодарю
6 Нуф-Нуф
 
07.12.12
17:33
(4) возможно. за всю практику построителем почти никогда не пользователся. сначала писал быдлоотчеты, а потом сразу на скд перешел.
кстати скд тоже заюзать можно.

только скд возвращает нетипизированную ТЗ
7 Serginio1
 
07.12.12
18:28
Вообще можешь
Например
Процедура СкопироватьПоУсловию(Тз,Условие)
резулт=Тз.СкопироватьКолонки();
Для каждого Стр из Тз Цикл
Если Вычислить(Условие) Тогда
РезСтр=Резулт.Добавить();
ЗаполнитьЗначенияСвойств(РезСтр,стр);
КонецЕсли;
КонецЦЦикла
возврат резулт
КонецФункции


И соответсвенно вызов

Новаятз=СкопироватьПоУсловию(Тз,"Стр.НужнаяКолонка<0");
8 Evrepid
 
07.12.12
19:07
Почему только запросом?
Перебор все еще имеет большие силы для этого... :)
9 Serginio1
 
07.12.12
19:30
Можно другой вариант
Функция СкопироватьПоУсловию(Тз,Условие)
Массив новый массив;
Для каждого Стр из Тз Цикл
  Если Вычислить(Условие) Тогда
    массив.Добавить(стр)
  КонецЕсли
КонецЦикла;
возврат Тз.Скопировать(массив)
КонецФункции
10 Chai Nic
 
07.12.12
19:32
(8) Перебор это тёмная сторона Силы. Ты должен использовать Запросы, чтобы стать настоящим джедаем.
11 Программист_НУ
 
07.12.12
22:19
(7) Блестяще!
12 YHVVH
 
07.12.12
22:31
(10) а лучше всего запрос в переборе, это сила темной энергии.
13 ДенисЧ
 
07.12.12
22:48
Запрос, юные падаваны, ведёт на Светлую Сторону, тогда как необоснованный перебор - на Тёмную.
Выбрирай сам.
14 mistеr
 
07.12.12
23:14
(13) Насколько я понимаю, ТЗ на 10К строк во время запроса путешествует на сервер, затем на сервер БД, и обратно. Это угодно темной стороне или светлой?
15 Serginio1
 
07.12.12
23:15
(13) Угу для того, что бы получить результат перебором мало того, что по количеству кода он будет меньше, так еще для запроса нужно таблицу закинуть на сервер приложений, оттуда закинуть на SQL во временную таблицу и дальше таким же макаром обратно. Где тут светлыя сторона?
16 Нуф-Нуф
 
07.12.12
23:26
Накладные расходы на передачу на сервер и обратно несравнимо меньше с выигрышем в скорости при обработке на сервере, чем тупой перебор на клиенте
17 Serginio1
 
07.12.12
23:29
(16) Ты хочешь сказать, что на сервере перебор умнее. Интересно и как это перебор на сервере быстрее, чем на локальной машине при одинаковой мощности процессора. Как правило серверных ядер при полной нагрузке не хватает.
18 Serginio1
 
07.12.12
23:32
17+ Ну а обработать доже несколько тысяч строк совсем незаметно для пользователя справится и процессор под ДВК 2. Проверено.
19 Нуф-Нуф
 
07.12.12
23:48
(17) у тебя мощность локальной машины равна мощности сервера? Хм... Имхо в консерватории что то не то...
20 Serginio1
 
07.12.12
23:57
19 Ну однопоток у меня и не только быстрее чем на сервере. Ты еще не забывай сколько задач обслуживает сервер и локальная машина. Сервер ориентирован на многопоток, и ядер может не хватать когда на каждый чих его использовать, когда клиентские процессоры простаивают. Так мало того обычно SQL сервер и сервеh разнесены по разным серверам. Посчитай количесво затрат при сортировке на клиентской машине и при использовании нескольких серверов, сетевых карт маршрутизаторов итд.
21 Нуф-Нуф
 
07.12.12
23:59
(20) продолжай жить в своем мире :)
22 Serginio1
 
08.12.12
00:09
21 Давай поставим эксперимент с замером времени и будем жить в одном мире. Приведи свои аргументы. Кстати если SQL может распараллелить задачу, то 1С все обрабатывает в однопотоке.
Темный твой мир. Кстати если помнишь раньше было модно использовать мощности клиентских машин, для распределенных задач, так как мощностей серверов не хватало.
23 hhhh
 
08.12.12
00:10
(21) от размера тз зависит. Если до 20000 записей в тз - это можно сказать детские размеры, то простой нетбук, купленный в пятерочке за 4000 рублей спокойно справится с этой задачей и нет смысла гонять информацию по серверам туда и обратно.
24 Snovy
 
08.12.12
00:56
Как то года полтора назад на мисте (может больше, может меньше) была тема - что быстрее - массив или соответствие. Увлеклись. Взяли чью-то базу, закинули все доки в ТЗ. Получилось около полумиллиона документов. Не помню суть эксперимента, но нужно было по какому то простейшему условию отобрать из таблицы доки - делали соответствие, массивы, ТЗ с индексом и без. Кто-то предложил - а если во временную таблицу и запросом? выиграли соответствия и индексированные ТЗ. Проиграл массив. Хуже массива был только запрос на сервер с временной таблицей. Даже условия задачи, полностью выполненные на сервере (т.е. сразу доки без подгрузки в ТЗ по условию отбирались на сервере - все равно временные таблицы проиграли индексированной ТЗ). Правда на 8.1 делали, если это о чем то говорит...
25 mistеr
 
08.12.12
01:30
(16) Правильный ответ - it depends.

Есть хороший принцип - располагать алгоритмы обработки поближе к данным (а не наоборот). Если наша ТЗ на 100К строк тянется из базы, то там же нужно и отфильтровать, запросом. Если это ТЧ документа на десяток строк, набитая пользователем, можно и на клиенте перебрать, ничего страшного.

Тема популярная, кстати.
v8: что быстрее найтистроки или менеджер запросов к таблице значений?
v8: чем заменить НайтиСтроки() ?
26 vmv
 
08.12.12
02:19
(9) я бы отсортировал по колонке "зн", что в (0) и потом нечеткий бинарный поиск вычисления строки по условию "зн<0"

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

надеюсь бинарный поиск в школе учили?
27 mistеr
 
08.12.12
02:28
(26) >бинарный поиск в школе учили?
Не будь таким требовательным, это же не форум по C++ :) Тут цитируют СП за фотку.
28 Serginio1
 
08.12.12
08:51
(21) У меня ТСД работает с десятком тысяч строк, где есть и динамическая фильтрация и отборы. Правда там C#, но терминал то на ARM 600 МГ.
Ну а если ты о клиенте заботишься давай посчитаем, какую работу он выполнит при вызове на сервере.
Работа по сериализации ТЗ состоит из описания колонок, а также проход по всем строкам с сериализацией каждого поля в строку и запись в XML. При получении ответа, нужно пройтись по  XML ответу, десериализовать. То есть ты считаешь, что такая работа значительно меньше затратная чем в 9. То есть пройтись по строкам, вызвать условие записаь ссылк строк в массив, а затем просто скопировать память и увеличить счетчиу ссылок у ссылочных типов?
Что то у Вас в консерватории.
29 Serginio1
 
08.12.12
08:58
Давно пользуюсь группированием таблиц. И тормозов не замечаю.
Используя вычислить, можно вычилять любые поля группировок
Функция СравнитьПоля(Структ,Строка)
   Для каждого стр из Структ Цикл
       Если Стр.Значение<>Строка[Стр.Ключ] Тогда
           возврат ложь
       КонецЕсли;
   КонецЦикла;    
       возврат истина
   КонецФункции
   
   Процедура ДобавитьПоля(Тз,ТзОриг,Поля) Экспорт
       если ПустаяСтрока(Поля) Тогда
           возврат
       КонецЕсли;
       
       МассивПолей=ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Поля,",");
       Для каждого Поле из МассивПолей Цикл
    Колонка=ТзОриг.Колонки.Найти(Поле);
    Тз.Колонки.Добавить(Колонка.Имя,Колонка.типЗначения);
    КонецЦикла;

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

Процедура ПроссумироватьПоля(Тз,ТзСтрок,МассивСуммируемыхПолей)
    Для Каждого Стр из МассивСуммируемыхПолей Цикл
       Тз[стр] = ТзСтрок.Итог(Стр);
    КонецЦикла;
   
КонецПроцедуры

Функция глСгруппироватьТзПоПолям(Тз,Поля,СуммируемыеПоля,ПоляСортировкиТзПоГруппе="") Экспорт
    перем Тип,Длина,Точность,ЕстьСпр,ЕстьДок;
    ЕстьСпр=0; ЕстьДок=0;
    //Тз.ПолучитьПараметрыКолонки(поле,тип,Длина,Точность);
    если ПустаяСтрока(СуммируемыеПоля) Тогда
        МассивСуммируемыхПолей=Новый массив;
        Иначе
    МассивСуммируемыхПолей=ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СуммируемыеПоля,",");
    КонецЕсли;
    Структ=Новый Структура(Поля);
   
    // Для того что бы правильно сртировались элементы с одинаковыми представление
    // Сначала отсортируем по внутреннему значению
    //а после группирования по представлению по возрастанию
    Сравнение=Новый СравнениеЗначений;
  //  Тз.Сортировать(ПолучитьСтрокуСортПоля(Поле,Тз,ЕстьСпр,ЕстьДок));
 
  ПоляСортировки=Поля;
  Если не пустаяСтрока(ПоляСортировкиТзПоГруппе) Тогда
      ПоляСортировки=ПоляСортировки+","+ПоляСортировкиТзПоГруппе
  КонецЕсли;
  Тз.Сортировать(ПоляСортировки,Сравнение);
 
    ТзФ=новый ТаблицаЗначений;
     ДобавитьПоля(ТзФ,Тз,Поля);
     ДобавитьПоля(ТзФ,Тз,СуммируемыеПоля);
     
     ТзФ.Колонки.Добавить("ТзПоГруппе",Новый ОписаниеТипов("ТаблицаЗначений"));
     
    ТекСтр=0;
    Заявка=0;  
    НачСтр=-1;
    СтрТзф="";
    Если Тз.Количество()>0 Тогда
         
        Для сч=0 По Тз.Количество()-1 Цикл
            строка=тз[сч];
                           
              Если (Сч=0) или не СравнитьПоля(Структ,Строка) Тогда
                   Если НачСтр>-1 Тогда
                        ТекТз=Тз.Скопировать(ПолучитьМассивСтрок(Тз,НачСтр,сч-1));
                        СтрТзф.ТзПоГруппе=ТекТз;
                        ПроссумироватьПоля(СтрТзф,ТекТз,МассивСуммируемыхПолей);
                   КонецЕсли;
                   
                  СтрТзф= ТзФ.Добавить();
                  Для каждого стр из Структ Цикл
                    Поле=Стр.Ключ;
                    Значение=Строка[поле];
                    Структ[Поле]=Значение;
                    СтрТзф[Поле]=Значение;
                 
                  КонецЦикла;
                   
                   НачСтр=сч;
              КонецЕсли;    
              // глКлонироватьЗапись(Тз,сч,ТекТз)
         КонецЦикла;
         
         Если НачСтр>-1 Тогда
              ТекТз=Тз.Скопировать(ПолучитьМассивСтрок(Тз,НачСтр,Тз.Количество()-1));
              СтрТзф.ТзПоГруппе=ТекТз;
              ПроссумироватьПоля(СтрТзф,ТекТз,МассивСуммируемыхПолей);
         КонецЕсли;
    КонецЕсли;
   
    Возврат ТзФ;
КонецФункции
30 Serginio1
 
08.12.12
11:16
28+ Ах да еще забыл, что если канал узкий то еще желательно данные сжимать.
31 milan
 
08.12.12
11:27
Я за перебор, сувать таблицу на сервер и обратно сомнительный способ оптимизации. Тем более что в 8.2 уф тз только на сервере и хранится, а писать сейчас без оглядки на уф , если только для любимого клиента, у которого почасовая оплата и надежда на долгое сотрудничество
32 Рэйв
 
08.12.12
11:56
перебор рулит всетаки имхо.
создавть запрос, сувать в него тз(кстати предварительно еще переведя ее в ТЗ с типизированными колонками если нет),Потом в ВТ...Потом из ВТ выбирать...

Нет ребята. проще и экономичнее перебрать чем следовать моде и канонам.
33 Нуф-Нуф
 
08.12.12
13:15
(22)(23)(25)(28) как я и говорил у вас довольно ограниченный мир. конечно это все "зависит" от объемов данных и все такое, в определенных случаях клиент может отработать быстрее.
но вы забываете (а может просто не знаете) что есть такие слова как "масштабируемость" и "клиент-серверное". ну напишите вы код, который анализ будет выполнять на клиенте, и по вашим "детским замерам" это окажется быстрее чем на сервере, потому что размер базы "детский". А что будете делать когда размер базы вырастет в 50 раз? будете переписывать код? или изначально напишите две ветки событий в зависимости от размера таблицы?
И откуда вы знаете мощность конкретного клиента? Может это буховский стационарный компЮ а может полудохлый ноут 6-8 летней давности? И напомню (если вы вообще знали), кроме обычного клиента, есть еще и тонкие клиенты, и веб-клиенты. Там тоже всю "эту вашу херню"  будете выполнять?
34 Serginio1
 
08.12.12
13:22
33 Я тебе приводил пример с ARM, ДВК 2. Многие работают в терминалах и кое где вместе с сервером приложений. А по поводу 6-8 летней давности, то они еще ого го какие быстрые кстати
результаты некоторых данных на не топовых машинах девятилетней давности http://www.rsdn.ru/article/alg/tlsd.xml

С такими задачами как фильтр, группировка справится любая машина.
35 Рэйв
 
08.12.12
13:28
(33)+100

только у меня например ситуация еще хуже
36 kiruha
 
08.12.12
13:29
(0)
Добавить индекс "ИмяКолонки"
отсортировать по индексу
найти строку где >0 (либо перебором от начала до середины, либо алгоритм "деление пополам ")
Скопировать строки
37 Рэйв
 
08.12.12
13:29
На в 2 раза меньших объемах, чем наши, ЛЮБАЯ стандарнтая умирает
38 Рэйв
 
08.12.12
13:29
ма рассматривали все и все замеряли
39 Рэйв
 
08.12.12
13:29
УППырище - это колнечно писссееецц
40 Рэйв
 
08.12.12
13:30
более 150 регистров сведений
41 Рэйв
 
08.12.12
13:30
накопления
42 Рэйв
 
08.12.12
13:30
пардон
43 Рэйв
 
08.12.12
13:31
около 250 регстров сведений
44 Рэйв
 
08.12.12
13:31
бльшинство из которых нах никому не нужно и сделано так. ..."на всякий случай"
45 Рэйв
 
08.12.12
13:32
Кто читал код типовых, тот  меня поймет
46 Рэйв
 
08.12.12
13:32
КАКМЕ ЖЕ ОНИ УПОРОТЫЕ УКУРКИ ГРЁБАННЫЕ!!!
47 Рэйв
 
08.12.12
13:33
вот
48 Рэйв
 
08.12.12
13:33
вотбщем взяли пустуй бух с минимом регистров и наворотов
49 Рэйв
 
08.12.12
13:33
И ваяем свое.
50 Рэйв
 
08.12.12
13:33
И всем советую кстати
51 Рэйв
 
08.12.12
13:34
Это был крик души если что:-)
52 Рэйв
 
08.12.12
13:34
Извините
53 Classic
 
08.12.12
13:38
(33)
Не совсем тебя понял.
Конструкцию...

ТаблицаСОтбором = ТаблицаДанных.Скопировать(Новый Структура("ИмяКолонки", 0));

...тоже для масштабируемости надо переписывать на запрос с временной таблицей?
А ведь это тоже работа клиента, который может оказаться как тонким, так и веб и т.п.

Принципиально ни чем не отличается от перебора ТЗ(полного, бинарного или индексированного) на клиенте с проверкой условия.
54 Нуф-Нуф
 
08.12.12
13:45
давайте исходить из того что на клиенте нет таблиц значений
55 Нуф-Нуф
 
08.12.12
13:46
хотя если в вашем мире они есть - пусть так
56 Classic
 
08.12.12
13:48
(54)
Все-таки на вопрос ответишь? У меня нет мира - я сам спрашиваю.
Чем принципиально отличается к примеру (36)
от конструкции в (53)?
57 Нуф-Нуф
 
08.12.12
13:50
(56) условия выборки из таблицы не всегда ограничивается > < =
58 Classic
 
08.12.12
14:00
(57)
Согласен. А если рассматривать простые условия сравнения?
59 Нуф-Нуф
 
08.12.12
14:02
(58) тогда возможно
60 Serginio1
 
08.12.12
14:41
(57) Угу прочитай внимательно 28. У тебя на клиенте больше будет действий по сериализации десериализации. При этом будет тот же перебор. В сериализаця полей будет значительно разного рода условий. Опять же для примера итоги по нескольким полям выдает дерево которое нужно обходить по уровням, конечно можно написать рекурсивный вызов, а многие делают вложенные цикла по 6 уровней. Или же можно самому сгруппировать всего в 2 уровня.
(59) Ну надо же даже с чем то согласился. В топике как раз то самое простое условие.
61 Нуф-Нуф
 
08.12.12
14:43
(60) на клиенте нет таблиц значений. и все твои доводы пук в лужу.
62 Serginio1
 
08.12.12
15:10
(61) Как это нет? То есть в неуправляемом (Обычное приложение )приложении нет клиента? Ты о чем?

Мне нравится как сделаны динамические фильтры в DataView

private void cbLogins_SelectedIndexChanged(object sender, EventArgs e)
       {
           var firstView =(DataView)dataGrid1.DataSource;
       
           if (cbLogins.Text=="Все")
               firstView.RowFilter = "Осталось>0";
           else
             firstView.RowFilter = String.Format("Осталось>0 AND Логин='{0}'",cbLogins.Text);

           dataGrid1.Focus();

       }

Для того, что бы такого добиться в 1С мне требуется держать две таблицы (одну полную, другую отфильтрованную), и синхронизировать данные.
63 Нуф-Нуф
 
08.12.12
15:14
(62) я же говорю. в твоем мире (древнем) еще есть клиенты обычного приложения. в настоящем и будущем есть только клиенты управляемого приложения
64 Serginio1
 
08.12.12
17:31
(63) Интересно a к кому адресовано 16?  А для того, что бы сделать запрос тебе нужно передать тз на SQL сервер. Делается это либо через булки создавая текстовый файл, либо через запросы с Insert. Так или иначе все равно нужно пройтись по таблице либо сериализовать в текстовый файл, либо установкой параметров, которые так или иначе сериализутся для передачи на SQL сервер. Где выигрыш?
65 Serginio1
 
08.12.12
17:36
(63) Кстати мое личное мнение, что должны существовать 2 технологии. Та же УПП это пока обычное приложение. Да и сервер приложений в большинстве случаев лишний костыль. Сейчас мощности КПК вполне достаточно, что бы работать в 2х звенке.
66 Serginio1
 
10.12.12
11:00
(63) Кстати добавлю еще, что программирование того же клиента на C# для КПК намного проще чем на толстом клиенте, а уж на тонком и подавно. DataView и DataTable достаточно мощны. Нужные надые по максимуму передаются на клиента, используя в том числе статистику. Дополнительные данные в том числе и печать ведется через вызов процедур на клиенте через ВК по TCP/IP. Считай, что это вызов серверных процедур. Но вот тоже, написать на толстом клиенте вызывал у меня рвотный эффект и массу дополнительного времени на программирование той же задачи на 1С.  Управляемые формы легче создавать на том же компакт Фреймворке, а доступ к данным осуществлять через Вэб сервисы со сжатием трафика если это нужно. И опыт такого взаимодействия с сайтом и клиентами дергающими Вэб сервисы  имеется. По сути так устроены управляемые формы. Только мощности КПК хватает для решения всех задач клиента, и сведения вызова сервера к минимуму. Правда с оговоркой, что задачи бывают разные и их легче оптимизировать используя тот же C# используя его мощь.
67 GANR
 
25.12.12
11:01
(51) Ну ты разошеееелся
Ошибка? Это не ошибка, это системная функция.