Загадочный символ ?
В последнее время товарищ @SeiOkami так разошелся с викториной на своем канале, что открыл скрытый зарезервированный знак в языке 1С. Это символ вопроса
?. Ему посвящены викторины раз и два.Путем нехитрых экспериментов можно понять, что символ
? заменяет ближайшее не ключевое слово, которое записано до этого знака. Иными словами, идентификатор, который написан синим цветом в стандартной раскраске. Поэтому если выполнить код:Раз = 0;
? = 1;
То в переменной
Раз будет лежать единица.Знак
? «забирает» себе не только названия переменных, но и методов. Именно поэтому код из викторины:Сообщить = 1;
Сообщить(?);
покажет единицу, т.к. происходит вывод переменной
Сообщить.Как же можно применить этот волшебный символ? Во-первых, как уже предложил SeiOkami, наконец-то у нас появился краткий инкремент!
МояПеременная = 0;
МояПеременная = ? + 1;
Сообщить(МояПеременная); // Выведет 1
Эту операцию можно использовать со всеми стандартными операндами:
+, -, *, /, %.Можно сделать еще более краткую запись преобразования переменной. Например:
МояПеременная = 5;
? = ? + 1;
? = ? * 2;
? = ? / 3;
Сообщить(МояПеременная); // Выдаст 4
Или вот так собирать строку:
МояСтрока = "";
? = ? + "Привет, ";
? = ? + "Мир ";
? = ? + "1С!";
Жаль, что нельзя так преобразовывать переменные через функции. Код
МояСтрока = СокрЛП(?); выдаст ошибку Переменная не определена (СокрЛП), т.к. ? возьмет имя метода слева.Какие еще есть примеры применения? Бывает, надо собрать структуру из переменных с тем же именем, чтобы передать ее куда-то дальше. Теперь можно писать так:
Структ = Новый Структура("ПеременнаяРаз,ПеременнаяДва,ПеременнаяТри");
Структ.ПеременнаяРаз = ?;
Структ.ПеременнаяДва = ?;
Структ.ПеременнаяТри = ?;Можно обращаться и к полям знака
?. Например, следующий код выведет всех родителей ссылки:ТекущаяСсылка = ПереданнаяСсылка;
Пока Не ТекущаяСсылка.Пустая() Цикл
Сообщить(ТекущаяСсылка);
ТекущаяСсылка = ?.Родитель;
КонецЦикла;
Еще можно сокращать логические условия. Вот проверка вхождения даты в диапазон:
ДатаНачала < МояПеременнаяСДатой И ? < ДатаОкончания. А какие вы можете придумать примеры для этого магического символа?Происхождение этой багофичи также загадочно, как и она сама. Известно лишь, благодаря тому же хакеру SeiOkami, что
? работает как в версии 8.0, так и в последних 8.3. Т.е. разработчики платформы, думаю, о ней не могут не знать, но не трогают. Может, эта функция была задумана изначально в 8-й платформе, но от нее отказались. Может, это какие-то «неубранные отходы» от тернарного оператора.Понятно, что на проде это использовать не следует, так, только поиграться. Но я хочу сказать, платформщики, если вы меня слышите, не убирайте, прикольная функция же! Наоборот задокументируйте, ну и еще доработайте, чтобы
? только переменные брал, методы игнорировал. Предложение по развитию платформы написать что ли… 🤔