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


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

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

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

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

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

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

//ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина;
    СтруктураТипов = ОбщегоНазначенияУТ.СоответствиеМассивовПоТипамОбъектов(МассивОбъектов);

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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


// <Описание процедуры>
//
// Параметры
//  <Параметр1>  - <Тип.Вид> - <описание параметра>
//                 <продолжение описания параметра>
//  <Параметр2>  - <Тип.Вид> - <описание параметра>
//                 <продолжение описания параметра>
//
&НаСервере
Процедура ВызватьПолучениеТабДок(СоответствиеТаблДокументов)

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

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