Имя: Пароль:
1C
 
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 параллельно попытаются да еще каждый с контекстом
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан