Имя: Пароль:
1C
1С v8
1c 8.3 модальные и не модальные окна в цикле
0 norets
 
04.12.16
07:41
Добрый день!
Помогите разобраться в таком вопросе:
Есть обработка для загрузки номенклатурного справочника из Excel. Требуется при создании вида номенклатуры выбрать ценовую группу. На текущий момент сделано так:
<code>
&НаКлиенте
Процедура Прочитать(Команда)
//Здесь идет чтение файла потом
//Для и = 1 по что-тотам.количество() цикл


// Тут мы прверяем есть ли группа номенклатуры и вид номенклатуры и //создаем если нет
    ГруппаИВид = Новый Массив;
                ГруппаИВид = НайтиГруппуИВидНоменклатуры(Гр);
                Если  ГруппаИВид[0].Пустая() Тогда
                    РодНом = СоздатьРодителя(Гр);
                Иначе
                    РодНом = ГруппаИВид[0];
                КонецЕсли;
                Если ГруппаИВид[1].Пустая() Тогда
                    //ВложеннаяПроцедура(Новый ОписаниеОповещения("ОбработкаКомандыЗавершение", ЭтотОбъект));
                    СтруктураВида = Новый Структура;
                    СтруктураВида.Вставить("Наименование", Гр);
                    НаценкаНаГруппу = Неопределено;
                    Если ВвестиЗначение(НаценкаНаГруппу, "Введите наценку для: " + Гр, Тип("СправочникСсылка.ЦеновыеГруппы")) Тогда  

//Вот здесь цикл останавливается пока не выберут ценовую группу
                        СтруктураВида.Вставить("ЦеноваяГруппа", НаценкаНаГруппу);
                    КонецЕсли;
                    ВидНом = СоздатьВидНоменклатуры(СтруктураВида);
                                        
                Иначе
                    ВидНом = ГруппаИВид[1];
                КонецЕсли;

// Продолжается цикл и создается элемент справочника

КонецПроцедуры
</code>
(прошу прощения если не очень понятная процедура, но должно хватить. Если что - я полный код приложу)

Все загружается, все хорошо если бы не одно но... Выскакивает предупреждение что использование модальных окон запрещено. Это можно отключить сняв конфигурацию с поддержки, чего делать не очень хочется.
Есть дублер метода ВвестиЗначение() = ПоказатьВводЗначения(), но тогда цикл не останавливается и смысл теряется. Есть ли возможность использования метода ПоказатьВводЗначения() с остановкой цикла? Как в данной ситуации поступить?
Еще раз прошу прощения за сумбурное объяснение. Если есть вопросы - отвечу. Заранее спасибо за помощь!
1 Garykom
 
гуру
04.12.16
07:45
Вынеси указание наценок (все что требует действий пользователя) из цикла/процедур обработки.

Нажал кнопочку - считались все группы - показал их разом все пользователю, пусть проставит циферки - далее грузишь используя введенные данные.

Для не модальности изучи http://its.1c.ru/docs/v8nonmodal/
http://xn----1-bedvffifm4g.xn--p1ai/news/отказ-от-модальных-окон-в-1с-8-3/
2 Garykom
 
гуру
04.12.16
07:47
(1)+ Суть отказа от модальности весь код делится на 2 части (процедуры/функции):
1. До вызова/показа формы/диалога не модального, он вызовет для обработки выбора/ввода данных
2. Постобработка результата обычной формы, не модальной
3 norets
 
04.12.16
08:19
Спасибо за ответ! Выносить за пределы цикла не вариант, т.к. все равно идет проверка на то есть ли уже этот вид номенклатуры. И вид передается новым элементам справочника сразу после создания. Что так, что эдак все равно не очень удобно. Придется снимать с поддержки. Главное чтобы совсем не отказались от модальности). Еще раз спасибо!
4 Garykom
 
гуру
04.12.16
08:32
(3) Поймите что модальность это зло и от нее откажутся везде со временем.
Лучше заранее правильно переписать "логику работы" юзеры потом спасибо скажут.
5 Garykom
 
гуру
04.12.16
08:34
>все равно идет проверка на то есть ли уже этот вид номенклатуры
Как раз все очень удобно будет и все можно правильно передавать.
6 norets
 
04.12.16
09:29
Соглашусь что откажутся. Просто опыта не хватает чтобы понять принцип работы. Подскажите такой момент:
Получается что в цикле можно задать значение наценки только для списка выведя на экран все группы из файла, а по очереди никак?  Т.е. действия пользователем будут выполняться только после всего цикла, так?
Попытаюсь объяснить в чем проблема:
У меня Excel файл считывается в ТЗ(таблица значений). Это можно сделать только &НаСервере, потом из ТЗ передаю в структуру, а структуру запихиваю в массив(есть понимание что что-то не так, но нашел только такой способ) который передаю в процедуру &НаКлиенте. Получая из массива и структуры данные создаю ( или нахожу существующий) элемент справочника ВидыНоменклатуры. При создании элемента самой номенклатуры передаю данные из вида и заполняю его.
В случае если сначала считывать все виды номенклатуры из файла, мне придется к справочнику обращаться и перебирать его несколько раз. Это же тоже не очень хорошо, правда?
Если есть возможность изменить логику - подскажите. Сейчас у меня происходит так: находим новый вид номенклатуры, пользователя спрашивают какую наценку ему присвоить, после чего для всей номенклатуры этого вида ( новых элементов) устанавливается эта наценка.
7 norets
 
04.12.16
09:36
Я, наверное, не так объясняю... Нет у меня понмания как все это можно вывести за цикл. Все равно происходить перебор ( файла или справочника) и цикл не ждет ввода данных от пользователя. Вот что меня беспокоит.
8 Мимохожий Однако
 
04.12.16
09:39
В любом случае надо разделить на несколько этапов:
1. Прочитать файл, создать массив, закрыть файл
2. Обработать массив и создать все возможные виды.
3. Предложить пользователю форму с ответами на вопросы
4. Еще раз обработать полученные данные с учетом ответов.
Если заранее выяснить возможные варианты, то и п.3, 4 может не понадобится вовсе.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс