Как отобразить асинхронные функции (ВопросАсинх, Асинх, Ждать) в Синтакс-помощнике 1С?

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

При работе с платформой "1С:Предприятие" версии 8.3.18 и выше, разработчики активно используют новые механизмы асинхронной работы, такие как модификатор Асинх, оператор Ждать и функции вроде ВопросАсинх. Эти нововведения значительно упрощают написание неблокирующего кода и повышают отзывчивость пользовательского интерфейса. Однако многие сталкиваются с ситуацией, когда, несмотря на активное использование этих конструкций в коде, найти информацию о них в стандартных разделах Синтакс-помощника — "Содержание" и "Индекс" — не удаётся. Единственным способом найти справочную информацию остаётся полнотекстовый "Поиск". Мы разберем причину такого поведения и предложим простое решение.

Введение в асинхронные операции в 1С:Предприятии

Прежде чем углубиться в проблему с Синтакс-помощником, давайте кратко рассмотрим, что представляют собой асинхронные функции в 1С. Начиная с версии платформы 8.3.18, фирма "1С" представила механизм асинхронности, вдохновленный паттерном async/await из JavaScript. Этот механизм позволяет выполнять длительные операции, не блокируя основной поток выполнения приложения, что критически важно для сохранения отзывчивости пользовательского интерфейса (особенно в тонком клиенте) и эффективного использования ресурсов.

Ключевые элементы асинхронности включают:

  1. Модификатор Асинх: Используется для объявления процедур и функций, которые могут содержать оператор Ждать. Такая процедура или функция всегда возвращает объект типа Обещание, даже если в её теле нет оператора Ждать.
  2. Оператор Ждать: Применяется к объекту типа Обещание (или к любому объекту, который может быть преобразован в Обещание). Выполнение процедуры приостанавливается до тех пор, пока Обещание не будет разрешено (успешно выполнено) или отклонено (завершено с ошибкой). При этом поток выполнения не блокируется, а передается системе для обработки других событий.
  3. Функция ВопросАсинх: Асинхронная версия стандартной функции Вопрос, предназначенная для отображения диалоговых окон пользователю. Она также возвращает Обещание и должна вызываться с оператором Ждать.
  4. Тип Обещание: Специальный объект, представляющий результат асинхронной операции, который может быть доступен в будущем.

Эти механизмы особенно полезны при работе с файлами, сетевыми запросами, взаимодействии с внешними системами или выполнении длительных вычислений, которые потенциально могут привести к "зависанию" интерфейса.

Суть проблемы: Отсутствие асинхронных функций в "Содержании" и "Индексе" Синтакс-помощника

Многие разработчики, активно использующие асинхронные конструкции в своих конфигурациях на платформе 8.3.18+, обнаруживают, что при попытке найти информацию о, например, ВопросАсинх или модификаторе Асинх в привычных разделах Синтакс-помощника — "Содержание" или "Индекс" — соответствующие записи отсутствуют. Это вызывает недоумение, поскольку эти функции являются частью встроенного языка и активно используются. Тем не менее, если ввести "ВопросАсинх" или "Асинх" в строку "Поиск" Синтакс-помощника, то необходимая информация успешно находится и отображается. Это явление указывает на то, что информация о функциях присутствует в базе знаний Синтакс-помощника, но по какой-то причине не индексируется или не отображается в структурированных разделах.

Причина проблемы: Контекстный отбор информации в Синтакс-помощнике

Разработчики платформы 1С предусмотрели механизм контекстного отбора информации в Синтакс-помощнике. Этот механизм позволяет отображать только ту часть справочной информации, которая релевантна для определенного контекста исполнения. Например, можно отфильтровать методы и свойства, чтобы видеть только те, которые доступны в тонком клиенте, или только на сервере, или только в веб-клиенте, или для обычных форм. Это сделано для удобства, чтобы разработчик не отвлекался на информацию, не применимую к текущей задаче или окружению.

Асинхронные функции, такие как ВопросАсинх, Асинх и Ждать, преимущественно используются в клиентском коде управляемых форм, а их реализация и особенности имеют специфический контекст. По умолчанию, или из-за ранее установленных настроек, Синтакс-помощник мог быть настроен таким образом, чтобы не отображать специфические элементы, которые не относятся к "универсальному" или "всеобъемлющему" контексту. Именно этот контекстный отбор и является причиной того, что асинхронные функции не попадают в стандартные разделы "Содержание" и "Индекс".

Пошаговое решение: Включаем отображение асинхронных функций

