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

Как сделать разные виды печатной формы в зависимости от данных документа

Автор Mikhail_smi, 25 апр 2022, 08:45

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

Mikhail_smi

Добрый день! Платформа 8.3
Задачка - необходимо сформировать печатную форму в зависимости от выбора настройки в самом документе. Конкретно - выбор сортировки в печатной форме осуществляется с помощью радиокнопки.
Сейчас при нажатии на "Печать" вываливается ошибка.
Подскажите, что делаю некорректно?

nvj84

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

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

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

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

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

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

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

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

Mikhail_smi

nvj84,
Как не работает я знаю.
Выбор делаю из перечислений (ПоНоменклатуре, ПоЦене... - это именно перечисления).
Можно ли в моем варианте исправить условия "Если", чтобы все заработало? Без условий упорядочивание работает (По номенклатуре, например).

nvj84

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

Теги:

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

Рейтинг@Mail.ru Rambler's Top100

Поиск