Разработка и отладка расширений в среде «1С:Предприятие 8.3» часто сопряжена с рутинным процессом: внесли изменение — перезапустили сеанс — дошли до нужной формы — проверили. Это отнимает значительное количество времени, особенно на тяжелых конфигурациях. В этой статье мы подробно разберем, почему платформа ведет себя именно так, и какие существуют хитрости, позволяющие минимизировать количество перезапусков или вовсе обойтись без них на этапе написания логики.
Для начала проанализируем ситуацию с технической точки зрения. Основная причина, по которой нельзя обновить код расширения «на лету», заключается в механизме компиляции модулей. При запуске клиентского сеанса или инициализации серверного вызова платформа компилирует модули расширения и основной конфигурации в промежуточный байт-код. Этот код кэшируется в оперативной памяти процесса.
В текущей архитектуре 1С:Предприятие не предусмотрен механизм динамической перекомпиляции конкретного модуля внутри активного сеанса. Любое изменение в структуре метаданных или программном коде расширения требует инвалидации (сброса) этого кэша и его повторного построения. Именно этот процесс и происходит при перезапуске сеанса.
Рассмотрим наиболее популярный среди опытных разработчиков метод. Вместо того чтобы сразу писать сложную логику в модулях расширения, мы можем вынести ее во внешнюю обработку (.epf).
Алгоритм действий следующий:
Проанализируем пример кода в расширении, который вызывает внешнюю обработку:
&НаКлиенте
Процедура ВыполнитьОтладку(Команда)
ИмяФайла = "C:\Debug\MyLogic.epf";
ОбработкаОбъект = ВнешниеОбработки.Создать(ИмяФайла, Ложь);
ОбработкаОбъект.ВыполнитьДействие();
КонецПроцедуры
Этот метод позволяет отлаживать сложные алгоритмы расчета, заполнения документов или формирования отчетов без единого перезапуска. После того как логика полностью отлажена и проверена во внешней обработке, мы просто копируем готовый код в соответствующий модуль расширения.
Разберем более экзотичный, но крайне эффективный метод, предложенный участниками сообщества. Мы можем хранить программный код в обычном текстовом файле (например, .txt или .bsl) и считывать его прямо во время выполнения процедуры расширения с помощью функции Выполнить().
Посмотрим на пример реализации:
&НаСервере
Процедура ВыполнитьАлгоритмИзФайла()
ТекстКода = "";
ЧтениеТекста = Новый ЧтениеТекста("C:\1c_code\logic.txt", КодировкаТекста.UTF8);
ТекстКода = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
// Выполняем динамический код в контексте текущего модуля
Выполнить(ТекстКода);
КонецПроцедуры
Важные нюансы этого метода:
Выполнить(). Вам будут доступны все локальные переменные и экспортные процедуры конфигурации.Выполнить() может быть заблокирована или ограничена. Для отладки рекомендуется временно снять флаг Безопасный режим.Сообщить() это идеальный вариант.Если вы привыкли работать в классическом Конфигураторе, возможно, стоит взглянуть на EDT. В отличие от стандартного инструментария, среда разработки на базе Eclipse предлагает механизм «быстрого обновления».
Хотя технически платформа все равно обновляет сеанс, EDT делает это максимально автоматизировано. При сохранении изменений в коде система в фоновом режиме может обновить расширение в базе и перезапустить отладочный процесс. Это значительно экономит «клики» пользователя. Кроме того, EDT лучше справляется с инкрементальной сборкой проекта.
Выясним, как современные DevOps-практики помогают в отладке. Использование инструментов сценарного тестирования, таких как Vanessa-Automation или xUnitFor1C, позволяет автоматизировать путь до точки проверки.
Вместо ручного повторения действий после перезапуска, мы пишем простой сценарий на языке Gherkin:
После изменения кода в расширении вы запускаете этот скрипт одной кнопкой. Система сама перезайдет в базу и выполнит все действия за вас. Это превращает утомительный перезапуск в короткую паузу на кофе.
Иногда перезапуск нужен только для того, чтобы изменить значение переменной или условие Если...Тогда. Напомним, что в 1С есть механизм, отдаленно напоминающий Edit and Continue.
Во время остановки на точке останова (breakpoint) вы можете открыть окно Табло или Вычислить выражение (Shift+F9) и принудительно изменить значение любой переменной.
Например, если у вас в коде ошибка в условии:
Если Скидка > 100 Тогда // Ошибочно написали 100 вместо 10
// Логика
КонецЕсли;
Вы можете в момент отладки вычислить выражение Скидка = 5 (присваивание) или просто изменить состояние объектов в базе, чтобы проверить, как поведет себя код дальше, не исправляя само условие немедленно. Это позволяет дойти до конца сложной цепочки действий за один сеанс.
Проанализируем еще несколько приемов, которые сделают жизнь разработчика легче:
/ClearCache гарантирует, что вы увидите актуальный код.Сервис — Параметры — Запуск 1С:Предприятия — Дополнительные.Подведем итог: Прямого способа обновить код модуля расширения без перезапуска сеанса в 1С на данный момент не существует из-за архитектурных особенностей платформы. Однако, используя вынос логики во внешние файлы, динамическое выполнение кода через Выполнить() и инструменты автоматизации, вы можете сократить время ожидания в несколько раз и сделать процесс разработки более комфортным.