Разделы сайта
Выбор редакции:
- Крейсер "красный крым" черноморского флота
- «31 спорный вопрос» русской истории: житие императора Николая II
- Лечебные свойства корня лопуха и его широкое применение в домашних условиях
- Природные ресурсы западной сибири
- Совместимость петуха и змеи в любовных отношениях и браке Он петух она змея совместимость
- Чемерица черная: прекрасная и опасная Противопоказания и побочные действия
- Чем интересна Свято-Михайло-Афонская Закубанская пустынь?
- Порционная сельдь под шубой на праздничный стол
- К чему снится шить во сне
- Примета — разбить зеркало случайно: что делать, если оно треснуло
Реклама
1с вопрос да нет управляемые формы. Как использовать показатьвопрос в обработчике формы передзаписью |
Задайте вопрос по учету и в течение семи рабочих дней получите ответ аудитора или методиста фирмы "1С". Условия использованияПринимаются вопросы по темам:
Исключения составляют вопросы
Единовременно от одного пользователя принимается в работу только один вопрос. Следующий вопрос пользователь может прислать после получения ответа на предыдущий вопрос. ЦенаСервис "Отвечает аудитор" включен в пакеты информационно-технологического сопровождения 1С:ИТС уровня ПРОФ. ДополнительноКак правильно задать вопрос
Форма и условия использования ответа
Вступление Для чего вообще стоит отказываться от модальности и, например, Вопрос заменять на ПоказатьВопрос? Всё дело в том, что больше года назад 1С-ники объявили « войну» модальным окнам. Исключение составляют только те, у кого самописная конфигурация, работа с которой не будет вестись на IPad, в режиме сервиса или с помощью веб-клиента. А если у вас обычная Бухгалтерия 3.0 и вы не собираетесь бухгалтеру давать доступ к базе через IPad, всё равно вам придётся заменить все модальные методы на немодальные, т.к. рано или поздно «Режим использования модальности» станет «Не использовать»! Что же думает по предлагаемому вопросу специалисты фирмы 1С? Для начала можно посмотреть на тему «Вопрос в обработчике формы ПередЗакрытием»:
Этот пример схож с нашей темой и очень часто на него ссылаются в теме «ПоказатьВопрос в обработчике формы ПередЗаписью»:
Задача сложная, поэтому разработчики при задании вопроса ПередЗаписью, в первую очередь рекомендуют отказаться от этой идеи… Дальше предлагают задать вопрос с множеством вариантов: «Отказаться, Только записать, Записать и закрыть». Помимо описанного минуса (пользователь и так уже заранее выбрать вариант, а его тут ещё раз спрашивают) есть ещё: в ПередЗаписью программа могла попасть и из «Отмена проведения». Т.е. надо добавлять ещё кнопку? Мне кажется этот вариант некрасивым. Остаётся только третий вариант с использованием нестандартных команд формы. Его мы и будем реализовывать. И не стандартной командой у нас будет только «Провести и закрыть». Как и в примере к теме «Вопрос в обработчике формы ПередЗакрытием», нам придётся при первом заходе давать Отказ = Истина, и только во втором заходе выполнять реальную запись. И ещё нам где-то нужно будет запоминать, что это именно второй заход в процедуру «ПередЗаписью». 1С-ники предложили это сделать через общую клиентскую переменную, в рассматриваемом примере это можно сделать через ПараметрыЗаписи. Пример использования ПоказатьВопрос в обработчике формы ПередЗаписью 1. Сначала нам нужно убрать стандартную команду «Провести и закрыть» из формы и создать свою команду и кнопку. 1.А. Если у вас уже кнопка «Провести и закрыть» не типовая - вам повезло, можете смело приступать к п. 2. 1.Б. Стандартная команда убирается через Свойства формы - Состав команд - Снимаем ненужную команду. Как добавлять команду и кнопку на форму, я не буду описывать, только напомню, что кнопку «Провести и закрыть» необходимо сделать кнопкой по умолчанию. 1.В. Теперь вариант сложнее в реализации, но проще в сопровождении типовой конфигурации. Практически в каждом обновлении Бухгалтерии программисты умудряются изменить 10-50% форм документов, поэтому в типовой конфигурации для сопровождения проще кодом убрать стандартную кнопку и добавить свою команду и кнопку. Для начала в обработчике формы «ПриОткрытии» необходимо убрать стандартную кнопку «ПровестиИЗакрыть». Элементы.ФормаПровестиИЗакрыть.Видимость = Ложь; Замечание: у пользователя с большими ограничениями к документу в платформе 8.3.7 вообще не появляется кнопка "Провести и закрыть". Поэтому для платформы 8.3.7 корректней писать код: Если Элементы.Найти("ФормаПровестиИЗакрыть")<>Неопределено Тогда Элементы.ФормаПровестиИЗакрыть.Видимость = Ложь; КонецЕсли; НоваяКоманда1 = ЭтаФорма.Команды.Добавить("ПровестиИЗакрыть2"); НоваяКоманда1.Действие = "ПровестиИЗакрыть"; НовыйЭлемент = Элементы.Добавить("ФормаПровестиИЗакрыть2" , Тип("КнопкаФормы"), Элементы.ФормаКоманднаяПанель); НовыйЭлемент.Заголовок = "Провести и закрыть"; НовыйЭлемент.ИмяКоманды = НоваяКоманда1.Имя; НовыйЭлемент.КнопкаПоУмолчанию = Истина; Элементы.Переместить(НовыйЭлемент,НовыйЭлемент.Родитель,Элементы.ГруппаКнопкиКоманднойПанели); Соответственно в этом коде заложены типовые наименования для ФормаДокументаОбщая документа «Поступление (акты, накладные)» (например Элементы.ГруппаКнопкиКоманднойПанели), которые в каждом конкретном случае необходимо будет менять на свои. &НаКлиенте Процедура ПровестиИЗакрыть(Команда) ПараметрыЗаписи = Новый Структура(); ПараметрыЗаписи.Вставить("РежимЗаписи", ПредопределенноеЗначение("РежимЗаписиДокумента.Проведение")); ПараметрыЗаписи.Вставить("Закрыть", Истина); Если Записать(ПараметрыЗаписи) Тогда Закрыть(); КонецЕсли; КонецПроцедуры Как я писал выше, мы будем обмениваться информацией между нашими процедурами через ПараметрыЗаписи. В ПередЗаписью мы не знаем, нажали мы «Записать», «Провести» или «Провести и закрыть», для этого в параметрах мы передаём параметр Закрыть. Если в параметрах записи есть этот параметр, значит надо закрыть форму после успешной записи. 3. Допустим, нам надо задавать вопрос не всегда, а только когда документ проведён. Теперь мы в процедуру «ПередЗаписью» добавляем (если эта процедура не существовала - создаём) новый код: Если Не ПараметрыЗаписи.Свойство("ВопросЗадан") И Объект.Проведен Тогда Отказ = Истина; Оповещение = Новый ОписаниеОповещения("ПоказатьВопросЗавершение", ЭтаФорма, ПараметрыЗаписи); ТекстВопроса = "Данный документ уже проведён. Вы действительно хотите перепровести или отменить проведение документа?"; ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 20, КодВозвратаДиалога.Нет, КодВозвратаДиалога.Нет); КонецЕсли; Свойство «ВопросЗадан» мы будем заполнять в оповещении, чтобы узнавать, когда в процедуру «ПередЗаписью» мы зашли во второй раз (в примере 1С в процедуре ПередЗакрытием это делалось через переменную «ВыполняетсяЗакрытие»). Другими словами: в структуре «ПараметрыЗаписи» есть свойство «ВопросЗадан», значит, вопрос уже задавали, и пользователь уже ответил утвердительно, если же свойства нет, значит, в процедуре «ПередЗаписью» мы первый раз. После метода ПоказатьВопрос можно ещё написать «Возврат», если у вас есть ещё какой-то код в процедуре «ПередЗаписью», выполняемый после вопроса. 4. Создаём процедуру «ПоказатьВопросЗавершение», в которую программа будет входить, когда пользователь ответит на вопрос (или произошёл таймаут). &НаКлиенте Процедура ПоказатьВопросЗавершение(Результат, ПараметрыЗаписи) Экспорт Если Результат = КодВозвратаДиалога.Да Тогда ПараметрыЗаписи.Вставить("ВопросЗадан", Истина); Если Записать(ПараметрыЗаписи) И ПараметрыЗаписи.Свойство("Закрыть") Тогда Закрыть(); КонецЕсли; КонецЕсли; КонецПроцедуры В этой процедуре мы и используем переданное ранее свойство «Закрыть». Если свойства нет, значит, закрывать не надо. 5. Теперь нам надо обработать нажатие «крестика» пользователем. Для этого нам нужна обработчик формы «ПередЗакрытием». Если его нет, то его можно создать на форме «ручками» или программно в обработчике «ПриСозданииНаСервере» : ЭтаФорма.УстановитьДействие("ПередЗакрытием","ПередЗакрытием"); &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) Если Модифицированность Тогда Отказ = Истина; ТекстВопроса = НСтр("ru = "Данные были изменены. Сохранить изменения?""); Оповещение = Новый ОписаниеОповещения("ВопросПередЗакрытиемЗавершение", ЭтотОбъект); ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ВопросПередЗакрытиемЗавершение(Результат, ДополнительныеПараметры) Экспорт Если Результат = КодВозвратаДиалога.Да Тогда ПараметрыЗаписи = Новый Структура(); ПараметрыЗаписи.Вставить("Закрыть", Истина); Если Записать(ПараметрыЗаписи) Тогда Закрыть(); КонецЕсли; ИначеЕсли Результат = КодВозвратаДиалога.Нет Тогда Модифицированность = Ложь; Закрыть(); КонецЕсли; КонецПроцедуры Получается, что пользователь когда нажал крестик ответит сначала на вопрос «Сохранить изменения?» и потом задастся ещё вопрос, который у вас прописан «ПередЗаписью». Если вас это не устраивает, можно передать параметр «ВопросЗадан» в «ВопросПередЗакрытиемЗавершение» и тогда второго вопроса не будет. Вопрос против ПоказатьВопрос А как бы мы решили задачу, если бы можно было использовать модальные вызовы? А очень просто, мы бы написали в процедуре «ПередЗаписью» следующий код: Если Объект.Проведен Тогда ТекстВопроса = "Данный документ уже проведён. Вы действительно хотите перепровести или отменить проведение документа?"; Ответ = Вопрос(ТекстВопроса,РежимДиалогаВопрос.ДаНет,20,КодВозвратаДиалога.Нет,КодВозвратаДиалога.Нет); Если Не Ответ=КодВозвратаДиалога.Да Тогда Отказ = Истина; Возврат; КонецЕсли; КонецЕсли; И всё! Никаких «заморочек» типа «А что пользователь нажал: Провести или ПровестиИЗакрыть?». И ещё надо будет отработать нажатие крестика в «ПередЗакрытием». Изначально похожий код я реализовывал у себя в Бухгалтерии предприятия 3.0. Задача заключалась в следующем: при определённом наборе условий (это не одно условие Объект.Проведен, как указано в примере в данной публикации ) из ФормаДокументаОбщая документа ПоступлениеТоваровУслуг спрашивать дополнительно подтверждения его действий. Ниже перечислены нюансы, которые мне не пришлось обходить, т.к. не подпадали под задачу. В обработчик формы «ПередЗаписью» программа не заходит, если: 1) пользователь нажал на кнопку «Пометить на удаление / снять пометку»; 2) если пользователь нажал на не проведённом документе кнопку «ДТ/КТ». И это не всё: если вы на форме документа создали всё, как я написал, и пользователь из формы списка перепроведёт документ - то никаких вопросов программа ему не задаст. Необходимо все интересующие вас кнопки на форме списка заменять на свои и отслеживать действия пользователя. Ещё у документа может быть не одна форма документа, а несколько (например, документ ПоступлениеТоваровУслуг в БП 3.0, где 3 формы: общая, товары и услуги). В каждой форме документа надо написать много кода… В связи с кучей нюансов остаётся актуальным первый совет от 1С (который сначала, без подробного вникания в задачу, может вызвать улыбку): «Изменить логику прикладного решения так, чтобы не было диалога с пользователем в этом обработчике». Давайте определимся, что же такое диалог? Вызов команды Сообщить является диалогом? А вызов команды Ввести Число! А вызов ОткрытьЗначение ? Итак, диалог - это прежде всего элемент графического интерфейса. окно. А, следовательно, вызов Сообщить диалогом не является, так как у него нет своего отдельного окна. Диалог - это не просто окно. Это окно, которое открывается пользователю с целью вывода информации и (или) получения ответа. Примеры диалогов: 1 С: Предприятие X Кафедра Прикладной информатики іигнчіїїтдиичіїїзіниипчпїтіі Для того, чтобы показать какой-либо диалог, необходимо вызвать команду, соответствующую этому диалогу, и передать ей необходимые параметры. Эта команда представляет собой обычную процедуру или функцию, только написанную не нами, а программистами фирмы 1С. Мы не можем менять эти команды, мы можем их только вызывать. Рассмотрим некоторые из них. Предупреждение Отличным примером диалога является вывод предупреждения пользователю: Предупреждение("Осторожно!"); Что мы видим? Вызов команды Предупреждение, в которую в качестве параметра передается строка "Осторожно". Когда компьютер дойдет до строчки, в которой вызывается эта команда, пользователю отобразится диалог предупреждения. И до тех пор, пока пользователь не закроет этот диалог, компьютер будет ожидать на этой же строчке. Только после закрытия диалога выполнение программы продолжится и начнется выполнение строки, следующей за вызовом диалога. К примеру, пусть у нас есть такой код: Предупреждение(" 1"); Предупреждение("2"); Предупреждение("3"); Как он будет выполняться? Вначале компьютер дойдет до строчки №1 и выполнит команду Предупреждение с параметром "1". В этот момент пользователю покажется диалоговое окно с текстом "1", а компьютер замрет на этой строчке и будет ожидать, пока пользователь закроет диалог. После закрытия диалога компьютер перейдет к выполнению строчки №2 и выполнит команду Предупреждение уже с другим параметром "2". Пользователю снова покажется диалоговое окно, но уже с текстом "2", а компьютер замрет уже на второй строчке и будет ожидать, пока пользователь закроет диалог. Затем компьютер перейдет к третьей строчке. Ну, и так далее. У команды Предупреждение параметр, отвечающий за текст, который выводится - не единственный. Есть еще два дополнительных параметра: Предупреждение(, , ) Таймаут - означает количество секунд, через которое диалог закроется сам, если этого не сделает пользователь. Заголовок - подменяет стандартный заголовок "1 С: Предприятие" на строку пользователя. К примеру, такой код: Предупреждение("Осторожно.", 5, "Внимание!"); покажет диалог с текстом "Осторожно." и заголовком "Внимание!", а также закроется через 5 секунд, если пользователь не сделает этого раньше:
А что если мы хотим задать только текст и заголовок окна, а таймаут не задавать? Во-первых, мы можем передать в качестве таймаута ноль: Предупреждение("Осторожно.", О, "Внимание!"); А во-вторых, мы можем просто оставить пустое место вместо параметра, и система сама поймет, что нужно оставить его значение по умолчанию: Предупреждение("Осторожно.", "Внимание!"); Для того, чтобы узнавать обо всех возможных параметрах встроенных команд 1С, пользуйтесь синтакс-помощником так, как это описано в одном из предыдущих юнитов. Ввод числа Некоторые диалоги не только выводят какую-то информацию от нас пользователю, но и, наоборот, возвращают некий результат взаимодействия с пользователем. Примером такого диалога является ввод числа. К примеру, напишем: ВвестиЧисло(Число); Введите число Зачем мы передаем в команду параметр Число ? Во-первых, для того, чтобы отобразить начальное значение ввода в диалоге. А, во-вторых, чтобы вернуть в эту переменную значение, которое ввел пользователь. Но что если пользователь отказался от ввода и нажал кнопку "Отмена"? Как об этом узнать? Оказывается, функция ВвестиЧисло не только показывает диалог ввода числа, но еще и возвращает нам Истина в том случае, если пользователь нажал кнопку "ОК", и Ложь, если он отменил ввод, нажав кнопку "Отмена". Таким образом, более правильным будет такой код: Результат = ВвестиЧисло(Число); Если Результат = Истина Тогда ОткрытьЗначение("Вы ввели " + Строка(Число)); ОткрытьЗначение("Вы отменили ввод"); КонецЕсли; В переменную Результат (имя могло быть любым) возвращается Истина или Ложь в зависимости от того, какую кнопку нажал пользователь ("ОК" или "Отмена"). В переменную Число возвращается число, введенное пользователем. Вопрос Заключительным диалогом, который мы рассмотрим, будет диалог вопроса пользователю. Имя команды, которая вызывает этот диалог, нам известно - Вопрос. Теперь давайте посмотрим в синтакс-помощнике, какие параметры принимает эта команда: Вопрос(, >) ТекстВопроса - это сам вопрос в текстовом виде, который увидит пользователь. Кнопки - это одно из предопределенных значений, которые также можно посмотреть в синтакс-помощнике. Например, если передать в этот параметр:
Таймаут - этот параметр нам уже знаком. КнопкаПоУмолчанию - это кнопка, на которой будет фокус при показе окна. Ее значения могут быть такими:
Заголовок - этот параметр нам уже знаком. КнопкаТаймаута - если задать значение этой кнопки и параметр Таймаут, то именно на ней будет отображаться количество оставшихся секунд до закрытия диалога. У нее могут быть такие же значения, как и у параметра КнопкаПоУмолчанию. Как видите, параметров много. Но необязательно использовать их все. Как следует из синтакс-помощника, обязательными к заполнению являются только первые два: Вопрос("Вам понятен материал?", Режим Д и лога Вопрос.Да Н ет); Вопрос-то мы задали. Хорошо бы теперь получить ответ -понятен материал или нет. Из того же синтакс-помощника мы узнаем, что кнопка, которая была нажата, возвращается в качестве результата вызова команды Вопрос. Результат = Вопрос("Вам понятен материал?", РежимДиалогаВо-прос.ДаНет); Если Результат = КодВозвратаДиалога.Да Тогда ОткрытьЗначение("Какой вы молодец!"); ОткрытьЗначение("Выполните задания еще раз!"); КонецЕсли; Модальность Все примеры диалогов, которые мы рассмотрели, являются модальными, потому что компьютер, показывая диалог, замирает на той же строчке и не идет дальше, пока диалог не закроется. Еще можно сказать, что, когда мы показываем модальный диалог, пользователь может работать только с этим диалогом. Работа со всей остальной частью системы блокируется, пока не закроется диалог. Таким недостатком не обладают немодальные версии диалогов, но к ним переходить нам еще рано. Для отработки и закрепления материала данного юнита рекомендуется выполнить нижеследующее задание. Напишите программу, которая спрашивает пользователя "Нажмите Да, чтобы вывести числа от 1 до 10, Нет - чтобы вывести числа от 10 до 100, ни в коем случае не нажимайте кнопку Отмена". В диалоге должны быть три кнопки Да, Нет и Отмена. Если пользователь нажал Да - выводим числа от 1 до 10, Нет - от 10 до 100, Отмена - выводим диалог предупреждения с текстом "Мы же вас предупреждали, что нельзя нажимать отмену!". Решение Результат = Вопрос( "Нажмите Да, чтобы вывести числа от 1 до 10" + ", Нет - чтобы вывести числа 10 до 100, ни в коем" + "случае не нажимайте кнопку Отмена", РежимДиалогаВопрос. ДаНетОтмена); Если Результат = КодВозвратаДиалога.Да Тогда Для Шаг = 1 По 10 Цикл Сообщить(Шаг); КонецЦикла; ИначеЕсли Результат = КодВозвратаДиалога.Нет Тогда Для Шаг = 10 По 100 Цикл Сообщить(Шаг); КонецЦикла; ИначеЕсли Результат = КодВозвратаДиалога.Отмена Тогда ОткрытьЗначение("Мы же вас предупреждали, что нельзя нажимать отмену!"); |
Читайте: |
---|
Новое
- «31 спорный вопрос» русской истории: житие императора Николая II
- Лечебные свойства корня лопуха и его широкое применение в домашних условиях
- Природные ресурсы западной сибири
- Совместимость петуха и змеи в любовных отношениях и браке Он петух она змея совместимость
- Чемерица черная: прекрасная и опасная Противопоказания и побочные действия
- Чем интересна Свято-Михайло-Афонская Закубанская пустынь?
- Порционная сельдь под шубой на праздничный стол
- К чему снится шить во сне
- Примета — разбить зеркало случайно: что делать, если оно треснуло
- Самостоятельные заговоры на удачу и деньги