Имя: Пароль:
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 параллельно попытаются да еще каждый с контекстом
Закон Брукера: Даже маленькая практика стоит большой теории.