Конфигуратор 1С: Почему он "съедает" всю оперативную память и как с этим бороться?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← К списку

Мы все сталкивались с этой проблемой: запускаем конфигуратор 1С, начинаем работать, а он вдруг начинает потреблять гигабайты оперативной памяти, зависает или вовсе вылетает с ошибкой "Недостаточно памяти". Особенно остро эта ситуация проявляется в последних версиях платформы, таких как 8.3.27. Давайте вместе разберем, почему это происходит, и какие шаги мы можем предпринять для решения или хотя бы смягчения этой неприятной особенности.

Проблема глобального поиска и утечек памяти

Одной из самых частых причин аномального потребления памяти в конфигураторе является глобальный поиск. Мы выяснили, что эта проблема воспроизводится в различных версиях платформы, включая 8.3.24, 8.3.25 и 8.3.27. Рассмотрим подробнее, как это происходит.

Когда мы запускаем глобальный поиск, например, по строке "ном" с установленными всеми галками в большой конфигурации (например, 1С:ERP), мы наблюдаем странное поведение. Сначала поиск идет относительно нормально, и потребление памяти растет умеренно (например, до 2 ГБ). Однако, дойдя до определенного процента выполнения (часто около 38%), поиск зависает, конфигуратор перестает отвечать, и тут же начинается резкое, неконтролируемое потребление оперативной памяти. В ходе таких экспериментов конфигуратор мог "съесть" 51 ГБ, а в особо "удачных" случаях — до 158 ГБ оперативной памяти (включая файл подкачки), после чего благополучно падал.

Проанализируем ситуацию: причиной такого поведения, скорее всего, является утечка памяти где-то на уровне C++ кода самой платформы 1С. Конфигуратор, по всей видимости, неэффективно обрабатывает или хранит промежуточные результаты поиска, особенно когда количество найденных результатов очень велико. Несмотря на то, что сама конфигурация (.cf файл) может весить несколько гигабайт, и большая часть из них — бинарные данные, в которых нет текста для поиска, конфигуратор все равно пытается загрузить что-то в память в огромных объемах.

Мы можем предложить несколько путей решения или обхода этой проблемы:

  1. Ограничение поиска: Подумайте, есть ли смысл в поиске, который выдает десятки или сотни тысяч результатов? Возможно, стоит ограничивать количество выдаваемых результатов на уровне платформы.
  2. Последовательное чтение: Для очень больших текстовых файлов или XML, которые не помещаются целиком в память, в программировании принято использовать последовательное чтение. В 1С для таких ситуаций существуют методы ЧтениеТекста() и ЗаписьТекста(). Возможно, внутренний механизм глобального поиска мог бы использовать подобный подход.
  3. Разделение конфигураций: Если вы работаете с несколькими крупными конфигурациями одновременно, постарайтесь открывать их по очереди или использовать разные экземпляры конфигуратора, перезапуская их между ресурсоемкими операциями.

Проблемы с большими бинарными данными в макетах

Еще одна выявленная проблема связана с неэффективной работой 1С с большими объемами данных внутри объектов типа ТабличныйДокумент (макеты). Мы видим, что если в макете хранится очень большая строка, например, данные в формате Base64, это может привести к зависаниям, даже если общий объем текста составляет всего 1 МБ.

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

Потребление памяти при сравнении и проверке конфигураций

Мы также заметили, что конфигуратор 1С 8.3.27 (и более ранние версии) не освобождает память после выполнения тяжелых операций, таких как загрузка изменений, обновление конфигурации базы данных или сравнение конфигураций. Это приводит к постепенному накоплению потребляемой памяти, и в конечном итоге к ошибке "Недостаточно памяти", если не перезапускать конфигуратор между такими операциями.

Кроме того, при проверке конфигурации в расширенном режиме, особенно после добавления ускорения проверки модулей, мы можем столкнуться с ситуацией, когда вся операционная система (включая Chrome, Telegram и другие приложения) подвисает на 10 секунд. Это может быть связано с тем, что 1С активно использует все доступные ресурсы для проверки, что приводит к временной нехватке ресурсов для других приложений.

В качестве временного решения, мы настоятельно рекомендуем регулярно перезапускать конфигуратор после каждой крупной операции (сравнение, объединение, проверка конфигурации), чтобы очистить занятую память.

Общие рекомендации и методы оптимизации

Помимо специфических проблем, рассмотрим общие подходы к оптимизации работы с памятью в 1С:

  1. Переход на 64-разрядную версию платформы 1С: Это фундаментальный шаг. 32-разрядные приложения ограничены 2-4 ГБ адресного пространства, тогда как 64-разрядная платформа может использовать значительно больший объем оперативной памяти, доступной в вашей системе. Если вы еще не перешли, настоятельно рекомендуем это сделать.
  2. Увеличение доступной адресной памяти для 32-битных систем (для экстренных случаев): Для 32-битных операционных систем можно попробовать принудительно увеличить объем адресной памяти, доступной приложениям, с помощью команды bcdedit. Например:
    
    bcdedit /set increaseuserva 3072
    
    Однако, мы должны предупредить, что это рискованный метод, который может замедлить или даже привести к сбою работы операционной системы. Используйте его только в крайних случаях и всегда возвращайте значение по умолчанию после выполнения операции.
  3. Размещение системных каталогов 1С на RAM-диске: Этот метод может ускорить первый запуск конфигуратора за счет сохранения кэша конфигурации на RAM-диске, что значительно быстрее, чем чтение с обычного жесткого диска.
  4. Оптимизация кода конфигурации:
    • Удаление дублирующегося кода: Повторяющийся код увеличивает объем модулей и усложняет компиляцию.
    • Разбиение крупных процедур и функций: Слишком большие процедуры могут быть сложны для анализа и компиляции.
    • Использование стандартных библиотек: Стандартные функции платформы часто оптимизированы лучше, чем самописные аналоги.
    • Минимизация запросов к базе данных: Старайтесь избегать избыточных запросов и получать данные за один раз.
    • Создание индексов: Правильное индексирование таблиц базы данных значительно ускоряет выполнение запросов.
  5. Управление объектами метаданных:
    • Оптимизация структуры справочников и документов: Избегайте слишком большого количества реквизитов, особенно со сложными типами данных, если они не используются.
    • Использование правильных типов данных: Выбирайте наиболее подходящие и компактные типы данных для реквизитов.
    • Удаление ненужных реквизитов: Лишние реквизиты увеличивают объем данных и замедляют работу.
  6. Свертка информационной базы: Уменьшение объема данных в информационной базе (например, путем архивирования старых периодов) может облегчить работу программы и конфигуратора.
  7. Выборочное сравнение конфигураций: При работе с хранилищем конфигурации, если нам нужно найти изменения только в определенном объекте метаданных, мы можем использовать функцию Сравнить выборочно с объектом хранилища. Это значительно быстрее полного сравнения конфигураций, так как сравниваются только свойства указанного объекта.
  8. Мониторинг производительности и анализ технологического журнала: Для выявления конкретных причин проблем с памятью и производительностью, мы рекомендуем использовать технологический журнал 1С и другие инструменты мониторинга. Они помогут нам точно определить, какие операции вызывают наибольшее потребление ресурсов.
  9. Закрытие других приложений: Во время выполнения ресурсоемких операций в 1С (например, глобальный поиск, сравнение больших конфигураций) мы советуем закрывать все ненужные приложения, чтобы освободить максимальный объем оперативной памяти для конфигуратора.
  10. Проблемы с зависанием при запуске: Долгий первый запуск 1С с новой или значительно измененной конфигурацией является нормальным процессом, связанным с кэшированием данных и компиляцией модулей. Если же эта проблема сохраняется постоянно, это может указывать на излишнюю сложность конфигурации или неправильную архитектуру. В таких случаях мы рекомендуем отключать необязательные алгоритмы и неиспользуемые сетевые запросы при запуске.

Официальные оптимизации в версии 8.3.27

Важно отметить, что разработчики 1С постоянно работают над оптимизацией платформы. В версии 8.3.27 были реализованы следующие улучшения:

  1. Ускорение поиска ссылок на объект конфигурации: Заявлено ускорение в 3,5 раза, что должно положительно сказаться на работе с большими конфигурациями.
  2. Уменьшение времени первого запуска тонкого клиента: Оптимизировано время первого запуска тонкого клиента (как в режиме предприятия, так и в конфигураторе) в файловом варианте после операций создания новой ИБ, загрузки .dt/.cf файлов, обновления базы и очистки кэша. Тесты на 1С:ERP показали ускорение в 3,5 раза.
  3. Оптимизация работы с хранилищем двоичных данных: Улучшена скорость записи во встроенное хранилище двоичных данных, что заметно при создании больших файлов или множества маленьких.
  4. Изменение процесса записи регистра сведений через менеджер записи: Теперь при изменении только ресурсов и/или реквизитов записи регистра сведений через менеджер записи производится только одна операция — обновление, вместо двух (удаление и добавление). Это повышает производительность и влияет на вызов обработчика ПриЗаписи(Отказ, Замещение).
  5. Оптимизация полнотекстового поиска: Снижено потребление оперативной памяти при выполнении операций формирования и слияния индексов полнотекстового поиска. Для полного использования преимуществ может потребоваться перестроить индекс новой версией платформы.
  6. Улучшенная работа с кластером серверов: Появилась возможность подключать заданных клиентов к выбранным серверам кластера и управлять перезапуском рабочих процессов. Также Дата акселератор теперь может хранить данные на диске, что решает проблемы с потерей данных после сбоев и позволяет хранить объем данных, превышающий объем оперативной памяти.
  7. Увеличение количества записей в табличных частях: Увеличено количество записей, которые могут содержаться в табличных частях объектов конфигурации, и появилась возможность самостоятельно задавать длину номера строки.

Подтверждение проблем и дополнительные наблюдения

Несмотря на официальные оптимизации, мы видим, что проблемы с памятью в конфигураторе 1С 8.3.27 продолжают проявляться. Форумы подтверждают, что конфигуратор по-прежнему "безобразно обращается с памятью", не освобождая ее после тяжелых операций, что может приводить к падениям. Проблема с "подвисанием" операционной системы на 10 секунд при проверке конфигурации (расширенный режим) также подтверждается.

Интересное наблюдение: версия 8.3.27.1644 оказалась "провальной" из-за критических проблем с производительностью и надежностью, включая крайне медленное сохранение и обновление конфигураций. Мы рекомендуем использовать версию 8.3.27.1606 как более стабильную, если есть такая возможность.

В заключение, мы видим, что проблема потребления памяти конфигуратором 1С является комплексной. Несмотря на усилия разработчиков, нам, как пользователям и разработчикам, часто приходится применять различные "костыли и велосипеды", чтобы обеспечить стабильную работу. Мы надеемся, что представленные рекомендации помогут вам сделать вашу работу с конфигуратором 1С более комфортной и эффективной.

← К списку