Имя: Пароль:
1C
1С v8
Как лучше всего передать колонку ТЧ с клиента на сервер
0 bahtik
 
28.05.15
09:47
Здравствуйте!
Простой, наверное вопрос, но не могу правильно его решить. Задача следующая. Управляемая форма, на ней ТЧ с колонкой "Услуга". У услуг в справочнике есть реквизит "ВремяВыполнения". Вот мне нужно подсчитать общее время выполнения услуг, входящих в ТЧ. Для этого создаю процедуру, выполняемую на сервере без контекста, которая должна пройтись по списку услуг и просуммировать их время выполнения. Но возник вопрос, каким образом передать список услуг в эту процедуру? Метод ПереченьУслуг.Выгрузить(,"Услуга") на клиенте не работает. Можно, конечно, самому пройтись в цикле по строкам таблицы и сформировать список значений, но может быть есть более корректный путь?
93 Господин ПЖ
 
28.05.15
11:26
попадание на сервер вместе с формой по сути ничего не решает

те же яйцы...

ибо изначально решаемая задача "хорошего решения" просто не имеет - в силу изначальной кривизны
94 bahtik
 
28.05.15
11:39
(93) Твоим извилинам немного кривизны бы не помешало. Куда ты собрался на сервер вместе с формой? Сиди лучше на месте и никуда не ходи. )
95 Heckfy
 
28.05.15
11:42
(94) Ты чё??? А куда еще с формой? Или ты думаешь, что форма на клиенте отрабатывается?? Форма - это первая составляющая серверной части.
96 bahtik
 
28.05.15
11:44
(95) Ты че??? ))) А что значит директива "НаСервереБезКонтекста", не догадываешься? ))
97 hhhh
 
28.05.15
11:48
(96) ну уж явно она не для твоей задачи. Ты вручную при помощи 100 команд через задницу пытаешься затащить контекст на сервер. Вместо того, чтобы написать одну строчку &НаСервере.
98 Heckfy
 
28.05.15
11:52
(96) Блин, форма образуется на сервере. А на клиент только картинка передается.
99 Любопытная
 
28.05.15
11:57
(98) Вы говорите о разных вещах. Спор ни о чем. ТС считает, что собирать массив значений колонки тч циклом эффективнее, чем просто сходить на сервер с контекстом. Это его право.
Оптимизация должна быть умеренной, об этом говорилось не раз. Мы вырвали маленькую задачку из контекста общей конфигурации и пытаемся на ее основе оценить что-то теоретическое...
Бессмысленная трата времени.
100 Cube
 
28.05.15
11:58
Сотка
101 bahtik
 
28.05.15
12:00
(97) (98) Вы белины объелись, что ли? Какая к чертям форма? Я с самого начала о том и говорю, что она мне на фиг не нужна. (97) Какие 100 команд? Вот тебе мой код:

....

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

....


&НаСервереБезКонтекста
Функция СерверРассчитатьВремяВыполненияРаботПоКаждойУслуге(СписокУслуг)
    
    ОбщееВремяВыполненияУслуг = 0;
    
    Для каждого Услуга Из СписокУслуг Цикл
        ОбщееВремяВыполненияУслуг = ОбщееВремяВыполненияУслуг + Услуга.ВремяВыполнения;
    КонецЦикла;
    
    Возврат ОбщееВремяВыполненияУслуг;
    
КонецФункции

Он работает. Без контекста формы. Почему "она явно не для твоей задачи"?
102 18_plus
 
28.05.15
12:04
(101) "Он работает"
сюда ты зачем пришёл?
и начни оптимизацию с этого кода
Для каждого СтрокаПеречняУслуг Из Объект.ПереченьУслугМойки Цикл
                    СписокУслуг.Добавить(СтрокаПеречняУслуг.Услуга);
                КонецЦикла;

и прежде чем учить других, почитай книжки.
103 hhhh
 
28.05.15
12:04
(101) ну вот это

    Для каждого Услуга Из СписокУслуг Цикл
        ОбщееВремяВыполненияУслуг = ОбщееВремяВыполненияУслуг + Услуга.ВремяВыполнения;
    КонецЦикла;

это запрос в цикле Услуга.ВремяВыполнения

быдлокод. Он съест времени в 10 раз больше, чем твоя передача контекста.
104 Timon1405
 
28.05.15
12:06
(102) Если вы про "Объект.ПереченьУслугМойки", то его закэширует платформа
105 18_plus
 
28.05.15
12:07
(104) я вообще-то про выгрузку колонки в массив.
106 Heckfy
 
28.05.15
12:08
(101) Форма образуется в ПриСозданииНаСервере
107 Любопытная
 
28.05.15
12:09
Слушайте, это все лирика. Мне другое интересно - вытащила я в ТЧ реквизит Услуга.ВремяВыполнения. Но я ж до него не могу никак на клиенте дотянуться? Получается, что он исключительно информативный?
108 Бубка Гоп
 
28.05.15
12:13
(107) почему не можешь то?
109 Любопытная
 
28.05.15
12:13
(108) Не получается) Научите?
110 Любопытная
 
28.05.15
12:14
(108) Учитывая то, что это просто колонка на форме, а не реквизит таб части документа
111 Бубка Гоп
 
28.05.15
12:16
(109) сейчас сам попробую, интересно какая там может быть проблема
112 bahtik
 
28.05.15
12:16
(103) Чушь
113 Timon1405
 
28.05.15
12:17
(105) Так там ващета не ТЗ а данныеформыколлекция, а метод выгрузить доступен только на сервере
114 bahtik
 
28.05.15
12:18
(104) Ничего кэшироваться не будет - все и так на клиенте. Объект - это же реквизит формы.
115 Любопытная
 
28.05.15
12:19
(111) нету ее) ни через Элементы, ни тем более через Объект. На форме колонка есть, а достать ее нельзя
116 Drac0
 
28.05.15
12:19
(110) Ну, сделайте эту колонку реквизитом формы, а не документа.
117 bahtik
 
28.05.15
12:19
(100) До второй дойдет?
118 Господин ПЖ
 
28.05.15
12:20
(112) гы
119 Drac0
 
28.05.15
12:21
(112) Чо? Он самый и есть.
120 Любопытная
 
28.05.15
12:22
(116) Ну так я о том и говорю - сделала реквизит формы, он прекрасно выводится, но я до него дотянуться не могу, чтобы, к примеру, по нему что-то посчитать. А так можно было бы прям тут, на клиенте, посчитать общую сумму и прекратить весь этот базар-вокзал
121 Господин ПЖ
 
28.05.15
12:22
бегать у ужасе от накладных расходов от передачи на сервер и тут же беззастенчиво лупить по базе запросом в цикле ради одного реквизита...
122 Бубка Гоп
 
28.05.15
12:23
(110) ну как то так

&НаСервере
Процедура ЗаполнитьКолонкуСервер()
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ ПЕРВЫЕ 100
        |    Номенклатура.Наименование КАК Колонка
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура";
    Результат = Запрос.Выполнить();
    Таблица.Загрузить(Результат.Выгрузить());
    
    
КонецПроцедуры    

&НаКлиенте
Процедура ВыполнениеНаКлиенте(Команда)
    Для Каждого Стр Из Таблица Цикл
        Сообщить(Стр.Колонка);
    КонецЦикла;    
КонецПроцедуры
123 Господин ПЖ
 
28.05.15
12:23
причем если память не изменяет читая весь объект...
124 Drac0
 
28.05.15
12:23
(120) Нет, вы сделали Элемент формы, а надо реквизит :)
125 Господин ПЖ
 
28.05.15
12:24
а как всё гордо начиналось - тупые 1с-ники не читали книг о программировании
126 Drac0
 
28.05.15
12:24
(123) Ага,  с табличными частями. Лепота там вообще.
127 Любопытная
 
28.05.15
12:24
(124) Ок, допустим реквизит будет. Как мы в него засунем значение?
128 Любопытная
 
28.05.15
12:25
(122) Ничего не поняла) Таблица это ху?
129 Бубка Гоп
 
28.05.15
12:25
(128) реквизит формы
130 Drac0
 
28.05.15
12:29
(127) ПриЧтенииНаСервере.
131 Бубка Гоп
 
28.05.15
12:33
(128) теперь получилось дотянуться или все еще нет? :)
132 bahtik
 
28.05.15
12:37
(121) Во-первых, это временный вариант кода, в котором запрос не использовался чисто по причине чтоб по быстрому написать и проверить. Потом, естественно, я бы заменил на запрос. Но не смотря на это, к твоему сведению то, что ты называешь "беззастенчивым луплением по базе", в данном случае вызовет ЗАМЕТНО меньше тех самых накладных расходов, т.к. и объект не такой большой и количество итераций небольшое. Но это уже так, к слову.
133 bahtik
 
28.05.15
12:38
(126) Там обращение к элементу справочника "Услуги", у которого всего то четыре реквизита. Так что никаких ТЧ. Ну и см (132).
134 bahtik
 
28.05.15
12:42
(127) О, вот наконец настает понимание проблемы подвала с  итогом. Колонка есть, реквизит есть, а как мы засунем в него значение? Засовывать, понятное дело, нужно с сервера (т.к. необходимые данные у нас на сервере). Но проблема то в том, что на сервере этой колонки нет! ))) Так что надо либо извращаться и возвращать данные каким-то параметром, или что-то еще, но в любом случае выигрыша по сравнению с тем кодом, что я написал - ноль целых ноль десятых. Вернее, даже хуже. Теперь понятно?
135 bahtik
 
28.05.15
12:43
(125) На вот, почитай, умник: http://its.1c.ua/db/metod81u#content:8020500:hdoc
136 Drac0
 
28.05.15
12:43
(133) Дадада. А потом, через годик, когда этот справочник повесят чуть больше атрибутов и пару ТЧ и проведут документ на пару сотен строк, посмотрят на это чудо 5-10 минут и скажут: "Ваша 1С г*вно!".
137 Господин ПЖ
 
28.05.15
12:44
(132, 133) ты ж.пой то не виляй... в начале усердно рассуждал не о конкретном примере, а о сферическом коне в вакууме
138 Господин ПЖ
 
28.05.15
12:46
а у "сферического коня" в таком справочнике может быть 50 ТЧ

у упоротых хохлов так принято писать - я гарантирую
139 Drac0
 
28.05.15
12:46
(134) Как нет этой колонки на сервере? Кто украл?! У меня все есть.
140 Бубка Гоп
 
28.05.15
12:46
(136) и тут он, не слезая с белого коня, перепишет код на нормальный
141 bahtik
 
28.05.15
12:47
(137) А если о сферическом коне в вакууме, то почитай еще про кэширование, и ты поймешь, что в реальности без запроса обращения к базе вообще может не быть, т.е. работать это самое "лупление по базе" будет еще быстрее, чем запрос.
142 Господин ПЖ
 
28.05.15
12:47
>Как нет этой колонки на сервере? Кто украл?! У меня все есть.

+100500
143 Drac0
 
28.05.15
12:48
(140) Ага, "Я этот кусок кода потом перепишу оптимально" будет, пожалуй, даже покруче, чем "Я с понедельника начну бегать по утрам" :)
144 bahtik
 
28.05.15
12:49
(143) см (141), если тебе не нравится переписывание.
145 Господин ПЖ
 
28.05.15
12:50
>то почитай еще про кэширование, и ты поймешь, что в реальности без запроса обращения к базе вообще может не быть

для того чтобы кэширование появилось значение надо сначала получить... и потом - кэш протухает через 20 мин
146 Drac0
 
28.05.15
12:50
(141) Ты думаешь 1С кэширует всю базу данных? ))))))))))))))))))

ТЫ когда профайлер скульный в последний раз открывал?
147 Бубка Гоп
 
28.05.15
12:50
(141) на кэш надейся, но и сам не плошай ;)
148 bahtik
 
28.05.15
12:51
(138) Вообще-то я не хохол и не украинец, и вообще из другой страны. А вот ты своими высказываниями уже дал знать, какая ты гнидная безмозглая натура )))
149 Господин ПЖ
 
28.05.15
12:52
дурак-казах в стране 404... это вообще адская смесь
150 bahtik
 
28.05.15
12:52
(145) А как ты думаешь, если мы добавляем в ТЧ строки, будет кэширование элемента, который входит в эту строку?
151 Господин ПЖ
 
28.05.15
12:54
(150) формально нам от него кроме guid и полей формирующих представление ссылки ничего не надо
152 bahtik
 
28.05.15
12:54
(149) И даже не казах, не мучай свой бестолковый мозг.
153 bahtik
 
28.05.15
12:55
(146) см (150)
154 Господин ПЖ
 
28.05.15
12:55
(152) да мне пофиг... тут ключевое слово - дурак
155 Drac0
 
28.05.15
12:55
(150) Нет :)
156 Одинесю
 
28.05.15
12:55
Хрум-хрум...
157 bahtik
 
28.05.15
12:56
Ну то, что ты дурак, это с самого начала было видно, зачем еще раз всем об этом сообщать? Это уже в кэше есть.
158 Господин ПЖ
 
28.05.15
12:56
(155) не разрывай шаблон дятлу
159 bahtik
 
28.05.15
12:56
(155) А на самом деле да.
160 Любопытная
 
28.05.15
12:57
(134) Мне уже давно все понятно, я вообще не с вами разговариваю, если вы не заметили
161 Drac0
 
28.05.15
12:57
(159) А на самом деле нет. Из БД подтягивает только ГУИД и поля, по которым сервер 1С генерит представление.
162 Господин ПЖ
 
28.05.15
12:57
(159) выдыхай уже...
163 Бубка Гоп
 
28.05.15
12:58
(160) с таблицей то получилось? ато я прям переживаю теперь
164 Любопытная
 
28.05.15
12:59
(163) Ну как бы... я ушла коммерческое писать, мне не до таблицы было)) Сейчас попытаюсь разобраться, что у меня не получается и как с этим бороться)
165 bahtik
 
28.05.15
13:00
(161) А ты не поленись, сделай тестовую конфу и посмотри в отладчике вызовы сервера. А потом рассказывай.
166 ЧеловекДуши
 
28.05.15
13:04
(4) В модуле формы пишешь "&НаСервере" и там уже можешь обращаться к реквизитам формы
167 Бубка Гоп
 
28.05.15
13:05
(166) ТС не приемлет контекстные вызовы, как я понял
168 Любопытная
 
28.05.15
13:05
(163) событие ПриЧтенииНаСервере в какой момент возникает?
Вот конкретная задача - есть реквизит формы, точнее - колонка реквизита формы. Она к объекту не имеет никакого отношения, она только у формы есть. При добавлении строки я хочу в эту колонку записать значение реквизита одного из полей добавляемой строки. В каком событии я могу это сделать?
169 Drac0
 
28.05.15
13:07
(165) А при чем тут вызовы сервера? 0_о Когда ты УЖЕ на сервере.
170 Drac0
 
28.05.15
13:09
(168) ПриЧтенииНаСервере возникает при чтении объекта из БД. При создании новых, естественно, не возникает. Нам так и нужно для решения подобной задачи.
171 Бубка Гоп
 
28.05.15
13:10
(168) во, уже проблема другая. Ну, если прям никакого не имеет, то ПриИзменении таблицы объекта, например, полностью загружать колонку формы. хотя это как то не красиво, проще там же считать сумму и не лохматить бабушку
172 Любопытная
 
