8.х помогите доделать код

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем 1C8, 17 июн 2013.

  1. TopicStarter Overlay
    1C8
    Offline

    1C8 Опытный в 1С

    Регистрация:
    20 янв 2009
    Сообщения:
    216
    Симпатии:
    0
    Баллы:
    26
    Доброго всем!
    Платформа 8.2.17.157
    УТ 10.3
    Получил задачу допилить документ "Перемещение товаров".
    Необхобимо реализовать механизм добавления в табличную часть документа товаров в группе Номенклатуры и всех ее дочерних групп включая дочерние группы подгрупп до самого низа. Мало того товар нужно отбирать по остаткам склада отправителя.
    Этот механизм от части реализован.
    Сразу оговорюсь что писал не я, и с программированием у меня туговато, особенно с запросами.
    Поэтому и пишу сюда и прошу помощи.
    В общем в документе создана новая Форма, которая открывает дерево Номенклатуры. В ней есть процедура которая повешана на кнопочку "добавить". Сейчас при нажатии на нее добавляется товар в выбранной группе и ее подгруппах но не более. Надо доделать так чтобы добавлялась ВСЯ Номенклатура из дочерних групп до самого низа, по остаткам склада отправителя.
    Вот код процедуры:

    Код:
    Процедура ОсновныеДействияФормыДобавить(Кнопка)
    Номенклатура = Справочники.Номенклатура.НайтиПоКоду(ЭлементыФормы.НоменклатурныеГруппы.ТекущиеДанные.Код);
    Если Номенклатура.ЭтоГруппа Тогда
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Родитель",Номенклатура);
    Запрос.УстановитьПараметр("ПометкаУдаления",Ложь);
    Запрос.Текст =
    "ВЫБРАТЬ
    | Номенклатура.Ссылка,
    | Номенклатура.ЭтоГруппа
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.Родитель = &Родитель
    | И Номенклатура.ПометкаУдаления = &ПометкаУдаления";
    Результат = Запрос.Выполнить().Выгрузить();
    
    //Отбор групп из результата
    Отбор = Новый Структура;
    Отбор.Вставить("ЭтоГруппа",Истина);
    НайденныеСтроки = Результат.НайтиСтроки(Отбор);
    РезультатПодгруппы = Новый ТаблицаЗначений();
    Если НайденныеСтроки.Количество() > 0 Тогда
    Номенклатура = Новый Массив;
    Индекс = 0;
    Для Каждого Строка Из НайденныеСтроки Цикл
    Номенклатура.Вставить(Индекс,Строка.Ссылка);
    Индекс = Индекс + 1;
    КонецЦикла;
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Родитель",Номенклатура);
    Запрос.УстановитьПараметр("ЭтоГруппа",Ложь);
    Запрос.УстановитьПараметр("ПометкаУдаления",Ложь);
    Запрос.Текст =
    "ВЫБРАТЬ
    | Номенклатура.Ссылка,
    | Номенклатура.ЭтоГруппа
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.Родитель В (&Родитель)
    | И Номенклатура.ЭтоГруппа = &ЭтоГруппа
    | И Номенклатура.ПометкаУдаления = &ПометкаУдаления";
    РезультатПодгруппы = Запрос.Выполнить().Выгрузить();
    КонецЕсли;
    
    Номенклатура = Новый Массив;
    
    Отбор = Новый Структура;
    Отбор.Вставить("ЭтоГруппа",Ложь);
    НайденныеСтроки = Результат.НайтиСтроки(Отбор);
    Индекс = 0;
    Для Каждого Строка Из НайденныеСтроки Цикл
    Номенклатура.Вставить(Индекс,Строка.Ссылка);
    Индекс = Индекс + 1;
    КонецЦикла;
    
    Для Каждого Строка Из РезультатПодгруппы Цикл
    Номенклатура.Вставить(Индекс,Строка.Ссылка);
    Индекс = Индекс + 1;
    КонецЦикла;
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Период",ВладелецФормы.ДокументОбъект.Дата);
    Запрос.УстановитьПараметр("Номенклатура",Номенклатура);
    Запрос.УстановитьПараметр("Склад",ВладелецФормы.ДокументОбъект.СкладОтправитель);
    Запрос.Текст =
    "ВЫБРАТЬ
    | ТоварыВРозницеОстатки.Номенклатура,
    | ТоварыВРозницеОстатки.ХарактеристикаНоменклатуры,
    | ТоварыВРозницеОстатки.Качество,
    |   ТоварыВРозницеОстатки.КоличествоОстаток,
    | ТоварыВРозницеОстатки.Номенклатура.ЕдиницаДляОтчетов КАК ЕдиницаИзмерения
    |ИЗ
    | РегистрНакопления.ТоварыВРознице.Остатки(&Период, ) КАК ТоварыВРозницеОстатки
    |ГДЕ
    | ТоварыВРозницеОстатки.Склад = &Склад
    | И ТоварыВРозницеОстатки.Номенклатура В(&Номенклатура)";
    Результат = Запрос.Выполнить().Выгрузить();
    
    
    Для Каждого Строка Из Результат Цикл
    НоваяСтрока = ВладелецФормы.Товары.Добавить();
    НоваяСтрока.Номенклатура = Строка.Номенклатура;
    НоваяСтрока.Количество = Строка.КоличествоОстаток;
    НоваяСтрока.Качество = Строка.Качество;
    НоваяСтрока.Коэффициент = 1;
    НоваяСтрока.ЕдиницаИзмерения = Строка.ЕдиницаИзмерения;
    Сообщить(Строка.Номенклатура.Наименование + " успешно добавлен");
    КонецЦикла;
    КонецЕсли;
    КонецПроцедуры
    
    Помогите пожалуйста!
  2. PavelBaryshev
    Offline

    PavelBaryshev Опытный в 1С

    Регистрация:
    9 сен 2008
    Сообщения:
    316
    Симпатии:
    0
    Баллы:
    26
    Вот так наверно надо:
    Код:
    ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.ЭтоГруппа
    ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ГДЕ
    Номенклатура.ПометкаУдаления = &ПометкаУдаления
    И Номенклатура.Ссылка В ИЕРАРХИИ(&Номенклатура)
    И НЕ Номенклатура.ЭтоГруппа
  3. TopicStarter Overlay
    1C8
    Offline

    1C8 Опытный в 1С

    Регистрация:
    20 янв 2009
    Сообщения:
    216
    Симпатии:
    0
    Баллы:
    26
    Вот такая ошибка вылетает
    Код:
    {Документ.ПеремещениеТоваров.Форма.НоменклатурныеГруппы(38)}: Ошибка при вызове метода контекста (Выполнить)
    Результат = Запрос.Выполнить().Выгрузить();
    по причине:
    {(8, 34)}: Не задано значение параметра "Номенклатура"
    И Номенклатура.Ссылка В ИЕРАРХИИ(<<?>>&Номенклатура)
  4. La Navidad
    Offline

    La Navidad Опытный в 1С

    Регистрация:
    25 дек 2012
    Сообщения:
    203
    Симпатии:
    1
    Баллы:
    26
    Параметр не задан. Измените это
    Код:
    Запрос.УстановитьПараметр("Родитель",Номенклатура);
    на это
    Код:
    Запрос.УстановитьПараметр("Номенклатура",Номенклатура);
  5. TopicStarter Overlay
    1C8
    Offline

    1C8 Опытный в 1С

    Регистрация:
    20 янв 2009
    Сообщения:
    216
    Симпатии:
    0
    Баллы:
    26
    Спасибо большое!

Поделиться этой страницей