TGViewer
1.C. Enterprise 1.C. Enterprise @ship1centerprise · 1.06K subscribers
Post #71 2.88K
​​Дневник капитана, желтая дата ??.??.????.
Загадочный символ ?

В последнее время товарищ @SeiOkami так разошелся с викториной на своем канале, что открыл скрытый зарезервированный знак в языке 1С. Это символ вопроса ?. Ему посвящены викторины раз и два.

Путем нехитрых экспериментов можно понять, что символ ? заменяет ближайшее не ключевое слово, которое записано до этого знака. Иными словами, идентификатор, который написан синим цветом в стандартной раскраске. Поэтому если выполнить код:
Раз = 0;
? = 1;

То в переменной Раз будет лежать единица.

Знак ? «забирает» себе не только названия переменных, но и методов. Именно поэтому код из викторины:
Сообщить = 1;
Сообщить(?);

покажет единицу, т.к. происходит вывод переменной Сообщить.

Как же можно применить этот волшебный символ? Во-первых, как уже предложил SeiOkami, наконец-то у нас появился краткий инкремент!
МояПеременная = 0;
МояПеременная = ? + 1;
Сообщить(МояПеременная); // Выведет 1

Эту операцию можно использовать со всеми стандартными операндами: +, -, *, /, %.

Можно сделать еще более краткую запись преобразования переменной. Например:
МояПеременная = 5;
? = ? + 1;
? = ? * 2;
? = ? / 3;
Сообщить(МояПеременная); // Выдаст 4


Или вот так собирать строку:
МояСтрока = "";
? = ? + "Привет, ";
? = ? + "Мир ";
? = ? + "1С!";

Жаль, что нельзя так преобразовывать переменные через функции. Код МояСтрока = СокрЛП(?); выдаст ошибку Переменная не определена (СокрЛП), т.к. ? возьмет имя метода слева.

Какие еще есть примеры применения? Бывает, надо собрать структуру из переменных с тем же именем, чтобы передать ее куда-то дальше. Теперь можно писать так:
Структ = Новый Структура("ПеременнаяРаз,ПеременнаяДва,ПеременнаяТри");
Структ.ПеременнаяРаз = ?;
Структ.ПеременнаяДва = ?;
Структ.ПеременнаяТри = ?;


Можно обращаться и к полям знака ?. Например, следующий код выведет всех родителей ссылки:
ТекущаяСсылка = ПереданнаяСсылка;
Пока Не ТекущаяСсылка.Пустая() Цикл
Сообщить(ТекущаяСсылка);
ТекущаяСсылка = ?.Родитель;
КонецЦикла;


Еще можно сокращать логические условия. Вот проверка вхождения даты в диапазон: ДатаНачала < МояПеременнаяСДатой И ? < ДатаОкончания. А какие вы можете придумать примеры для этого магического символа?

Происхождение этой багофичи также загадочно, как и она сама. Известно лишь, благодаря тому же хакеру SeiOkami, что ? работает как в версии 8.0, так и в последних 8.3. Т.е. разработчики платформы, думаю, о ней не могут не знать, но не трогают. Может, эта функция была задумана изначально в 8-й платформе, но от нее отказались. Может, это какие-то «неубранные отходы» от тернарного оператора.
Понятно, что на проде это использовать не следует, так, только поиграться. Но я хочу сказать, платформщики, если вы меня слышите, не убирайте, прикольная функция же! Наоборот задокументируйте, ну и еще доработайте, чтобы ? только переменные брал, методы игнорировал. Предложение по развитию платформы написать что ли… 🤔
  • 👍 2
More from @ship1centerprise
  1. May 13, 2025Дневник капитана, дата '20250513' 🔷 Изолента для транзакций 🔷 Перейдем букве 🔤 нашего A…
  2. May 6, 2025Дневник капитана, дата 06.05.2025 🪓Сага о распределенных транзакциях🪓 В прошлом посте я…
  3. May 5, 2025Дневник капитана, красивая дата 05*05=25 ➖Кислотные транзакции➖ Захотелось рассказать про…
  4. Jul 28, 2023​​Дневник капитана, дата ‘2023-07-28’. Мой корабль улетел в совсем удаленные части Вселенн…
  5. Dec 21, 2022Всем привет! Уже завтра, 22 декабря встречаемся онлайн: INFOSTART AWARDS 2022 и новогодняя…
  6. Jun 24, 2022Вот так вот уходишь из 1С, а там такое: https://infostart.ru/job/vacancy/1676535/ Update:…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →