Как создать внешнюю печатную форму для Управление Торговлей, редакция 11 (на примере документа Заказ клиента, создание печатной формы счета) - 1С-ИнтеГрация

Как создать внешнюю печатную форму для Управление Торговлей, редакция 11 (на примере документа Заказ клиента, создание печатной формы счета)



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

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

Ну, начнем:

В режиме конфигуратора создаем новую обработку: Меню Файл->Новый...->Внешняя обработка и переходим в модуль объекта. В отличии от того, как мы ранее создавали ВПФ, каждая внешняя печатная форма теперь не имеет реквизитов, по которым система определяет принадлежность формы к какому-либо объекту. Теперь для регистрации в системе обработка должна уметь "рассказать" о себе - для кого, как именно и в каком режиме будет запускаться.
Для этого нам необходимо определить в модуле объект экспортную функцию СведенияОВнешнейОбработке. Рассмотрим теперь более подробно, как она работает:


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


Итак, мы подготовили все необходимое, что бы наша печатная форма смогла о себе рассказать. Но ведь этого мало: нужно еще, что бы она что-то выводила на экран!
Для этого необходимо, как и раньше, объявить в модуле экспортную процедуру Печать, которая имеет параметры, аналогичные тем, которые используются в БСП.
Подробно рассматривать алгоритм вывода на печать в этом примере не будем, поэтому просто приведу сам дальнейший код:


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

 

Источник



Назад в раздел