8.х Внешняя Печатная Форма. Выбор шапки макета по варианту склада.

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

  1. TopicStarter Overlay
    shustrik
    Offline

    shustrik

    Регистрация:
    13 сен 2010
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    Вопрос такой. В 1С:Предприятие 8.1 в Комплексной Автоматизации добавили Складу свойство Магазин. В итоге это свойство распространилось на все склады.

    Я делаю внешнюю печатную форму. Мне нужно в зависимости от этого свойства выбирать шапку. Как это сделать - я не могу сообразить. во-первых, какой запрос (к какому регистру) надо сделать? и соответственно КАКОЙ?
    и во-вторых, какое необходимо сделать условие (Если ХХ ТОГДА YY)? Складов-то много, а магазинов-то всего 5. Соответственно, типов шапки макета - 6. Пять для разных магазинов и одна шапка для общего случая. т.е. я так понимаю что нужно делать условие типа
    Код:
    Если маг1 тогда типшап2 иначе если маг2 тогда типшап2 ... Иначе ТипШапки = "ОбщаяШапка" КонецЕсли; 
    
    ну а как ещё-то присвоить области макета название соответствующее нужной шапке исходя из свойства склада?

    и при всём при этом ведь ещё и шапка должна называться определенным образом... иначе ж как он её выберет-то...

    т.е. условно говоря код должен выглядеть так:


    Код:
    Если РегистрыСведений.ЗначенияСвойствОбъектов.Значение = Интерьер1 Тогда 
    ТипШапки = "Инт1" ИначеЕсли РегистрыСведений.ЗначенияСвойствОбъектов.Значение = Интерьер2 Тогда ТипШапки = "Инт2" ИначеЕсли ... КонецЕсли; 
    
    ОбластьМакетаШапка = Макет.ПолучитьОбласть("Шапка"+ТипШапки)
    ........ 
    
    но КАК мне это значение выдрать?((((((((((

    Благодарю заранее за помощь.

    Оригинал кода внешней печатки вот
    Код:
    Перем мВалютаРегламентированногоУчета Экспорт;
    
    // Функция формирует табличный документ с печатной формой Товарного Чека,
    //
    // Возвращаемое значение:
    //  Табличный документ - печатная форма Товарного Чека
    //
    Функция Печать() Экспорт
    
    КолНаСтраницу = 2;
    
    ОбщееКоличество = 0;
    
    ЗапросШапка = Новый Запрос;
    ЗапросШапка.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект);
    ЗапросШапка.Текст = 
    "ВЫБРАТЬ
    |	Номер,
    |	Дата,
    |	ВалютаДокумента,
    |	ДоговорКонтрагента,
    |	Контрагент КАК Получатель,
    |	СуммаДокумента КАК ОбщаяСумма,
    |	СуммаВключаетНДС,
    |	УчитыватьНДС,
    |	Организация,
    |	Организация КАК Поставщик,
    |	Склад
    |ИЗ
    |	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |ГДЕ
    |	РеализацияТоваровУслуг.Ссылка = &ТекущийДокумент";
    Шапка = ЗапросШапка.Выполнить().Выбрать();
    Шапка.Следующий();
    
    ЗапросТовара = Новый Запрос;
    ЗапросТовара.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект);
    ЗапросТовара.Текст = 
    "ВЫБРАТЬ
    |	РеализацияТоваровУслуг.Номенклатура КАК Номенклатура,
    |	ВЫБОР
    |		КОГДА РеализацияТоваровУслуг.Номенклатура.ЕдиницаХраненияОстатков.Представление ЕСТЬ NULL 
    |			ТОГДА РеализацияТоваровУслуг.Номенклатура.БазоваяЕдиницаИзмерения.Представление
    |		ИНАЧЕ РеализацияТоваровУслуг.Номенклатура.ЕдиницаХраненияОстатков.Представление
    |	КОНЕЦ КАК ЕдиницаИзмерения,
    |	РеализацияТоваровУслуг.Цена,
    |	РеализацияТоваровУслуг.Сумма,
    |	РеализацияТоваровУслуг.СтавкаНДС,
    |	РеализацияТоваровУслуг.СуммаНДС,
    |	РеализацияТоваровУслуг.ПроцентСкидкиНаценки КАК Скидка,
    |	РеализацияТоваровУслуг.НомерСтроки КАК НомерСтроки,
    |	РеализацияТоваровУслуг.Количество,
    |	РеализацияТоваровУслуг.Номенклатура.Артикул КАК Артикул
    |ИЗ
    |	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслуг
    |ГДЕ
    |	РеализацияТоваровУслуг.Ссылка = &ТекущийДокумент";
    ТаблицаТовара = ЗапросТовара.Выполнить().Выгрузить();
    
    ЗапросСвойства = Новый Запрос;
    ЗапросСвойства.УстановитьПараметр("Объект", СсылкаНаОбъект);
    ЗапросСвойства.Текст=
    "ВЫБРАТЬ
    |	ЗначенияСвойствОбъектов.Значение КАК Значение,
    |	ЗначенияСвойствОбъектов.Свойство КАК Свойство,
    |	ЗначенияСвойствОбъектов.Объект.Ссылка КАК Объект
    |ИЗ
    |	РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |ГДЕ
    |	ЗначенияСвойствОбъектов.Объект.Ссылка = &Объект";
    Выборка = ЗапросСвойства.Выполнить().Выбрать(); 
    
    Пока Выборка.Следующий() Цикл
    
    Склад = Выборка.Склад;
    ЗначениеСвойства = Выборка.Значение;
    
    КонецЦикла;
    
    //ТипШапки = Выборка.Свойство;
    
    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_РеализацияТоваровУслуг_ТоварныйЧек";
    
    Макет = ПолучитьМакет("ТоварныйЧек");
    
    Для i=1 По КолНаСтраницу Цикл
    Если i=2 Тогда
    ОбластьМакетаОтступ = Макет.ПолучитьОбласть("Отступ");
    ТабДокумент.Вывести(ОбластьМакетаОтступ);
    ОбщееКоличество = 0;
    КонецЕсли;
    
    // Выводим шапку Товарного Чека
    
    
    ОбластьМакетаШапка = Макет.ПолучитьОбласть("Шапка");
    
    
    ОбластьМакетаШапка.Параметры.ПредставлениеПоставщика = Шапка.Организация;
    ОбластьМакетаШапка.Параметры.Склад = Шапка.Склад;
    ОбластьМакетаШапка.Параметры.ДатаЧека = Формат(Шапка.Дата, "ДФ=""дд ММММ гггг 'г.'""");
    
    //Конец области Шапка
    ТабДокумент.Вывести(ОбластьМакетаШапка);
    
    ЕстьСкидки = ТаблицаТовара.Итог("Скидка") <> 0;
    
    //Вывод табличной части
    ОбластьМакетаСтрока = Макет.ПолучитьОбласть("Строка");
    
    Для Каждого СтрокаТабличнойЧасти Из ТаблицаТовара <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/цикл')">Цикл	</span>
    
    ОбластьМакетаСтрока.Параметры.Заполнить(СтрокаТабличнойЧасти);
    
    Если НЕ ЗначениеЗаполнено(СтрокаТабличнойЧасти.Номенклатура) Тогда
    Сообщить("В одной из строк не заполнено значение номенклатуры - строка при печати пропущена.", СтатусСообщения.Важное);
    Продолжить;
    КонецЕсли;
    
    ТабДокумент.Вывести(ОбластьМакетаСтрока);
    
    ОбщееКоличество = ОбщееКоличество + СтрокаТабличнойЧасти.Количество;
    
    КонецЦикла;
    //Конец области Строка
    
    Если ТаблицаТовара <> Неопределено Тогда
    
    Сумма    = ТаблицаТовара.Итог("Сумма");
    СуммаНДС = ТаблицаТовара.Итог("СуммаНДС");
    
    Иначе
    
    Сумма    = 0;
    СуммаНДС = 0;
    
    КонецЕсли;
    
    СуммаДляПрописи = Шапка.ОбщаяСумма + ?(Шапка.СуммаВключаетНДС, 0, СуммаНДС);
    
    ОбластьМакетаИтого = Макет.ПолучитьОбласть("Итого");
    
    ОбластьМакетаИтого.Параметры.ВсегоКоличество = ОбщееКоличество;
    
    ОбластьМакетаИтого.Параметры.Всего = ОбщегоНазначения.ФорматСумм(СуммаДляПрописи, Шапка.ВалютаДокумента);
    
    //Конец области Итого
    ТабДокумент.Вывести(ОбластьМакетаИтого);
    
    ОбластьМакетаСуммаПрописью = Макет.ПолучитьОбласть("СуммаПрописью");
    
    ОбластьМакетаСуммаПрописью.Параметры.СуммаПрописью  = ОбщегоНазначения.СформироватьСуммуПрописью(СуммаДляПрописи, Шапка.ВалютаДокумента);
    
    //Конец области Сумма Прописи
    ТабДокумент.Вывести(ОбластьМакетаСуммаПрописью);
    
    ОбластьМакетаПодписи = Макет.ПолучитьОбласть("Подписи");
    
    //Конец области Подписи
    ТабДокумент.Вывести(ОбластьМакетаПодписи);
    
    КонецЦикла;
    
    Возврат ТабДокумент
    
    КонецФункции // ПечатьТоварногоЧека()
    
    Я специально сделал ошибку на получении области шапка, чтобы можно было отслеживать вычисление значения ВЫБОРКА... помогите плиз :angry:
  2. x_under
    Offline

    x_under Модераторы Команда форума Модератор

    Регистрация:
    25 апр 2007
    Сообщения:
    2.576
    Симпатии:
    13
    Баллы:
    29
    Ну идея у вас правильна. Единственно можно добавить условие в запрос на своство, а не только на объект. Я приведу пример для объектного получения, а не для запроса.

    А выбор шапки, то есть условие в операторе если зависит от типа значения вашего свойства - или это строка или элемент справочника "Значения свойств объектов".
    Код:
    // получение свойства склада
    Отбор = Новый Структура("Объект,Свойство",Объект,ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Магазин"));
    ЗначениеСвойства = РегистрыСведения.ЗначенияСвойствОбъектов.Получить(Отбор).Значение;
    
    // выбор области макета
    Если ЗначениеСвойства = <Ваше сравниваемое значение> Тогда
    ОбластьМакета = Макет.ПолучитьОбласть(<Ваша область>);
    ИначеЕсли ЗначениеСвойства = <Ваше сравниваемое значение> Тогда
    // и так далее
    Иначе
    ОбластьМакета = Макет.ПолучитьОбласть(<Общая область>);
    КонецЕсли;
    
  3. TopicStarter Overlay
    shustrik
    Offline

    shustrik

    Регистрация:
    13 сен 2010
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    Огромнейше благодарю за грамотный хелп (на кнопочку уже нажал). Вот конечный результат внешней обработки. Если кому-то пригодится ещё - только рад буду.

    Код:
    Перем мВалютаРегламентированногоУчета Экспорт;
    
    // Функция формирует табличный документ с печатной формой Товарного Чека,
    //
    // Возвращаемое значение:
    //  Табличный документ - печатная форма Товарного Чека
    //
    Функция Печать() Экспорт
    
    КолНаСтраницу = 2;
    
    ОбщееКоличество = 0;
    
    ЗапросШапка = Новый Запрос;
    ЗапросШапка.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект);
    ЗапросШапка.Текст = 
    "ВЫБРАТЬ
    |	Номер,
    |	Дата,
    |	ВалютаДокумента,
    |	ДоговорКонтрагента,
    |	Контрагент КАК Получатель,
    |	СуммаДокумента КАК ОбщаяСумма,
    |	СуммаВключаетНДС,
    |	УчитыватьНДС,
    |	Организация,
    |	Организация КАК Поставщик,
    |	Склад
    |ИЗ
    |	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |ГДЕ
    |	РеализацияТоваровУслуг.Ссылка = &ТекущийДокумент";
    Шапка = ЗапросШапка.Выполнить().Выбрать();
    Шапка.Следующий();
    
    ЗапросТовара = Новый Запрос;
    ЗапросТовара.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект);
    ЗапросТовара.Текст = 
    "ВЫБРАТЬ
    |	РеализацияТоваровУслуг.Номенклатура КАК Номенклатура,
    |	ВЫБОР
    |		КОГДА РеализацияТоваровУслуг.Номенклатура.ЕдиницаХраненияОстатков.Представление ЕСТЬ NULL 
    |			ТОГДА РеализацияТоваровУслуг.Номенклатура.БазоваяЕдиницаИзмерения.Представление
    |		ИНАЧЕ РеализацияТоваровУслуг.Номенклатура.ЕдиницаХраненияОстатков.Представление
    |	КОНЕЦ КАК ЕдиницаИзмерения,
    |	РеализацияТоваровУслуг.Цена,
    |	РеализацияТоваровУслуг.Сумма,
    |	РеализацияТоваровУслуг.СтавкаНДС,
    |	РеализацияТоваровУслуг.СуммаНДС,
    |	РеализацияТоваровУслуг.ПроцентСкидкиНаценки КАК Скидка,
    |	РеализацияТоваровУслуг.НомерСтроки КАК НомерСтроки,
    |	РеализацияТоваровУслуг.Количество,
    |	РеализацияТоваровУслуг.Номенклатура.Артикул КАК Артикул
    |ИЗ
    |	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслуг
    |ГДЕ
    |	РеализацияТоваровУслуг.Ссылка = &ТекущийДокумент";
    ТаблицаТовара = ЗапросТовара.Выполнить().Выгрузить();
    
    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_РеализацияТоваровУслуг_ТоварныйЧек";
    
    Макет = ПолучитьМакет("ТоварныйЧек");
    
    Для i=1 По КолНаСтраницу Цикл
    Если i=2 Тогда
    ОбластьМакетаОтступ = Макет.ПолучитьОбласть("Отступ");
    ТабДокумент.Вывести(ОбластьМакетаОтступ);
    ОбщееКоличество = 0;
    КонецЕсли;
    
    // Выводим шапку Товарного Чека
    
    ОбластьМакетаШапка = ВыборШапки();
    
    ОбластьМакетаШапка.Параметры.ПредставлениеПоставщика = Шапка.Организация;
    ОбластьМакетаШапка.Параметры.Склад = Шапка.Склад;
    ОбластьМакетаШапка.Параметры.ДатаЧека = Формат(Шапка.Дата, "ДФ=""дд ММММ гггг 'г.'""");
    
    //Конец области Шапка
    ТабДокумент.Вывести(ОбластьМакетаШапка);
    
    //Вывод табличной части
    ОбластьМакетаСтрока = Макет.ПолучитьОбласть("Строка");
    
    Для Каждого СтрокаТабличнойЧасти Из ТаблицаТовара <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/цикл')">Цикл	</span>
    
    ОбластьМакетаСтрока.Параметры.Заполнить(СтрокаТабличнойЧасти);
    
    Если НЕ ЗначениеЗаполнено(СтрокаТабличнойЧасти.Номенклатура) Тогда
    Сообщить("В одной из строк не заполнено значение номенклатуры - строка при печати пропущена.", СтатусСообщения.Важное);
    Продолжить;
    КонецЕсли;
    
    ТабДокумент.Вывести(ОбластьМакетаСтрока);
    
    ОбщееКоличество = ОбщееКоличество + СтрокаТабличнойЧасти.Количество;
    
    КонецЦикла;
    //Конец области Строка
    
    Если ТаблицаТовара <> Неопределено Тогда
    
    Сумма    = ТаблицаТовара.Итог("Сумма");
    СуммаНДС = ТаблицаТовара.Итог("СуммаНДС");
    
    Иначе
    
    Сумма    = 0;
    СуммаНДС = 0;
    
    КонецЕсли;
    
    СуммаДляПрописи = Шапка.ОбщаяСумма + ?(Шапка.СуммаВключаетНДС, 0, СуммаНДС);
    
    ОбластьМакетаИтого = Макет.ПолучитьОбласть("Итого");
    
    ОбластьМакетаИтого.Параметры.ВсегоКоличество = ОбщееКоличество;
    
    ОбластьМакетаИтого.Параметры.Всего = ОбщегоНазначения.ФорматСумм(СуммаДляПрописи, Шапка.ВалютаДокумента);
    
    //Конец области Итого
    ТабДокумент.Вывести(ОбластьМакетаИтого);
    
    ОбластьМакетаСуммаПрописью = Макет.ПолучитьОбласть("СуммаПрописью");
    
    ОбластьМакетаСуммаПрописью.Параметры.СуммаПрописью  = ОбщегоНазначения.СформироватьСуммуПрописью(СуммаДляПрописи, Шапка.ВалютаДокумента);
    
    //Конец области Сумма Прописи
    ТабДокумент.Вывести(ОбластьМакетаСуммаПрописью);
    
    ОбластьМакетаПодписи = Макет.ПолучитьОбласть("Подписи");
    
    //Конец области Подписи
    ТабДокумент.Вывести(ОбластьМакетаПодписи);
    
    КонецЦикла;
    
    Возврат ТабДокумент
    
    КонецФункции // ПечатьТоварногоЧека()
    
    //Процедура определяет шапку Товарного Чека
    Функция ВыборШапки()
    
    // получение свойства склада
    Отбор = Новый Структура("Объект, Свойство", СсылкаНаОбъект.Склад, ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Магазин"));
    ЗначениеСвойства = РегистрыСведений.ЗначенияСвойствОбъектов.Получить(Отбор).Значение;
    
    Макет = ПолучитьМакет("ТоварныйЧек");
    
    // выбор области макета
    Если 		ЗначениеСвойства = Неопределено Тогда
    ОблМакШап = Макет.ПолучитьОбласть("ШапкаОбщая");
    ИначеЕсли	ЗначениеСвойства.Наименование = Строка("Маг1") Тогда
    ОблМакШап = Макет.ПолучитьОбласть("Шапка1");
    ИначеЕсли 	ЗначениеСвойства.Наименование = Строка("Маг2") Тогда
    ОблМакШап = Макет.ПолучитьОбласть("Шапка2");
    ИначеЕсли 	ЗначениеСвойства.Наименование = Строка("Маг3") Тогда
    ОблМакШап = Макет.ПолучитьОбласть("Шапка3");
    ИначеЕсли 	ЗначениеСвойства.Наименование = Строка("Маг4") Тогда
    ОблМакШап = Макет.ПолучитьОбласть("Шапка4");
    КонецЕсли;
    
    Возврат ОблМакШап;
    
    КонецФункции;
    

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