При активной работе в программе 1С:Бухгалтерия (особенно в конфигурациях на обычных формах, таких как редакция 2.0 или Управление торговлей 10.3) пользователи часто сталкиваются со сбоем: при попытке найти товар в форме подбора номенклатуры система замирает на несколько секунд, после чего аварийно завершает работу с ошибкой «Недостаточно памяти» (Out of Memory). Выясним причину этой проблемы и подробно проанализируем варианты ее решения.
Проанализируем ситуация с технической точки зрения. Ошибка возникает в клиент-серверном режиме работы (когда база данных размещена на MS SQL Server или PostgreSQL), но запускается в режиме «Толстый клиент».
1cv8.exe) имеет жесткое ограничение — оно не может адресовать более 2 ГБ виртуальной памяти на один процесс.1cv8.exe исчерпывает выделенную ему память и падает.Рассмотри подробно комплексные способы решения этой проблемы — от простых организационно-технических шагов до оптимизации кода.
Самым простым и эффективным решением без изменения программного кода является переход на 64-разрядное приложение клиента 1С.
client64).1cv8.exe становится 64-разрядным и сможет использовать всю доступную оперативную память компьютера (без лимита в 2 ГБ), благодаря чему крупная таблица подбора успешно обработается в памяти.Важно: Для работы 64-битного клиента требуется, чтобы на ПК была установлена 64-разрядная ОС Windows и желательно иметь не менее 8 ГБ оперативной памяти для комфортной работы.
Если ошибка появляется эпизодически при массовом перепроведении документов за старые периоды и ручной корректировке номенклатуры, разберем вариант выполнения этой работы прямо на сервере:
Посмотрим на проблему с точки зрения эволюции платформы. В современной редакции 1С:Бухгалтерия 3.0 используется архитектура управляемого приложения (Тонкий клиент).
При работе в тонком клиенте:
rphost.Если конфигурация дорабатывается программистом, разберем, как сделать запрос подбора номенклатуры легким и быстрым. Основная ошибка разработчиков — выборка всех остатков и номенклатуры в один неиндексированный массив.
Проанализируем правильный подход к написанию запроса с использованием временных таблиц, явным ограничением выборки и удалением временных таблиц из памяти:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 500
| Номенклатура.Ссылка КАК Номенклатура,
| Номенклатура.Наименование КАК Наименование
|ПОМЕСТИТЬ ВТ_ВыбраннаяНоменклатура
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &СтрокаПоиска
| И НЕ Номенклатура.ЭтоГруппа
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура;
|
|ВЫБРАТЬ
| ВТ_Номенклатура.Номенклатура КАК Номенклатура,
| ВТ_Номенклатура.Наименование КАК Наименование,
| ЕСТЬNULL(ТоварыОстатки.КоличествоОстаток, 0) КАК Остаток
|ИЗ
| ВТ_ВыбраннаяНоменклатура КАК ВТ_Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
| &Период,
| Номенклатура В (ВЫБРАТЬ ВТ.Номенклатура ИЗ ВТ_ВыбраннаяНоменклатура КАК ВТ)
| ) КАК ТоварыОстатки
| ПО ВТ_Номенклатура.Номенклатура = ТоварыОстатки.Номенклатура;
|
|УНИЧТОЖИТЬ ВТ_ВыбраннаяНоменклатура";
Запрос.УстановитьПараметр("СтрокаПоиска", "%" + ИскомыйТекст + "%");
Запрос.УстановитьПараметр("Период", ТекущаяДата());
РезультатЗапроса = Запрос.Выполнить();
Ключевые моменты оптимизации:
ВЫБРАТЬ ПЕРВЫЕ 500 защищает клиентский сеанс от переполнения памяти, если пользователь ввел слишком общий критерий поиска.РегистрНакопления.ТоварыНаСкладах.Остатки(..., Номенклатура В (...)), а не в секцию ГДЕ. Это заставляет MS SQL выбирать остатки только по найденным позициям.УНИЧТОЖИТЬ ВТ_ВыбраннаяНоменклатура очищает временные таблицы СУБД сразу после выполнения пакета.Выясним, какие регламентные настройки СУБД и платформы помогают предотвратить падение по памяти:
Max Server Memory) необходимо жестко ограничить объем памяти. Например, если на сервере 32 ГБ ОЗУ, выделяем для SQL не более 20–22 ГБ, оставляя ресурс для операционной системы и службы кластера 1С (rphost).FULLSCAN для таблиц регистров накопления и бухгалтерии:
UPDATE STATISTICS [_Document123] WITH FULLSCAN;
DBCC FREEPROCCACHE;
%AppData%\1C\1cv8 и %LocalAppData%\1C\1cv8. Часто устаревшие пользовательские настройки динамических списков и форм подбора провоцируют утечку памяти при выполнении поиска.Таким образом, сочетание установки 64-битного клиента 1С, регулярного обслуживания СУБД и грамотной граничной выборки в запросах подбора полностью решает проблему с нехваткой памяти.