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

18.08.25

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

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

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

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

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

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

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

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

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

Выход:

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

Код модуля:

 

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

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

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

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

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

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

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

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

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

 


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

 
 

 

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

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

 


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

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

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

См. также

Инструменты администратора БД Групповая разработка (Git, хранилище) Обновление 1С Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 2.х 1С:Библиотека стандартных подсистем Абонемент ($m)

Обработка, объединяющая в себе использование инструментов БСП по администрированию кластера серверов и запуска скриптов для автоматического обновления конфигурации из хранилища.

4 стартмани

17.11.2025    668    1    KovrovtsevAS    0    

7

Обновление 1С Программист 1С:Предприятие 8 Бесплатно (free)

Обновление конфигураций с расширениями конфигураций.

13.11.2025    1080    vasilev2015    15    

6

Обновление 1С Программист 1С:Предприятие 8 1С:Бухгалтерия 3.0 Россия Абонемент ($m)

Обработка, загружающая по расписанию пакет правил обмена в случае их изменения из установленного в настройках каталога.

2 стартмани

27.10.2025    552    2    cheiser1982    2    

1

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

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

24.10.2025    1996    1c-izh    6    

6

Обновление 1С Рефакторинг и качество кода 1С:Предприятие 8 Абонемент ($m)

Анализ конфигураций - позволяет проверять любые конфигурации и расширения на наличие ошибок, связанных с вызовом экспортных функций и процедур общих модулей и модулей менеджеров объектов. Проверяются ошибки: 1) Метод объекта не обнаружен 2) Недостаточно фактических параметров. 3) Слишком много фактических параметров. Рекомендуется выполнять при подготовке обновлений. Анализ расширений - позволяет выводить подробный количественный состав расширений по объектам, определить случаи пересечения одного и того же функционала в разных расширения, выявить использование в модулях аннотации "вместо".

10 стартмани

17.10.2025    4711    22    Suker86    13    

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

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

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

Если же передать весь объем, предварительно его разделив, то он спокойно порциями встает в очередь и затем так же спокойно отложено отработает.
Потому отложенные обработчики делят данные на порции, и на каждую порцию создается отдельное рег задание.
А вот именно при подготовке данных этого нет, что и исправляем
8. Dach 390 19.08.25 13:46 Сейчас в теме
(7) на партнерку бы еще написать и носом их ткнуть в этот код
9. Vladimir-R 172 20.08.25 13:43 Сейчас в теме
(8) ответ 1С
"При анализе решено. что деградации нет или она незначительна.
Ошибкой не считается."
10. iolko 343 21.08.25 03:34 Сейчас в теме
(9) Ну что тут сказать, возможно, на каких-то объемах проблемы нет, но с нашими - они возникли..
По этому: хочешь сделать хорошо - сделай сам, как обычно
Для отправки сообщения требуется регистрация/авторизация