Имя: Пароль:
1C
 
Насколько "ресурсозатратен" ПодключитьОбработчикОжидания?
0 repin_mike
 
09.12.16
12:54
Привет всем!
Имеется обработка, основная на том, что "тяжелым" запросом выбираются данные из нескольких документов и отображаются в табличной части. Пользователь имеет возможность изменять значения в этой таблице, и они сразу же записываются в документ. Запись в документ тоже достаточно ресурсозатратная, там ПередЗаписью много чего происходит.
Как оно устроено сейчас: событие записи отрабатывает ПриОкончанииРедактирования у табличного поля. Пользователь редактирует 10 штук подряд колонок, и на каждой колонке происходит получение объекта документа, изменение нужного реквизита, и запись; в результате всё очень долго.
Как я думаю сделать, чтобы работало побыстрее: запись делать только однократно, вопрос как определить момент записи. Перебрав события табличного поля, я предположил, что ничего лучше ПриАктивизацииСтроки в моём случае нет - запоминаем текущую строку, и в момент смены строки записываем, ведь каждая колонка одной строки относится только к одному своему документу. Но возникает такой момент - если вдруг пользователь отредактировал кучу колонок, но строку не поменял, тогда записи не произойдёт. И я подумал что может быть в момент, когда пользователь отредактировал какую-то колонку, подключать обработчик ожидания секунд на 30, пользователь отредактировал ещё одну колонку - старый отключается, и подключается новый ещё на 30 секунд ожидания; если пользователь задумался на 30 секунд - тогда обработчик срабатывает однократно и делает запись. На первый взгляд вариант работоспособный, но только не факт что в быстродействии будет выигрыш, я с ПодключитьОбработчикОжидания никогда не работал и не знаю насколько быстро он устанавливается/снимается. Подскажите по вашему опыту жизнеспособность данной схемы.
1 repin_mike
 
09.12.16
12:57
И ещё подвопрос, что происходит если я создаю несколько подряд обработчиков ожидания:

ПодключитьОбработчикОжидания("Функция", 30);

..подождать 15 секунд

ПодключитьОбработчикОжидания("Функция", 30);


В результате подключатся два, которые будут срабатывать поочерёдно раз в 15 секунд; или в результате второй строки первый перезапустится и начнёт отсчет заново?

В СП не описано такой ситуации
2 bodri
 
09.12.16
13:02
(0) а может кнопку прикрутить "Записать изменения"?
(1) по идее идет перезапуск
3 Fragster
 
гуру
09.12.16
13:03
у меня вместе с одним объектом в его ТЧ есть возможность редактировать "подчиненные" объекты.
измененные строки подсвечиваются жирным, по записи родительского объекта - записываются изменения "подчиненных". При начале редактирования строки, соответствующей подчиненному объекту - устанавливается блокировка, чтобы подчиненный объект не был изменен в другом месте. см. Зацените канбан доску на 1с форма редактирования итерации.

в случае обработки можно сделать также, но записывать по кнопке
4 Fragster
 
гуру
09.12.16
13:03
ну, и при закрытии предупреждать о несохраненных изменениях
5 FIXXXL
 
09.12.16
13:06
(0) "складируй" измененные строки в ТЧ обработки, по кнопке или по выходу из обработки - пиши изменения
как вариант - пометка изменной строки, отбор по пометкам и запись измененных
6 catena
 
09.12.16
13:06
(1)Там у подключить обработчик есть еще третий параметр. Я думаю, в описанной схеме его надо взводить в истину.
7 aleks_default
 
09.12.16
13:59
делаешь реквизит формы произвольного типа.
В при начале редактирования строки таб части сохраняешь туда данные текущей строки в  виде структуры. При окончании редактирования строки сверяешь данные текущей строки со структурой из реквизита. Если есть изменения - записываешь, если нет - нет.
Но лучше действительно добавить скрытую колонку с пометкой "Изменена/не изменена" и записывать измененные строки отдельным действием либо по кнопке либо перед закрытием формы.
8 repin_mike
 
09.12.16
14:09
(7) Записывать все строки сразу тоже плохой вариант - будет выпадать сразу слишком много ошибок, по типу вот в этом документе не указана ставка НДС, а 17 строчек ниже договор не соответствует организации, а ещё в одном документе указан банковский счет, который помечен на удаление (всё это проверяется ПриЗаписи документа). Разобраться во всём этом пользователю будет сильно сложнее, чем если на каждый конкретный документ будет выдаваться его персональный список ошибок.
9 Fragster
 
гуру
09.12.16
14:17
(8) так проверяй сразу
10 Fragster
 
гуру
09.12.16
14:17
можно блокировать строку и писать в фоне, а потом возвращать ошибки
11 Вафель
 
09.12.16
14:17
делай очередь записи.
Пользователь меняет - добавляется в очередь.
В фонге очередь обрабатывается
12 aleks_default
 
09.12.16
14:18
Перенести все проверки из ПередЗаписью в  ОбработкуПроверкиЗаполнения. Эту процедуру можно вызывать отдельно через ПроверитьЗаполнение() без записи документа.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший