Как в общем модуле вызвать диалог Вопроса «Да.Нет»
Подскажите плиз.
В общем модуле сделал процедуру :
Процедура ДЗР(Отказ,ДокументОбъект,ТекПользователь,ЭтаФорма) Экспорт
Если ДокументОбъект.Дата >РежимДиалогаВопрос.ДаНет;
<ОбщийМодуль.ОбщегоНазначения.Модуль(1760,17)>: Переменная не определена (КодВозвратаДиалога)
в модуле есть функция :
Функция ВопросДаНет(ТекстВопроса) Экспорт
Возврат (КодВозврата = КодВозвратаДиалога.Да);
я в процедуре пишу так :
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Режим = РежимДиалогаВопрос.ДаНет;
Ответ = Вопрос(«Закрыть без сохранения?», Режим, 0);
Если Ответ = КодВозвратаДиалога.Да Тогда
Отказ=Истина;
ЭтаФорма.Модифицированность=Ложь;
ЭтаФорма.Закрыть();
Иначе
//а тут ни фига
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Режим = РежимДиалогаВопрос.ДаНет;
Ответ = Вопрос(«Закрыть без сохранения?», Режим, 0);
Если Ответ = КодВозвратаДиалога.Да Тогда
Отказ=Истина;
ЭтаФорма.Модифицированность=Ложь;
ЭтаФорма.Закрыть();
Иначе
//а тут ни фига
КонецЕсли;
КонецПроцедуры
Этот код не канает, мне надо код разместить в общем модуле.
Все оказалось намного проще :
1. В общем модуле
Функция ВопросДаНет(ТекстВопроса) Экспорт
Возврат (КодВозврата = КодВозвратаДиалога.Да);
Процедура ДЗР(Отказ,ДокументОбъект,ТекПользователь,ЭтаФорма) Экспорт
1С 8.x : Форма
Универсальная Форма Вопроса для Пользователя
При написании программ, часто возникает ситуация, когда необходимо спросить у пользователя, какие данные он хочет получить.
В данной статье описан пример создания универсальной Формы Вопроса для Пользователя:
В свойствах формы, обязательно снять галочку «Разрешить закрытие», иначе пользователь сможет нажать на крестик в правом верхнем углу и ответа на вопрос не произойдет .
2. В модуле опишем действия заданных Событий:
Код 1C v 8.х
Все, форма готова!
Использовать ее, можно с помощью кода:
Пользователь увидит вопрос:
Автор: Евгений Мигачев
Похожие FAQ
Еще в этой же категории
Программное создание таблицы значений с условным оформлением 12
Как создать на форме таблицу и сделать для нее подсветку содержимого колонки в строке по условию? Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем ма Поле выбора
Как ограничить список выбора? 8
Ограничим список элементов, установив отбор в открываемой форме //Пример 1 Процедура СтатьяПДРНачалоВыбора(Элемент, СтандартнаяОбработка) ФормаВыбора = Справочники.ПрочиеДоходыИРасходы.ПолучитьФормуВыбора(, Элемент); ЭлементОтбораВидПДР = Форма Реквизит
1С диалог да нет
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
Работа с Диалогами в языке 1С 8.3, 8.2 (в примерах
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).
Подписывайтесь и получайте новые статьи и обработки на почту (не чаще 1 раза в неделю). |
Вступайте в мою группу ВКонтакте, Одноклассниках, Facebook или Google+ — самые последние обработки, исправления ошибок в 1С, всё выкладываю там в первую очередь.
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Нажмите одну из кнопок, чтобы поделиться:
Режим = РежимДиалогаВопрос.ДаНетОтмена;
Ответ = Вопрос(«Документ будет записан», Режим, 0);
Если Ответ = КодВозвратаДиалога.Отмена Тогда
Сообщить(«Документ не проведен, заказы поставщикам не созданы»);
Возврат;
КонецЕсли;
Если Ответ = КодВозвратаДиалога.Нет Тогда
Сообщить(«Документ не проведен, заказы поставщикам не созданы»);
Возврат;
КонецЕсли;
Если Ответ = КодВозвратаДиалога.Да Тогда
Записать(Новый Структура(«РежимЗаписи», РежимЗаписиДокумента.Запись));
КонецЕсли;
Как сделать отображение вопроса пользователю? Как спровить спросить «Да+Нет», «Повтор+Отмена» и т.д.?
В 1С 7.x можно делать так:
Если Вопрос(«Вы уверены?»,»Да+Нет»)=»Да» Тогда
Программирование в 1С для всех
Кто программировал в версиях 1С 8.1 и 8.2 помнят различные процедуры, вызывающие модальные окна: Предупреждение, Вопрос и т.п. С появлением платформы 8.3. все немного изменилось, и в полнее возможно, что код, написанный для конфигураций на платформе 1С 8.2, не будет работать на платформе 1С 8.3. При использовании вышеперечисленных процедур вызова модальных окон могут появляться ошибки подобного рода: «Использование модальных окон в данном режиме запрещено!».
Всему виной свойство конфигурации «Режим использования модальности»
У этого свойства может быть три значения:
• Использовать – тогда процедуры типа Предупреждение, Вопрос и тп будут работать;
• Использовать с предупреждениями – процедуры типа Предупреждение, Вопрос и тп будут работать, но будет выходить сообщение;
• Не использовать — процедуры типа Предупреждение, Вопрос и тп работать не будут.
Поэтому если возникла такая ошибка, то есть два варианта решения проблемы. Первый вариант – топорный, изменить свойство конфигурации «Режим использования модальности». Этот вариант в некоторых случаях может иметь место. Но имейте в виду, что он не применим, если конфигурация планируется запускаться под web-клиентом.
Второй вариант – переписать все имеющиеся процедуры вызова модальных окон на процедуры, использующие немодальные окна. Процедур, которые потребуется заменить в случае перехода с платформы 8.2 на 8.3, довольно таки много, я приведу только некоторые из них:
• Предупреждение – ПоказатьПредупреждение
• Вопрос – ПоказатьВопрос
• ВвестиЧисло – ПоказатьВводЧисла
• ВвестиСтроку- ПоказатьВводСтроки
• ВвестиДату – ПоказатьВводДаты
• ВвестиЗначение — ПоказатьВвводЗначения
Основное отличие всех вышеперечисленных новых процедуры, то, что ввод-вывод информации осуществляется асинхронно. Что это значит? Пока Вы решаете нажать или не нажать кнопку «ОК», как ответить на вопрос, или какое число ввести, идет выполнение кода программы. Для этого в метод необходимо передать название процедуры, которая будет обработчиком ожидания. И сработает, когда вы нажмете кнопку «ОК».
В тоже время не стоит путать асинхронность с параллельностью. Код, который у Вас сработает в процедуре обработчике ожидания, не будет выполняться параллельно основному коду. Он сработает после выполнения этого кода.
Рассмотрим эту особенность более подробно. Для этого я создал простую обработку, в которой будет выполняться следующий код:
Поясню написанный выше код: мы создали обработчик ожидания с помощью объекта «ОписаниеОповещения», где в качестве первого параметра указали название процедуры, которая должна сработать после нажатия кнопки «ОК» окна предупреждения. В следующей строке мы применили процедуру «ПоказатьПредупреждение», где в качестве первого параметра указали написанный выше обработчик ожидания. Именно после нажатия кнопки «ОК» сработает процедура «ПослеЗакрытияПредупреждения». А в конце мы написали простой цикл.
Обратите внимание на рисунок, цикл сработал до того, как мы нажали на кнопку «ОК» окна предупреждении. Это и есть, по сути, асинхронное выполнение кода.
Теперь попробуем применить вызов предупреждения внутри цикла
И всё равно, выполнение цикла произойдет до того как будет нажата кнопка «ОК». Точно так же будет работать метод, если мы уберем оповещение.
В связи с переходом на немодальные окна потребуется пересмотреть принципы работы диалогов пользователя, где нужно ответить, как вариант, да-нет.
Если в модальных окнах можно было использовать такой код:
То при использовании немодальных окон, код будет следующим:
В этом случае одним из параметров процедуры, которая будет обработчиком ожидания, будет параметр, имеющий тип код возврата диалога.
Рассмотрим еще один вариант, если нам нужно что-то сделать в обработчике события в зависимости от той или иной ситуации в цикле. Допустим, мы записываем документы, и нужно задать какой-то вопрос, от которого будет зависеть запись документа (допустим сменить склад). Понятно что таких документов может быть много и их нужно как-то накопить. Для этого можно использовать параметр, который мы передаем в обработчик ожидания (третий параметр конструктора объекта ОписаниеОповещения).
В своем коде я ни чего не буду записывать, а просто покажу, как можно реализовать подобную ситуацию. В качестве параметра обработчика ожидания я буду использовать структуру, в которую добавлю в качестве элемента в массив. В этот массив добавляем номера интерации цикла, в тот момент когда, срабатывает процедура ПоказатьВопрос (точно так же можно добавлять и ссылки на документы).
Поскольку обработчики начнут выполняться после моего основного цикла, то мне нужен порядок выполнения этих обработчиков, что бы узнать, какой индекс массива взять.
Для этого я создам реквизит формы с типом число.
И при вызове обработчика события, буду рекурсивно прибавлять этот реквизит. Тем самым мы будем знать, для какого по индексу события вызван наш обработчик.
В структуру, которую Вы указываете в описании оповещения можно записывать практически любые переменный, а потом их использовать в обработчике этого оповещения. Но всегда нужно помнить, что код в обработчике выполнится уже после основного кода.
Как мы видим, использование асинхронности модальных окон может существенно улучшить некоторые моменты разработки. Но в тоже время переход с модальных окон типа Предупреждение, Вопрос на немодальные окна: ПоказатьПредупреждение, ПоказатьВопрос накладывает определенные проблемы: алгоритмы, которые были раньше вполне возможно потребуют существенной переработки. Необходим будет какой-то рефакторинг кода. Причем иной раз очень серьезный.
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
1С. ОписаниеОповещения
ОписаниеОповещения — объект встроенного языка 1С:Предприятия, указывающий на процедуру, в которой будет продолжено исполнение кода при наступлении определенного события.
Вслед за браузерами, которые отказались от модальности, технологической платформе пришлось перейти на асинхронную работу клиентской части. Необходимо это было для поддержки веб-клиента.
Ведь формы выбора файлов, вопросов, предупреждений, ввода значений, да и зачастую формы, от результата работы в которых зависит дальнейший ход событий, были модальными.
Основным инструментом отказа от модальности стало ОписаниеОповещения.
Как работает ОписаниеОповещения
Для начала разберем как работает платформа с модальными окнами на примере метода Вопрос(). Напишем не хитрый код, в котором пользователю показывается диалог с вопросом и вариантами ответа Да и Нет.
В данном случае пользователю будет показан диалог, а работа клиентской части будет полностью приостановлена до момента, пока пользователь не ответит на вопрос.
Тогда результат поместится в переменную Ответ и только после этого работа клиентской части будет возобновлена для выполнения алгоритма заполнения.
Напишем аналогичный пример, но уже без модального вызова. Будем использовать метод ПоказатьВопрос(), которому передадим ОписаниеОповещения.
Пользователь не заметит разницы, ведь будет показан точно такой же диалог с вопросом. Но исполнение кода не будет приостановлено, вместо этого будет исполнен дальнейший алгоритм и будет завершена работа текущей процедуры.
После ответа пользователя будет вызвана процедура ОбработатьОтветПользователя(), которую мы указали в конструкторе ОписаниеПоповещения и только тогда будет выполнен алгоритм заполнения.
Описание функционала от разработчиков на ИТС
Синтаксис
Конструктор ОписаниеОповещения имеет 5 необязательных параметров:
ИмяПроцедуры — Имя экспортируемой процедуры, которая будет вызвана;
Модуль — Модуль в котором расположена вызываемая процедура. Могут быть указаны Форма, Общий модуль, Команда командного интерфейса;
ДополнительныеПараметры — Произвольное значение, которое будет передано в вызываемую процедуру последним параметром;
ИмяПроцедурыОбработкиОшибки — Имя экспортируемой процедуры, которая будет вызвана в случае ошибки;
МодульОбработкиОшибки — Модуль в котором расположена вызываемая процедура в случае ошибки. Могут быть указаны Форма, Общий модуль, Команда командного интерфейса.
Вызываемая процедура и её параметры
Вызываемая процедура должна быть экспортируемой, и в самом простом случае содержать два параметра Результат и ДополнительныеПараметры.
В зависимости от объекта в котором используется ОписаниеОпопвещения, количество параметров вызываемой процедуры может меняться.
Например вызываемая процедура для обработки оповещения метода глобального контекста НачатьПомещениеФайла() должна иметь 4 параметра.
Для избежания ошибок обращайтесь к Синтаксис-помощнику, там описано количество и порядок необходимых параметров.
Выполнение обработки оповещения
В платформе реализован метод ВыполнитьОбработкуОповещения(), для возможности непосредственного выполнения обработки оповещения.
Методу в качестве параметра необходимо передать ОписаниеОповещения, которое будет выполнено. Так же можно передать в процедуру обработки произвольный результат вторым необязательным параметром.
Работа на сервере
ОписаниеОповещения не доступно на сервере, но в качестве исполняемой процедуры можно указать серверный метод. В справке нет явного указания о данной возможности, но и противоречий нет.
Возможные ошибки
Не найден экспортируемый метод
Если вызываемая процедура не экспортная, то при исполнении будет вызвано исключение. Решается указанием экспортной процедуры.
Количество параметров 1. Ожидаемое количество – 2
Если вызываемая процедура будет объявлена с одним параметром, то при исполнении будет вызвано исключение. Решается добавлением второго параметра в вызываемую процедуру.
Примеры использования ОписаниеОповещения
ОписаниеОповещения может использоваться во множестве сценариев, например обработка результата открытия форм, диалог выбора файла, работа с файлами, чтение и запись данных, работа с табличными и текстовыми документами. Разберем некоторые из них.
Оповещение о закрытии формы
Реализуем функционал открытия формы подбора с дальнейшей обработкой результата
Ввод значений и предупреждения
Реализуем функционал ввода числа. После ввода выполним проверку на четность введенного числи, если число не четное выведем предупреждение
Проверка существования файла и передача описания оповещения через дополнительные параметры
При работе на стороне клиента, например с оборудованием, логику работы системы можно организовать при помощи оповещений. Можно передавать ОписаниеОповещения в качестве следующего шага, ветвления логики или вызывать одно оповещение из нескольких мест.
Разработаем функционал проверки существования файла. В модуле реализована процедура для централизованной обработки ошибок ОповеститьОбОшибке(), будем передавать ОписаниеОповещения об ошибке через дополнительные параметры.
Обработаем результат проверки существования файла. Если файл не существует, выполним обработку оповещения переданного через дополнительные параметры
Процедура для централизованной обработки ошибок