Имя: Пароль:
1C
 
Текстовое поле в ТЧ дока – как убрать «лишние» вызовы ф-ций из формулы.
Ø
0 EuVod
 
15.12.06
23:02
Чего-то в поиске ничего путного не нашел. Итак имеем документ с большой таб.частью (порядка 2-3 тыс. строк). В нем два текстовых поля, которые соответственно как-то вычисляются. При любом изменении в этом документе происходит пересчет всех таких полей для каждой строки документа. Это тормозит работу. И я чего-то не соображу, каким образом можно организовать пересчет таких полей, например, по кнопке – без автообновления. Я так понимаю, что непосредственно указывать из программы значение текста в строке нельзя, а функция, вызываемая из формулы данной колонки, будет отрабатывать всегда. Есть какой-то выход, кроме как эмуляция ТЧ через ТЗ? Я делаю «лист инвентаризации» - типа сидят 4 оператора и забивают каждый в свой лист результаты разных пересчетчиков – надо, чтобы они видели суммарный результат своей работы (по факту записанных листов). Видимо придется «сводную ведомость» выносить в виде ТЗ на отдельную закладку. (две сводных колонки в ТЧ – конечно хорошо, но тормозит).
1 Дурочка 1С ®
 
15.12.06
23:11
Попробуй спросить по-русски ...
2 leosoft
 
16.12.06
01:11
Вряд ли им надо просматривать все 3000 расчетных колонок!
Можно их убрать и сделать кнопку, по которой посчитаются
итоги и будут показаны на экране.
3 VZ
 
16.12.06
01:39
"Я так понимаю, что непосредственно указывать из программы значение текста в строке нельзя" - неправильно понимешь.
"функция, вызываемая из формулы данной колонки, будет отрабатывать всегда" - некоторые включают опцию "только при изменении". Но это редкие экземпляры, читающие мануалы.
"При любом изменении в этом документе происходит пересчет всех таких полей для каждой строки документа" - молодец, что сумел добиться этого.
 
Помедитируй над (1) - возможно, получишь желаемое.
4 Vlad55
 
16.12.06
02:11
(0)
Я думаю что Вы лезете "через печь в двери"
Вряд ли что из этого получится.
"Делай проще дурак"
5 EuVod
 
18.12.06
14:40
Свой текст всегда понятен – попробую разъяснить. (хотя я уже «переделал проще»).
В ТЧ на форму документа добавляю реквизит типа «текст» (пусть с идентификаторм «Текст1»).
под словами «нельзя непосредственно указывать из программы значение текста» я имел в виду, что не могу присвоить значение в стиле Текст1 = «1» при выбранной строке ТЧ, чтобы именно в этой строке проставилось нужное мне значение;
Буду признателен уважаемым донам за разъяснение, как я могу отображать в ТЧ документа нужные мне значения (зависящие от номера строки) – не реквизиты. Я умею только через текстовое поле, в свойстве «формула» которого прописана функция возвращающая нужное мне значение. Я был бы вполне счастлив, если бы мог эта функция не вызывалась всякий раз (а формулы в текстовых поля пересчитываются на форме всегда, разве нет?).
Метод ВыполнятьФормулуТолькоПриИзменении() – не сильно поможет – ибо мне надо чтобы перевычисление вообще происходило по разовому нажатию кнопки, а ни при каждом изменении любого реквизита. Если я применяю этот метод к собственно вычисляемому текстовому полю – это ничего не дает.
6 КонецЦикла
 
18.12.06
15:02
Вызывает сомнение необходимость что-то долго вычислять для 3000 элементов
Их кто-то видит одноврененно? Надо ли вообще что-то вычислять?
Можно попробовать показывать информацию для текущей строки, внизу
7 Oops
 
18.12.06
15:07
2(0) В памяти ТЗ.
При обращении проверятся "вычисляли уже для этого параметра/строки?" Да-берём из ТЗ (как из кэша), Нет-вычисляем и кладём в ТЗ
8 EuVod
 
18.12.06
15:14
(7) мерси, но сама фукнция очень быстрая, но сам факт 3000*2 = 6000 вызов - ~0.8 сек. операторы набивают данные в стрки документа существенно быстре и не могут ждать. (буду ошибки). Я думал будет пересчитываться только то, что помещается в отображаемую область (как происходит с формами списков справочника) но вычисляеются значения текста для всех строк.
В общем сводную ТЗ я вынес на отдельную закладку, текстовый колонки убрал.
9 Uho
 
18.12.06
15:24
все не осилил, но ты ж сам говоришь через кнопку сделать:
в текстовых полях пишешь
?(Автообновление=1, считаем, несчитаем);
а в кнопке присваивай значение переменной Автообновление
10 Oops
 
18.12.06
15:26
2(8) Что-то ты ошибаешься. "пересчитываться только то, что помещается в отображаемую область" - так и есть.
11 Дурочка 1С ®
 
18.12.06
15:32
>> вычисляеются значения текста для всех строк.
 
Что за бред?
12 КонецЦикла
 
18.12.06
15:35
2(11) У него значит такое разрешение на монике :)
13 EuVod
 
18.12.06
15:37
(12) разершение к сожалению не такое... но отладчик показывает, что функция вызывалась именно то количество раз сколько есть строк в ТЧ.
14 Дурочка 1С ®
 
18.12.06
15:37
(12) Скажи ему: пусть уберет кота от экрана ... ©Реклама
15 Uho
 
18.12.06
15:56
(12) неа, у него релиз небось какой-нибудь 27 :))
16 smaharbA
 
18.12.06
15:59
Если НомерСтроки<>НомерСтрокиПрежн Иначе
...
17 Oops
 
18.12.06
16:09
2(13) кажи код
18 EuVod
 
18.12.06
17:22
Было примерно так:
ПолучитьСводнПодсчет("Ост") – в формуле текстовой колонки.
Функция ПолучитьСводнПодсчет(ИмяПоказателя)
  Если ИмяПоказателя = "Ост" Тогда
    ЗначВозвр = ТЗСвод.ПолучитьЗначение(НомерСтроки, "ОстатокФакт");
  ИначеЕсли ИмяПоказателя = "ИзлНед" Тогда
    ЗначВозвр = ТЗСвод.ПолучитьЗначение(НомерСтроки, "ОстатокФакт") - ОстатокПлан;
  КонецЕсли; //ИмяПоказателя =..
  
  Возврат ЗначВозвр;
КонецФункции // ПолучитьСводнПодсчет()
В поле «формула» некоторых других реквизитов тоже есть свои вызовы процедур которые устанавливают значения реквизитов в той же строке.
(12) - шутки-шутками, но релиз 23.
19 EuVod
 
18.12.06
17:25
на 25 правда тоже самое.
20 Oops
 
18.12.06
17:33
2(18) попробуй:
Функция ПолучитьСводнПодсчет(ИмяПоказателя)
Сообщить(НомерСтроки);
 
Кстати, как вариант - использовать общую (для модуля) переменную и считать только 1 раз на строку (как в ТиС).
 
Ещё вопрос - что делаешь когда строки удаляют/меняют?
21 EuVod
 
18.12.06
19:19
строки закреплены жестко - это остатки по регистру, определенным образом упорядоченные; изменение порядка/добавление/удаление - не предусмотрены и заблокированы.
22 Uho
 
18.12.06
22:15
(21) что-то я не пойму, ты не на один из вариантов не дал своего согласия/несогласия (желательно, аргументированного)
23 EuVod
 
19.12.06
10:39
Честно говоря перестал экспериментировать. Сейчас немного не до того.
Из обсуждения я понял что
1. не должна ф-ция из формулы текстового столбца вызываться больше чем надо (чем строк на экране), почему вызывается - не знаю.
2. других способов заполнять текстовое поле ТЧ кроме как возвращать из прописанной ф-ции нужное значение нет (я так и думал – но мало ли).
3. Вариант (20) – не уловил, что имеется в виду, надо будет мне глянуть в ТиС (в какое место?). Расчет мне надо время от времени обновлять, чтобы подхватывались изменения внесенные другими пользователями в свои листы. Да ив любом случае – откуды бы я не заполнял текстовые столбцы, основное время уходит из-за непоняток с п.1.
Выводить в подвал для текущей строки - очевидно быстро - но в данном случае не удобно: пользователь не согласится.
Так что я вывел свод на отдельную закладку – соответсвенно в табличной части не осталось вычисляемых колонок, а свод пересчитывается при выборе его закладки. (в любом случае это разовая операция).
Всем спасибо большое за участие и попытку разобраться.
24 EuVod
 
19.12.06
10:55
кстати попутный вопрос - почему если размещаем ТЗ в форме документа, то когда на ней сфокусированы, текстовый поиск (бинокль со строкой поиска и стрелки "вперед-назад") - недоступен. В форме обработки-отчета поиск по ТЗ нормально работает...
25 Uho
 
19.12.06
11:00
(24) у меня доступен
26 Oops
 
19.12.06
11:02
2(23.3) ТиС, Спр.Номенклатура, ФормыСписка-ДляПодбора
См. колонку "Остаток". Там вызывается "ПолучитьОстатокЗаполнитьЦену()", а в след. колонках уже используется вычисленное в функции "ТекОстатокПоФирме" и "ЦенаТекНоменклатуры" и т.п.
Т.е. на две (и более) вычисляемых колонки - один вызов функции.
27 EuVod
 
19.12.06
11:43
(25) хм... от чего же это может зависеть (не от слоев же)
(26) спасибо - понял.