Имя: Пароль:
1C
 
Как лучше сделать перетаскивание Номенклатуры? 1с83
0 pro3ri
 
13.01.16
12:47
Добрый день!
В поступление товаров и услуг на веб клиенте вносят номенклатуру перетаскиванием:
Внес такой код:

&НаКлиенте
Процедура ТоварыПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
    Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда
    
        Для каждого ЭлементМассива Из ПараметрыПеретаскивания.Значение Цикл
            Если ТипЗнч(ЭлементМассива) <> Тип("СправочникСсылка.Номенклатура") Тогда
                ПараметрыПеретаскивания.ДопустимыеДействия = ДопустимыеДействияПеретаскивания.НеОбрабатывать;
            КонецЕсли;
        КонецЦикла;        
        
    Иначе
        ПараметрыПеретаскивания.ДопустимыеДействия = ДопустимыеДействияПеретаскивания.НеОбрабатывать;
    КонецЕсли;
КонецПроцедуры                                                                          


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

КонецПроцедуры
    
Процедура ВыполнитьПослеЗакрытияВопроса(Число, ДополнительныеПараметры)

    Строка = Объект.Товары.Добавить();
    Строка.Номенклатура = ДополнительныеПараметры;
    Строка.Количество = Число;                

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

Правильно ли сделано описание оповещения, может есть более толковый метод?
1 pro3ri
 
13.01.16
12:49
Переносят сразу несколько элементов, выходит так:\
https://s.mail.ru/K6Fx4zxD7UJ9/img-2016-01-13-14-49-47.png
2 Garykom
 
гуру
13.01.16
12:55
drug & drop это для извращенцев которые точно мышкой двигать не умеют...

даже на сенсорных смартах/планшетах предпочитают кнопки "в корзину/купить" делать
3 Остап Сулейманович
 
13.01.16
12:56
(1) У тебя ПоказатьВводЧисла() вызывается в цикле. Но собственно ввод выполняется уже после завершения ТоварыПеретаскивание.

Я бы сделал примерно так :
В ТоварыПеретаскивание всю номенклатуру, которая обрабатывается сложил в табличку с колонками "Номенклатура" и "Значение". Потом попросил заполнить все "Значение" и только потом начал добавлять куда ты там перетаскиваешь.

Кратко : обрабатывать весь список за один проход. А не построчно.
4 pro3ri
 
13.01.16
13:12
(3) А табличка с колонками это таблица значений?
5 pro3ri
 
13.01.16
13:33
(3) наваял так:
6 pro3ri
 
13.01.16
13:34
Таблица - реквизит формы с типом тз

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

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

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

    
Процедура ВыполнитьПослеЗакрытияВопроса(Число, ДополнительныеПараметры)

    Строка = Объект.Товары.Добавить();
    Строка.Номенклатура = ДополнительныеПараметры;
    Строка.Количество = Число;                

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

поправьте, но по-моему хрен редьки не слаще...
7 lxs
 
13.01.16
13:37
тебе надо дополнительную форму открывать с тз, а не использовать ПоказатьВводЧисла()
8 pro3ri
 
13.01.16
14:45
(7) создал новую форму с кодом:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Для каждого СтрокаТЗ Из Параметры.ТЗ Цикл
    
        Строка = Таблица.Добавить();
        Строка.Значение = СтрокаТЗ.Значение;
        Строка.Количество = СтрокаТЗ.Количество;
    
    КонецЦикла;
    
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
    ОповеститьОВыборе(Таблица);
КонецПроцедуры

в форме док пост добавил:

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

                КонецЕсли;
            КонецЦикла;
            
            
            
            ОткрытьФорму("Документ.ПоступлениеТоваров.Форма.Форма",Новый Структура("ТЗ",Таблица),ЭтаФорма);
            
        КонецЕсли;

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

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
    Таблица.Очистить();
    Для каждого СтрокаВыбранная Из ВыбранноеЗначение Цикл
    
        СтрокаДок = Объект.Товары.Добавить();
        СтрокаДок.Номенклатура = СтрокаВыбранная.Значение;
        СтрокаДок.Количество = СтрокаВыбранная.Количество;
        
    КонецЦикла;
    
КонецПроцедуры

https://s.mail.ru/4nYrnWmzsrSx/img-2016-01-13-16-44-41.png
получилось красивей!