|   |   | 
| 
 | 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 параллельно попытаются да еще каждый с контекстом | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |