Вход | Регистрация

1С:Предприятие ::

Метки: 

Внешняя печатная при печати выдает ошибку "Печатная форма недоступна"

Я
   stalker300490
 
24.08.18 - 15:42
Код обработки

Функция СведенияОВнешнейОбработке() экспорт
    ПараметрыРегистрации = Новый Структура;
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг");//Указываем документ к которому делаем внешнюю печ. форму

    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");//может быть - ПечатнаяФорма, ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов... 

    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "РеализацияТоваровУслуг (внешняя)");//имя под которым обработка будет зарегестрирована в справочнике внешних обработок

    ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ);
    ПараметрыРегистрации.Вставить("Версия", "1.0"); 
    ПараметрыРегистрации.Вставить("Информация", "Эту ВПФ мы сделали для того что бы посмотреть возможности БСП "); 
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    ДобавитьКоманду(ТаблицаКоманд, "РеализацияТоваровУслуг (внешняя)", "РеализацияТоваровУслуг", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);

    Возврат ПараметрыРегистрации;
КонецФункции

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

    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));//имя макета печ.формы

    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));//ВызовСерверногоМетода

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

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



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





Функция СтруктураИтоговыеСуммы()
    
    Структура = Новый Структура;
    
    СтруктураРесурсовДляИтогов = СтруктураРесурсовДляИтогов();
    
    Для Каждого Элемент Из СтруктураРесурсовДляИтогов Цикл
        Структура.Вставить("Итого"+Элемент.Ключ+"НаСтранице", 0);
        Структура.Вставить("Итого"+Элемент.Ключ, 0);
    КонецЦикла;
    
    Возврат Структура;
    
КонецФункции


Процедура ОбнулитьИтогиПоСтранице(ИтоговыеСуммы)
    
    СтруктураРесурсовДляИтогов = СтруктураРесурсовДляИтогов();
    
    Для Каждого Элемент Из СтруктураРесурсовДляИтогов Цикл
        ИтоговыеСуммы.Вставить("Итого"+Элемент.Ключ+"НаСтранице", 0);
    КонецЦикла;
    
КонецПроцедуры


Процедура РассчитатьИтоговыеСуммы(ИтоговыеСуммы, СтрокаТовары)
    
    СтруктураСуммПоСтроке = СтруктураРесурсовДляИтогов();
    
    ЗаполнитьЗначенияСвойств(СтруктураСуммПоСтроке, СтрокаТовары);
    ОкруглитьДоЦелого(СтруктураСуммПоСтроке.КоличествоМест);
    Для Каждого Элемент Из СтруктураСуммПоСтроке Цикл
        Если ЗначениеЗаполнено(Элемент.Значение) Тогда
            ИтоговыеСуммы["Итого"+Элемент.Ключ+"НаСтранице"] = ИтоговыеСуммы["Итого"+Элемент.Ключ+"НаСтранице"] + Элемент.Значение;
            ИтоговыеСуммы["Итого"+Элемент.Ключ] = ИтоговыеСуммы["Итого"+Элемент.Ключ] + Элемент.Значение;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры



Функция СформироватьПечатнуюФормуМХ3(СтруктураТипов, ОбъектыПечати, ПараметрыПечати) Экспорт
    
    УстановитьПривилегированныйРежим(Истина);
    
    ТабличныйДокумент = Новый ТабличныйДокумент;
    
    // Зададим параметры макета

    ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
    
    ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_МХ3";
    
    НомерТипаДокумента = 0;
    
    Для Каждого СтруктураОбъектов Из СтруктураТипов Цикл
        
        НомерТипаДокумента = НомерТипаДокумента + 1;
        Если НомерТипаДокумента > 1 Тогда
            ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;
        
        МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(СтруктураОбъектов.Ключ);
        
        Попытка
            ДанныеДляПечати = МенеджерОбъекта.ПолучитьДанныеДляПечатнойФормыМХ3(ПараметрыПечати, СтруктураОбъектов.Значение);
            ЗаполнитьТабличныйДокументМХ3(ТабличныйДокумент, ДанныеДляПечати, ОбъектыПечати);
        Исключение
            ИнформацияОбОшибке = ИнформацияОбОшибке();
        КонецПопытки;
        
    КонецЦикла;
    
    Возврат ТабличныйДокумент;
    
КонецФункции


Процедура ЗаполнитьРеквизитыШапкиМХ3(ДанныеПечати, ДанныеПоСкладу, Макет, ТабличныйДокумент)
    Макет = ПолучитьМакет("ПФ_MXL_СчетНаОплату");
    // Выводим общие реквизиты шапки

    СведенияОПоклажедержателе = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(ДанныеПоСкладу.Поклажедержатель, ДанныеПечати.Дата);
    СведенияОПоклажедателе    = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(ДанныеПечати.Организация, ДанныеПечати.Дата);
    
    ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
    
    ШтрихкодированиеПечатныхФорм.ВывестиШтрихкодВТабличныйДокумент(
        ТабличныйДокумент,
        Макет,
        ОбластьМакета,
        ДанныеПечати.Ссылка);
        
    ОбластьМакета.Параметры.Заполнить(ДанныеПечати);
    ОбластьМакета.Параметры.Заполнить(ДанныеПоСкладу);
    
    СтруктураПараметров = Новый Структура;
    СписокПараметров = "ПолноеНаименование,ЮридическийАдрес,Телефоны";
    СтруктураПараметров.Вставить("НомерДокумента", ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ДанныеПечати.Номер));
    СтруктураПараметров.Вставить("ПредставлениеПоклажедержателя", ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПоклажедержателе,СписокПараметров));
    СтруктураПараметров.Вставить("ПредставлениеПоклажедателя", ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПоклажедателе,СписокПараметров));
    СтруктураПараметров.Вставить("ПоклажедержательПоОКПО", СведенияОПоклажедержателе.КодПоОКПО);
    СтруктураПараметров.Вставить("ВидДеятельностиПоОКДП", СведенияОПоклажедержателе.КодОКВЭД);
    СтруктураПараметров.Вставить("ПоклажедательПоОКПО", СведенияОПоклажедателе.КодПоОКПО);
    
    ОбластьМакета.Параметры.Заполнить(СтруктураПараметров);
    ТабличныйДокумент.Вывести(ОбластьМакета);
    
КонецПроцедуры


Процедура ЗаполнитьТабличныйДокументМХ3(ТабличныйДокумент, ДанныеДляПечати, ОбъектыПечати)
    
    Макет = УправлениеПечатью.МакетПечатнойФормы("ПФ_MXL_МХ3");
    
    ДанныеПечати         = ДанныеДляПечати.РезультатПоШапке.Выбрать();
    ВыборкаДанныеПоСкладу = ДанныеДляПечати.РезультатПоСкладам.Выбрать();
    ВыборкаПоДокументам  = ДанныеДляПечати.РезультатПоТабличнойЧасти.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    ПервыйДокумент = Истина;
    Пока ДанныеПечати.Следующий() Цикл
        
        СтруктураПоиска = Новый Структура("Ссылка", ДанныеПечати.Ссылка);
        ВыборкаПоДокументам.Сбросить();
        Если НЕ ВыборкаПоДокументам.НайтиСледующий(СтруктураПоиска) Тогда
            
            Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                НСтр("ru = 'В документе %1 отсутствуют товары. Печать акта не требуется'"),
                ДанныеПечати.Ссылка);
            
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
                Текст,
                ДанныеПечати.Ссылка);
            
            Продолжить;
            
        КонецЕсли;
        
        НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
        
        ВыборкаПоСкладам = ВыборкаПоДокументам.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        
        Пока ВыборкаПоСкладам.Следующий() Цикл
            
            СтруктураПоиска = Новый Структура("Ссылка, Склад", ДанныеПечати.Ссылка, ВыборкаПоСкладам.Склад);
            ВыборкаДанныеПоСкладу.Сбросить();
            
            Если НЕ ВыборкаДанныеПоСкладу.НайтиСледующий(СтруктураПоиска) Тогда
                
                Продолжить;
                
            КонецЕсли;
            
            Если ВыборкаДанныеПоСкладу.ИсточникИнформацииОЦенахДляПечати = Перечисления.ИсточникиИнформацииОЦенахДляПечати.ПоСебестоимости Тогда
                Если ВыборкаДанныеПоСкладу.ПредварительныйРасчет = Null Тогда
                    ТекстСообщения = НСтр("ru = 'Не удалось получить цены по себестоимости для документа %Документ%: на %Период% не произведен расчет себестоимости.'");
                    
                    ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Документ%", ДанныеПечати.Ссылка);
                    ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Период%", Формат(НачалоМесяца(ДанныеПечати.ДатаДокумента),"ДЛФ=DD"));
                    
                    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
                    
                    Продолжить;
                    
                ИначеЕсли ВыборкаДанныеПоСкладу.ПредварительныйРасчет Тогда
                    
                    ТекстСообщения = НСтр("ru = 'При печати цен документа %Документ% использовались данные предварительного расчета себестоимости.'");
                    ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Документ%", ДанныеПечати.Ссылка);
                    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
                    
                КонецЕсли;
            КонецЕсли;
            
            Если Не ПервыйДокумент Тогда
                ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
            КонецЕсли;
            
            ПервыйДокумент = Ложь;
            
            // Выводим общие реквизиты шапки

            ЗаполнитьРеквизитыШапкиМХ3(ДанныеПечати, ВыборкаДанныеПоСкладу, Макет, ТабличныйДокумент);
            
            // Выводим заголовок таблицы

            ЗаголовокТаблицы = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
            ТабличныйДокумент.Вывести(ЗаголовокТаблицы);
            
            НомерСтраницы   = 1;
            
            // Инициализация итогов в документе

            ИтоговыеСуммы = СтруктураИтоговыеСуммы();
            
            // Создаем массив для проверки вывода

            МассивВыводимыхОбластей = Новый Массив;
            
            // Выводим многострочную часть документа

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

            ОбластьИтоговПоСтранице = Макет.ПолучитьОбласть("ИтогоПоСтранице");
            ОбластьИтоговПоСтранице.Параметры.Заполнить(ИтоговыеСуммы);
            ТабличныйДокумент.Вывести(ОбластьИтоговПоСтранице);
        
            // Выводим итоги по документу в целом

            ОбластьВсего.Параметры.Заполнить(ИтоговыеСуммы);
            ТабличныйДокумент.Вывести(ОбластьВсего);
            
            // Выводим таблицу услуги

            ОбластьМакета = Макет.ПолучитьОбласть("ЗаголовокТаблицыУслуги");
            ОбластьМакета.Параметры.Заполнить(ВыборкаДанныеПоСкладу);
            ТабличныйДокумент.Вывести(ОбластьМакета);
            
            ОбластьМакета = Макет.ПолучитьОбласть("СтрокаУслуги");
            Для Сч=1 По 6 Цикл
                ТабличныйДокумент.Вывести(ОбластьМакета);
            КонецЦикла;
            ОбластьМакета = Макет.ПолучитьОбласть("ИтогоУслуги");
            ТабличныйДокумент.Вывести(ОбластьМакета);
            
            ОбластьМакета = Макет.ПолучитьОбласть("СтоимостьРабот");
            ТабличныйДокумент.Вывести(ОбластьМакета);
            
            Если ЗначениеЗаполнено(ВыборкаДанныеПоСкладу.ОсобыеОтметки) Тогда
                ОбластьМакета = Макет.ПолучитьОбласть("ОсобыеОтметки");
                ОбластьМакета.Параметры.Заполнить(ВыборкаДанныеПоСкладу);
                ТабличныйДокумент.Вывести(ОбластьМакета);
            Иначе
                ОбластьМакета = Макет.ПолучитьОбласть("ОсобыеОтметкиПустые");
                ТабличныйДокумент.Вывести(ОбластьМакета);
            КонецЕсли;
            
            // Выводим итоги по документу

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



Процедура УстановитьПараметр(ОбластьМакета, ИмяПараметра, ЗначениеПараметра)
    ОбластьМакета.Параметры.Заполнить(Новый Структура(ИмяПараметра, ЗначениеПараметра));
КонецПроцедуры


Функция СтруктураРесурсовДляИтогов()
    
    Структура = Новый Структура;
    
    Структура.Вставить("СуммаБезНДС",       0);
    Структура.Вставить("СуммаНДС",          0);
    Структура.Вставить("СуммаСНДС",         0);
    Структура.Вставить("Количество",        0);
    Структура.Вставить("КоличествоМест",    0);
    Структура.Вставить("КоличествоПринято", 0);
    Структура.Вставить("МассаБрутто",       0);
    Структура.Вставить("МассаНетто",        0);
    Структура.Вставить("Сумма",             0);
    
    Структура.Вставить("РазницаБезНДСУвеличение", 0);
    Структура.Вставить("РазницаБезНДСУменьшение", 0);
    Структура.Вставить("РазницаНДСУвеличение",    0);
    Структура.Вставить("РазницаНДСУменьшение",    0);
    Структура.Вставить("РазницаСНДСУвеличение",   0);
    Структура.Вставить("РазницаСНДСУменьшение",   0);
    
    Возврат Структура;
    
КонецФункции


Процедура ОкруглитьДоЦелого(ОкругляемоеЧисло)
    Если ЗначениеЗаполнено(ОкругляемоеЧисло) Тогда
        Если ОкругляемоеЧисло <> Цел(ОкругляемоеЧисло) Тогда
            ОкругляемоеЧисло = Цел(ОкругляемоеЧисло) + 1;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры
 
 
   Вафель
 
1 - 24.08.18 - 16:23
у тебя где-то не возвращается табличный документ. может не те идентификаторы передаешь
   stalker300490
 
2 - 27.08.18 - 15:17
Вафель, уже разобрался, именно так и было
   Вафель
 
3 - 27.08.18 - 15:39
(2) сам на такое натывкался много раз


Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует