Как обновить код расширения в сеансе 1С без перезапуска программы?

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

Разработка и отладка расширений в среде «1С:Предприятие 8.3» часто сопряжена с рутинным процессом: внесли изменение — перезапустили сеанс — дошли до нужной формы — проверили. Это отнимает значительное количество времени, особенно на тяжелых конфигурациях. В этой статье мы подробно разберем, почему платформа ведет себя именно так, и какие существуют хитрости, позволяющие минимизировать количество перезапусков или вовсе обойтись без них на этапе написания логики.

Почему 1С требует перезапуск сеанса?

Для начала проанализируем ситуацию с технической точки зрения. Основная причина, по которой нельзя обновить код расширения «на лету», заключается в механизме компиляции модулей. При запуске клиентского сеанса или инициализации серверного вызова платформа компилирует модули расширения и основной конфигурации в промежуточный байт-код. Этот код кэшируется в оперативной памяти процесса.

В текущей архитектуре 1С:Предприятие не предусмотрен механизм динамической перекомпиляции конкретного модуля внутри активного сеанса. Любое изменение в структуре метаданных или программном коде расширения требует инвалидации (сброса) этого кэша и его повторного построения. Именно этот процесс и происходит при перезапуске сеанса.

Способ 1. Использование внешних обработок как «полигона»

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

Алгоритм действий следующий:

  1. Создаем внешнюю обработку и описываем в ее модуле объекта или модуля формы необходимый алгоритм.
  2. В расширении оставляем только «вызов» этой обработки.
  3. При изменении кода в обработке нам не нужно перезапускать весь сеанс 1С — достаточно закрыть форму обработки и открыть файл заново (или перечитать его программно).

Проанализируем пример кода в расширении, который вызывает внешнюю обработку:


&НаКлиенте
Процедура ВыполнитьОтладку(Команда)
    ИмяФайла = "C:\Debug\MyLogic.epf";
    ОбработкаОбъект = ВнешниеОбработки.Создать(ИмяФайла, Ложь);
    ОбработкаОбъект.ВыполнитьДействие();
КонецПроцедуры

Этот метод позволяет отлаживать сложные алгоритмы расчета, заполнения документов или формирования отчетов без единого перезапуска. После того как логика полностью отлажена и проверена во внешней обработке, мы просто копируем готовый код в соответствующий модуль расширения.

Способ 2. Динамическое выполнение кода через «Выполнить()»

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

Посмотрим на пример реализации:


&НаСервере
Процедура ВыполнитьАлгоритмИзФайла()
    ТекстКода = "";
    ЧтениеТекста = Новый ЧтениеТекста("C:\1c_code\logic.txt", КодировкаТекста.UTF8);
    ТекстКода = ЧтениеТекста.Прочитать();
    ЧтениеТекста.Закрыть();
    
    // Выполняем динамический код в контексте текущего модуля
    Выполнить(ТекстКода);
КонецПроцедуры

Важные нюансы этого метода:

Способ 3. Переход на среду разработки EDT (Enterprise Development Tools)

Если вы привыкли работать в классическом Конфигураторе, возможно, стоит взглянуть на EDT. В отличие от стандартного инструментария, среда разработки на базе Eclipse предлагает механизм «быстрого обновления».

Хотя технически платформа все равно обновляет сеанс, EDT делает это максимально автоматизировано. При сохранении изменений в коде система в фоновом режиме может обновить расширение в базе и перезапустить отладочный процесс. Это значительно экономит «клики» пользователя. Кроме того, EDT лучше справляется с инкрементальной сборкой проекта.

Способ 4. Использование инструментов автоматизации (Vanessa-Automation)

Выясним, как современные DevOps-практики помогают в отладке. Использование инструментов сценарного тестирования, таких как Vanessa-Automation или xUnitFor1C, позволяет автоматизировать путь до точки проверки.

Вместо ручного повторения действий после перезапуска, мы пишем простой сценарий на языке Gherkin:

  1. Открыть 1С.
  2. Открыть документ "Реализация товаров и услуг" №123.
  3. Нажать кнопку "Рассчитать скидки".

После изменения кода в расширении вы запускаете этот скрипт одной кнопкой. Система сама перезайдет в базу и выполнит все действия за вас. Это превращает утомительный перезапуск в короткую паузу на кофе.

Способ 5. Отладка через «Табло» и «Вычислить выражение»

Иногда перезапуск нужен только для того, чтобы изменить значение переменной или условие Если...Тогда. Напомним, что в 1С есть механизм, отдаленно напоминающий Edit and Continue.

Во время остановки на точке останова (breakpoint) вы можете открыть окно Табло или Вычислить выражение (Shift+F9) и принудительно изменить значение любой переменной.

Например, если у вас в коде ошибка в условии:


Если Скидка > 100 Тогда // Ошибочно написали 100 вместо 10
    // Логика
КонецЕсли;

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

Дополнительные советы по ускорению процесса

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

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

← На главную