Почему в типовом коде 1С встречается оператор Возврат, после которого идет другой код?

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

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

Рассмотрим подробнее, зачем это нужно, как работают механизмы автоматизированной сборки и почему статический анализ кода не считает такие участки ошибочными.

Анализ исходного примера

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


Процедура ПечатьЧекаПослеЗаписиИзмененийЛокализация(ПараметрыОперацииФискализацииЧека)
    
    //++ Локализация
    ФорматноЛогическийКонтрольКлиентСервер.ПровестиФорматноЛогическийКонтроль(ПараметрыОперацииФискализацииЧека, ПараметрыКассыККМ.ИдентификаторУстройства);
    
    ВыполнитьДействиеПослеЗаписи(
                   Новый ОписаниеОповещения("ПробитьЧекПослеПроведения", ЭтотОбъект, ПараметрыОперацииФискализацииЧека),
                   НСтр("ru = 'Перед выполнением операции пробития чека не удалось провести документ.'"));
    
    Возврат;
    //-- Локализация
    
    //@skip-warning
    УстановитьФискальныйСтатусПробит();
    
КонецПроцедуры

В данном примере мы видим, что блок, помеченный комментариями //++ Локализация и //-- Локализация, полностью перехватывает управление и завершает работу процедуры. Код, находящийся ниже (УстановитьФискальныйСтатусПробит()), никогда не будет выполнен в данной версии конфигурации. Выясним причину такого архитектурного решения.

Причина 1: Технология автоматизированной сборки (Локализация)

Фирма «1С» использует технологию «мастер-конфигураций». Существует основная ветка разработки (Core), содержащая общую логику, и множество локальных веток (для Казахстана, Беларуси, ОАЭ и т.д.). Разберем по шагам, как происходит процесс формирования кода:

  1. Подмена логики: Когда для конкретной страны требуется иная последовательность действий (например, в РФ чек пробивается сразу, а в другой стране требуется дополнительный форматно-логический контроль), разработчики локализации вставляют свой блок кода.
  2. Сохранение структуры: Вместо того чтобы удалять «родной» код мастер-конфигурации, разработчики ставят оператор Возврат. Это делается для минимизации конфликтов при последующих обновлениях. Когда выйдет новая версия «мастер-конфигурации», скрипты автоматического сравнения и объединения легко сопоставят блоки кода, так как структура модуля не изменилась.
  3. Скрипты препроцессора: В процессе сборки финального продукта специальные инструменты (скрипты) могут анализировать эти блоки. В некоторых поставках блок «Локализация» может быть вырезан полностью, и тогда код, идущий ниже, снова станет активным.

Причина 2: Статический анализ и директива @skip-warning

Любой современный инструмент проверки качества кода (например, встроенная проверка конфигурации в 1С или внешние системы вроде SonarQube) пометит код после Возврат как критическую ошибку: «Обнаружен недостижимый код».

Чтобы автоматизированные системы сборки (CI/CD) не останавливали процесс из-за таких «ошибок», разработчики используют специальные маркеры. Посмотрим на строку //@skip-warning. Это инструкция для статического анализатора (например, BSL Language Server), которая буквально говорит: «Я знаю, что здесь недостижимый код, не выдавай предупреждение в этом месте». Это стандарт де-факто в крупной промышленной разработке на платформе 1С.

Причина 3: Метапрограммирование и внешняя компиляция

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

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

Почему код не удаляют совсем?

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

Итоги

Подводя итог, можно сказать, что код после оператора Возврат — это не небрежность, а осознанный инструмент управления сложностью в больших системах. Мы проанализировали, что такая структура кода обеспечивает:

  1. Легкость обновления: Сохранение идентичности модулей с мастер-конфигурацией.
  2. Гибкость сборки: Возможность включать и выключать блоки кода для разных регионов.
  3. Чистоту отчетов: Использование @skip-warning позволяет проходить автоматические тесты без ложных срабатываний на «мертвый код».

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

← На главную