Переход с обычных форм на управляемое приложение в платформе «1С:Предприятие» часто вызывает у разработчиков легкое замешательство. Многие привычные инструменты, которые годами помогали нам быстро находить ошибки в режиме «Предприятия», либо изменили свое местоположение, либо вовсе исчезли. Одним из таких инструментов является системное «Табло».
В этой статье мы подробно разберем, как решить две важнейшие задачи, с которыми сталкивается программист при отладке сложных расчетов в управляемом приложении:
---
В обычных формах (в версиях платформы 7.7–8.1) в режиме Предприятия существовало встроенное системное окно «Табло». Оно позволяло разработчику или администратору «на лету» писать небольшие строки кода на встроенном языке, вычислять значения реквизитов и даже вызывать экспортные функции. С переходом на управляемые формы (начиная с версии 8.2) разработчики платформы приняли решение скрыть этот инструмент из пользовательского режима, оставив его исключительно прерогативой Конфигуратора.
Давайте выясним, как мы можем обойти это ограничение в современных реалиях.
Способ 1. Использование встроенного отладчика в Конфигураторе
Если мы ведем полноценную разработку, штатное «Табло» никуда не исчезло — оно просто переместилось в среду разработки. Мы можем использовать горячие клавиши Ctrl + Alt + W для вызова панели «Табло» или сочетание клавиш Shift + F9 для моментального вычисления выделенного выражения.
Однако здесь кроется важный нюанс управляемого приложения: большая часть сложных расчетов (проведение документов, расчет себестоимости, заполнение табличных частей) выполняется строго на стороне сервера. Чтобы Конфигуратор мог перехватывать эти серверные процедуры и выводить переменные в наше «Табло», на сервере 1С обязательно должен быть запущен режим отладки. Для этого служба ragent должна запускаться с параметром -debug. Если этого не сделать, точки останова на сервере просто не сработают.
Способ 2. Внешние обработки-аналоги
Что делать, если база находится на рабочем сервере (где отладка по соображениям производительности выключена), а нам крайне необходимо вычислить выражение прямо в режиме Предприятия? На помощь приходят внешние обработки, написанные сообществом разработчиков (например, различные вариации «Консоли кода» или «Табло для управляемых форм»).
Такие обработки используют системные функции встроенного языка Вычислить() и Выполнить(). Они позволяют написать произвольный алгоритм в текстовом поле на форме и выполнить его как на клиенте, так и на сервере.
---
Представим типичную ситуацию: вам необходимо протестировать сложный алгоритм расчета себестоимости или распределения затрат. Вы хотите, чтобы этот экспериментальный алгоритм срабатывал только тогда, когда базу запускаете именно вы (или конкретный тестер), а все остальные пользователи продолжали работать со стабильным типовым кодом.
Один из участников обсуждения предложил использовать проверку через справочник групп доступа:
Если Справочники.ГруппыДоступа.Отладчик.Пользователи.Найти(ПараметрыСеанса.ТекущийПользователь, "Пользователь") = Неопределено Тогда
// Выполняем стандартный расчет
Иначе
// Выполняем экспериментальный расчет
КонецЕсли;
Давайте проанализируем этот подход. С одной стороны, он рабочий. С другой стороны, он заставляет нас создавать новые элементы метаданных (или завязываться на конкретные элементы справочников, жестко прописывая их имена в коде), писать запросы к табличным частям и захватывать объекты в хранилище конфигурации. Это долго и неэффективно. Рассмотрим более элегантные и быстрые альтернативы.
Платформа 1С позволяет передавать в сеанс любую текстовую строку при запуске системы с помощью ключа командной строки /C. Мы можем использовать этот параметр как готовый маркер отладки.
Давайте разберем этот процесс по шагам:
/C МойРежимОтладки
Если ПараметрыЗапуска = "МойРежимОтладки" Тогда
// Этот блок выполнится только в вашем сеансе
ВыполнитьЭкспериментальныйРасчет();
Иначе
// Обычная логика для всех остальных пользователей
ВыполнитьСтандартныйРасчет();
КонецЕсли;
Если вам требуется передавать несколько параметров одновременно, мы можем проверять вхождение подстроки с помощью функции СтрНайти():
Если СтрНайти(ПараметрыЗапуска, "ОтладкаРасчетов") > 0 Тогда
// Активируем отладочный режим
КонецЕсли;
Преимущества этого подхода очевидны:
ПараметрыЗапуска будут пустыми.Если вы работаете в конфигурации, созданной на базе Библиотеки Стандартных Подсистем (БСП), разработчики фирмы 1С уже позаботились о нас и внедрили системный параметр запуска.
Если в дополнительных параметрах запуска базы прописать команду РежимОтладки, БСП автоматически скорректирует поведение системы:
Что делать, если правила разработки на проекте категорически запрещают вносить какие-либо временные изменения в рабочий код («говнокод»), а отладить расчеты нужно прямо сейчас?
Давайте воспользуемся штатным и очень мощным механизмом Конфигуратора — точками останова с условием. Этот инструмент позволяет останавливать выполнение программы только при соблюдении заданного логического выражения.
Разберем, как его настроить:
Истина для остановки. Например:
ПараметрыСеанса.ТекущийПользователь.Имя = "Иванов" ИЛИ ПараметрыЗапуска = "Тест"
Теперь система будет останавливаться на этой строке только тогда, когда расчет выполняет пользователь «Иванов» или сеанс запущен со специальным параметром. Для всех остальных пользователей в системе не будет происходить никаких задержек, а вам не придется переживать, что вы забудете удалить отладочный код перед релизом.
Применяйте эти подходы на практике, комбинируйте их в зависимости от сложности задач, и процесс отладки в управляемых формах станет для вас быстрым, прозрачным и комфортным!