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

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

Автор Конст_007, 02 окт 2015, 13:50

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

Конст_007

Добрый день всем!

Помогите плиз с печатной формой макета документа. УТ 11.1 на УФ.
Делают макет накладной на вн. перемещение. Хочу вывести в макет по позициям спецификации данные из регистра сведений (ЦеныНоменклатурыЦеныСрезПоследних) по определенному виду цен. В отчете на СКД вытягивал примерно так, работало:

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


Здесь в макете по идее должно быть как то так:

Процедура НаклВнПерем(ТабДок, Ссылка) Экспорт
//{{_КОНСТРУКТОР_ПЕЧАТИ(НаклВнПерем)
Макет = Документы.ПеремещениеТоваров.ПолучитьМакет("НаклВнПерем");
Запрос1 = Новый Запрос;
Запрос1.Текст =
"ВЫБРАТЬ
| ПеремещениеТоваров.Дата,
| ПеремещениеТоваров.Номер,
| ПеремещениеТоваров.Руководитель
|ИЗ
| Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
|ГДЕ
| ПеремещениеТоваров.Ссылка В (&Ссылка)";
Запрос1.Параметры.Вставить("Ссылка", Ссылка);
Выборка1 = Запрос1.Выполнить().Выбрать();

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


ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
Шапка = Макет.ПолучитьОбласть("Шапка");
ОбластьТоварыШапка = Макет.ПолучитьОбласть("ТоварыШапка");
ОбластьТовары = Макет.ПолучитьОбласть("Товары");
ТабДок.Очистить();

ВставлятьРазделительСтраниц = Ложь;
Пока Выборка1.Следующий() Цикл
Если ВставлятьРазделительСтраниц Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;

ТабДок.Вывести(ОбластьЗаголовок);

Шапка.Параметры.Заполнить(Выборка1);
ТабДок.Вывести(Шапка, Выборка1.Уровень());

ТабДок.Вывести(ОбластьТоварыШапка);
ВыборкаТовары = Выборка2.Выбрать();
Пока ВыборкаТовары.Следующий() Цикл
ОбластьТовары.Параметры.Заполнить(ВыборкаТовары);
ТабДок.Вывести(ОбластьТовары, ВыборкаТовары.Уровень());
КонецЦикла;

ВставлятьРазделительСтраниц = Истина;
КонецЦикла;
КонецПроцедуры


дает ошибку:
Синтаксическая ошибка "'НаценкаОбщая'"
ПеремещениеТоваров.Ссылка В(&Ссылка) и ЦеныНоменклатурыСрезПоследних.ВидЦены.Идентификатор = <<?>> 'НаценкаОбщая'

Может изначально что то не так делаю? помогите разобраться


vitasw

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

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


Тут еще нужно предусмотреть, что цена в РС может быть в какой угодно валюте и по идее нужен пересчет цены из валюты в валюту

Конст_007

Спасибо за ответ!

Попробовал ваш вариант, ругается на условие:

{Документ.ПеремещениеТоваров.МодульМенеджера(4784)}: Ошибка при вызове метода контекста (Выполнить)
    Выборка2 = Запрос2.Выполнить().Выбрать();
по причине:
{(8, 34)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
ПеремещениеТоваровТовары.Ссылка <<?>>= &Ссылка

Попробовал изменить условие так:

       |ГДЕ
       | ПеремещениеТоваровТовары.Ссылка В (&Ссылка)";


Форма формируется, но данные не выводит.

Попробовал условие через ПОДОБНО, Поигрался с функциями Выразить, результат нулевой

Упростил запрос, сделал:
      "ВЫБРАТЬ
       | ПеремещениеТоваровТовары.Номенклатура,
       | ПеремещениеТоваровТовары.Упаковка,
       | ПеремещениеТоваровТовары.Количество
       |ИЗ
       | Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
       |ГДЕ
       | ПеремещениеТоваровТовары.Ссылка В (&Ссылка)";

Все равно пустую спецификацию выводит.
Где то в условии ошибка, где не соображу...

vitasw

А что вы в запрос передаете в качестве параметра "Ссылка"?

Конст_007


vitasw

1) Как-то вы неуверенно отвечаете. Кроме вас на вопрос никто не ответить. Нет ответа = нет помощи.
2) В своем запросе я вам предложил "идею близко к тексту", а не готовый код.

Конст_007

Да я понимаю, что не готовый код...
Пробую получить значение параметра "Ссылка" через сообщение, получаю значение "массив", поэтому и не уверен

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


Вот так выводит пустоту:
"ВЫБРАТЬ
| ПеремещениеТоваровТовары.Номенклатура,
| ПеремещениеТоваровТовары.Количество
|ИЗ
| Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
|ГДЕ
| ПеремещениеТоваровТовары.Ссылка В (&Ссылка)";


почему, уже голову сломал...

vitasw

1) Научитесь пользоваться отладчиком. Грамаднейшее число вопросов отпадет
2) Запрос - это далеко не все что нужно для вывода информации в табличный документ. Как по вашему данные из запроса попадают в табличный документ?

Конст_007

Отладчик дает значение выражения: ссылка = Массив

Как я понимаю примерно порядок заполнения макета:
Запускается запрос с параметрами, получается таблица значений.
Задаются области макета.
В определенную область макета выводятся нужные значения из полученной таблицы
значений через параметры области.
т.е. ОбластьМакета.Параметры.Параметр1 = ЗначениеИзТаблицыЗначений1 если по одному параметру,
либо там:
.Уровень() если все записи надо.

как то так, сильно не пинайте только ;)

Дмитрий@

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

ТабДок = СформироватьТабличныйДокумент();
ТабДок.Показать();

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

&НаСервере
Функция СформироватьТабличныйДокумент()

ТабДок = Новый ТабличныйДокумент;

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

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

ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("Итого");
ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");

ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);

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

ИтогоРасход = 0;
ИтогоСуммаКОплате = 0;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
ТабДок.Вывести(ОбластьДетальныхЗаписей);
ИтогоРасход = ИтогоРасход + ВыборкаДетальныеЗаписи.Расход;
ИтогоСуммаКОплате = ИтогоСуммаКОплате + ВыборкаДетальныеЗаписи.СуммаКОплате;
КонецЦикла;

ОбластьПодвалТаблицы.Параметры.ИтогоРасход = ИтогоРасход;
ОбластьПодвалТаблицы.Параметры.ИтогоСуммаКОплате = ИтогоСуммаКОплате;
ТабДок.Вывести(ОбластьПодвалТаблицы);

Возврат ТабДок;


КонецФункции

Теги:

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

Рейтинг@Mail.ru

Поиск