![]() |
![]() |
![]() |
|
1С. Распределить нагрузку обработки из-за ошибки памяти | ☑ | ||
---|---|---|---|---|
0
ac13
24.07.25
✎
15:58
|
Приветствую.
Прошу подсказать у кого есть идеи. На клиенте проверяю электронные подписи для списка документов. Если в списке более 100 документов, то обработка выпадает с ошибкой дампа памяти, не хватило места. Как выйти из ситуации? Думаю использовать пакетную обработку, между пакетами вставлять ОбновитьИнтерфейс(). Может у кого-то есть опыт и идеи получше?) |
|||
1
Волшебник
24.07.25
✎
15:59
|
Уберите транзакцию
|
|||
2
ac13
24.07.25
✎
16:04
|
(1) А откуда ее убрать?
Я в цикле для каждого документа обращаюсь к БСПшной процедуре. Выглядит это так, если коротко: Для каждого СтрокаСписка из СписокДокументов Цикл ЭлектронныеДокументыЭДОКлиент.ПроверитьПодписиДокумента(Оповещение, СтрокаСписка.СсылкаНаЭлектронныйДокумент, КонтекстДиагностики); КонецЦикла; |
|||
3
Волшебник
24.07.25
✎
16:03
|
(2) А если не коротко, а по-настоящему?
|
|||
4
ac13
24.07.25
✎
16:11
|
(3) Остальное - лишнее, к сути мало имеет отношения. Обработка подписей выполняется непосредственно - ЭлектронныеДокументыЭДОКлиент.ПроверитьПодписиДокумента. А дальше вся цепочка БПСшных процедур, возвращается результат.
Если чуть подробнее: КонтекстДиагностики = ОбработкаНеисправностейБЭДКлиент.НовыйКонтекстДиагностики(); Для каждого СтрокаСписка из СписокДокументов Цикл Оповещение = Новый ОписаниеОповещения("ПослеПроверкиПодписейДокумента", ЭтотОбъект, СтрокаСписка.СсылкаНаЭлектронныйДокумент); ЭлектронныеДокументыЭДОКлиент.ПроверитьПодписиДокумента(Оповещение, СтрокаСписка.СсылкаНаЭлектронныйДокумент, КонтекстДиагностики); КонецЦикла; &НаКлиенте Процедура ПослеПроверкиПодписейДокумента(Результат, Ссылка) Экспорт Если Результат.Успех Тогда Сообщить(СтрШаблон("Подпись для %1 проверена.", Ссылка)); КонецЕсли; КонецПроцедуры |
|||
5
Волшебник
24.07.25
✎
16:11
|
(4) Создавайте контекст внутри цикла
|
|||
6
ac13
24.07.25
✎
16:14
|
(5) В смысле так?
Для каждого СтрокаСписка из СписокДокументов Цикл КонтекстДиагностики = ОбработкаНеисправностейБЭДКлиент.НовыйКонтекстДиагностики(); Оповещение = Новый ОписаниеОповещения("ПослеПроверкиПодписейДокумента", ЭтотОбъект, СтрокаСписка.СсылкаНаЭлектронныйДокумент); ЭлектронныеДокументыЭДОКлиент.ПроверитьПодписиДокумента(Оповещение, СтрокаСписка.СсылкаНаЭлектронныйДокумент, КонтекстДиагностики); КонецЦикла; наоборот его специально ЗА внес, чтобы быстрее было) |
|||
7
Волшебник
24.07.25
✎
16:15
|
(6) да
оформляйте программный код тэгом <PRE> |
|||
8
ac13
24.07.25
✎
16:14
|
(7) Спасибо, попробую
|
|||
9
ac13
24.07.25
✎
16:18
|
А что на счет идеи дополнительно вставить ОбновитьИнтерфейс() между пакетами, например, по 10 или по 50 шт? Плохо или можно? Занимает дополнительное время, но вроде как скидывается дамп.
|
|||
10
Волшебник
24.07.25
✎
16:18
|
(9) Не помешает. Можно вставить паузу в несколько секунд
|
|||
11
ac13
24.07.25
✎
16:18
|
(10) Спасибо 👍
|
|||
12
Волшебник
24.07.25
✎
16:19
|
а ещё добавьте Попытка...Исключение на каждый документ
Хотя если там вылетает с дампом, то может не помочь. Похоже на бесконечную рекурсию где-то в другом месте |
|||
13
ac13
24.07.25
✎
16:21
|
Да, в моём случае Попытка только дополнительно увеличит время обработки.
|
|||
14
Волшебник
24.07.25
✎
16:22
|
(13) Пофиг на время, если обработка вообще не отрабатывает
|
|||
15
ac13
24.07.25
✎
16:29
|
(14) Тоже верно.
|
|||
16
Garykom
гуру
25.07.25
✎
09:34
|
(0) Какого места не хватило?
Оперативки? Диска? Ты понимаешь что по сути оповещение это фоновая отложенная обработка (асинхронность) - по сути в цикле у тебя вышла многозадачность? Правильно сказали про паузы добавить А лучше пакетами фигачить, пока оповещения для пакета не выполнятся дальше не топать Или сразу правильно разделять через фоновые для многопоточности, чтобы асинхронность была не в цикле а только одна для каждого фонового - тут нет риска что у тебя разом больше 100 параллельно попытаются да еще каждый с контекстом |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |