понедельник, 9 сентября 2013 г.

Внешняя печатная форма для 1с Розница 2.0 Управляемое приложение

Модуль внешней обработки:
Функция СформироватьПечатнуюФормуКО1(МассивОбъектов, ОбъектыПечати) Экспорт
   

    ТабличныйДокумент = Новый ТабличныйДокумент();
    СинонимДокумента   = НСтр("ru='Приходный кассовый ордер'");
   
    ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ПриходныйКассовыйОрдер_ПФ_MXL_КО1";
   
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    Ссылка                КАК Ссылка,
    |    КорреспондирующийСчет КАК КорреспондирующийСчет
    |ИЗ
    |    КорСчета
    |;
    |ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |    ПриходныйКассовыйОрдер.Номер                         КАК Номер,
    |    ПриходныйКассовыйОрдер.Дата                          КАК ДатаДокумента,
    |    ПриходныйКассовыйОрдер.Ссылка                        КАК Ссылка,
    |    ПриходныйКассовыйОрдер.Организация                   КАК Организация,
    |    ПриходныйКассовыйОрдер.Организация                   КАК ЮрФизЛицо,
    |    ПриходныйКассовыйОрдер.Организация                   КАК Руководители,
    |    ПриходныйКассовыйОрдер.Организация.Префикс           КАК Префикс,
    |    ПриходныйКассовыйОрдер.СуммаДокумента                КАК Сумма,
    |    ПриходныйКассовыйОрдер.ХозяйственнаяОперация         КАК ХозяйственнаяОперация,
    |    ПриходныйКассовыйОрдер.Контрагент                    КАК Контрагент,
    |    ПриходныйКассовыйОрдер.Контрагент.Представление      КАК ФИОПолучателя,
    |    ПриходныйКассовыйОрдер.Приложение                    КАК Приложение,
    |    ПриходныйКассовыйОрдер.ПоДокументу                   КАК ПоДокументу,
    |    ПриходныйКассовыйОрдер.Основание                     КАК Основание,
    |    ПриходныйКассовыйОрдер.Контрагент.НаименованиеПолное КАК НаименованиеПолное,
    |    ПриходныйКассовыйОрдер.Контрагент.Наименование       КАК Наименование,
    |    ПриходныйКассовыйОрдер.ПринятоОт                     КАК ПринятоОт,
    |    ПриходныйКассовыйОрдер.ДокументОснование             КАК ДокументОснование,
    |    ПриходныйКассовыйОрдер.ВТомЧислеНДС                  КАК ВТомЧислеНДС,
    |    ПриходныйКассовыйОрдер.Ответственный.ФизЛицо         КАК Кассир,
    |    ""50.01""                                            КАК КодДебета
    |ИЗ
    |    Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер
    |ГДЕ
    |    ПриходныйКассовыйОрдер.Ссылка В(&МассивОбъектов)
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПриходныйКассовыйОрдер.Ссылка
    |";
   
    Запрос.МенеджерВременныхТаблиц = ДенежныеСредстваСервер.ПолучитьМенеджерТаблицыКорСчетов(Документы.ПриходныйКассовыйОрдер.ПустаяСсылка(), МассивОбъектов);
    Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
   
    МассивРезультатов = Запрос.ВыполнитьПакет();
    ТаблицаКорСчетаДебет = МассивРезультатов[0].Выгрузить();
    ДанныеПечати = МассивРезультатов[1].Выбрать();
   
    ПервыйДокумент = Истина;
    Макет = УправлениеПечатью.ПолучитьМакет("ОбщийМакет.ПФ_MXL_КО1");
    ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
   
    Пока ДанныеПечати.Следующий() Цикл
       
        Если Не ПервыйДокумент Тогда
            ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;
       
        ПервыйДокумент = Ложь;
        НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;

        ЕстьРасчетыСКонтрагентами = ДенежныеСредстваСервер.ЕстьРасчетыСКонтрагентами(ДанныеПечати.ХозяйственнаяОперация);
       
        СведенияОбОрганизации = ФормированиеПечатныхФормСервер.СведенияОЮрФизЛице(ДанныеПечати.Организация, ДанныеПечати.ДатаДокумента);
       
        // Шапка накладной
       
        ОбластьМакета.Параметры.Заполнить(ДанныеПечати);
        ОбластьМакета.Параметры.ПредставлениеОрганизации = ФормированиеПечатныхФормСервер.ОписаниеОрганизации(СведенияОбОрганизации, "ПолноеНаименование,");
        ОбластьМакета.Параметры.СуммаРубКоп       = ФормированиеПечатныхФормСервер.СуммаРубКоп(ДанныеПечати.Сумма);
        ОбластьМакета.Параметры.Сумма             = Формат(ДанныеПечати.Сумма, "ЧЦ=15; ЧДЦ=2");
        ОбластьМакета.Параметры.СуммаПрописью     = ФормированиеПечатныхФормСервер.СформироватьСуммуПрописью(ДанныеПечати.Сумма);
        ОбластьМакета.Параметры.ОрганизацияПоОКПО = СведенияОбОрганизации.КодПоОКПО;
        ОбластьМакета.Параметры.ДатаДокумента     = ДанныеПечати.ДатаДокумента;
        ОбластьМакета.Параметры.НомерДокумента    = ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(ДанныеПечати.Номер, ПустаяСтрока(ПолучитьФункциональнуюОпцию("ПрефиксИнформационнойБазы")), Истина);
        Если Найти(ОбластьМакета.Параметры.ПредставлениеОрганизации, "КАРИГУЗ") > 0 Тогда
            //-Выделим НДС т.к. в основной конфигурации не выделяется
            СуммаНДС = ОбластьМакета.Параметры.Сумма/118*18;
            РублиНДС = Цел(СуммаНДС);
            КопейкиНДС = Окр(100 * (СуммаНДС - РублиНДС), 0, 1);
            СуммаРубКопНДС = ""
            + Формат(РублиНДС, "ЧДЦ=0; ЧГ=0")
            + " руб. "
            + Цел(КопейкиНДС /10)
            + (КопейкиНДС - 10 * Цел(КопейкиНДС / 10))
            +" коп.";
           
            ОбластьМакета.Параметры.ВТомЧисле = "НДС(18%)  " + СуммаРубКопНДС;
        Иначе   
            ОбластьМакета.Параметры.ВТомЧисле         = ДанныеПечати.ВТомЧислеНДС + ?(ДанныеПечати.ВТомЧислеНДС = "Без налога (НДС)", "", " руб.");
        КонецЕсли;
   
        МассивКорСчетов = ТаблицаКорСчетаДебет.НайтиСтроки(Новый Структура("Ссылка", ДанныеПечати.Ссылка));
        КодыСчетДебет = "";
        Для каждого СтрокаКорСчета Из МассивКорСчетов Цикл
            КодыСчетДебет = КодыСчетДебет + "," + СтрокаКорСчета.КорреспондирующийСчет;
        КонецЦикла;
       
        ОбластьМакета.Параметры.СубСчет = Сред(КодыСчетДебет, 2);
       
        Руководители = ФормированиеПечатныхФормСервер.ОтветственныеЛицаОрганизаций(ДанныеПечати.Руководители, КонецДня(ДанныеПечати.ДатаДокумента));
       
        Бухгалтер    = Руководители.ГлавныйБухгалтер;
       
        ОбластьМакета.Параметры.ФИОГлавногоБухгалтера = Бухгалтер;
        ОбластьМакета.Параметры.ФИОКассира            = ФормированиеПечатныхФормСервер.ФамилияИнициалыФизЛица(ДанныеПечати.Кассир);
       
        ОбластьМакета.Параметры.ПринятоОт  = ДанныеПечати.ПринятоОт;
        ОбластьМакета.Параметры.Основание  = ДанныеПечати.Основание;
        ОбластьМакета.Параметры.Приложение = ДанныеПечати.Приложение;
       
        ТабличныйДокумент.Вывести(ОбластьМакета);
        УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, ДанныеПечати.Ссылка);
       
    КонецЦикла;
    ТабличныйДокумент.АвтоМасштаб = Истина;
   
    Возврат ТабличныйДокумент;
   
КонецФункции


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

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

Функция ПолучитьНазначениеОбработки()
   
    Назначение = Новый Массив;
   
    Назначение.Добавить("Документ.ПриходныйКассовыйОрдер");
    //Назначение.Добавить("Документ.ЧекККМ");
   
    Возврат Назначение;
   
КонецФункции

Функция ПолучитьТаблицуКоманд()
   
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
   
    Возврат Команды;
   
КонецФункции

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
   
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
   
КонецПроцедуры

Модуль формы:

&НаКлиенте
Процедура Печать_(Команда)
    ТабДок = Печ();
    Если не ТабДок = Неопределено Тогда
        ТабДок.Показать();
    КонецЕсли;
КонецПроцедуры

&НаСервере
Функция Печ()
    МассивОбъектов = Новый Массив;
    МассивОбъектов.Добавить(Объект.СсылкаНаОбъект);
   
    ОбъектыПечати = Новый СписокЗначений;
    ОбъектыПечати.Добавить(Объект.СсылкаНаОбъект);
    Документ = РеквизитФормыВЗначение("Объект");
      Возврат Документ.СформироватьПечатнуюФормуКО1(МассивОбъектов,ОбъектыПечати);
      //ЗначениеВРеквизитФормы(Документ, "Объект");
   
КонецФункции