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


1С:Предприятие :: 1С:Предприятие 8 общая

Внешняя печатная форма

Внешняя печатная форма
Я
   K1RSAN
 
15.08.18 - 13:59
Помогите люди добрые. Странное случилось. Сделал внешнюю печатную форму для документа, вывожу на печать - а он выводит около 100 документов этого типа в базе... В качестве основы использовал типовые механизмы. Где я мог натупить?


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

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

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

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

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

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

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

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

КонецПроцедуры

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

//ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина;

    СтруктураТипов = ОбщегоНазначенияУТ.СоответствиеМассивовПоТипамОбъектов(МассивОбъектов);

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


Функция СформироватьТабДокументОбразца(МассивОбъектов, ОбъектыПечати, ИмяУпаковочныйЛиста)

    ТабличныйДокумент = Новый ТабличныйДокумент;

    ПервыйДокумент = Истина;

    Для Каждого ТекущийДокумент Из МассивОбъектов Цикл

        Если Не ПервыйДокумент Тогда
            ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;
        ПервыйДокумент = Ложь;

        НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;

        Если ИмяУпаковочныйЛиста = "УпаковочныйЛист" Тогда
            
            Запрос = Новый Запрос;
            Запрос.Текст =
            "ВЫБРАТЬ
            |    ЗаказКлиента.Ссылка,
            |    ЗаказКлиента.Номер КАК НомерЗаказа,
            |    ЗаказКлиента.Дата,
            |    ЗаказКлиента.Грузоотправитель,
            |    ЗаказКлиента.Грузополучатель,
            |    ЗаказКлиента.Товары.(
            |        Номенклатура,
            |        Количество
            |    )
            |ИЗ
            |    Документ.ЗаказКлиента КАК ЗаказКлиента";
            Запрос.Параметры.Вставить("Ссылка", ТекущийДокумент);

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

КонецФункции
 
 
   SpellKeeper
 
1 - 15.08.18 - 14:05
Для Каждого ТекущийДокумент Из МассивОбъектов Цикл

А сколько в массиве элементов?
   Вафель
 
2 - 15.08.18 - 14:07
в запросе нет условия по ссылке
   K1RSAN
 
3 - 15.08.18 - 14:11
Вот я не могу понять, КАК туда они все попадают. Идут они туда через типовой выход на внешнюю печатную форму в процедуру Печать() (1)
   K1RSAN
 
4 - 15.08.18 - 14:13
(2) А где эту ссылку получить?
   Numerus Mikhail
 
5 - 15.08.18 - 14:14
(3)  Если ИмяУпаковочныйЛиста = "УпаковочныйЛист" Тогда
            
            Запрос = Новый Запрос;


нет условия
   Вафель
 
6 - 15.08.18 - 14:15
(3) учи тему "Условия в запросе"
   K1RSAN
 
7 - 15.08.18 - 14:25
(6) отличный совет. а ничего, что это условие просто не работает? и большое количество объектов попадает ДО запроса? Я это место уже много раз правил, потому могут быть неиспользуемые куски кода.
   K1RSAN
 
8 - 15.08.18 - 14:26
Все документы судя по всему попадают в процедуру Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)

в переменной массив объектов. НО я не могу отладчиком ходить внутри внешней печатной формы - потому и спрашиваю тут. Может я просто что-то оформил не так. По сути кроме кода и макета у внешней печатной формы ничего нет
   Вафель
 
9 - 15.08.18 - 14:27
(7) у тебя вообще нет условия
   Lexey_
 
10 - 15.08.18 - 14:28
(7) а как будет работать то, чего нет?
 
 Рекламное место пустует
   K1RSAN
 
11 - 15.08.18 - 14:30
(9) Потому что я его убрал. А если указать это условие - выдает ошибку
{(14, 22)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
 неограниченной длины и поля несовместимых типов.
ЗаказКлиента.Ссылка <<?>>= &Ссылка

Неужто блин никто здесь не делал внешних печатных форм для типовых документов?
   Numerus Mikhail
 
12 - 15.08.18 - 14:30
(8) Давай сыграем в игру.
Напиши в начале процедуры печать() такой код:
Сообщить(МассивОбъектов.Количество());
   K1RSAN
 
13 - 15.08.18 - 14:30
(10) Еще один "умный" ПРОБЛЕМА НЕ В ЗАПРОСЕ. ПРоблема в том, что в процедуру попадает большое количество документов ДО ЗАПРОСА. И
   Numerus Mikhail
 
14 - 15.08.18 - 14:31
(11) здесь все это делали, просто ты не понимаешь того, что ты делаешь. Из-за этого и ошибка.
Данная ошибка говорит о том, что ты в параметр &Ссылка передаешь не ссылку на документ, а строку или еще что-то.
   hhhh
 
15 - 15.08.18 - 14:34
(13) вот это что за херня?

     СформироватьТабДокументОбразца(СтруктураТипов, ОбъектыПечати, "УпаковочныйЛист"));

что за структуру типов ты туда пихаешь?
   K1RSAN
 
16 - 15.08.18 - 14:34
(12) Спасибо за совет. Забыл совсем об этом способе
   K1RSAN
 
17 - 15.08.18 - 14:35
(15) Это я уже пытаюсь сделать хоть что-то, подсматривая выводы на печать типовых печатных форм
   kossmatiy
 
18 - 15.08.18 - 14:36
(8) Это почему не можешь отладить впф? Есть обработка отладка впф, есть яндекс, гугл...
   hhhh
 
19 - 15.08.18 - 14:38
(17) как ты ловко подсмотрел. Должно быть МассивОбъектов, а это как раз твои документы Заказ, а ты туда какую-то структуру фигакнул.
   K1RSAN
 
20 - 15.08.18 - 14:38
(18) Яндекс и гугл кинул на инфостарт с платными обработками.
   Вафель
 
21 - 15.08.18 - 14:39
(11) ну так нужно было с этой ошибкой и приходить.
А вообще см (60
   K1RSAN
 
22 - 15.08.18 - 14:39
(19) Потому что там и такое встречалось -
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    СтруктураТипов = ОбщегоНазначенияУТ.СоответствиеМассивовПоТипамОбъектов(МассивОбъектов);
    
    Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ЗаказКлиента") Тогда
        
        УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
            КоллекцияПечатныхФорм,
            "ЗаказКлиента",
            НСтр("ru = 'Заказ клиента'"),
            СформироватьПечатнуюФормуЗаказаКлиента(СтруктураТипов, ОбъектыПечати, ПараметрыПечати));
        
    КонецЕсли;
    


Начало процедуры в типовом документе
   Lexey_
 
23 - 15.08.18 - 14:40
(13) т.е. ты настолько "умный", что без условия в запросе выбираешь нужный документ?
"ПРоблема в том, что в процедуру попадает большое количество документов ДО ЗАПРОСА"
это как ты определил, если "я не могу отладчиком ходить внутри внешней печатной формы"?
   Numerus Mikhail
 
24 - 15.08.18 - 14:40
(22) сколько объектов в МассивОбъектов?
   K1RSAN
 
25 - 15.08.18 - 14:41
Да, всё, я тупой, только один фиг не работает никак
   Вафель
 
26 - 15.08.18 - 14:41
(23) он  телепат 100 уровня
   edem911
 
27 - 15.08.18 - 14:41
(20) А отладить никак?
Масив объектов нужно перебирать.
Создаешь в обработке форму 1 командуи список значений.
Идентификатор команды должен быть такой же как в объекте.
процедуры формы 

&НаКлиенте
Процедура Тест(Команда)
    Если МассивОбъектов.Количество()>0 Тогда
        СоответствиеТаблДокументов = Новый Соответствие;
        ВызватьПолучениеТабДок(СоответствиеТаблДокументов);    
        
        //выводим окна с табличными документами

        Для каждого ЭлементСоответствия Из СоответствиеТаблДокументов Цикл
            ЭлементСоответствия.Значение.Показать(ЭлементСоответствия.Ключ);
        КонецЦикла; 
    иначе
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Не выбрано ни одного тестового объекта";
        Сообщение.Сообщить();
    КонецЕсли;     
КонецПроцедуры


// <Описание процедуры>

//
// Параметры

//  <Параметр1>  - <Тип.Вид> - <описание параметра>
//                 <продолжение описания параметра>

//  <Параметр2>  - <Тип.Вид> - <описание параметра>
//                 <продолжение описания параметра>

//
&НаСервере
Процедура ВызватьПолучениеТабДок(СоответствиеТаблДокументов)

    ИдентификаторКоманды = "СчетНаОплату";//тот же - что и в функции "СведенияОВнешнейОбработке" модуля обработки!

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

    Для каждого ТекПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
           СоответствиеТаблДокументов.Вставить(ТекПечатнаяФорма.ИмяМакета,ТекПечатнаяФорма.ТабличныйДокумент);
    КонецЦикла; 

        
    
КонецПроцедуры// ВызватьПолучениеТабДок()
   K1RSAN
 
28 - 15.08.18 - 14:42
В любом случае спасибо, хотя бы теперь представляю, где копать
   kossmatiy
 
29 - 15.08.18 - 14:43
(20) ну хз. Я сейчас с телефона нашел прямую ссылку.
   K1RSAN
 
30 - 15.08.18 - 14:45
В общем я сам насовокупил кучу всего, из разных кусков. Вроде получилось что нужно
   K1RSAN
 
31 - 15.08.18 - 14:45
Спасибо всем
   edem911
 
32 - 15.08.18 - 14:45
(27) (28)  выше код для вызова отладки! в итоге открываешь обработку через файл открыть и отлаживай сколько хочешь.


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