Для того чтобы Синтакс-помощник начал полноценно отображать все асинхронные конструкции встроенного языка в разделах "Содержание" и "Индекс", нам необходимо скорректировать его настройки фильтрации. Давайте разберем этот процесс по шагам:

  1. Откройте Синтакс-помощник. В конфигураторе 1С вы можете открыть его через меню "Справка" -> "Синтакс-помощник" или нажав комбинацию клавиш Ctrl+F1.
  2. Найдите настройки отбора. В окне Синтакс-помощника внимательно посмотрите на верхнюю панель инструментов или в меню "Сервис". Обычно там находится кнопка или выпадающий список, отвечающий за фильтрацию отображаемой информации по контексту. Эта кнопка может быть обозначена как "Отбор по контексту", "Настройка отбора" или иметь иконку, символизирующую фильтр. В более старых версиях или для комплексной настройки, эти параметры также могут быть доступны через меню "Сервис" -> "Параметры" -> вкладка "Справка" в конфигураторе.
  3. Активируйте отображение всех элементов или нужных контекстов. После обнаружения настроек отбора вам потребуется изменить выбранный режим. Скорее всего, вам нужно будет установить "галочку" или выбрать опцию, которая расширяет отображение информации. Типичные варианты включают:
    • "Отображать все": Это наиболее простой способ, который гарантирует показ всех элементов встроенного языка, независимо от их контекста.
    • Выбрать специфические контексты: Если доступен список контекстов (например, "Клиент", "Сервер", "Тонкий клиент", "Веб-клиент"), убедитесь, что выбраны те, которые релевантны для асинхронных операций (в первую очередь, "Тонкий клиент" и "Клиент (управляемое приложение)").

    Именно эта "галочка" или настройка фильтрации является тем самым решением, о котором говорилось в обсуждении. Её активация снимает ограничения на отображение справочной информации.

  4. Перезапустите или обновите Синтакс-помощник. В некоторых случаях может потребоваться закрыть и снова открыть Синтакс-помощник, чтобы изменения вступили в силу. После этого вы сможете найти ВопросАсинх, Асинх и другие асинхронные конструкции в разделах "Содержание" и "Индекс".

Как только вы примените эти настройки, вы заметите, что разделы "Содержание" и "Индекс" Синтакс-помощника теперь полноценно отображают информацию об асинхронных функциях и операторах, предоставляя вам полный доступ к документации по этим мощным возможностям платформы.

Влияние режима совместимости на отображение в Синтакс-помощнике

В ходе обсуждения поднимался вопрос о режиме совместимости конфигурации и его возможном влиянии на проблему. Мы хотим подчеркнуть, что режим совместимости конфигурации не оказывает прямого влияния на содержимое или отображение справочной информации в Синтакс-помощнике. Режим совместимости — это механизм, который определяет, какая версия платформы будет эмулироваться при работе конфигурации. Он используется для обеспечения корректной работы старых конфигураций на более новых версиях платформы без необходимости их полной адаптации.

Например, если ваша платформа имеет версию 8.3.19, а режим совместимости конфигурации установлен на 8.3.16, это означает, что в рантайме (во время выполнения) конфигурация будет вести себя так, будто она работает на платформе 8.3.16. Это влияет на доступность определенных функций, методов и свойств встроенного языка *в самой конфигурации*, а также на поведение некоторых объектов. Асинхронные функции, появившиеся в 8.3.18, при режиме совместимости 8.3.16 будут недоступны для использования в коде и не будут компилироваться.

Однако Синтакс-помощник всегда предоставляет документацию по всем возможностям той версии платформы, на которой запущен сам конфигуратор. То есть, если вы используете конфигуратор 8.3.19, Синтакс-помощник будет содержать информацию обо всех функциях до 8.3.19 включительно, независимо от режима совместимости открытой конфигурации. Проблема с отображением в "Содержании" и "Индексе" возникает исключительно из-за настроек фильтрации контекста в самом Синтакс-помощнике, а не из-за режима совместимости конфигурации.

Почему "Поиск" всегда находит, а "Содержание" и "Индекс" нет

Разница в поведении между полнотекстовым поиском и навигацией по "Содержанию" и "Индексу" объясняется их внутренними механизмами:

  1. "Содержание" и "Индекс": Эти разделы представляют собой структурированный и отфильтрованный каталог справочной информации. Информация в них организована иерархически и подвергается предварительной индексации и, что самое важное, контекстной фильтрации. Если элемент не соответствует текущим настройкам отбора (например, не относится к выбранным контекстам исполнения), он просто не будет включен в эти структурированные списки, даже если физически присутствует в базе знаний Синтакс-помощника.
  2. "Поиск": Полнотекстовый поиск, в отличие от первых двух механизмов, осуществляет сканирование всей доступной базы знаний Синтакс-помощника без применения контекстных фильтров. Он ищет заданный текст по всем документам, независимо от того, к какому контексту они относятся или как они классифицированы в иерархических списках. Именно поэтому "Поиск" успешно находил асинхронные методы, даже когда они были скрыты из "Содержания" и "Индекса" из-за настроек фильтрации.

Понимание этой разницы позволяет нам четко отделить проблему фильтрации отображения от отсутствия самой информации.

Примеры использования асинхронных функций

Давайте рассмотрим несколько примеров использования асинхронных функций, чтобы лучше понять их синтаксис и назначение, а также убедиться, что вы сможете найти их описание в Синтакс-помощнике после применения вышеописанного решения.

Пример 1: Использование ВопросАсинх для неблокирующего диалога

Традиционная функция Вопрос блокирует выполнение клиентского кода до получения ответа от пользователя. ВопросАсинх позволяет избежать этого, возвращая Обещание, которое разрешается после выбора пользователя.


// В обработчике команды или другой клиентской процедуре, объявленной как Асинх
&НаКлиенте
Асинх Процедура ВыполнитьДействиеАсинх(Команда)

    Сообщить("Начало выполнения действия...");

    // Вызываем ВопросАсинх и ожидаем его завершения
    ОтветПользователя = Ждать ВопросАсинх(
        "Вы действительно хотите выполнить это действие?",
        РежимДиалогаВопрос.ДаНет,
        ,,
        СтандартнаяКартинка.Вопрос
    );

    Если ОтветПользователя = КодВозвратаДиалога.Да Тогда
        Сообщить("Пользователь выбрал 'Да'. Продолжаем...");
        // Здесь может быть вызов другой асинхронной или синхронной функции
        // Например, Ждать МояДлительнаяОперацияАсинх();
    Иначе
        Сообщить("Пользователь выбрал 'Нет' или закрыл диалог. Отменяем.");
    КонецЕсли;

    Сообщить("Действие завершено.");

КонецПроцедуры

Обратите внимание на модификатор Асинх перед Процедура и оператор Ждать перед вызовом ВопросАсинх. Без них код не будет работать как асинхронный.

Пример 2: Создание собственной асинхронной функции

Вы можете создавать собственные асинхронные процедуры и функции, которые будут выполнять длительные операции без блокировки интерфейса.


// На клиенте
&НаКлиенте
Асинх Функция МояДлительнаяОперацияАсинх()

    Сообщить("Начало длительной операции на клиенте...");

    // Имитация длительной работы, например, обращения к веб-сервису
    // В реальном коде здесь может быть вызов Ждать HTTPЗапросАсинх() или Ждать ВызватьФункциюСервераАсинх()
    Для Индекс = 1 По 5 Цикл
        // Здесь мы просто демонстрируем, что функция Асинх может быть просто вызвана.
        // Для реальной задержки без блокировки потребуется более сложный механизм или платформа.
        // Например, Ждать КомандаОжиданияАсинх(1000);
        Сообщить("   Шаг " + Индекс + "...");
    КонецЦикла;

    Сообщить("Длительная операция на клиенте завершена.");
    Возврат Истина;

КонецФункции

&НаКлиенте
Асинх Процедура ВыполнитьВсеДействия(Команда)

    Сообщить("Запускаем несколько асинхронных операций...");

    // Вызываем длительную операцию и ждем ее завершения
    Результат = Ждать МояДлительнаяОперацияАсинх();

    Если Результат Тогда
        Сообщить("Первая операция успешно завершена. Запускаем ВопросАсинх.");
        Ответ = Ждать ВопросАсинх("Продолжить далее?", РежимДиалогаВопрос.ДаНет);
        Если Ответ = КодВозвратаДиалога.Да Тогда
            Сообщить("Продолжаем!");
        Иначе
            Сообщить("Остановлено.");
        КонецЕсли;
    КонецЕсли;

    Сообщить("Все асинхронные действия завершены.");

КонецПроцедуры

Эти примеры показывают, как модификатор Асинх и оператор Ждать используются вместе для создания и управления асинхронным потоком выполнения. После того как вы настроите Синтакс-помощник, вы сможете легко найти подробную информацию по каждому из этих ключевых слов и функций.

Заключение

Проблема с отсутствием асинхронных функций в "Содержании" и "Индексе" Синтакс-помощника 1С, при их наличии в "Поиске", является распространенной, но легко решаемой. Её причина кроется в механизме контекстного отбора информации, который по умолчанию может скрывать специфические для определенных контекстов элементы. Активация опции "Отображать все" или выбор соответствующих контекстов (например, "Тонкий клиент", "Клиент (управляемое приложение)") в настройках Синтакс-помощника полностью решает эту проблему. Помните, что режим совместимости конфигурации не влияет на отображение документации в Синтакс-помощнике, а только на доступность функций в рантайме. Вооружившись этим знанием, вы сможете эффективно использовать все возможности встроенного языка 1С, включая современные асинхронные механизмы, и всегда иметь под рукой актуальную справочную информацию.

← На главную