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

Вытащить табличную часть по ссылке в другой документ

Автор Tatt, 25 июл 2024, 16:26

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

Tatt

Возникла проблема, которую я не могу решить, и, честно говоря, я не сильна в запросах.
В итоге, что имеем: Справочник "Номенклатура" с реквизитом наименования - здесь сидит название блюда, и табличной частью "ТехнологическаяКарта" где два реквизита: ингредиент - ссылка на номенклатуру и расход - количество
Есть документ "заказ", куда в табличную часть идет реквизит наименование - ссылка на номенклатуру - выбор блюда. На основании этого документа формируется документ "Расходная накладная" и вот он уже должен формироваться не с блюдом в табличной части, а с рецептурой из номенклатуры. Я жеско зависла и рада буду всему, кроме осуждений, спасибо большое, материалы или советы как лучше и проще это провернуть.
Функция ПолучитьТехнологическуюКарту(Ссылка)

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

Запрос.УстановитьПараметр("Ссылка", ссылка);

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();
Выборка.Следующий();

ЗаполнитьЗначенияСвойств(Результат,Выборка);
Возврат Результат;
КонецФункции

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

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

КонецЦикла;
    КонецЕсли;
КонецПроцедуры


antoneus

Наоборот, надо НоменклатураТехнологическаяКарта цеплять к ТЧ документа заказ, выгребать все сразу и заполнять расходную накладную, типа

Выбрать
    НоменклатураТехнологическаяКарта.Ингредиент,
    НоменклатураТехнологическаяКарта.Расход
ИЗ
    Документ.Заказ.Товар КАК ЗаказТовар
ЛЕВОЕ СОЕДИНЕНИЕ
    Справочник.Номенклатура.ТехнологическаяКарта КАК НоменклатураТехнологическаяКарта
ПО
    ЗаказТовар.Наименование = НоменклатураТехнологическаяКарта.Ссылка
ГДЕ
    ЗаказТовар.Ссылка = &Ссылка
Подсовываем ссылку на заказ, получаем на выходе таблицу ингредиентов.

Максим75

вот это лишнее

  |     Справочник.Номенклатура КАК Номенклатура
        |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная КАК РасходнаяНакладная
        |        ПО Номенклатура.Ссылка = РасходнаяНакладная.Товар.Блюдо

и в функции Вам надо обходить результат запроса, ведь на одно блюдо может быть много ингредиентов, а в Вашем случае будет всего один ингредиент.
И возвращайте из функции не структуру, а сразу выборку, ну т.е. Возврат Выборка.
а уже в процедуре ОбработкаЗаполнения вот здесь
ИнформацияОбТК = ПолучитьТехнологическуюКарту(НоваяСтрока.Блюдо);
Вы получите некую выборку, ее уже обходите в цикле и заполняете товары.

LexaK

Tatt, документ "Расходная накладная"  какие в нем ТабЧасти? Какие Поля/колонки (с типом) в этих частях?
если помогло нажмите: Спасибо!

Tatt

LexaK, В табличной части Расходной два поля: ингредиент - справочник номенклатура, и расход - число

Tatt

Максим75, да, вытаскивался только один ингредиент, потом правда вообще ошибка возникла, но сейчас попробую, спасибо за ответ)

Максим75

Tatt, Вам Антонеус все написал, переделайте запрос.
Абсолютно правильно выбирать все сразу по документу, а не в цикле запросы выполнять.

Tatt

Максим75, запрос изменила, да вроде все окей, но не получается вывести ингредиенты полностью. В обработке ведь цикл прописать необходимо? Не получается, все никак не могу понять что и как. Не могли бы помочь и подсказать?

antoneus

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
   
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.Заказ") Тогда       
        ЗаполнитьПоЗаказуКлиента(ДанныеЗаполнения);
    КонецЕсли;

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

Процедура ЗаполнитьПоЗаказуКлиента(Ссылка)

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

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

Tatt

antoneus, божечки, огромное спасибо, я уже думала, что никогда не получится это сделать!!!!

Теги:

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

Рейтинг@Mail.ru

Поиск