«Недостаточно памяти» в 1С: причины и решение
Процессу 1С не хватило оперативной памяти для выполнения операции. Чаще всего это упирание 32-разрядного клиента в лимит адресного пространства или операция, которая загружает в память слишком много данных.
Текст ошибки
Причины
- Используется 32-разрядный клиент или конфигуратор, который не может занять больше нескольких гигабайт
- Обновление или сравнение большой конфигурации в конфигураторе
- Отчёт или обработка выбирает огромный объём данных целиком
- Выгрузка базы в .dt или большой табличный документ на слабом компьютере
- На сервере 1С сработали ограничения памяти рабочих процессов
- Мало физической памяти и маленький файл подкачки
Для пользователя и администратора
Используйте 64-разрядную платформу
Это решение чаще всего. 32-разрядный процесс ограничен адресным пространством, и при обновлении больших типовых конфигураций (ERP, КА, УТ) памяти не хватает даже на мощном компьютере.
- Установите 64-разрядную версию платформы той же версии, что и сейчас. При установке выберите компонент для конфигуратора (толстого клиента), если обновление выполняется через него.
- В окне запуска выделите базу, нажмите «Изменить» и на последней странице выберите разрядность x86_64 или вариант с приоритетом 64-разрядной версии.
- Проверьте в диспетчере задач, что процесс 1cv8 запущен без пометки «32 бита».
Освободите ресурсы
- Закройте другие программы и лишние окна 1С на время обновления или выгрузки.
- Проверьте, что файл подкачки Windows включён и размещён на диске со свободным местом.
- Очистите кэш пользователя 1С: удалите содержимое каталогов кэша в
%LOCALAPPDATA%\1C\1cv8\и%APPDATA%\1C\1cv8\при закрытой программе.
Клиент-серверный режим
Если ошибка приходит с сервера, проверьте в консоли кластера свойства рабочего сервера: ограничения памяти рабочих процессов и критический объём памяти. При превышении сервер завершает тяжёлые вызовы. Увеличение лимитов оправдано, если на сервере достаточно памяти, но сначала найдите операцию, которая её расходует.
Для разработчика
Не загружайте большие выборки целиком в таблицу значений, если их можно обработать последовательно:
// Плохо для миллионов строк: всё в памяти
// Таблица = Запрос.Выполнить().Выгрузить();
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбработатьСтроку(Выборка);
КонецЦикла;
- Ограничивайте выборки через
ВЫБРАТЬ ПЕРВЫЕ Nи обрабатывайте порциями. - Избегайте соединений, которые размножают строки.
- Для больших файлов используйте потоковые объекты:
ЧтениеТекста,ЗаписьXML,ЧтениеJSON, вместо загрузки всего содержимого в строку. - Огромный табличный документ в отчёте замените выводом с отбором или выгрузкой в файл.
Частые вопросы
У меня 32 ГБ памяти, а 1С пишет, что не хватает. Как так?
Если запущена 32-разрядная версия, процесс может использовать лишь несколько гигабайт независимо от объёма памяти компьютера. Переключитесь на 64-разрядную платформу.
Ошибка при обновлении конфигурации. Что делать в первую очередь?
Запустите конфигуратор 64-разрядной версии платформы, закройте лишние программы и повторите обновление.