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

ошибка при обходе дерева значений

Автор Инокентий, 20 мар 2023, 10:57

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

Инокентий

Всем привет. Хочу выводить на форму данные о расходуемых материалах. Для этого я формирую дерево значений из спецификации. Дерево формируется правильно(на форму выводится). Но при обходе возникает ошибка

Поле объекта не обнаружено (Номенклатура)
{Документ.ВыпускПродукции.Форма.ФормаДокумента.Форма(56)}:НоваяСтрока.Номенклатура = стр.Номенклатура;
{Документ.ВыпускПродукции.Форма.ФормаДокумента.Форма(60)}:РекурсивныйОбход(стр, ТабЗ);
{Документ.ВыпускПродукции.Форма.ФормаДокумента.Форма(60)}:РекурсивныйОбход(стр, ТабЗ);
{Документ.ВыпускПродукции.Форма.ФормаДокумента.Форма(60)}:РекурсивныйОбход(стр, ТабЗ);
{Документ.ВыпускПродукции.Форма.ФормаДокумента.Форма(48)}:РекурсивныйОбход(Дерево, табДляЗаполнения);
{Документ.ВыпускПродукции.Форма.ФормаДокумента.Форма(29)}:ТабДляЗаполненияФормы = ОбходДерева(ЗаполнениеДерева(ТаблицаСпецификаций));
{Документ.ВыпускПродукции.Форма.ФормаДокумента.Форма(42)}:ЗаполнениеФормыНаСервере();

Подскажите пожалуйста, в чем ошибка?

&НаСервере
Процедура ЗаполнениеФормыНаСервере()

Объект.РасходуемыеМатериалы.Очистить();

Запрос = новый Запрос(
"
| ВЫБРАТЬ
|    Спецификация.Владелец КАК Владелец,
|    Спецификация.НаСколькоШтук КАК НаСколькоШтук,
|    СпецификацияИнгридиенты.Номенклатура КАК Номенклатура,
|    СпецификацияИнгридиенты.Количество КАК Количество
|ИЗ
|    Справочник.Спецификация.Ингридиенты КАК СпецификацияИнгридиенты
|        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Спецификация КАК Спецификация
|        ПО СпецификацияИнгридиенты.Ссылка = Спецификация.Ссылка
|СГРУППИРОВАТЬ ПО 
|    СпецификацияИнгридиенты.Номенклатура,
|    Спецификация.Владелец,
|    Спецификация.НаСколькоШтук,
|    СпецификацияИнгридиенты.Количество"
); 

ТаблицаСпецификаций = Запрос.Выполнить().Выгрузить();
ТаблицаРасходов =  новый ТаблицаЗначений();   
ТабДляЗаполненияФормы = новый ТаблицаЗначений;

ТабДляЗаполненияФормы = ОбходДерева(ЗаполнениеДерева(ТаблицаСпецификаций));
Для Каждого стр из ТабДляЗаполненияФормы Цикл

СтрокаВТаблицеДокумента=Объект.РасходуемыеМатериалы.Добавить();
СтрокаВТаблицеДокумента.Номенклатура=стр.Номенклатура;
СтрокаВТаблицеДокумента.Количество=стр.Количество;

КонецЦикла;

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

&НаКлиенте
Процедура ЗаполнениеФормы(Команда)
ЗаполнениеФормыНаСервере();
КонецПроцедуры

Функция ОбходДерева(Дерево)

табДляЗаполнения = новый ТаблицаЗначений;
РекурсивныйОбход(Дерево, табДляЗаполнения);
Возврат табДляЗаполнения;
КонецФункции   

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

Функция ЗаполнениеДерева (ТаблицаСпецификаций)

ДеревоРасходов = Новый ДеревоЗначений;
ДеревоРасходов.Колонки.Добавить("Номенклатура");
ДеревоРасходов.Колонки.Добавить("Количество");

ТабСпецификацификации=Объект.Производство.Выгрузить();

Для каждого стр из ТабСпецификацификации цикл 

НовСтрока = ДеревоРасходов.Строки.Добавить();
НовСтрока.Номенклатура = стр.Номенклатура;
НовСтрока.Количество = стр.Количество;

РекурсивноеЗаполнение(НовСтрока, ТаблицаСпецификаций);
КонецЦикла;

ЗначениеВРеквизитФормы(ДеревоРасходов,"Дерево");
Возврат ДеревоРасходов;
КонецФункции   

процедура РекурсивноеЗаполнение( СтрокаДерева, ТабЗапроса)

МассивНайденныхСтрок = ТабЗапроса.НайтиСтроки(новый  Структура("Владелец", СтрокаДерева.Номенклатура));

Для каждого элем из МассивНайденныхСтрок цикл
НоваяСтрока = СтрокаДерева.строки.Добавить();
НоваяСтрока.Номенклатура = элем.Номенклатура;

если  СтрокаДерева.Количество %  элем.НаСколькоШтук <> 0 Тогда

НоваяСтрока.Количество = ((цел(СтрокаДерева.Количество/элем.НаСколькоШтук)+1)*элем.Количество);
Иначе
НоваяСтрока.Количество = ((СтрокаДерева.Количество/элем.НаСколькоШтук)*элем.Количество);
КонецЕсли;
Сообщить(СтрокаДерева.строки.количество());
РекурсивноеЗаполнение(НоваяСтрока, ТабЗапроса);

КонецЦикла;

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

LexaK

у вас в ТабЗ - нет колонки Номенклатура!  :fdbsdfbsd:
если помогло нажмите: Спасибо!

Инокентий


Теги:

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

Рейтинг@Mail.ru

Поиск