В процессе анализа чужого кода или поддержки старых конфигураций программисты 1С иногда сталкиваются с необычным символом ~ (тильда), который стоит перед идентификатором. Для многих разработчиков, привыкших к современным стандартам разработки, этот символ кажется странным артефактом. Давайте разберем, какую функцию выполняет тильда, как она работает и почему её использование вызывает так много споров в профессиональном сообществе.
Символ тильда ~ в языке 1С используется исключительно для объявления метки. Метка — это именованная точка в программном коде, на которую можно мгновенно переместить выполнение программы из другого места той же процедуры или функции. Инструментом для такого «прыжка» служит оператор Перейти.
Проанализируем простейший пример, который часто встречается в старом коде:
Если Не Отказ Тогда
Перейти ~м1;
КонецЕсли;
// Какой-то промежуточный код, который будет пропущен
Сообщить("Этот текст не выведется, если Отказ = Ложь");
~м1:
СоздатьДействие(Артикул);
В данном случае, если условие выполняется, программа игнорирует все строки, идущие после Перейти, и сразу переходит к строке, помеченной как ~м1:. Это классическая реализация конструкции goto, которая пришла в 1С из ранних языков программирования и версии 1С 7.7.
Рассмотрим по шагам, как правильно оформляется метка и переход на нее в 1С:
~НачалоЦикла:).Перейти, после которого через пробел указывается имя метки с тильдой, а в конце ставится точка с запятой (Перейти ~Метка;).Платформа 1С накладывает очень жесткие ограничения на использование меток. Выясним основные правила, которые нельзя нарушать:
1. Локальность внутри метода. Метка видна только внутри той процедуры или функции, в которой она объявлена. Вы не можете объявить метку в одной процедуре, а попытаться перейти на неё из другой. Это обеспечивает минимальную изоляцию кода.
2. Запрет «впрыгивания» в блоки. Проанализируем важный нюанс: нельзя перейти из основного текста процедуры внутрь блока Если...КонецЕсли, Для...КонецЦикла или Попытка...Исключение. Платформа просто не позволит запустить такой код, выдав ошибку компиляции. Это сделано для того, чтобы не нарушать логическую целостность условий и циклов.
3. Разрешение на выход. В отличие от входа, выход с помощью метки из вложенных конструкций разрешен. Вы можете находиться внутри тройного вложенного цикла и одним оператором Перейти оказаться снаружи всех них. Рассмотрим этот пример подробнее ниже.
Несмотря на то что метки критикуются, существуют сценарии, где их применение кажется оправданным некоторым разработчикам. Разберем ситуацию с вложенными циклами.
Для Каждого Строка1 Из Таблица1 Цикл
Для Каждого Строка2 Из Таблица2 Цикл
Для Каждого Строка3 Из Таблица3 Цикл
Если НайденоКритическоеЗначение(Строка3) Тогда
Перейти ~КонецОбработки;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
~КонецОбработки:
Сообщить("Обработка завершена досрочно");
В этом примере использование Перейти позволяет избежать написания множества проверок флагов после каждого вложенного цикла. Если бы мы использовали стандартный оператор Прервать, нам пришлось бы трижды проверять условие выхода на каждом уровне вложенности.
Еще один специфический случай — работа с динамическим кодом через Выполнить(). Иногда в сложных генераторах кода метки упрощают построение логических переходов, хотя это и усложняет последующую отладку.
Как отмечают участники обсуждения, использование меток — это «вселенское зло» или «мракобесие». Почему сложилось такое мнение? Проанализируем причины:
Перейти превращает код в запутанный клубок, где логика прыгает из начала в конец и обратно. Такой код крайне сложно читать.Перейти. В типовых конфигурациях (таких как БП 3.0 или ERP) вы практически не встретите тильду, за исключением очень старых модулей, оставленных для совместимости.Посмотрим, как можно переписать код с метками, используя современные приемы структурного программирования:
Возврат.Возврат автоматически прекратит выполнение вложенных циклов.Булево (например, НужноПрерватьЦикл), чтобы корректно управлять выходом из итераций.Подводя итог, можно сказать, что тильда в коде 1С — это мощный, но опасный инструмент из прошлого. Если вы встретили её в коде, теперь вы знаете, что это всего лишь метка. Однако при написании собственного кода старайтесь избегать меток, отдавая предпочтение чистому и структурированному коду, соответствующему современным стандартам платформы 8.3.