|
Внешняя печатная форма | ☑ | ||
---|---|---|---|---|
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) выше код для вызова отладки! в итоге открываешь обработку через файл открыть и отлаживай сколько хочешь.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |