При разработке расширений для крупных типовых конфигураций, таких как 1С:ERP Управление предприятием, 1С:Комплексная автоматизация или 1С:Управление торговлей, программисты часто сталкиваются со следующей проблемой: даже при незначительном изменении кода (например, добавлении одного пробела или комментария) в модуле заимствованного объекта конфигуратор зависает на несколько минут. При этом в диспетчере задач операционной системы наблюдается картина, когда одно из ядер процессора загружено на 100%, а дисковая активность и потребление оперативной памяти остаются на минимальном уровне. Это происходит как на файловых базах, так и на клиент-серверных вариантах работы, причем даже на мощных современных компьютерах, оснащенных быстрыми твердотельными накопителями.
Проанализируем ситуацию, выясним причины такого поведения платформы 1С:Предприятие и разберем практические способы решения этой проблемы, которые помогут вернуть скорость разработки к комфортным показателям.
Выясним причину долгого сохранения изменений. Начиная с режима совместимости 8.3.12, в расширениях появилась возможность существенно менять структуру хранения данных (добавлять реквизиты в заимствованные объекты, создавать собственные справочники, документы и регистры внутри расширения). Для обеспечения целостности базы данных платформе требуется тщательно проверять совместимость структуры метаданных расширения с основной конфигурацией.
При сохранении изменений в расширении платформа делит этот процесс на два сценария:
Алгоритм предварительного анализа платформы работает достаточно грубо. Когда мы заимствуем форму, модуль менеджера или модуль объекта крупного документа (например, заказ клиента или приобретение товаров и услуг в ERP) и вносим туда любые текстовые изменения, платформа помечает весь заимствованный объект как измененный. В результате запускается полный цикл сверки структуры метаданных расширения с колоссальной по объему основной конфигурацией ERP.
Процесс сверки выполняется в один поток (в один процесс конфигуратора), поэтому загружается ровно одно ядро процессора. Частота процессора становится главным лимитирующим фактором, и даже самый быстрый SSD не способен ускорить эту чисто вычислительную операцию сопоставления деревьев метаданных. Также на это накладываются особенности сборки рантайма C++ в новых версиях платформы 1С (начиная с 8.3.12), где некоторые внутренние операции компиляции и валидации стали выполняться медленнее.
Рассмотрим подробнее самый надежный, правильный и рекомендуемый стандарт разработки 1С для минимизации времени сохранения расширений. Изменение текста общих модулей в расширении не инициирует проверку изменения структуры данных конфигурации, поэтому сохранение происходит практически мгновенно.
Разберем этот метод по шагам на практическом примере. Допустим, нам необходимо переопределить обработчик события при проведении документа в расширении.
Вместо того чтобы писать весь исполняемый код непосредственно в заимствованном модуле объекта документа, мы выполним следующие действия:
мдРасширение_ОбработчикиСобытий. Обязательно установим для него свойства Сервер и Вызов сервера (в зависимости от контекста выполнения).Посмотрим на пример кода в модуле объекта документа:
&После("ОбработкаПроведения")
Процедура мд_ОбработкаПроведенияПосле(Отказ, РежимПроведения)
// Передаем управление в наш общий модуль расширения
мдРасширение_ОбработчикиСобытий.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ, РежимПроведения);
КонецПроцедуры
Теперь перейдем в наш созданный общий модуль мдРасширение_ОбработчикиСобытий и опишем там всю необходимую бизнес-логику:
Процедура ОбработкаПроведенияДокумента(ДокументОбъект, Отказ, РежимПроведения) Экспорт
// Проверим, заполнены ли важные реквизиты
Если Не ЗначениеЗаполнено(ДокументОбъект.Контрагент) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не заполнен контрагент!", ДокументОбъект, "Контрагент");
Отказ = Истина;
Возврат;
КонецЕсли;
// Здесь размещаем весь остальной сложный код доработки
// ...
КонецПроцедуры
При таком подходе мы изменяем код модуля объекта документа всего один раз — при создании вызова. Все последующие многочисленные правки, отладку и доработку алгоритма мы будем производить внутри общего модуля мдРасширение_ОбработчикиСобытий. Так как общий модуль не привязан к структуре конкретных таблиц базы данных, сохранение конфигурации базы данных при редактировании его кода будет занимать не более 1–2 секунд вместо мучительных нескольких минут.
Проанализируем состав объектов в вашем расширении. Чем больше "тяжелых" объектов метаданных (документов с десятками табличных частей, сложных регистров) перенесено в расширение, тем дольше платформа выполняет валидацию структуры при каждом обновлении конфигурации базы данных.
Рекомендуется придерживаться следующих правил "гигиены" расширений:
В некоторых случаях, если ваше расширение не использует специфические возможности последних версий платформы (такие как добавление собственных реквизитов к типовым объектам, создание собственных регистров сведений в расширении и т.д.), для ускорения разработки в файловой базе можно временно понизить режим совместимости самого расширения.
Разберем этот шаг:
Режим совместимости.8.3.12 (например, 8.3.11).При отключенном или пониженном режиме совместимости платформа не производит глубокую проверку ссылочной целостности и изменений физической структуры таблиц для объектов расширения. Это мгновенно решает проблему зависания при сохранении. Важно: помните, что перед переносом расширения в рабочую базу (особенно если рабочая база ERP работает на высоком режиме совместимости) режим совместимости расширения необходимо вернуть в исходное состояние и провести финальное тестирование.
Поскольку операция проверки метаданных является строго однопоточной, классическое масштабирование за счет увеличения количества ядер процессора (например, покупка многоядерных серверных решений с относительно низкой частотой ядер) не даст никакого прироста производительности в Конфигураторе 1С.
Для комфортной работы программиста с крупными конфигурациями процессор рабочего компьютера должен обладать максимальной производительностью на одно ядро (Single-Thread Performance). При выборе оборудования обратите внимание на следующие характеристики: