Как исправить ошибку «Недостаточно памяти» при поиске и подборе номенклатуры в 1С?

Системный администратор 1С v8.3 (Обычные формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При активной работе в программе 1С:Бухгалтерия (особенно в конфигурациях на обычных формах, таких как редакция 2.0 или Управление торговлей 10.3) пользователи часто сталкиваются со сбоем: при попытке найти товар в форме подбора номенклатуры система замирает на несколько секунд, после чего аварийно завершает работу с ошибкой «Недостаточно памяти» (Out of Memory). Выясним причину этой проблемы и подробно проанализируем варианты ее решения.

Архитектурные причины возникновения ошибки

Проанализируем ситуация с технической точки зрения. Ошибка возникает в клиент-серверном режиме работы (когда база данных размещена на MS SQL Server или PostgreSQL), но запускается в режиме «Толстый клиент».

  1. Ограничение 32-разрядного процесса клиента: Даже если на компьютере пользователя установлена 64-разрядная операционная система и 4 ГБ (или больше) оперативной памяти, 32-битное приложение 1С (процесс 1cv8.exe) имеет жесткое ограничение — оно не может адресовать более 2 ГБ виртуальной памяти на один процесс.
  2. Специфика толстого клиента: В отличие от тонкого клиента, где все сложные расчетах и выборка данных происходят на сервере, толстый клиент может запрашивать массивные таблицы у СУБД и пытаться обработать их непосредственно на локальном компьютере пользователя.
  3. Объемные выборки при подборе: Если справочник номенклатуры содержит десятки тысяч позиций (например, 40 000+ элементов), а обработка подбора запрашивает остатки по всем позициям и регистру бухгалтерии за большой период, сформированная таблица превышает порог 1.5–1.8 ГБ. В этот момент процесс 1cv8.exe исчерпывает выделенную ему память и падает.
  4. Неоптимальные планы запросов СУБД: Если на сервере MS SQL устарела статистика по регистрам или переполнен процедурный кэш, СУБД строит неэффективный план выполнения запроса, считывая лишние данные вместо точечной выборки.

Рассмотри подробно комплексные способы решения этой проблемы — от простых организационно-технических шагов до оптимизации кода.

Способ 1. Установка 64-битного клиента 1С на компьютер пользователя

Самым простым и эффективным решением без изменения программного кода является переход на 64-разрядное приложение клиента 1С.

  1. Начиная с платформы 1С:Предприятие 8.3.9, фирма 1С поставляет официальный 64-битный тонкий и толстый клиент (файл установки client64).
  2. Установим 64-битную версию платформы 1С на компьютер бухгалтера.
  3. После этого процесс 1cv8.exe становится 64-разрядным и сможет использовать всю доступную оперативную память компьютера (без лимита в 2 ГБ), благодаря чему крупная таблица подбора успешно обработается в памяти.

Важно: Для работы 64-битного клиента требуется, чтобы на ПК была установлена 64-разрядная ОС Windows и желательно иметь не менее 8 ГБ оперативной памяти для комфортной работы.

Способ 2. Временная работа через удаленный рабочий стол (RDP) на сервере

Если ошибка появляется эпизодически при массовом перепроведении документов за старые периоды и ручной корректировке номенклатуры, разберем вариант выполнения этой работы прямо на сервере:

  1. Предоставим бухгалтеру доступ на терминальный сервер (или сервер приложений 1С) по протоколу RDP.
  2. Запустим сеанс 1С непосредственно на сервере, обладающем высокими вычислительными ресурсами и большим объемом ОЗУ.
  3. Перед выполнением тяжелых операций обязательно создадим резервную копию базы данных. На мощном сервере процесс подбора и перепроведения документов пройдет значительно быстрее и без сбоев по памяти.

Способ 3. Переход на «Тонкий клиент» и управляемые формы (1С:Бухгалтерия 3.0)

Посмотрим на проблему с точки зрения эволюции платформы. В современной редакции 1С:Бухгалтерия 3.0 используется архитектура управляемого приложения (Тонкий клиент).

При работе в тонком клиенте:

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

Способ 4. Оптимизация кода запроса в обработке подбора

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

Проанализируем правильный подход к написанию запроса с использованием временных таблиц, явным ограничением выборки и удалением временных таблиц из памяти:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 500
    |	Номенклатура.Ссылка КАК Номенклатура,
    |	Номенклатура.Наименование КАК Наименование
    |ПОМЕСТИТЬ ВТ_ВыбраннаяНоменклатура
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |	Номенклатура.Наименование ПОДОБНО &СтрокаПоиска
    |	И НЕ Номенклатура.ЭтоГруппа
    |ИНДЕКСИРОВАТЬ ПО
    |	Номенклатура;
    |
    |ВЫБРАТЬ
    |	ВТ_Номенклатура.Номенклатура КАК Номенклатура,
    |	ВТ_Номенклатура.Наименование КАК Наименование,
    |	ЕСТЬNULL(ТоварыОстатки.КоличествоОстаток, 0) КАК Остаток
    |ИЗ
    |	ВТ_ВыбраннаяНоменклатура КАК ВТ_Номенклатура
    |	ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
    |		&Период, 
    |		Номенклатура В (ВЫБРАТЬ ВТ.Номенклатура ИЗ ВТ_ВыбраннаяНоменклатура КАК ВТ)
    |	) КАК ТоварыОстатки
    |	ПО ВТ_Номенклатура.Номенклатура = ТоварыОстатки.Номенклатура;
    |
    |УНИЧТОЖИТЬ ВТ_ВыбраннаяНоменклатура";

Запрос.УстановитьПараметр("СтрокаПоиска", "%" + ИскомыйТекст + "%");
Запрос.УстановитьПараметр("Период", ТекущаяДата());

РезультатЗапроса = Запрос.Выполнить();

Ключевые моменты оптимизации:

  1. Инструкция ВЫБРАТЬ ПЕРВЫЕ 500 защищает клиентский сеанс от переполнения памяти, если пользователь ввел слишком общий критерий поиска.
  2. Условие отбора по номенклатуре передается напрямую в параметры виртуальной таблицы остатков РегистрНакопления.ТоварыНаСкладах.Остатки(..., Номенклатура В (...)), а не в секцию ГДЕ. Это заставляет MS SQL выбирать остатки только по найденным позициям.
  3. Команда УНИЧТОЖИТЬ ВТ_ВыбраннаяНоменклатура очищает временные таблицы СУБД сразу после выполнения пакета.

Способ 5. Обслуживание СУБД MS SQL и очистка кэша

Выясним, какие регламентные настройки СУБД и платформы помогают предотвратить падение по памяти:

  1. Настройка лимита памяти MS SQL Server: В свойствах экземпляра SQL Server (параметр Max Server Memory) необходимо жестко ограничить объем памяти. Например, если на сервере 32 ГБ ОЗУ, выделяем для SQL не более 20–22 ГБ, оставляя ресурс для операционной системы и службы кластера 1С (rphost).
  2. Обновление статистики СУБД: Настроим регламентное задание в SQL Server Agent для регулярного обновления статистики с параметром FULLSCAN для таблиц регистров накопления и бухгалтерии:
    
    UPDATE STATISTICS [_Document123] WITH FULLSCAN;
    DBCC FREEPROCCACHE;
    
  3. Очистка кэша 1С у пользователя: Удалим локальные временные файлы пользователя в каталогах %AppData%\1C\1cv8 и %LocalAppData%\1C\1cv8. Часто устаревшие пользовательские настройки динамических списков и форм подбора провоцируют утечку памяти при выполнении поиска.

Таким образом, сочетание установки 64-битного клиента 1С, регулярного обслуживания СУБД и грамотной граничной выборки в запросах подбора полностью решает проблему с нехваткой памяти.

← На главную