Почему долго сохраняется расширение в 1С и как ускорить этот процесс?

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

При разработке расширений для крупных типовых конфигураций, таких как 1С:ERP Управление предприятием, 1С:Комплексная автоматизация или 1С:Управление торговлей, программисты часто сталкиваются со следующей проблемой: даже при незначительном изменении кода (например, добавлении одного пробела или комментария) в модуле заимствованного объекта конфигуратор зависает на несколько минут. При этом в диспетчере задач операционной системы наблюдается картина, когда одно из ядер процессора загружено на 100%, а дисковая активность и потребление оперативной памяти остаются на минимальном уровне. Это происходит как на файловых базах, так и на клиент-серверных вариантах работы, причем даже на мощных современных компьютерах, оснащенных быстрыми твердотельными накопителями.

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

Почему это происходит? Разбор внутренних механизмов платформы

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

При сохранении изменений в расширении платформа делит этот процесс на два сценария:

  1. Быстрое применение изменений. Происходит, когда изменения затрагивают только программный код, не влияющий на структуру базы данных (например, общие модули расширения).
  2. Медленное применение изменений (полная проверка метаданных). Запускается, когда платформа предполагает, что структура данных могла измениться.

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

Процесс сверки выполняется в один поток (в один процесс конфигуратора), поэтому загружается ровно одно ядро процессора. Частота процессора становится главным лимитирующим фактором, и даже самый быстрый SSD не способен ускорить эту чисто вычислительную операцию сопоставления деревьев метаданных. Также на это накладываются особенности сборки рантайма C++ в новых версиях платформы 1С (начиная с 8.3.12), где некоторые внутренние операции компиляции и валидации стали выполняться медленнее.

Решение 1. Архитектурный подход: вынос логики в Общие модули

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

Разберем этот метод по шагам на практическом примере. Допустим, нам необходимо переопределить обработчик события при проведении документа в расширении.

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

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

Посмотрим на пример кода в модуле объекта документа:


&После("ОбработкаПроведения")
Процедура мд_ОбработкаПроведенияПосле(Отказ, РежимПроведения)
    
    // Передаем управление в наш общий модуль расширения
    мдРасширение_ОбработчикиСобытий.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ, РежимПроведения);
    
КонецПроцедуры

Теперь перейдем в наш созданный общий модуль мдРасширение_ОбработчикиСобытий и опишем там всю необходимую бизнес-логику:


Процедура ОбработкаПроведенияДокумента(ДокументОбъект, Отказ, РежимПроведения) Экспорт
    
    // Проверим, заполнены ли важные реквизиты
    Если Не ЗначениеЗаполнено(ДокументОбъект.Контрагент) Тогда
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не заполнен контрагент!", ДокументОбъект, "Контрагент");
        Отказ = Истина;
        Возврат;
    КонецЕсли;
    
    // Здесь размещаем весь остальной сложный код доработки
    // ...
    
КонецПроцедуры

При таком подходе мы изменяем код модуля объекта документа всего один раз — при создании вызова. Все последующие многочисленные правки, отладку и доработку алгоритма мы будем производить внутри общего модуля мдРасширение_ОбработчикиСобытий. Так как общий модуль не привязан к структуре конкретных таблиц базы данных, сохранение конфигурации базы данных при редактировании его кода будет занимать не более 1–2 секунд вместо мучительных нескольких минут.

Решение 2. Минимизация состава заимствованных объектов

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

Рекомендуется придерживаться следующих правил "гигиены" расширений:

Решение 3. Локальное понижение режима совместимости расширения

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

Разберем этот шаг:

  1. Откройте свойства вашего расширения в дереве конфигурации.
  2. Найдите свойство Режим совместимости.
  3. Попробуйте установить его в значение ниже 8.3.12 (например, 8.3.11).

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

Решение 4. Оптимизация аппаратной части рабочего места разработчика

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

Для комфортной работы программиста с крупными конфигурациями процессор рабочего компьютера должен обладать максимальной производительностью на одно ядро (Single-Thread Performance). При выборе оборудования обратите внимание на следующие характеристики:

← На главную