ПоказатьВопрос в цикле

1. testinj 15 19.03.19 12:48 Сейчас в теме
Доброе время суток.

Конфигурация УТ11.4, внешняя обработка создания номенклатуры из файла Excel.
Файл Excel предварительно загружается в Табличную часть обработки "ТаблицаEXEL"
Есть не правильный но рабочий код:

&НаКлиенте
Процедура СоздатьНоменклатуру(Команда)

                Для каждого СтрТЧ Из Объект.ТаблицаEXEL Цикл
			
			Ответ = Вопрос( "Создать номенклатуру с Наименованием = '"+СтрТЧ.Наименование+"'", РежимДиалогаВопрос.ДаНетОтмена, 0 );
			
			Если Ответ = КодВозвратаДиалога.Отмена Тогда
				Возврат;
                        ИначеЕсли Ответ = КодВозвратаДиалога.Да Тогда
                                 СоздаемНоменклатуруНаСервере(СтрТЧ.Наименование);
			КонецЕсли;
		
		
		КонецЦикла;

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

Показать


Более правильный но не рабочий код


&НаКлиенте
Процедура СоздатьНоменклатуру(Команда)

Для каждого СтрТЧ Из Объект.ТаблицаEXEL Цикл
			
			Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтаФорма, Параметры);

			ПоказатьВопрос(Оповещение, "Создать номенклатуру с Наименованием = '"+СтрТЧ.Наименование+"'", РежимДиалогаВопрос.ДаНетОтмена, 0 );
		
		КонецЦикла;

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

Показать


Задача при нажатии "Отмена", завершить цикл немедленно, но проблема в том что:

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

Как сделать правильно (без модальности)?
По теме из базы знаний
Найденные решения
6. Drak0n 187 19.03.19 13:06 Сейчас в теме
Процедура СоздатьНоменклатуру(Команда)
ОбработатьСтроку(0);
КонецПроцедуры;

Процедура ОбработатьСтроку(Строка)
Если Строка = Объект.ТаблицаEXEL.Количество() Тогда
    Возврат;
КонецЕсли; 

ДопПараметры = Новый Структура("Строка", Строка);
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтотОбъект, ДопПараметры);
ПоказатьВопрос(Оповещение, "Создать номенклатуру с Наименованием = '"+Строка.Наименование+"'", РежимДиалогаВопрос.ДаНетОтмена, 0 );
КонецПроцедуры;

Процедура ПослеЗакрытияВопроса(Ответ , ДопПараметры) Экспорт
Если Ответ = КодВозвратаДиалога.Отмена Тогда
    Возврат;
ИначеЕсли Ответ = КодВозвратаДиалога.Да Тогда
    СоздаемНоменклатуруНаСервере(Объект.ТаблицаEXEL[ДопПараметры.Строка].Наименование);
КонецЕсли;

ОбработатьСтроку(ДопПараметры.Строка+1);

КонецПроцедуры
Показать
cherryblossom; assa; chinkovs; user975424; paxan; nghtmn_cmth; vSAD; testinj; RocKeR_13; +9 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. arsen_botashev 19.03.19 12:56 Сейчас в теме
(1)Может вместо возврат использовать Прервать;?
2. Сначала обрабатывается весь цикл, а уже потом задаются вопросы..

Может выгрузить ТЧ, и написать ПОКА СтрТЧ.Следующий() Цикл.
2. N0t_F0und 10 19.03.19 12:53 Сейчас в теме
Дорабатывать второй вариант
4. user-z99999 67 19.03.19 12:57 Сейчас в теме
Можно добавить
ОбработкаПрерыванияПользователя()

Прерывание работы модуля клавишами Ctrl+Break может быть выполнено пользователем, только если в процессе работы модуля выполняется вызов процедуры глобального контекста ОбработкаПрерыванияПользователя(). Данная процедура проверяет, не было ли нажатия пользователем клавиш Ctrl+Break, и если было, прерывает работу модуля.

А почему так сложно показываете сообщения пользователю?
Сообщить("Работа остановлена");
5. VictorRGB2 13 19.03.19 12:59 Сейчас в теме
вынести операции внутри цикла в функцию, возвращающую отказ, а уже внутри функции обрабатывать оповещение
типа такого

Перем Отказ;

Для Каждого стр Из Таблица Цикл
    ОбработкаДействийВнутриЦикла(стр);
    Если Отказ Тогда 
          Прервать;
    КонецЕсли;
КонецЦикла;

Функция ОбработкаДействийВнутриЦикла(стр)

            Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтаФорма, Параметры);

            ПоказатьВопрос(Оповещение, "Создать номенклатуру с Наименованием = '"+стр.Наименование+"'", РежимДиалогаВопрос.ДаНетОтмена, 0 );

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

Функция ПослеЗакрытияВопроса()
// обработать результат ответа и присвоить переменной  Отказ требуемое значение
КонецФункции
Показать
8. RocKeR_13 1325 19.03.19 13:23 Сейчас в теме
(5) и в итоге у вас откроется столько диалогов вопроса, сколько будет строк в таблице. В немодальном режиме выполнение кода не прерывается, поэтому цикл
Для Каждого стр Из Таблица Цикл
    ОбработкаДействийВнутриЦикла(стр);
    Если Отказ Тогда 
          Прервать;
    КонецЕсли;
КонецЦикла;

у вас не остановится, пока не закончатся строки или пользователь каким-то чудом не сможет нажать кнопку ответа, которой соответствует Отказ=Истина
6. Drak0n 187 19.03.19 13:06 Сейчас в теме
Процедура СоздатьНоменклатуру(Команда)
ОбработатьСтроку(0);
КонецПроцедуры;

Процедура ОбработатьСтроку(Строка)
Если Строка = Объект.ТаблицаEXEL.Количество() Тогда
    Возврат;
КонецЕсли; 

ДопПараметры = Новый Структура("Строка", Строка);
Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтотОбъект, ДопПараметры);
ПоказатьВопрос(Оповещение, "Создать номенклатуру с Наименованием = '"+Строка.Наименование+"'", РежимДиалогаВопрос.ДаНетОтмена, 0 );
КонецПроцедуры;

Процедура ПослеЗакрытияВопроса(Ответ , ДопПараметры) Экспорт
Если Ответ = КодВозвратаДиалога.Отмена Тогда
    Возврат;
ИначеЕсли Ответ = КодВозвратаДиалога.Да Тогда
    СоздаемНоменклатуруНаСервере(Объект.ТаблицаEXEL[ДопПараметры.Строка].Наименование);
КонецЕсли;

ОбработатьСтроку(ДопПараметры.Строка+1);

КонецПроцедуры
Показать
cherryblossom; assa; chinkovs; user975424; paxan; nghtmn_cmth; vSAD; testinj; RocKeR_13; +9 Ответить
12. testinj 15 19.03.19 14:05 Сейчас в теме
(6)
Вот это решение!
Правда сам уже допер уже...

Всем спасибо, вопрос закрыт.
14. romankoav 4 14.05.20 14:17 Сейчас в теме
7. starjevschik 19.03.19 13:22 Сейчас в теме
Алгоритм надо поменять. Сделать таблицу с галками, названиями из Екселя и номенклатурой. Есть номенклатура - ок. Нет номенклатуры - пользователь проставляет галки, что создавать.
Вопрос в цикле это не запрос в цикле, а как-то совсем уж не але.
singlych; +1 Ответить
9. RocKeR_13 1325 19.03.19 13:25 Сейчас в теме
(7) Ага, на 1000 товаров 1000 раз жать "Да" - это извращение)))
11. testinj 15 19.03.19 14:02 Сейчас в теме
(9)
Если пользователь устанет жать Да, для этого и нужна кнопка Отмена.

Ставить 1000 галок, еще и прокручивая вертикальный скролинг (при условии что нужно создавать не все)

(10)
В шапке есть крыжик "Создавать без вопросов" - это работает и галки не нужны.
13. RocKeR_13 1325 19.03.19 14:21 Сейчас в теме
(11)
Если пользователь устанет жать Да, для этого и нужна кнопка Отмена.

Ну а если ему где-нибудь на 243, 327, 496 и 874 позициях надо нажать "Нет" вместо "Да"? Ему запоминать эти наименования или считать количество вопросов?
В этом случае проще потратить несколько минут: предварительно поставить все галки и снять в строках 243, 327, 496 и 874, после чего спокойно можно запустить создание номенклатуры и пойти пить чай. В вашем же случае пользователь вынужден следить за всем процессом от начала до конца, подтверждая многократно свои действия, что повышает вероятность совершения ошибки.
10. N0t_F0und 10 19.03.19 13:30 Сейчас в теме
Сделать таблицу с галками

добавить на панель кноки ПОМЕТИТЬ ВСЁ, СНЯТЬ ПОМЕТКУ, отборами воспользоваться для установки
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот