Имя: Пароль:
1C
1С v8
УФ. Работа с ТаблицейЗначений на сервере. Как ускорить?
0 ignorant
 
20.04.17
17:53
Пытаюсь старую обработку/отчет переделать из Обычного под Управляемое Приложение.
У обработки несколько реквизитов типа ТаблицаЗначений.
1-я процедура на сервере формирует эти ТЗ, записывает ЗначениеВРеквизитФормы и
вызывает другие процедуры _на сервере_, кот. в процессе обработки ТаблицЗначений интенсивно "общаются" между собой.

Каждая процедуры вначале вычитывает РеквизитФормыВЗначение, при завершение - возвращает изменённое ЗначениеВРеквизитФормы.
Т.к. таблицы объемные - несколько тыс. строк и 10-15 колонок - выгрузка/загрузка реквизитов _сильно_ тормозит.

Интересуем мнение более опытных коллег:
0. Всё ли я делаю правильно с т.з. идеологии работы с УФ?
1. Если контекст остается _на сервере_ ( серверные процедуры общаются между собой) -
м.б. есть другие, более быстрые, варианты передавать значение реквизитов формы?
или отказать от работы через реквизиты формы и явно использовать параметры процедур?

Спасибо за внимание.
ПС. Сильно не бить, УФ только начинаю изучать.
1 VladZ
 
20.04.17
17:56
(0) Попробуй сделать табличную часть.
2 jsmith82
 
20.04.17
17:57
Работай с таб. частью или реквизитом формы. Зачем вычитывать
3 ignorant
 
20.04.17
18:00
(1) ТЗ удобней, можно иметь динамический состав колонок
4 Buster007
 
20.04.17
18:02
Сделать все за 1 раз.
5 ignorant
 
20.04.17
18:03
(2) Почему и обратился - не умею ;)
Подскажи, как работать с реквизитом на сервере. У меня в в реквизите не ТаблицаЗначений, а ДанныеФормыКоллекция.
6 VladZ
 
20.04.17
18:05
(3) Оно, конечно, все так. Но в УФ ты постоянно должен думать, что у тебя выполняется на сервере, а что на клиенте. И что лучше туда-сюда не таскать.
7 ignorant
 
20.04.17
18:05
(4) Код старый и сложный, не хочется туда лезть без особой нужды.
Если других вариантов не найду - придется делать за 1 раз.
8 jsmith82
 
20.04.17
18:07
(5) методы ДФК почти равны методам ТЗ
ТЗ = ДФК.Выгрузить()
ДФК.Загрузить(ТЗ)
т.е. можно без значение в реквизит и реквизит в значение
ну а вообще просто обращайся к ДФК
типа для каждого стр из дфк цикл
дфк[0]
дфк.найтистроки(отбор)
9 ignorant
 
20.04.17
18:07
(6) Я ж вроде и не таскаю
_серверная_ процедура обращается к _серверной_

или я что-то не понимаю?..
10 PiotrLoginov
 
20.04.17
18:07
Особо не вникал. Не надо таскать на клиент то, что там не нужно. Данные нужны на клиенте для взаимодействия с чем-то, что невыгодно/невозможно активно передавать на сервер и (конечно) для интерактива, например, показа этих данных/таблиц пользователю. В остальных случаях большие таблицы после создания/работы  с ними нужно помещать на сервере во временное хранилище до момента, когда они снова понадобятся.
11 ignorant
 
20.04.17
18:09
(8) ДФК - переведи
12 Buster007
 
20.04.17
18:33
(11) ответ в (5)
13 Maniac
 
20.04.17
18:36
ЗначениеВРеквизитФормы

самый МЕДЛЕННЫЙ метод в восьмерке.
14 Maniac
 
20.04.17
18:37
тьфу блин, сорян. я совсем заработался. подумал про строкуВнутр что ты таблицу пихаешь
15 Maniac
 
20.04.17
18:37
Используй передачу таблиц через хранилище.
Тогда можно работать БезКонтекста
16 Maniac
 
20.04.17
18:37
и передавать только то что хочешь
17 ignorant
 
20.04.17
19:08
(13) А если перенести код из Формы в Модуль?
В Модуле реквизиты обработки доступны нормально, не ДФК.
18 ignorant
 
20.04.17
19:13
(5), (12) про ДФК всё равно торможу
Отчет.ТЗ.Выгрузить() ДанныеФормыКоллекция получаю, не ТЗ.
как до ТЗ достучаться?
19 jsmith82
 
20.04.17
19:22
???
20 jsmith82
 
20.04.17
19:23
Ты чё там творишь?!
21 ignorant
 
20.04.17
19:34
Это не я , это УФ :(

С начала.
У отчета несколько реквизитов типа ТаблицаЗначений.
Как из ДанныеФормыКоллекция можно получить _значение_ ТЗ ?
Отчет.ТЗ.Выгрузить() - получаю ДФК, не ТЗ

что я делаю не так?
22 jsmith82
 
20.04.17
19:42
(21) Отчет.ТЗ.Выгрузить() - получаю ДФК
Гон 100%
23 jsmith82
 
20.04.17
19:44
Если ТЗ это реквизит отчета, то в форме:
Отчет.ТЗ это ДФК
Отчет.ТЗ.Выгрузить() это ТЗ
24 ignorant
 
20.04.17
19:57
Да, я ошибся. Исправил.

Твой совет
ТЗ = Отчет.ТЗ.Выгрузить();

будет работать быстрее, чем

ТЗ = РеквизитФормыВЗначение("Отчет.ТЗ");  ?

ОК. поробую.

А как тебе мысль перенести код из Формы в Модуль?
В Модуле реквизиты обработки доступны нормально...
25 PiotrLoginov
 
20.04.17
20:20
1. Игнор сообщений (10) и (15) означает, что программист еще не проникся принципами программирования УФ.
2. Надежда "переехать" в модуль объекта, где контекст как будто ближе к ОФ (а по существу просто весь существует лишь на сервере) подтверждает 1.

На самом деле на скорость не влияет, где обращаться к реквизитам обработки - в модуле формы или в модуле объекта.
26 Maniac
 
20.04.17
22:12
Ну на самом деле с модулем обработки действительно обидная ситуация.
Особенно когда хочется закрыть код.
27 Мыш
 
20.04.17
23:01
(26) Не надо стесняться )
28 shpioleg
 
20.04.17
23:29
(0) ЗначениеВРеквизитФормы используешь только 1 раз когда все ТЗ сформированы и возвращаешься на клиент.
Серверные процедуры "при общение между собой" передают эти ТЗ через параметры по ссылке.
Зачем вообще выдумывать общение между процедурами через реквизит формы? Сам же пишешь
>или отказать от работы через реквизиты формы и явно использовать параметры процедур