В процессе работы с объемными базами данных 1С:Предприятие 8.3 пользователи и администраторы нередко сталкиваются со ситуацией: на компьютере установлена 64-разрядная операционная система, достаточное количество оперативной памяти (например, 8 ГБ или больше) и запущен 64-разрядный клиент 1С, однако при выполнении ресурсоемких операций — таких как удаление помеченных объектов или тестирование и исправление — программа расходует лишь около 2 ГБ ОЗУ и завершается критической ошибкой «Не хватает памяти».
Выясним причины такого поведения платформы, проанализируем узкие места файлового режима и разберем проверенные способы решения этой проблемы.
Рассмотрим, почему процесс 1С не использует весь доступный объем оперативной памяти, даже если установлен 64-разрядный релиз платформы.
1cv8s.exe) платформа по умолчанию использует режим «Выбирать автоматически». В этом случае система может приоритетно запускать 32-разрядный исполняемый файл 1cv8.exe из каталога Program Files (x86). Для 32-разрядного процесса в Windows установлено жесткое ограничение виртуального адресного пространства в 2 ГБ (или до 3–4 ГБ при специальных настройках OS), независимо от общего объема установленной ОЗУ.Проанализируем ситуацию, когда ошибка нехватки памяти вызвана не масштабом базы, а повреждением структуры данных. В иерархических справочниках (например, Номенклатура или Подразделения) может возникнуть зацикленная иерархическая ссылка — ситуация, когда элемент прямо или опосредованно ссылается на самого себя в качестве родителя.
При попытке проверить или удалить такой элемент стандартные механизмы 1С попадают в бесконечную рекурсию. Происходит исчерпание стека и оперативной памяти, после чего платформа выдает сообщение о недостатке ресурсов.
Разберем по шагам действия, которые помогут справиться с ошибкой и успешно выполнить обработку данных.
Перейдем в список информационных баз, выделим нужную базу, нажмем кнопку «Изменить» и на последней странице мастера настроек в поле «Разрядность» установим значение 64 (x86_64) вместо варианта Автоматически.
Запустим конфигуратор, откроем меню «Администрирование» — «Тестирование и исправление...». Отметим флажками пункты Проверка ссылочной целостности и Проверка логической целостности. При обнаружении некорректных ссылок выберем вариант Очищать ссылки. Это позволит развязать циклические зависимости в справочниках.
Не следует пытаться удалить несколько десятков тысяч объектов за один раз. Разберем пример программного порционного удаления через внешнюю обработку или стандартный поиск ссылок с отбором по конкретным типам метаданных:
// Пример логики порционной обработки элементов
МассивУдаляемых = Новый Массив;
Выборка = Справочники.Номенклатура.Выбрать();
Счетчик = 0;
Пока Выборка.Следующий() Цикл
Если Выборка.ПометкаУдаления Тогда
МассивУдаляемых.Добавить(Выборка.Ссылка);
Счетчик = Счетчик + 1;
КонецЕсли;
// Удаляем каждые 500 элементов, не перегружая память
Если Счетчик >= 500 Тогда
УдалитьОбъекты(МассивУдаляемых, Истина);
МассивУдаляемых.Очистить();
Счетчик = 0;
КонецЕсли;
КонецЦикла;
Если МассивУдаляемых.Количество() > 0 Тогда
УдалитьОбъекты(МассивУдаляемых, Истина);
КонецЕсли;
После массового удаления помеченных объектов физический размер файла 1Cv8.1CD не уменьшается автоматически. Чтобы освободить место и перестроивать индексы, выполним утилиту chdbfl.exe (находится в каталоге bin платформы) или запустим в режиме Конфигуратора процедуру «Сжатие таблиц информационной базы» в меню ТИИ.
В конфигурациях на базе Библиотеки Стандартных Подсистем (БСП) перейдем в раздел «Администрирование» — «Обслуживание» — «Удаление помеченных объектов» и выберем режим фонового удаления. В этом режиме проверка ссылок выполняется отдельными фоновыми заданиями без блокировки клиентского приложения и переполнения интерфейсного потока.
Если файловая база данных регулярно превышает лимиты и выдает ошибки памяти, рассмотрим следующие архитектурные решения:
rphost, эффективно управляющий оперативной памятью сервера.