Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
24 ноя 2024, 15:16

Как заполнить корректно ДеревоЗначений?

Автор fruitella, 27 апр 2023, 13:14

0 Пользователей и 1 гость просматривают эту тему.

fruitella

Коллеги, здравствуйте!

Учусь прям на ходу, подскажите пожалуйста как правильно заполнить дерево значений?
Допустим у нас есть кнопка "Подбор товаров", все работает, товары в списке присутствуют, они добавляются в корзину.
Я их заношу в Таблицу значений, затем прохожусь циклом по ТаблицеЗначений и получаю 1 строку, ту которую нужно теперь передать в мое ДеревоЗначений.

В Отладчике если навожусь на НоваяСтрока, то я вижу все данные по товару, которому выбрал в подборе. Осталось дело за малым, просто корректно передать это и добавить в реквизиты ДереваЗначений. Просьба подсказать, что я делаю не так, т.к. получаю ошибку "Итератор не определен" в теле 2 цикла?
Код процедуры:

&НаСервере
Процедура ОбработкаВыбораТоваровНаСервере(ВыбранноеЗначение)
//Функционал добавления товаров, после того как клиент нажал кнопку "Подбор товаров"
ТЗ = ПолучитьИзВременногоХранилища(ВыбранноеЗначение.АдресТоваровВХранилище);

НоваяСтрока = Неопределено;

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

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

НовыйЭлемент.Артикул = ДеревоТоваров.Артикул;
НовыйЭлемент.Наименование = ДеревоТоваров.Наименование;
НовыйЭлемент.ЕдиницаИзмерения = ДеревоТоваров.ЕдиницаИзмерения;
НовыйЭлемент.Номенклатура = ДеревоТоваров.Номенклатура;
НовыйЭлемент.ПотребностьID = ДеревоТоваров.ПотребностьID;
НовыйЭлемент.ТоварID = ДеревоТоваров.ТоварID;
НовыйЭлемент.Комментарий = ДеревоТоваров.Комментарий;
НовыйЭлемент.КоличествоУпаковок = ДеревоТоваров.КоличествоУпаковок;
НовыйЭлемент.Цена = ДеревоТоваров.Цена;
НовыйЭлемент.ПроцентРучнойСкидки = ДеревоТоваров.ПроцентРучнойСкидки;
НовыйЭлемент.СуммаРучнойСкидки = ДеревоТоваров.СуммаРучнойСкидки;
НовыйЭлемент.Сумма = ДеревоТоваров.Сумма;
НовыйЭлемент.БазоваяЦена = ДеревоТоваров.БазоваяЦена;
НовыйЭлемент.Статус = ДеревоТоваров.Статус;
НовыйЭлемент.ПоставщикКПоказу = ДеревоТоваров.ПоставщикКПоказу;
НовыйЭлемент.Поставщик = ДеревоТоваров.Поставщик;
НовыйЭлемент.Толеранс = ДеревоТоваров.Толеранс;
НовыйЭлемент.СрокПоставки = ДеревоТоваров.СрокПоставки;
НовыйЭлемент.СрокРезерва = ДеревоТоваров.СрокРезерва;
НовыйЭлемент.Добавлена = ДеревоТоваров.Добавлена;
КонецЦикла;

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


antoneus

Ну дык какой итератор может быть у типа ДанныеФормыЭлементКоллекции? Цикл нужен опять по ТЗ, а не по НовойСтроке.

Следующая ошибка будет на строке НовыйЭлемент.Артикул = ДеревоТоваров.Артикул. Почему? Потому что у ДереваТоваров нет атрибута Артикул. И атрибута Наименование нет. И прочих, которые вы пытаетесь присвоить НовомуЭлементу.

LexaK

fruitella, и самый главный вопрос!
при заполнении документа, зачем вам какое-то ДеревоЗначений? куда вы его потом девать будете? как использовать?
если помогло нажмите: Спасибо!

fruitella

LexaK, Оно просто уже используется. Есть список товаров, соответственно там товары отображаются во вьюшке в виде дерева, которые пользователь может просматривать, вносить какие-то изменения, менять статусы и прочее.

Если не сложно подскажите как правильно тогда это можно реализовать, видимо я делаю что-то не так и есть более простые способы?


LexaK

fruitella, Пользователь может просматривать товары в СпискеТоваров, при выборе товаров, в ТабличнойЧасти документа,
в каком еще ДеревеЗначений надо просматривать товары - не понятно.

самое оптимальное, возьмите любую типовую базу, и от туда берите приемы работы с документами, справочниками, формами
там все это уже придумано.

(90% работы программиста как раз и состоит из копи-паста и небольшой подгонки у же работающего отлаженного кода)
если помогло нажмите: Спасибо!

fruitella

Изменил немного реализацию. Взял пример здесь: https://1clancer.ru/article/peredacha_dannykh_mezhdu_upravlyaemymi_formami_773
Ошибок ни каких нет, в отладчике вижу, что тот товар, который был выбран присутствует, после нажатия кнопки "Перенести в документ" перекидывает на список, но выбранного товара нет в отображаемом списке.

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


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

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

Если ИсточникВыбора.ИмяФормы = "Обработка.ПодборТоваровВДокументПродажи.Форма.Форма" Тогда
ОбработатьВыбранноеЗначение(ВыбранноеЗначение);
ИначеЕсли ИсточникВыбора.ИмяФормы = "Документ.Форма1.Форма.ФормаЗагрузкиПредзаказ" Тогда
ЗаполнитьТаблицуТоваров(ВыбранноеЗначение);
ИначеЕсли ИсточникВыбора.ИмяФормы = "Документ.Форма1.Форма.ФормаЗагрузкиИзExcel" Тогда
ЗаполнитьДеревоТоваров(ВыбранноеЗначение);
ИначеЕсли ИсточникВыбора.ИмяФормы = "Документ.Форма1.Форма.ФормаСопоставленияТовара" Тогда
СопоставитьНаименования(ВыбранноеЗначение);
ИначеЕсли ИсточникВыбора.ИмяФормы = "Справочник.Партнеры.Форма.ФормаВыбора" Тогда
ТекущаяСтрока = Элементы.ДеревоТоваров1.ТекущиеДанные;
ТекущаяСтрока.Поставщик = ВыбранноеЗначение;
ТекущаяСтрока.ПоставщикКПоказу = ПоставщикНаименование(ВыбранноеЗначение);
ПараметрыИзменения = Новый Структура;
ПараметрыИзменения.Вставить("ID", ТекущаяСтрока.ТоварID);
ОбновитьСтрокуТоваров(ПараметрыИзменения, ТекущаяСтрока);
ИначеЕсли ИсточникВыбора.ИмяФормы = "Справочник.Номенклатура.Форма.ФормаВыбора" Тогда
ТекущаяСтрока = Элементы.ДеревоТоваров1.ТекущиеДанные;
ТекущаяСтрока.Номенклатура = ВыбранноеЗначение;
ТекущаяСтрока.Наименование = НоменклатураНаименование(ВыбранноеЗначение);
ТекущаяСтрока.Артикул = НоменклатураАртикул(ВыбранноеЗначение);

Родитель = Элементы.ДеревоТоваров1.ТекущиеДанные.ПолучитьРодителя();
Если Родитель = Неопределено Тогда
ПараметрыИзменения = Новый Структура;
ПараметрыИзменения.Вставить("ID", ТекущаяСтрока.ПотребностьID);
ОбновитьСтрокуПотребностей(ПараметрыИзменения, ТекущаяСтрока)
Иначе
ПараметрыИзменения = Новый Структура;
ПараметрыИзменения.Вставить("ID", ТекущаяСтрока.ТоварID);
ОбновитьСтрокуТоваров(ПараметрыИзменения, ТекущаяСтрока);
КонецЕсли;

ТекущаяСтрока.ЕдиницаИзмерения = ПолучитьТекущуюЕдиницуИзмеренияНоменклатуры(ВыбранноеЗначение);
КонецЕсли;

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

LexaK

fruitella, первое что бросилось в глаза,
структура не так задается - это неправильно
РезультатПоиска = Объект.Товары.НайтиСтроки(Новый Структура("Артикул", Стр.Артикул, "Номенклатура", Стр.Номенклатура));
надо так
РезультатПоиска = Объект.Товары.НайтиСтроки(Новый Структура("Артикул,Номенклатура", Стр.Артикул, Стр.Номенклатура));
если помогло нажмите: Спасибо!

fruitella

LexaK, Поменял, не помогло. Есть еще какие то замечания?

LexaK

fruitella, проверить что находится в таблице ТаблицаПодобранныхТоваров  ???
ТаблицаПодобранныхТоваров = ПолучитьИзВременногоХранилища(ВыбранноеЗначение.АдресТоваровВХранилище);

(запустите отладчик же, в нем же все ясно будет что и почему не работает, не заполняется)
если помогло нажмите: Спасибо!

fruitella

Так и не удалось победить. В отладчике я получаю товар, в цикле я вытягиваю данные которые мне нужны по структуре поиска - это артикул и номеклатура.Вроде присваиваю данные каждого поля таблицы, но они все равно не отображаются после нажатия кнопки "Перенести в документ".
В чем может быть косяк? Скрины ниже.




Похожие темы (5)

Рейтинг@Mail.ru

Поиск