Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Что не так в печатной форме (http://forums.kuban.ru/f1040/chto_ne_tak_v_pechatnoj_forme-3653305.html)

med 05.02.2013 08:42

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

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

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

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


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

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

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

{ОбщийМодуль.ОбщегоНазначения.Модуль(256)**: Ошибка при вызове метода контекста (Выполнить)
Результат = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
по причине:
**(6, 2)**: Неоднозначное поле "Документ.Ссылка"
<<?>>Документ.Ссылка В(&МассивДокументов)

Ругается на функцию:

Функция ПроверитьПроведенностьДокументов(знач Документы) Экспорт

Результат = Новый Массив;

ШаблонЗапроса =
"ВЫБРАТЬ
| Документ.Ссылка КАК Ссылка
|ИЗ
| &ИмяДокумента КАК Документ
|ГДЕ
| Документ.Ссылка В(&МассивДокументов)
| И (НЕ Документ.Проведен)";

ТекстОбъединитьВсе =
"
|
|ОБЪЕДИНИТЬ ВСЕ
|
|";

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

ТекстЗапроса = "";
Для Каждого ИмяДокумента Из ИменаДокументов Цикл
Если Не ПустаяСтрока(ТекстЗапроса) Тогда
ТекстЗапроса = ТекстЗапроса + ТекстОбъединитьВсе;
КонецЕсли;
ТекстПодзапроса = СтрЗаменить(ШаблонЗапроса, "&ИмяДокумента", ИмяДокумента);
ТекстЗапроса = ТекстЗапроса + ТекстПодзапроса;
КонецЦикла;

Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("МассивДокументов", Документы);

Если Не ПустаяСтрока(ТекстЗапроса) Тогда
Результат = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
КонецЕсли;
Возврат Результат;

КонецФункции
Бился бился, внаглую переписал хвост функции

вместо:
Результат = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
написал:
Попытка
Если Не ПустаяСтрока(ТекстЗапроса) Тогда
Результат = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
КонецЕсли;
Исключение
Результат = Новый Массив;
КонецПопытки;

Заработало и стало все печататься, но это же неправильно. Где в моей форме ошибка, из-за которой эта функция вылетает ?

Uho 05.02.2013 10:12

во-первых, в твоем коде (по крайней мере, выложенном здесь) НЕ вызывается функция ПроверитьДокументыПроведены() поэтому ошибки в принципе не может быть.

во-вторых, кто тебя научил в цикле обходить МассивДокументов и формировать запрос для каждого???

в-третьих, нет ли у тебя реквизита "Ссылка" в этом документе?

med 05.02.2013 12:26

[quote=Uho;28900462]во-первых, в твоем коде (по крайней мере, выложенном здесь) НЕ вызывается функция ПроверитьДокументыПроведены() поэтому ошибки в принципе не может быть.[/quote]
Но тем не менее программа вылетает, я так понял это для любой печати вызывается, по крайней мере для другой печатной формы так же эта процедура вызывается, но там все проходит...
Пример, как создавать внешнюю печатную управляемую форму я взял с
[url]http://www.1c-pro.ru/topic26882.html[/url]
плюс пример [url]http://forum.aeroion.ru/topic473.html[/url]
форма чека оттуда работает прекрасно.
[quote=Uho;28900462]в-третьих, нет ли у тебя реквизита "Ссылка" в этом документе? [/quote]
реквизита нет, я так понял для Управляемого приложения это необязательно.

Uho 05.02.2013 14:51

[quote=med;28903572]я так понял это для любой печати вызывается[/quote]
откуда вызывается то?

[quote=med;28903572]Пример, как создавать внешнюю печатную управляемую форму я взял с [/quote]

Там нет такого безобразия как в (0)

ТекстЗапроса [quote=med;28903572]реквизита нет, я так понял для Управляемого приложения это необязательно. [/quote]
А реквизит "Документ" у этого документа есть?

med 06.02.2013 12:45

[quote=Uho;28907190]откуда вызывается то?[/quote]
Ну если это принипиально то вот:
// Выполняет интерактивное проведение документов перед печатью.
// Если есть непроведенные документы, предлагает выполнить проведение. Спрашивает
// пользователя о продолжении, если какие-то из документов не провелись и имеются проведенные.
//
// Параметры
// ДокументыМассив - Массив - ссылки на документы, которые требуется провести перед печатью.
// После выполнения функции из массива исключаются непроведенные документы.
// ФормаИсточник - УправляемаяФорма - форма, из которой было вызвана команда.
//
// Возвращаемое значение:
// Булево - есть документы для печати в параметре ДокументыМассив.
//
Функция ПроверитьДокументыПроведены(ДокументыМассив, ФормаИсточник = Неопределено) Экспорт

ОчиститьСообщения();
ДокументыТребующиеПроведение = ОбщегоНазначенияВызовСервера.ПроверитьПроведенностьДокументов(ДокументыМассив);
КоличествоНепроведенныхДокументов = ДокументыТребующиеПроведение.Количество();
...................................
[quote=Uho;28907190]Там нет такого безобразия как в (0)[/quote]
Неправда ваша дяденька, если сравните, то увидите , что точная копия, единственно , я конечно подправил, потому как этот пример для УТ 11, а не для УНФ
[quote=Uho;28907190]А реквизит "Документ" у этого документа есть? [/quote]
Никаких реквизитов у этой печатной формы нет, и никаких форм у этой ВПФ тоже нет (это сделано по аналогии с [url]http://forum.aeroion.ru/topic473.html[/url], естественно с поправкой на 8.2)

Uho 06.02.2013 14:45

[quote=med;28924560]Неправда ваша дяденька, если сравните, то увидите , что точная копия, единственно , я конечно подправил, потому как этот пример для УТ 11, а не для УНФ[/quote]я про первую ссылку

[quote=med;28903572]Пример, как создавать внешнюю печатную управляемую форму я взял с [url]http://www.1c-pro.ru/topic26882.html[/url][/quote] там такого безобразия нет

про функцию ПроверитьДокументыПроведены() я еще в (1) написал

[quote=med;28924560]Никаких реквизитов у этой печатной формы нет, и никаких форм у этой ВПФ тоже нет[/quote]
я разве спрашивал про реквизиты формы?

med 07.02.2013 06:19

[quote=Uho;28927632]я разве спрашивал про реквизиты формы? [/quote]
Реквизит запроса ?

med 07.02.2013 06:25

[quote=Uho;28927632]про функцию ПроверитьДокументыПроведены() я еще в (1) написал[/quote]
Я не понял а с чем спор то ? функция вызывается, зачем она вызывается вопрос не ко мне а к фирме 1С, то что ее не вызываю я, не означает что она не вызывается вообще при печати.
[quote=Uho;28927632]там такого безобразия нет[/quote]
Какого конкретно безобразия там нет ? пример тупо скопирован и исправлен под мою печатную форму, чего там такого, чего нет в примере ?

Uho 07.02.2013 09:36

[quote=med;28938210]Реквизит запроса ? [/quote]
реквизит [b]документа[/b]
[quote=Uho;28907190]А реквизит "Документ" у этого [b]документа[/b] есть? [/quote]
[quote=med;28938224]Какого конкретно безобразия там нет ? [/quote]
вот этого:
[quote=Uho;28900462]в цикле обходить МассивДокументов и формировать запрос для каждого???[/quote]

med 11.02.2013 12:23

а как надо ?

Uho 11.02.2013 14:20

одним запросом


Текущее время: 06:44. Часовой пояс GMT +3.