28.05.15
13:11
(170) Там же это где?
173 bahtik
 
28.05.15
13:12
(170) ПриЧтенииНаСервере вообще-то это событие формы и возникает либо при открытии формы, либо повторном ее считывании (например, по команде "Перечитать"). Так что тут это вообще ни к месту.
174 Бубка Гоп
 
28.05.15
13:12
(172) в ПриИзменении, само собой. если в конечном счете интересует сумма, зачем отдельная таблица?
175 Drac0
 
28.05.15
13:14
(172) Я не дочитал про добавление строки :) Если колонка зависит от одного из полей строки, то стоит повесить заполнение этого поля на ПриИзменении этого поля.
176 Drac0
 
28.05.15
13:15
(173) Ты на (169) ответь, уникум.
177 Любопытная
 
28.05.15
13:15
(171) Это изначальная проблема ТС, с которой он справился тем способом, которым справился. Я бы не стала заморачиваться и ковыряться с контекстом, но и пересчитывать этот самый итог либо при записи, либо по отдельной команде.
(174) ПриИзменении на клиенте нет доступа к реквизитам ссылки, это значит хождение на сервер, пусть и без контекста, при каждом изменении каждой строки. Если эта сумма - единственное, что при этом надо получить, то (имхо конечно) структура данных некорректна и стоит что-то поменять в монастыре)
178 Drac0
 
28.05.15
13:15
(174) Сумма может быть интересна в разных разрезах :)
179 bahtik
 
28.05.15
13:18
(169) Да, тут я не то написал, ошибся. Подразумевал обращение к БД.
180 Любопытная
 
28.05.15
13:18
(178) если она так интересна, может добавить колонку в ТЧ документа и не парить мозги окружающим?
181 bahtik
 
28.05.15
13:18
(180) Гениально!!! Я даже не сомневался, что до этого дойдет )))
182 Drac0
 
28.05.15
13:18
(177) Про сумму я уже говорил, что ее проще положить в шапке. А если логика работы формы строится на этих данных которые не надо фиксировать в объекте, а не только на их сумме, то заполнять эту строку безконтекстным вызовом - единственный вариант. Кстати, совсем не страшный :)
183 Drac0
 
28.05.15
13:19
(179) Я смотрел. А ты?
184 Любопытная
 
28.05.15
13:19
(181) Я не с вами общаюсь, если вы не заметили. Свои восторги оставьте при себе
185 Drac0
 
28.05.15
13:21
(180) Вообще, я изначально был за это :) Но тут могут быть нюансы в зависимости от логики. Например, нужны текущие данные, а не те, что были на момент заполнения документа.
186 fakeyou
 
28.05.15
13:21
&НаСервере
Процедура СчитаемУслуги()
Если НеЗначениеЗаполнено(ВремяВыполненияУслуг) Тогда

Для Каждого СТР из Объект.Услуги Цикл
ВремяВыполненияУслуг = Стр.ВремяВыполнения+ВремяВыполненияУслуг
КонецЦикла

Объект.ВсегоВремяУслуг = ВремяВыполненияУслуг;
конецесли
КонецПроцедуры
187 Любопытная
 
28.05.15
13:21
(182) Да нестрашный конечно, не спорю.  Просто я из библии вынесла для себя мысль о том, что желательно максимально сократить количество хождений туда-сюда. Это мой личный бзик :)
188 Drac0
 
28.05.15
13:23
+(185) Но это уже немного из области фантастики :)
189 Drac0
 
28.05.15
13:24
(187) Сократить, но не убрать же совсем :)
190 bahtik
 
28.05.15
13:25
(184) Так и я не с тобой общаюсь. На хрен ты мне сдалась то? Отстань же от меня уже наконец, ну ёлы-палы!
191 Любопытная
 
28.05.15
13:25
(189) Вы правы)
192 Господин ПЖ
 
28.05.15
13:26
еще немного до 200
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан