Ошибка обновления типовых конфигураций УТ/ЕРП/КА и других "Превышен максимальный расход памяти сервера за один вызов"

18.08.25

База данных - Обновление 1С

При обновлении конфигураций ЕРП/КА/УТ типовыми обновлениями можно получить ошибку  Превышен максимальный расход памяти сервера за один вызов". С чем это связано? Рассмотрим исправление этой ошибки.

Например, посмотрим регистры накопления:

  • ЗаданияНеоперативногоДопроведенияДокументов
  • ДенежныеСредстваБезналичные

В модулях менеджера которых есть процедура "ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию", в которой выполняется выборка данных.

Затем эта выборка, в качестве ТЗ или массива уходит в процедуру ОбновлениеИнформационнойБазы.ОтметитьКОбработке"

Самое забавное, что 1С  для нас (но, видимо, не для себя)  написали комментарий к процедуре 
"ОтметитьКОбработке"

// Отмечает, что переданные данные необходимо обновить.
// Важно: не рекомендуется передавать в параметр Данные сразу все данные, которые
// необходимо зарегистрировать к обработке, т.к. большие коллекции типа Массив
// или ТаблицаЗначений могут занять существенный объем памяти сервера и привести
// к сильному снижению производительности системы. Рекомендуется получать и передавать
// данные небольшими порциями, например по 1000 объектов.

Это отлично .. но при этом в обработчике обновлений ... мы получаем огромную выборку .. без каких-либо разделений на порции.. в после передачи этой выборки  (массив или ТЗ)  в "ОтметитьКОбработке".. даже на мощных серверах .. мы просто падаем ...

Выход:

1) Создаем общий модуль "РаботаСПорциямиСервер" (Сервер, внешнее соединение)

Код модуля:

 

#Область ПрограммныйИнтерфейс

Функция РазбитьМассивНаПорции(ВходящийМассив, РазмерПорции) Экспорт
	
	ПулМассивов = Новый Массив;
	
	МассивПорция = Новый Массив;
	
	Если ВходящийМассив.Количество() <= РазмерПорции Тогда
		
		ПулМассивов.Добавить(ВходящийМассив);
		Возврат ПулМассивов;
		
	КонецЕсли;

	Для Индекс = 0 По ВходящийМассив.ВГраница() Цикл
		
		Если МассивПорция.Количество() = РазмерПорции Тогда
			
			ПулМассивов.Добавить(МассивПорция);
			МассивПорция = Новый Массив;
			
		КонецЕсли;

		МассивПорция.Добавить(ВходящийМассив.Получить(Индекс));
		
	КонецЦикла;
	
	Если Индекс -1 = ВходящийМассив.ВГраница() И МассивПорция.Количество() <> 0 Тогда
		
		ПулМассивов.Добавить(МассивПорция);
		
	КонецЕсли;
	
	Возврат ПулМассивов;
	
КонецФункции

Функция РазбитьТЗНаПорции(Тз, РазмерПорции) Экспорт
	
	ПулМассивов = Новый Массив;
	
	Если Тз.Количество() <= РазмерПорции Тогда
		
		ПулМассивов.Добавить(Тз);
		Возврат ПулМассивов;
		
	КонецЕсли;
	
	ТзПорция = ПустаяТз(Тз);
	
	Для Сч = 0 По Тз.Количество() -1 Цикл
		
		Если ТзПорция.Количество() = РазмерПорции Тогда
			
			ПулМассивов.Добавить(ТзПорция);
			ТзПорция = ПустаяТз(Тз);
			
		КонецЕсли;
		
		НоСтрокаТз = ТзПорция.Добавить();
		ЗаполнитьЗначенияСвойств(НоСтрокаТз, Тз.Получить(Сч));
		
	КонецЦикла;
	
	Если Сч = Тз.Количество() И ТзПорция.Количество() <> 0 Тогда
		
		ПулМассивов.Добавить(ТзПорция);
		
	КонецЕсли;
	
	Возврат ПулМассивов;
	
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция ПустаяТз(Тз)
	
	Возврат Тз.СкопироватьКолонки();
	
КонецФункции

#КонецОбласти

 


Исправление в расширении выглядит так:

 
 

 

#Удаление
  ОбновлениеИнформационнойБазы.ОтметитьКОбработке(
  Параметры, Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Регистратор"), ДополнительныеПараметры);
#КонецУдаления

#Вставка
  
  РазмерПорции = 500;
  
  ДанныеДляОбработки = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Регистратор");
  ПуллМассивовДляОбработки = РаботаСПорциямиСервер.РазбитьМассивНаПорции(ДанныеДляОбработки, РазмерПорции);
  
  Для Каждого ЭлМассива Из ПуллМассивовДляОбработки Цикл
  
    ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, ЭлМассива, ДополнительныеПараметры);
    
  КонецЦикла;
  
#КонецВставки

 


После таких доработок, отложенные обработчики отработают штатно, и проблем возникать не будет.

PS все это справедливо для "больших баз", где первички очень много...

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Обновление 1С Системный администратор Программист 1С v8.3 Россия Абонемент ($m)

Внешняя обработка "Запуск процедур обновления" предназначена для запуска процедур обновления в типовых конфигурациях, а также в конфигурациях, где поддерживается типовой механизм обновления по подсистемам. Это может быть полезно тем, кто разрабатывает и поддерживает свои подсистемы на базе типового механизма. Тестировщики, разработчики.

1 стартмани

16.07.2025    580    4    lastpioneer    0    

9

Рефакторинг и качество кода Обновление 1С Программист 1С v8.3 Бесплатно (free)

Проблемы и их решение из реальных проектов сложного обновления 1С, когда нужно было сохранить целостность данных, ускориться и уложиться в оцененные и утвержденные сроки.

02.07.2025    3119    1c-izh    9    

13

DevOps и автоматизация разработки Обновление 1С Системный администратор Программист 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление холдингом Абонемент ($m)

Продолжаем делиться опытом ICL SOFT – в этой статье рассказываем о сложном обновлении сильно доработанной конфигурации "1С:ERP Управление холдингом с версии 3.1.8.15" до актуальной версии редакции 3.2. Публикации о сложных обновлениях, которые можно найти в открытых источниках, содержат мало подробной информации об использованных инструментах и решениях. Часто в них отсутствует информация о том, что находится под капотом этих решений. Будем рады, если наша статья окажется полезной

1 стартмани

01.07.2025    1857    vladimir_iclsoft    1    

19

Рефакторинг и качество кода Обновление 1С Программист 1С v8.3 Бесплатно (free)

Тестовая база обновлена через все ключевые релизы, всё протестировано, остатки сведены, вы готовы обновить «боевую» базу, но…по замерам для этого потребуется целая неделя, а у вас есть всего пара выходных. Знакомая ситуация? Расскажем, как увеличить скорость отработки промежуточных конфигураций!

18.06.2025    3511    1c-izh    14    

10

Обновление 1С Программист Стажер 1С v8.3 Бесплатно (free)

Наша компания перманентно занимаемся обновлением «старых» и, к тому же, сильно нетиповых конфигураций. Хочется поделиться опытом по работе с важным этапом подобных проектов — поиску и оптимизации промежуточных конфигураций 1С. Первый материал будет полезен начинающим специалистам 1С, а в последующих, надеемся, найдется интересная информация и для матерых разработчиков.

04.06.2025    3832    1c-izh    13    

17

Обновление 1С 1С v8.3 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Абонемент ($m)

Добавление в Справочник "Статьи затрат" отсутствующих предопределённых элементов.

1 стартмани

23.05.2025    590    0    qrw    0    

0

БСП (Библиотека стандартных подсистем) Обновление 1С Программист 1C:ERP Бесплатно (free)

В данной статье рассмотрен один из вариантов добавления собственных обработчиков обновления в расширении конфигурации. При смене версии расширения - автоматический вызов процесса обновления информационной базы.

29.04.2025    2988    krasnoshchekovpavel    7    

19
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Xershi 1538 19.08.25 05:45 Сейчас в теме
2. aximo 2387 19.08.25 07:16 Сейчас в теме
Это что у вас «большие базы» на 32-ух разрядных серверах приложений работают?
4. iolko 331 19.08.25 09:12 Сейчас в теме
3. Vladimir-R 171 19.08.25 09:03 Сейчас в теме
У вас в настройках отложенного обновления сколько потоков обновления включено?
5. iolko 331 19.08.25 09:13 Сейчас в теме
(3) Там, понимаете, дело не в потоках .. а дело в том, что передается в качестве параметра большой объем данных.
О том, что так делать нельзя, 1С пишет в комментарии:

// Важно: не рекомендуется передавать в параметр Данные сразу все данные, которые
// необходимо зарегистрировать к обработке, т.к. большие коллекции типа Массив
// или ТаблицаЗначений могут занять существенный объем памяти сервера и привести
// к сильному снижению производительности системы. Рекомендуется получать и передавать
// данные небольшими порциями, например по 1000 объектов.

Но при этом сама не выполняет данные требования
Dach; sapervodichka; +2 Ответить
6. sapervodichka 7170 19.08.25 10:24 Сейчас в теме
(3) тут я так понял дело в том, что есть 1 параметр, там весь объем и по потокам эти данные не делятся (это ведь дописывать надо кодом) машина не сможет поделить по потокам выполнение процедуры. Вот Алексей решил все также оставить в 1 потоке, но только поделить на меньшие порции, чтобы прожевывало. А так классно было бы иметь встроенную возможность поделить на порции и эти порции в разные потоки для любого обработчика обновления - но это лучше самому 1С сделать везде в обработчиках обновления.
7. iolko 331 19.08.25 12:57 Сейчас в теме
(6) Да, совершенно верно, и это (во всяком случае у нас) огромная выборка, и если она передается вся, без разбиения на порции, то получаем недостаток памяти.

Если же передать весь объем, предварительно его разделив, то он спокойно порциями встает в очередь и затем так же спокойно отложено отработает.
Потому отложенные обработчики делят данные на порции, и на каждую порцию создается отдельное рег задание.
А вот именно при подготовке данных этого нет, что и исправляем
8. Dach 388 19.08.25 13:46 Сейчас в теме
(7) на партнерку бы еще написать и носом их ткнуть в этот код
Оставьте свое сообщение