При изучении программного кода в типовых конфигурациях от фирмы «1С» (особенно в решениях вроде ERP World Edition или локализованных версиях для других стран) разработчики часто натыкаются на странную конструкцию: внутри процедуры вызывается оператор Возврат, но ниже него расположен значительный объем программного кода. На первый взгляд, это кажется ошибкой или «мусором», оставшимся после отладки. Однако, если мы проанализируем ситуацию глубже, станет понятно, что это часть сложной технологической цепочки разработки.
Рассмотрим подробнее, зачем это нужно, как работают механизмы автоматизированной сборки и почему статический анализ кода не считает такие участки ошибочными.
Для начала разберем типичный фрагмент кода, который вызывает вопросы. Проанализируем ситуацию на примере процедуры фискализации:
Процедура ПечатьЧекаПослеЗаписиИзмененийЛокализация(ПараметрыОперацииФискализацииЧека)
//++ Локализация
ФорматноЛогическийКонтрольКлиентСервер.ПровестиФорматноЛогическийКонтроль(ПараметрыОперацииФискализацииЧека, ПараметрыКассыККМ.ИдентификаторУстройства);
ВыполнитьДействиеПослеЗаписи(
Новый ОписаниеОповещения("ПробитьЧекПослеПроведения", ЭтотОбъект, ПараметрыОперацииФискализацииЧека),
НСтр("ru = 'Перед выполнением операции пробития чека не удалось провести документ.'"));
Возврат;
//-- Локализация
//@skip-warning
УстановитьФискальныйСтатусПробит();
КонецПроцедуры
В данном примере мы видим, что блок, помеченный комментариями //++ Локализация и //-- Локализация, полностью перехватывает управление и завершает работу процедуры. Код, находящийся ниже (УстановитьФискальныйСтатусПробит()), никогда не будет выполнен в данной версии конфигурации. Выясним причину такого архитектурного решения.
Фирма «1С» использует технологию «мастер-конфигураций». Существует основная ветка разработки (Core), содержащая общую логику, и множество локальных веток (для Казахстана, Беларуси, ОАЭ и т.д.). Разберем по шагам, как происходит процесс формирования кода:
Возврат. Это делается для минимизации конфликтов при последующих обновлениях. Когда выйдет новая версия «мастер-конфигурации», скрипты автоматического сравнения и объединения легко сопоставят блоки кода, так как структура модуля не изменилась.Любой современный инструмент проверки качества кода (например, встроенная проверка конфигурации в 1С или внешние системы вроде SonarQube) пометит код после Возврат как критическую ошибку: «Обнаружен недостижимый код».
Чтобы автоматизированные системы сборки (CI/CD) не останавливали процесс из-за таких «ошибок», разработчики используют специальные маркеры. Посмотрим на строку //@skip-warning. Это инструкция для статического анализатора (например, BSL Language Server), которая буквально говорит: «Я знаю, что здесь недостижимый код, не выдавай предупреждение в этом месте». Это стандарт де-факто в крупной промышленной разработке на платформе 1С.
Проанализируем концепцию метапрограммирования, о которой упоминают ведущие эксперты. В современной среде 1С программный код в Конфигураторе — это не всегда то же самое, что исполняется в реальности.
Существуют внешние инструменты (препроцессоры), которые перед поставкой конфигурации пользователю «склеивают» модули из разных кусков. Блок кода, начинающийся с //++, воспринимается такой системой как «инъекция». Если инъекция произошла, оригинальный код ниже просто «глушится» оператором Возврат. Это позволяет поддерживать единую базу кода для десятков различных региональных продуктов, не создавая для каждого отдельную конфигурацию с нуля.
Выясним, почему бы просто не удалить ненужные строки. Рассмотрим ситуацию глазами программиста, который будет обновлять вашу систему через год:
УстановитьФискальныйСтатусПробит() удален, при сравнении конфигураций возникнет «сложное изменение».Возврат.Подводя итог, можно сказать, что код после оператора Возврат — это не небрежность, а осознанный инструмент управления сложностью в больших системах. Мы проанализировали, что такая структура кода обеспечивает:
@skip-warning позволяет проходить автоматические тесты без ложных срабатываний на «мертвый код».Поэтому, встретив подобную конструкцию, не спешите её удалять — она является защитным механизмом, обеспечивающим целостность вашей информационной системы при будущих обновлениях от фирмы «1С».