В чём смысл кода «Если ЭтоОтладка() Тогда Возврат» во внешних обработках 1С?

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

При изучении чужого кода во внешних обработках или печатных формах программисты часто натыкаются на конструкцию в самом начале процедуры ПриОткрытии, которая прерывает выполнение кода, если функция ЭтоОтладка() возвращает «Истина». На первый взгляд это кажется нелогичным: зачем писать код, который специально не должен выполняться? В этой статье мы подробно разберем, какой «сакральный смысл» скрывается за этими строками, как это связано с Библиотекой стандартных подсистем (БСП) и как этот прием упрощает жизнь разработчику.

Контекст использования: Библиотека стандартных подсистем

Прежде всего, нам необходимо понять среду, в которой работает такой код. В современных конфигурациях (таких как 1С:ERP, 1С:Управление торговлей 11 или 1С:Бухгалтерия 3.0) внешние обработки крайне редко запускаются пользователем через меню «Файл — Открыть». Обычно они регистрируются в справочнике Дополнительные отчеты и обработки.

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

Разбор функции определения режима отладки

Давайте проанализируем типовую реализацию функции, которая определяет, находится ли программа в режиме разработки или запущена пользователем в рабочей базе. Рассмотрим пример кода:


Функция ЭтоОтладка()
    
    // Проверяем, переданы ли параметры штатным механизмом БСП
    ЭтоОтладка = ( Не Параметры.Свойство("ДополнительнаяОбработкаСсылка") или 
                   Не ЗначениеЗаполнено(Параметры.ДополнительнаяОбработкаСсылка) );
    
    // Если мы открыли обработку вручную (через Файл -> Открыть),
    // то свойство "ДополнительнаяОбработкаСсылка" будет отсутствовать.
    Если ЭтоОтладка Тогда
        // Подготавливаем форму для удобной работы программиста
        ЗаполнитьФормуОтладки();
    КонецЕсли;
    
    Возврат ЭтоОтладка;
        
КонецФункции

В этом фрагменте мы видим, что переменная ЭтоОтладка принимает значение «Истина», если обработка открыта напрямую как файл. В этом случае вызывается вспомогательная процедура ЗаполнитьФормуОтладки(), а затем функция возвращает результат в основную процедуру.

Почему важна команда Возврат в процедуре ПриОткрытии?

Теперь разберем основной вопрос: зачем в процедуре ПриОткрытии после вызова этой функции стоит оператор Возврат? Посмотрим на структуру события:


Процедура ПриОткрытии(Отказ)
    
    Если ЭтоОтладка() Тогда
        // Мы подготовили тестовые данные и выходим, 
        // чтобы не выполнять «тяжелую» или «опасную» логику
        Возврат;
    КонецЕсли;

    // Ниже идет стандартная логика БСП
    СформироватьПечатнуюФормуПоПараметрам(Параметры.Источник);
    // ... дальнейший код
КонецПроцедуры

Проанализируем ситуацию: если мы не напишем Возврат, выполнение кода пойдет дальше. Штатный код БСП обычно рассчитывает на то, что в Параметры переданы ссылки на объекты базы (например, ссылка на документ, который нужно напечатать). Если мы открыли файл вручную, этих параметров нет. Программа попытается обратиться к Параметры.ДополнительнаяОбработкаСсылка или другим ключам и неминуемо «вылетит» с ошибкой «Поле объекта не обнаружено».

Таким образом, сакральный смысл заключается в «коротком замыкании» алгоритма: мы выполняем только ту часть кода, которая нужна нам для тестирования, и полностью игнорируем ту часть, которая предназначена для работы внутри подсистемы БСП.

Роль процедуры ЗаполнитьФормуОтладки()

Разберем подробнее, что обычно происходит внутри ЗаполнитьФормуОтладки(). Это место, где программист создает «имитацию» реальной работы. Вместо того чтобы каждый раз выбирать документ в интерфейсе, разработчик может жестко прописать ссылку на нужный объект.


Процедура ЗаполнитьФормуОтладки()
    
    // Пример: находим конкретный документ в тестовой базе
    ТестоваяСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("00001", ТекущаяДата());
    
    // Заполняем реквизиты формы значениями для тестирования
    Объект.СсылкаНаОбъект = ТестоваяСсылка;
    Объект.Организация = ТестоваяСсылка.Организация;
    
    // Можно также сымитировать команды печати
    КомандыПечати = ПолучитьСписокДоступныхКоманд();
    
КонецПроцедуры

Это позволяет использовать метод RAD (Rapid Application Development) — быстрой разработки. Программисту достаточно нажать Ctrl+S в конфигураторе и переоткрыть файл в режиме предприятия, чтобы сразу увидеть результат работы алгоритма на конкретных данных, не тратя время на регистрацию обработки в справочнике и долгий путь через интерфейс пользователя.

Защита данных и предотвращение ошибок

Рассмотрим еще один важный аспект. Часто в процедуре ПриОткрытии или в связанных с ней модулях вызываются длительные процессы (например, АхалайМахалай_В_течении5мин(), как шутливо заметили в обсуждении). Это могут быть запросы к внешним системам, расчет итогов или массовое начисление зарплаты.

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

  1. Потеря времени: Разработчик будет ждать завершения тяжелого запроса, который ему сейчас не нужен для отладки интерфейса.
  2. Порча данных: Если код содержит запись в базу, запуск его с «пустыми» параметрами может привести к записи некорректных данных.
  3. Блокировка интерфейса: Ошибки в основном потоке выполнения могут привести к невозможности закрыть форму или корректно завершить сеанс.

Именно поэтому проверка Если ЭтоОтладка() Тогда Возврат; служит своеобразным предохранителем, разделяющим «боевой» код и «песочницу» разработчика.

Подведем итоги

Мы выяснили, что использование подобного паттерна — это признак профессионального подхода к разработке под БСП. Рассмотрим основные преимущества, которые мы получаем:

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

← На главную