1с кодвозвратадиалога переменная не определена
Здравствуйте, коллеги! Сегодня поговорим о проблеме неопределенных переменных в 1С. Рядовой пользователь с данной ошибкой сталкиваться не должен, но если уж и произошло подобное при работе в типовой конфигурации 1С, которая никак не модифицировалась, возможно, у нас наклевывается проблема самого релиза, которая иссякнет при обновлении. В таком случае стоит связаться со специалистом, чтобы найти выход из ситуации.
Если же Вы сами занимаетесь разработкой и столкнулись с ошибкой, «Переменная не определена в 1С», то следует обратится к конфигуратору, найти, что за переменная и в какой именно момент не определена. Есть несколько вариантов решения, но нужно подбирать их с умом, ибо вполне возможно, что после неправильного исправления в одном месте, Вы получите кучу ошибок в других местах.
1. Проверка на определения 1С 8.3
Можно прописать перед ошибкой следующий код:
Если Не НашаПеременная = Неопределено Тогда
Соответственно, закрыв «Если» после, но тут как уже писалось нужно действовать аккуратно, возможно данная конструкция напрочь сломает весь последующий код. Гораздо лучше найти, где объявляется переменная и устранить ошибку.
2. Поиск объявления переменной 1С 8.3
Вполне возможен вариант, что ее просто забыли включить в передаваемые параметры функции или она не доступна в данном виде клиента. Такое случается, когда, например, обращаются из тонкого клиента к метаданным. В этом случае стоит переписать функцию или, возможно, объявить новую, но уже на сервере, которая вернет необходимые тонкому клиенту данные.
3. Обычная опечатка в программе 1С 8.3 Предприятие
Чтобы быстро в программе 1С 8.3 Предприятие проверить опечатка ли спровоцировала ошибку, просто скопируем переменную из объявления и вставим ее имя в то место, где случается ошибка. Можно сделать следующим образом, чтобы избежать таких ошибок в будущем:
Теперь, когда курсор останавливается на идентификаторе, все другие его упоминания будут выделены, как на следующем изображении:
Специалист компании ООО «Кодерлайн»
Дягилев Дмитрий Вадимович
Вас могут заинтересовать следующие статьи:
Нередко при работе с 1С возникают ситуации, когда у непроведенных или помеченных на удаление документов остаются движения в регистрах. Данная обработка помогает автоматизировать процесс нахождения и удаления таких движений. UPD. 07.11.14 Добавлена версия только для управляемого приложения.
Основные особенности обработки:
1. Работает как на обычных, так и на управляемых формах
2. Гибкая настройка обработки, позволяющая удалять движения только по определенным регистрам или по определенным документам
3. Автоматический поиск документов - исключений, то есть документов которые являются регистраторами в регистрах, но в свойство "Проведение" = Запретить. Примером может являтся документ "Бухгалелская операция" из бухгалтерии или документ "Корректировка регистров". По умолчанию по таким документам поиск ошибочных движений не ведется.
UPD. 07.11.14 Добавлена версия только для управляемого приложения. Дело в том, что как выяснилось на последних версиях платформы идет синтаксическая проверка модуля обработки перед ее открытием, поэтому выкладываю файл обработки работающий только под управляемыми формами (выпелил код для обычных форм).
Специальные предложения
Не работает в варианте клиент-сервер. Платформа 8.3.5, БП 3.0, УФ
Ошибка инициализации модуля: ВнешняяОбработка.УдалениеДвиженийУПомеченныхНаУдалениеИНепроведенныхДокументо в.МодульОбъекта
по причине:
: Переменная не определена (РежимДиалогаВопрос)
Ответ = Вопрос(ТекстВопроса, >РежимДиалогаВопрос.ДаНет);
: Переменная не определена (РежимДиалогаВопрос)
Ответ = Вопрос(ТекстВопроса, >РежимДиалогаВопрос.ДаНет);
: Переменная не определена (КодВозвратаДиалога)
Если Ответ = >КодВозвратаДиалога.Нет тогда
: Переменная не определена (КодВозвратаДиалога)
Если Ответ = >КодВозвратаДиалога.Нет тогда
: Процедура или функция с указанным именем не определена (Вопрос)
Ответ = >Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
: Процедура или функция с указанным именем не определена (Вопрос)
Ответ = >Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
: Процедура или функция с указанным именем не определена (ОбработкаПрерыванияПользователя)
>ОбработкаПрерыванияПользователя();
: Процедура или функция с указанным именем не определена (ОбработкаПрерыванияПользователя)
>ОбработкаПрерыванияПользователя();
Войдите как ученик, чтобы получить доступ к материалам школы
Внутренний язык программирования 1С 8.3 для начинающих программистов: использование диалогов в 1С
Автор уроков и преподаватель школы: Владимир Милькин
Давайте определимся, что же такое диалог? Вызов команды Сообщить является диалогом? А вызов команды ВвестиЧисло? А вызов ОткрытьЗначение?
Итак, диалог - это прежде всего элемент графического интерфейса , окно . А следовательно вызов Сообщить - диалогом не является, так как у него нет своего отдельного окна.
Диалог - это не просто окно. Это окно, которое открывается пользователю с целью вывода информации и (или) получения ответа.
Для того чтобы показать какой-либо диалог необходимо вызвать команду соответствующую этому диалогу и передать ей необходимые параметры. Команда - это обычная процедура или функция, только написанная не нами, а программистами фирмы 1С. Мы не можем менять эти команды, мы можем их только вызывать.
Предупреждение
Отличным примером диалога является вывод предупреждения пользователю:
Что мы видим? Вызов команды Предупреждение, в которую в качестве параметра передаётся строка "Осторожно".
Когда компьютер дойдёт до строчки, в которой вызывается эта команда, пользователю отобразится диалог предупреждения. И до тех пор, пока пользователь не закроет этот диалог, компьютер будет ожидать на этой же строчке. Только после закрытия диалога - выполнение программы продолжится и начнётся выполнение строки, следующей за вызовом диалога.
К примеру, пусть у нас есть такой код:
Как он будет выполняться?
В начале компьютер дойдёт до строчки №1 и выполнит команду Предупреждение с параметром "1". В этот момент пользователю покажется диалоговое окно с текстом "1", а компьютер замрёт на этой строчке и будет ожидать, пока пользователь закроет диалог. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
После закрытия диалога компьютер перейдёт к выполнению строчки №2 и выполнит команду Предупреждение уже с другим параметром "2". Пользователю снова покажется диалоговое окно, но уже с текстом "2", а компьютер замрёт уже на второй строчке и будет ожидать, пока пользователь закроет диалог.
Затем компьютер перейдёт к третьей строчке. Ну и так далее.
У команды Предупреждение параметр, отвечающий за текст, который выводится - не единственный. Есть ещё два дополнительных параметра:
Предупреждение(ТекстПредупреждения>, Таймаут>, Заголовок>)
Таймаут - означает количество секунд, через которое диалог закроется сам, если этого не сделает пользователь.
Заголовок - подменяет стандартный заголовок "1С:Предприятие" на строку пользователя.
К примеру, такой код:
покажет диалог с текстом "Осторожно." и заголовком "Внимание!", а также закроется через 5 секунд, если пользователь не сделает этого раньше:
А что если мы хотим задать только текст и заголовок окна, а таймаут не задавать?
Во-первых, мы можем передать в качестве таймаута ноль:
А во-вторых, мы можем просто оставить пустое место вместо параметра и система сама поймёт, что нужно оставить его значение по умолчанию:
Для того, чтобы узнавать обо всех возможных параметрах встроенных команд 1С - пользуйтесь синтакс-помощником так, как это описано в одном из предыдущих уроков (ссылка).
Ввод числа
Некоторые диалоги не только выводят какую-то информацию от нас пользователю, но и наоборот возвращают некий результат взаимодействия с пользователем. Примером такого диалога является ввод числа.
К примеру, напишем:
Зачем мы передаём в команду параметр Число? Во-первых, для того, чтобы отобразить начальное значение ввода в диалоге. А, во-вторых, чтобы вернуть в эту переменную значение, которое ввёл пользователь. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Но что если пользователь отказался от ввода и нажал кнопку "Отмена"? Как об этом узнать? Оказывается, функция ВвестиЧисло не только показывает диалог ввода числа, но ещё и возвращает нам Истина в том случае, если пользователь нажал кнопку "ОК" и Ложь, если он отменил ввод, нажав кнопку "Отмена".
Таким образом, более правильным будет такой код:
В переменную Результат (имя могло быть любым) возвращается Истина или Ложь в зависимости от того какую кнопку нажал пользователь ("ОК" или "Отмена").
В переменную Число возвращается число введенное пользователем.
Вопрос
Заключительным диалогом, который мы рассмотрим, будет является диалог вопроса пользователю.
Имя команды, которая вызывает этот диалог нам известна - Вопрос.
Теперь давайте посмотрим в синтакс-помощнике какие параметры принимает эта команда:
ТекстВопроса - это сам вопрос в текстовом виде, который увидит пользователь.
Кнопки - это одно из предопределенных значений, которые также можно посмотреть в синтакс-помощнике. Например, если передать в этот параметр:
- РежимДиалогаВопрос.ДаНет - в диалоге будет всего две кнопки Да и Нет.
- РежимДиалогаВопрос.ДаНетОтмена - три кнопки Да, Нет и Отмена.
- РежимДиалогаВопрос.ОкОтмена - две кнопки Ок и Отмена.
- И другие варианты кнопок.
- КодВозвратаДиалога.Нет
- КодВозвратаДиалога.Да
- КодВозвратаДиалога.Отмена
- И другие кнопки.
- обновления Конфигурации 1С;
- внесения собственных доработок в 1С.
- слова, по которым производится поиск ошибки — в строке Найти ;
- Конфигурацию 1С, где проявилась ошибка.
- Ограничения программ, используемых для работы в Интернете (браузеров),
- Ограничения, связанные с качеством связи между клиентским приложением и сервером.
- Модальное окно – окно, блокирующее весь интерфейс приложения, при этом исполнение кода останавливается до момента получения ответа пользователя. Например, окно модальной формы.
- Модальный метод – метод глобального контекста или объекта платформы, при выполнении которого происходит открытие модального окна. Например, методы Вопрос() , ОткрытьМодально() .
- Блокирующее окно – окно, блокирующее весь интерфейс или его часть, но при этом исполнение кода не останавливается. Например, форма, блокирующая владельца.
- Процедура, которая создает блокирующее окно, ожидающее действия пользователя,
- Процедура – обработчик оповещения о том, что пользователь сделал свой выбор и мы можем использовать результат его действий для дальнейшей работы.
- ИмяПроцедуры – Указывает имя процедуры-обработчика оповещения, которая будет выполнена после получения ответа пользователя,
- Модуль -Указывает в каком модуле расположена эта процедура. Этот параметр может иметь следующие типы:
- УправляемаяФорма – процедура расположена в модуле управляемой формы,
- ОбщийМодуль – процедура расположена в общем неглобальном клиентском модуле,
- КомандаКомандногоИнтерфейса – процедура расположена в модуле команды.
- ДополнительныеПараметры – значение любого типа, которое будет передано в процедуру-обработчик оповещения при ее вызове.
- Их имена начинаются со слова Показать либо Начать, например ПоказатьВопрос() вместо Вопрос() , НачатьПомещениеФайла() вместо ПоместитьФайл() , и так далее,
- Первым параметром принимают объект ОписаниеОповещения, указывающий на процедуру модуля, которая будет выполнена после того как пользователь сделает выбор в блокирующем окне,
- Не возвращают значения, вместо этого результат выбора пользователя будет передан в процедуру модуля, описанную объектом ОписаниеОповещения.
- Добавлено свойство формы ОписаниеОповещенияОЗакрытии , которое указывает на процедуру модуля, которая будет вызвана при ее закрытии. Также это значение можно установить при помощи нового параметра метода ОткрытьФорму() ,
- Добавлен вариант режима открытия окна формы – БлокироватьВеcьИнтерфейс , при использовании которого открываемая форма заблокирует все окна, а не только окно родителя.
- Создать в форме переменную, которая будет хранить ответ пользователя при ее закрытии,
- Если ответа получено еще не было (переменная содержит Неопределено ), то в обработчике ПередЗакрытием нужно показать окно выбора пользователю, например, при помощи метода ПоказатьВопрос() и прервать закрытие формы, установив Отказ=Истина ,
- В процедуре-обработчике выбора следует установить переменной результат выбора и вызвать метод Закрыть() формы,
- Если переменная содержит какое-либо значение, то это значит, что идет процесс закрытия, инициированный на предыдущем шаге, результат выбора от пользователя уже получен и обработчик ПередЗакрытием может использовать его значение.
Таймаут - этот параметр нам уже знаком.
КнопкаПоУмолчанию - это кнопка, на которой будет фокус при показе окна. Её значения могут быть такими:
Заголовок - этот параметр нам уже знаком.
КнопкаТаймаута - если задать значение этой кнопки и параметр Таймаут, то именно на ней будет отображаться количество оставшихся секунд до закрытия диалога. У неё могут быть такие же значения как и у параметра КнопкаПоУмолчанию.
Уфф. Как видите, параметров много. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Но необязательно использовать их все. Как следует из синтакс-помощника обязательными к заполнению являются только первые два:
Вопрос-то мы задали. Хорошо бы теперь получить ответ - выспался пользователь или нет Из того же синтакс-помощника мы узнаём, что кнопка которая была нажата возвращается в качестве результата вызова команды Вопрос:
Модальность
Все примеры диалогов, которые мы рассмотрели - являются модальными, потому что компьютер, показывая диалог, замирает на той же строчке и не идёт дальше, пока диалог не закроется.
Ещё можно сказать, что когда мы показываем модальный диалог - пользователь может работать только с этим диалогом. Работа со всей остальной частью системы блокируется, пока не закроется диалог.
Таким недостатком не обладают немодальные версии диалогов, но к ним переходить нам ещё рано.
Ошибка Итератор для значения не определен 1С 8.3 связана с доступом к элементам коллекций в программном коде. Она возникает при обращении через итератор к массиву или таблице значений, которые не являются коллекцией.
Изучив статью, вы получите подробные инструкции, как действовать в случае появления ошибки после:
Поиск ошибки и ее исправление будет рассмотрен на конкретном примере.
Итератор для значения не определен
Ошибка Итератор для значения не определен 1С 8.3 может возникать при обновлении типовой информационной базы и выполнении собственных доработок в Конфигураторе 1С.
Если вы используете типовую 1С, в которую не вносились доработки в Конфигурацию, то, скорее всего, появление этой ошибки связано с выполненным обновлением. В этом случае лучше всего воспользоваться поиском ошибок в сервисе 1С или дождаться следующего релиза обновления 1С.
Поиск ошибки в сервисе 1С
Ошибка 1С Итератор значения не определен может появиться после обновления 1С. Список регистрации этой ошибки в последних обновлениях 1С:Бухгалтерия 3.0 следующий:
Поэтому при получении ошибки Итератор для значения не определен 1С 8.3 после обновления конфигурации нужно воспользоваться поиском ошибки в сервисе 1С:
Для работы с сервисом нужно указать:
После обновления 1С 8.3 на релиз 3.0.43.194 выходит ошибка Итератор для значения не определен при формировании справки НДФЛ. Что делать?
Инструкция по исправлению ошибки:
Сохраните изменения по кнопке Записать и закрыть .
Если есть ограничения на изменение данных в информационной базе, можно обновить конфигурацию на релиз 3.0.50.10, где ошибка уже исправлена разработчиками.
Как правило, такие ошибки регистрируются и исправляются очень быстро. В течении 2-3 дней после сбора информации об ошибках выходит релиз с исправлениями, на который нужно обновиться пользователям 1С.
Исправление ошибки «Итератор для значения не определен»
Если в 1С вносятся доработки в Конфигурацию или пишутся внешние обработки, то искать и исправлять ошибку придется самостоятельно. На что здесь нужно обратить внимание. Если ошибка допущена в доработанном программном коде, то место ее поиска уже понятно. Кроме того, очень часто 1С выдает подсказку в окне ошибки, где может указываться место ее возникновения: общий модуль, процедура или функция и строчка программного кода.
В рассмотренном выше примере с производственным календарем ошибка возникала в общем модуле Учет НДФЛ в строке 12542.
Исправление ошибки в этом случае заключается в открытии указанного модуля Учет НДФЛ и анализа строчки кода 125452.
При попытке подключить в 1С внешнюю печатную форму Счет Фактура выданный (ошибка) 1.07.2020 появляется ошибка Итератор для значения не определен .
В функции СведенияОВнешнейОбработке указывается параметр Назначение — массив документов, к которым будет подключена внешняя печатная форма. Обратите внимание, что в нашем примере коллекция назначений указывает не на массив данных, а на пустую строку:
Обращение итератора к строке, не являющейся коллекцией, и приводит к появлению ошибки 1С Итератор для значения не определен . Правильный пример кода описывает в процедуре СведенияОВнешнейОбработке массив назначения — документ Счет фактура выданный :
После внесения изменений в МассивНазначений подключение внешней печатной формы Счет Фактура выданный (правильно) 1.07.2020 в 1С выполнится без ошибок.
При правильно прописанном коде в списке печатных форм Счета-фактуры выданные отображается подключенная внешняя печатная форма Счет-фактура от 01.07.2020.
См. также:
Помогла статья?
Получите еще секретный бонус и полный доступ к справочной системе БухЭксперт8 на 14 дней бесплатно
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
Работа с Диалогами в языке 1С 8.3, 8.2 (в примерах
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).
Подписывайтесь и получайте новые статьи и обработки на почту (не чаще 1 раза в неделю). |
Вступайте в мою группу ВКонтакте, Одноклассниках, Facebook или Google+ — самые последние обработки, исправления ошибок в 1С, всё выкладываю там в первую очередь.
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Нажмите одну из кнопок, чтобы поделиться:
Режим = РежимДиалогаВопрос.ДаНетОтмена;
Ответ = Вопрос(«Документ будет записан», Режим, 0);
Если Ответ = КодВозвратаДиалога.Отмена Тогда
Сообщить(«Документ не проведен, заказы поставщикам не созданы»);
Возврат;
КонецЕсли;
Если Ответ = КодВозвратаДиалога.Нет Тогда
Сообщить(«Документ не проведен, заказы поставщикам не созданы»);
Возврат;
КонецЕсли;
Если Ответ = КодВозвратаДиалога.Да Тогда
Записать(Новый Структура(«РежимЗаписи», РежимЗаписиДокумента.Запись));
КонецЕсли;
В статье будут рассмотрены причины отказа от дальнейшей поддержки модальных окон в платформе «1С:Предприятие» и типовые сценарии перевода имеющегося функционала на новую модель.
Развитие продуктов «1С» и платформы «1С:Предприятие»
Одним из основных векторов развития платформы «1С:Предприятие» является возможность ее успешного использования в среде Интернет.
Эта среда имеет ряд ограничений, которые отсутствуют в среде настольных приложений:
Приложения, предназначенные для работы через Интернет, должны быть построены с учетом этих ограничений, поэтому их модель отличается от настольных приложений.
Все интернет-приложения создаются с использованием асинхронной (событийно-управляемой) модели управления логикой, в отличие от принятой в настольных приложениях синхронной (последовательной) модели.
Изначально платформа «1С:Предприятие» создавалась для построения настольных бизнес-приложений, использующих синхронную модель. Однако, с развитием SaaS-решений потребовался постепенный переход на асинхронную логику.
Проблемы поддержки модальных окон в среде Интернет
Модальные окна являются элементом синхронной модели. Они блокируют исполнение логики приложения, позволяя выполнять ее участки последовательно, друг за другом, в зависимости от результата, полученного от пользователя.
Такие окна не входят в стандарт веб-разработки, поэтому не поддерживаются всеми браузерами, при помощи которых пользователь получает доступ к приложениям «1С».
Для разработки качественных веб-приложений требуются асинхронные средства обеспечения взаимодействия с пользователем.
Такие средства были добавлены в платформу «1С:Предприятие» в версии 8.3.3.
Несколько терминов и определений
Далее в статье будут использоваться следующие термины:
Общие принципы при переходе на асинхронную модель построения бизнес-логики
В синхронной модели код, зависящий от выбора пользователя, выполняется последовательно.
В асинхронной модели мы можем получить результат только обрабатывая события, которые возникают, когда пользователь делает свой выбор. При этом на время ожидания выбора код приложения не останавливается и оно продолжает работать.
Таким образом, получается, что такой код разбивается на две процедуры:
Новые асинхронные средства платформы для взаимодействия с пользователем
Для реализации асинхронной модели в первую очередь требуется возможность описания процедур-обработчиков оповещений, которые будут вызваны системой при завершении выбора пользователя.
Для этого в платформу был добавлен новый тип объектов – ОписаниеОповещения .
Этот объект имеет конструктор со следующими параметрами:
Для получения значения модуля у вышеперечисленных объектов добавлено общее свойство ЭтотОбъект.
При вызове указанной процедуры системой ей через параметры передается результат выбора пользователя и значение ДополнительныеПараметры . В некоторых случаях результат выбора может отсутствовать (метод ПоказатьПредупреждение() ) или передаваться несколькими параметрами (метод НачатьПомещениеФайла() ).
Для перехода на асинхронную модель в платформу были добавлены методы, аналогичные модальным методам, но, в отличие от них, не блокирующие поток исполнения. Эти методы уже не являются элементами синхронной логики, поэтому могут беспрепятственно использоваться при разработке веб-приложений.
Группа этих методов отличается следующим:
Также были добавлены возможности работы с управляемыми формами в асинхронной модели. Однако, для них не создавалось новых методов, а были доработаны уже имеющиеся средства:
Дополнительно реализован новый метод глобального контекста ВыполнитьОбработкуОповещения(), который позволяет вручную осуществить вызов процедуры-обработчика. Это позволяет реализовать общую процедуру, выполняющую опрос пользователя, которая вызывается из разных мест.
Особенности реализации асинхронной бизнес-логики
Следует отметить, что поначалу асинхронная модель может показаться сложнее привычной синхронной. На самом деле, понимая основные различия этих моделей, разработка асинхронных приложений становится не многим труднее.
Это подтверждается тем фактом, что все современные веб-приложения построены именно с использованием асинхронной модели и их количество постоянно растет.
Типовые сценарии при переходе на асинхронную модель
Вопрос пользователю в команде формы
Наиболее частым сценарием является получение информации от пользователя во время исполнения какой-либо команды.
Допустим, существует следующий код, написанный в рамках синхронной модели:
В рамках асинхронной модели с использованием новых средств этот код будет выглядеть следующим образом:
Процедура ДобавитьХарактеристику ( Команда )
//Выберем вид характеристики
Оповещение = Новый ОписаниеОповещения (
"ДобавитьХарактеристикуЗавершение" ,
ЭтотОбъект ) ;
ОткрытьФорму ( "ПланВидовХарактеристик.ВидыХарактеристик.ФормаВыбора" ,
, , , , , Оповещение , РежимОткрытияОкнаФормы . БлокироватьВеcьИнтерфейс ) ;
КонецПроцедуры
Процедура ДобавитьХарактеристикуЗавершение ( ВидХарактеристики , Параметры ) Экспорт
Если ВидХарактеристики = Неопределено Тогда
Возврат ;
КонецЕсли ;
//Проверим наличие
Если ОписаниеХарактеристик . НайтиСтроки (
Новый Структура ( "ВидХарактеристики" , ВидХарактеристики ) ) . Количество ( ) > 0 Тогда
ПоказатьПредупреждение ( , НСтр ( "ru = ‘Характеристика уже существует!’" , "ru" ) ) ;
Возврат ;
КонецЕсли ;
//Добавим вид характеристики на форму
ДобавитьХарактеристикуНаСервере ( ВидХарактеристики ) ;
КонецПроцедуры
Следует обратить внимание, что процедура-обработчик объявлена экпортируемой. Это связано с тем, что эта процедура будет вызвана не кодом самого модуля, а системным кодом платформы, поэтому модуль должен предоставить к ней доступ.
Вопрос пользователю при закрытии формы
Более сложной является ситуация, когда нужно о чем-то спросить пользователя во время обработчика события, например события закрытия формы. В асинхронной модели мы не можем сразу получить результат выбора, чтобы указать дальнейшие действия системе при помощи значения параметра Отказ .
В таких случаях доступен следующий алгоритм:
Ниже приведен пример кода, реализующего этот алгоритм:
Вопрос пользователю во вложенных процедурах
Теперь рассмотрим случай, когда выбор пользователя осуществляется в некоторой общей процедуре, вызываемой из разных мест другими процедурами. Получается, что в асинхронной модели такая процедура не может сразу вернуть результат, а должна как-то уведомлять вызывающие ее процедуры о том, что результат получен и можно продолжать работу.
Предположим, существует общая функция, которая возвращает текст, в зависимости от ответа пользователя:
В асинхронной модели эту функцию и ее вызовы следует реализовывать следующим образом:
Таким образом, вызовы процедур можно связывать в цепочки, передавая им результат при помощи метода ВыполнитьОбработкуОповещения().
Заключение
В статье были рассмотрены новые средства, позволяющие реализовывать более качественные приложения с использованием асинхронной модели, принятой в среде Интернет.
Несмотря на наличие таких средств, видно, что большое количество диалогов может усложнять программный код. К тому же, в веб-приложениях диалоги выбора используются гораздо реже, чем в настольных, поскольку снижают общее удобство использования.
Читайте также: