Доброе время суток.
Конфигурация УТ11.4, внешняя обработка создания номенклатуры из файла Excel.
Файл Excel предварительно загружается в Табличную часть обработки "ТаблицаEXEL"
Есть не правильный но рабочий код:
Более правильный но не рабочий код
Задача при нажатии "Отмена", завершить цикл немедленно, но проблема в том что:
1. Результат вопроса обрабатывается в другой процедуре
2. Сначала обрабатывается весь цикл, а уже потом задаются вопросы..
Как сделать правильно (без модальности)?
Конфигурация УТ11.4, внешняя обработка создания номенклатуры из файла Excel.
Файл Excel предварительно загружается в Табличную часть обработки "ТаблицаEXEL"
Есть не правильный но рабочий код:
&НаКлиенте
Процедура СоздатьНоменклатуру(Команда)
Для каждого СтрТЧ Из Объект.ТаблицаEXEL Цикл
Ответ = Вопрос( "Создать номенклатуру с Наименованием = '"+СтрТЧ.Наименование+"'", РежимДиалогаВопрос.ДаНетОтмена, 0 );
Если Ответ = КодВозвратаДиалога.Отмена Тогда
Возврат;
ИначеЕсли Ответ = КодВозвратаДиалога.Да Тогда
СоздаемНоменклатуруНаСервере(СтрТЧ.Наименование);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
ПоказатьБолее правильный но не рабочий код
&НаКлиенте
Процедура СоздатьНоменклатуру(Команда)
Для каждого СтрТЧ Из Объект.ТаблицаEXEL Цикл
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтаФорма, Параметры);
ПоказатьВопрос(Оповещение, "Создать номенклатуру с Наименованием = '"+СтрТЧ.Наименование+"'", РежимДиалогаВопрос.ДаНетОтмена, 0 );
КонецЦикла;
КонецПроцедуры
ПоказатьЗадача при нажатии "Отмена", завершить цикл немедленно, но проблема в том что:
1. Результат вопроса обрабатывается в другой процедуре
2. Сначала обрабатывается весь цикл, а уже потом задаются вопросы..
Как сделать правильно (без модальности)?
По теме из базы знаний
- Вариант перевода модальных вызовов в немодальные
- Цикл ввода данных, пример решения
- Опрос пользователя в цикле с оповещением (управляемые формы)
- Несколько немодальных вопросов пользователю подряд. Вариант реализации через рекурсивный вызов "ПоказатьВопрос"
- Использование асинхронных методов в платформе «1С:Предприятие 8»
Найденные решения
Процедура СоздатьНоменклатуру(Команда)
ОбработатьСтроку(0);
КонецПроцедуры;
Процедура ОбработатьСтроку(Строка)
Если Строка = Объект.ТаблицаEXEL.Количество() Тогда
Возврат;
КонецЕсли;
ДопПараметры = Новый Структура("Строка", Строка);
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтотОбъект, ДопПараметры);
ПоказатьВопрос(Оповещение, "Создать номенклатуру с Наименованием = '"+Строка.Наименование+"'", РежимДиалогаВопрос.ДаНетОтмена, 0 );
КонецПроцедуры;
Процедура ПослеЗакрытияВопроса(Ответ , ДопПараметры) Экспорт
Если Ответ = КодВозвратаДиалога.Отмена Тогда
Возврат;
ИначеЕсли Ответ = КодВозвратаДиалога.Да Тогда
СоздаемНоменклатуруНаСервере(Объект.ТаблицаEXEL[ДопПараметры.Строка].Наименование);
КонецЕсли;
ОбработатьСтроку(ДопПараметры.Строка+1);
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Можно добавить
ОбработкаПрерыванияПользователя()
Прерывание работы модуля клавишами Ctrl+Break может быть выполнено пользователем, только если в процессе работы модуля выполняется вызов процедуры глобального контекста ОбработкаПрерыванияПользователя(). Данная процедура проверяет, не было ли нажатия пользователем клавиш Ctrl+Break, и если было, прерывает работу модуля.
А почему так сложно показываете сообщения пользователю?
ОбработкаПрерыванияПользователя()
Прерывание работы модуля клавишами Ctrl+Break может быть выполнено пользователем, только если в процессе работы модуля выполняется вызов процедуры глобального контекста ОбработкаПрерыванияПользователя(). Данная процедура проверяет, не было ли нажатия пользователем клавиш Ctrl+Break, и если было, прерывает работу модуля.
А почему так сложно показываете сообщения пользователю?
Сообщить("Работа остановлена");
вынести операции внутри цикла в функцию, возвращающую отказ, а уже внутри функции обрабатывать оповещение
типа такого
типа такого
Перем Отказ;
Для Каждого стр Из Таблица Цикл
ОбработкаДействийВнутриЦикла(стр);
Если Отказ Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Функция ОбработкаДействийВнутриЦикла(стр)
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтаФорма, Параметры);
ПоказатьВопрос(Оповещение, "Создать номенклатуру с Наименованием = '"+стр.Наименование+"'", РежимДиалогаВопрос.ДаНетОтмена, 0 );
КонецФункции
Функция ПослеЗакрытияВопроса()
// обработать результат ответа и присвоить переменной Отказ требуемое значение
КонецФункции
Показать
(5) и в итоге у вас откроется столько диалогов вопроса, сколько будет строк в таблице. В немодальном режиме выполнение кода не прерывается, поэтому цикл
у вас не остановится, пока не закончатся строки или пользователь каким-то чудом не сможет нажать кнопку ответа, которой соответствует Отказ=Истина
Для Каждого стр Из Таблица Цикл
ОбработкаДействийВнутриЦикла(стр);
Если Отказ Тогда
Прервать;
КонецЕсли;
КонецЦикла;
у вас не остановится, пока не закончатся строки или пользователь каким-то чудом не сможет нажать кнопку ответа, которой соответствует Отказ=Истина
Процедура СоздатьНоменклатуру(Команда)
ОбработатьСтроку(0);
КонецПроцедуры;
Процедура ОбработатьСтроку(Строка)
Если Строка = Объект.ТаблицаEXEL.Количество() Тогда
Возврат;
КонецЕсли;
ДопПараметры = Новый Структура("Строка", Строка);
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтотОбъект, ДопПараметры);
ПоказатьВопрос(Оповещение, "Создать номенклатуру с Наименованием = '"+Строка.Наименование+"'", РежимДиалогаВопрос.ДаНетОтмена, 0 );
КонецПроцедуры;
Процедура ПослеЗакрытияВопроса(Ответ , ДопПараметры) Экспорт
Если Ответ = КодВозвратаДиалога.Отмена Тогда
Возврат;
ИначеЕсли Ответ = КодВозвратаДиалога.Да Тогда
СоздаемНоменклатуруНаСервере(Объект.ТаблицаEXEL[ДопПараметры.Строка].Наименование);
КонецЕсли;
ОбработатьСтроку(ДопПараметры.Строка+1);
КонецПроцедуры
Показать
Алгоритм надо поменять. Сделать таблицу с галками, названиями из Екселя и номенклатурой. Есть номенклатура - ок. Нет номенклатуры - пользователь проставляет галки, что создавать.
Вопрос в цикле это не запрос в цикле, а как-то совсем уж не але.
Вопрос в цикле это не запрос в цикле, а как-то совсем уж не але.
(11)
Ну а если ему где-нибудь на 243, 327, 496 и 874 позициях надо нажать "Нет" вместо "Да"? Ему запоминать эти наименования или считать количество вопросов?
В этом случае проще потратить несколько минут: предварительно поставить все галки и снять в строках 243, 327, 496 и 874, после чего спокойно можно запустить создание номенклатуры и пойти пить чай. В вашем же случае пользователь вынужден следить за всем процессом от начала до конца, подтверждая многократно свои действия, что повышает вероятность совершения ошибки.
Если пользователь устанет жать Да, для этого и нужна кнопка Отмена.
Ну а если ему где-нибудь на 243, 327, 496 и 874 позициях надо нажать "Нет" вместо "Да"? Ему запоминать эти наименования или считать количество вопросов?
В этом случае проще потратить несколько минут: предварительно поставить все галки и снять в строках 243, 327, 496 и 874, после чего спокойно можно запустить создание номенклатуры и пойти пить чай. В вашем же случае пользователь вынужден следить за всем процессом от начала до конца, подтверждая многократно свои действия, что повышает вероятность совершения ошибки.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот