1С и ресурсы сервера

Недавно столкнулся с ситуацией: процесс 1С после выполнения довольно массивной обработки съедал более 1 ГБ памяти. Это было недопустимо и я начал искать проблемные места в коде. После операций с замером производительности кода и поиска в сети информации по проблемам с освобождением памяти в 1С нашел у себя в коде «уязвимые» места, после исправления которых результат выполнения обработки занимал не более 100 МБ. Вот список из некоторых уязвимых мест, на которых 1С загребает себе памяти:

  1. Доступ к реквизитам объекта, полученного запросом, через точку. В моей конфигурации справочник «Номенклатура» достаточно объемный объект. При написании запроса, я решил схитрить и выбирать реквизиты не запросом, а через точку. В результате обманул сам себя. При доступе через точку, 1С загружает себе в память весь объект и потом уже ищет значение нужного реквизита. Но потом он из памяти не очищается.
  2. Создание конструкций типа «Новый Массив», «Новый Структура», «Новый СписокЗначений» в цикле.Для каждого из них, 1С резервирует место в памяти и возвращает указатель на это место. И если переменная, в которую помещается данная конструкция не объявлена ​​в разделе переменных модуля или процедуры/функции — при следующей итерации выделяется новое место в памяти, а предыдущий указатель не затирается. Посчитайте количество итераций и получите объем лишней памяти.
  3. Запрос в цикле — знаю, что неправильно по методологии, по рукам можно получить, но в каждого бывают ситуации, когда обойти это ограничение трудно. Просто надо понимать, когда реализуешь запрос в цикле, то идет загромождения памяти процесса.

После всех моих операций по оптимизации мне вспомнилась история о 1 байт).