Технология создания внешних печатных форм, обработок, отчетов для управляемого режима 8.2

Тема в разделе "Статьи", создана пользователем BabySG, 10 окт 2010.

Статус темы:
Закрыта.
  1. TopicStarter Overlay
    BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    В данной ветке рассматривается процесс создания внешних печатных форм, отчетов, обработок для типовых конфигураций 1С, основанных на БСП (Библиотеке Стандартных Подсистем)

    ВНИМАНИЕ:
    Создание внешних печатных форм для обычного приложения рассматриваются в этой ветке.

    Темы по обсуждению вопросов по примерам и разработке:
    - разработка внешних печатных форм
    - разработка дополнительных отчетов (проектируется)
    - разработка дополнительных разработок (проектируется)

    Примеры:
    - Как подключить внешнюю печатную форму? (на примере обработки из этого сообщения)
    - Как создать внешнюю печатную форму для Управление Торговлей, редакция 11.0.5.4 (на примере документа Заказ клиента, создание печатной формы счета, БСП 1.0.7.5)
    Последнее редактирование модератором: 8 мар 2014
  2. TopicStarter Overlay
    BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Как создать внешнюю печатную форму для Управление Торговлей, редакция 11
    (на примере документа Заказ клиента, создание печатной формы счета)


    Пример разрабатывает на основе конфигурации Управление торговлей, редакция 11.0 (11.0.5.4)
    Обратите внимание: процесс разработки макета печатной формы в данный пример не включен.
    Дается только основа, как создать корректно подключаемую обработку к конфигурации.

    Итак, у нас появилась задача: разработать внешнюю печатную форму для документа Заказ клиента, которая будет выводить на печать форму счета (в 11-ой редакции, в отличии от 10-ой, из заказа нельзя распечатать печатную форму счета. Для этого необходимо использовать документ Счет покупателю. Вот наш заказчик и поставил задачу, что бы можно было распечатать нужную форму из документа Заказ клиента)

    Ну, начнем:
    В режиме конфигуратора создаем новую обработку: Меню Файл->Новый...->Внешняя обработка и переходим в модуль объекта. В отличии от того, как мы ранее создавали ВПФ, каждая внешняя печатная форма теперь не имеет реквизитов, по которым система определяет принадлежность формы к какому-либо объекту. Теперь для регистрации в системе обработка должна уметь "рассказать" о себе - для кого, как именно и в каком режиме будет запускаться.
    Для этого нам необходимо определить в модуле объект экспортную функцию СведенияОВнешнейОбработке. Рассмотрим теперь более подробно, как она работает:
    Код:
    Функция СведенияОВнешнейОбработке() Экспорт
    // Объявим переменную, в которой мы сохраним и вернем "наружу" необходимые данные
    ПараметрыРегистрации = Новый Структура;
    
    // Объявим еще одну переменную, которая нам потребуется ниже
    МассивНазначений = Новый Массив;
    
    // Первый параметр, который мы должны указать - это какой вид обработки системе должна зарегистрировать. 
    // Допустимые типы: ДополнительнаяОбработка, ДополнительныйОтчет, ЗаполнениеОбъекта, Отчет, ПечатнаяФорма, СозданиеСвязанныхОбъектов
    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
    
    // Теперь нам необходимо передать в виде массива имен, к чему будет подключена наша ВПФ
    // Имейте ввиду, что можно задать имя в таком виде: Документ.* - в этом случае обработка будет подключена ко всем документам в системе, 
    // которые поддерживают механизм ВПФ
    МассивНазначений.Добавить("Документ.ЗаказКлиента");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    
    // Теперь зададим имя, под которым ВПФ будет зарегистрирована в справочнике внешних обработок
    ПараметрыРегистрации.Вставить("Наименование", "Заказ клиента (в виде счета)");
    
    // Зададим право обработке на использование безопасного режима. Более подробно можно узнать в справке к платформе (метод УстановитьБезопасныйРежим)
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
    
    // Следующие два параметра играют больше информационную роль, т.е. это то, что будет видеть пользователь в информации к обработке
    ПараметрыРегистрации.Вставить("Версия", "1.0");    
    ПараметрыРегистрации.Вставить("Информация", "Дополнительная печатная форма 'Счет' к документу заказ клиента");
    
    // Создадим таблицу команд (подробнее смотрим ниже)
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    
    // Добавим команду в таблицу
    ДобавитьКоманду(ТаблицаКоманд, "Счет покупателю", "Заказ клиента (в виде счета)", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
    
    // Сохраним таблицу команд в параметры регистрации обработки
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    
    // Теперь вернем системе наши параметры
    Возврат ПараметрыРегистрации;
    КонецФункции
    
    Функция ПолучитьТаблицуКоманд()
    
    // Создадим пустую таблицу команд и колонки в ней
    Команды = Новый ТаблицаЗначений;
    
    // Как будет выглядеть описание печатной формы для пользователя
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); 
    
    // Имя нашего макета, что бы могли отличить вызванную команду в обработке печати
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    
    // Тут задается, как должна вызваться команда обработки
    // Возможные варианты:
    // - ОткрытиеФормы - в этом случае в колонке идентификатор должно быть указано имя формы, которое должна будет открыть система
    // - ВызовКлиентскогоМетода - вызвать клиентскую экспортную процедуру из модуля формы обработки
    // - ВызовСерверногоМетода - вызвать серверную экспортную процедуру из модуля объекта обработки
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    
    // Следующий параметр указывает, необходимо ли показывать оповещение при начале и завершению работы обработки. Не имеет смысла при открытии формы
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    
    // Для печатной формы должен содержать строку ПечатьMXL 
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    Возврат Команды;
    КонецФункции
    
    Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
    // Добавляем команду в таблицу команд по переданному описанию.
    // Параметры и их значения можно посмотреть в функции ПолучитьТаблицуКоманд
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
    
    КонецПроцедуры
    
    Итак, мы подготовили все необходимое, что бы наша печатная форма смогла о себе рассказать. Но ведь этого мало: нужно еще, что бы она что-то выводила на экран!
    Для этого необходимо, как и раньше, объявить в модуле экспортную процедуру Печать, которая имеет параметры, аналогичные тем, которые используются в БСП.
    Подробно рассматривать алгоритм вывода на печать в этом примере не будем, поэтому просто приведу сам дальнейший код:

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

    В приложениях обработка, которая должна была получиться в итоге.

    Вложения:

    emelian и DimSon нравится это.
  3. TopicStarter Overlay
    BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29

    Вложения:

    DimSon нравится это.
Статус темы:
Закрыта.

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