Доброе время суток.

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

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

    Для каждого СтрТЧ Из Объект.ТаблицаEXEL Цикл

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

    Если Ответ = КодВозвратаДиалога.Отмена Тогда
    Возврат;
    ИначеЕсли Ответ = КодВозвратаДиалога.Да Тогда
    СоздаемНоменклатуруНаСервере(СтрТЧ.Наименование);
    КонецЕсли;

    КонецЦикла;

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

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

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

    Для каждого СтрТЧ Из Объект.ТаблицаEXEL Цикл

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

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

    КонецЦикла;

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

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

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

Как сделать правильно (без модальности)?
---
```1c
    Процедура СоздатьНоменклатуру(Команда)
    ОбработатьСтроку(0);
    КонецПроцедуры;

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

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

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

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

    КонецПроцедуры
```
---
Может вместо возврат использовать Прервать;?
2. Сначала обрабатывается весь цикл, а уже потом задаются вопросы..
Может выгрузить ТЧ, и написать ПОКА СтрТЧ.Следующий() Цикл.
---
Дорабатывать второй вариант
---
Можно добавить
ОбработкаПрерыванияПользователя()

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

А почему так сложно показываете сообщения пользователю?

```1c
    Сообщить("Работа остановлена");
```
---
вынести операции внутри цикла в функцию, возвращающую отказ, а уже внутри функции обрабатывать оповещение
типа такого

```1c
    Перем Отказ;

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

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

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

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

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

    Функция ПослеЗакрытияВопроса()
    // обработать результат ответа и присвоить переменной Отказ требуемое значение
    КонецФункции
```
---
и в итоге у вас откроется столько диалогов вопроса, сколько будет строк в таблице. В немодальном режиме выполнение кода не прерывается, поэтому цикл

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

у вас не остановится, пока не закончатся строки или пользователь каким-то чудом не сможет нажать кнопку ответа, которой соответствует Отказ=Истина
---
```1c
    Процедура СоздатьНоменклатуру(Команда)
    ОбработатьСтроку(0);
    КонецПроцедуры;

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

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

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

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

    КонецПроцедуры
```
---
Вот это решение!
Правда сам уже допер уже...

Всем спасибо, вопрос закрыт.
---
Спасибо за идею!!
---
Алгоритм надо поменять. Сделать таблицу с галками, названиями из Екселя и номенклатурой. Есть номенклатура - ок. Нет номенклатуры - пользователь проставляет галки, что создавать.
Вопрос в цикле это не запрос в цикле, а как-то совсем уж не але.
---
Ага, на 1000 товаров 1000 раз жать "Да" - это извращение)))
---
Если пользователь устанет жать Да, для этого и нужна кнопка Отмена.

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

(10)
В шапке есть крыжик "Создавать без вопросов" - это работает и галки не нужны.
---
Если пользователь устанет жать Да, для этого и нужна кнопка Отмена.
Ну а если ему где-нибудь на 243, 327, 496 и 874 позициях надо нажать "Нет" вместо "Да"? Ему запоминать эти наименования или считать количество вопросов?
В этом случае проще потратить несколько минут: предварительно поставить все галки и снять в строках 243, 327, 496 и 874, после чего спокойно можно запустить создание номенклатуры и пойти пить чай. В вашем же случае пользователь вынужден следить за всем процессом от начала до конца, подтверждая многократно свои действия, что повышает вероятность совершения ошибки.
---
Сделать таблицу с галками
добавить на панель кноки ПОМЕТИТЬ ВСЁ, СНЯТЬ ПОМЕТКУ, отборами воспользоваться для установки