Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
18 сен 2021, 02:31

Создание внешней печатной формы

Автор Metr_K, 30 мар 2017, 12:08

0 Пользователей и 1 гость просматривают эту тему.

Metr_K

Уважаемые форумчане, подскажите как исправить ошибку. Создаю внешнюю печатную форму для не типовой конфигурации. Имеются следующие данные:
Реквизит- СсылкаНаОбъект, тип - ДокументСсылка.ЧекККМ
Макет - Накладная
Форма - Ссылается на объект и имеет одну единственную кнопку "Выполнить".

Код модуля внешней печатной формы:
Перем мВалютаРегламентированногоУчета Экспорт;
//Перем Организация, Склад, ДисконтнаяКарта;

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

Функция ПолучитьТаблицуКоманд()

   // Создадим пустую таблицу команд и колонки в ней
   Команды = Новый ТаблицаЗначений;

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

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

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

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

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

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

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

Функция  Печать (ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь) Экспорт

ТабДокумент = ПечатьЧека();
Возврат ТабДокумент;

КонецФункции


Функция ПечатьЧека()

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

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

Организация = СсылкаНаОбъект.Организация;
Склад = СсылкаНаОбъект.Склад;
ДисконтнаяКарта = СсылкаНаОбъект.ДисконтнаяКарта;

Шапка = Запрос.Выполнить().Выбрать();
Шапка.Следующий();

ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Чек_Накладная";

Макет = ПолучитьМакет("Накладная");

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

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

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

ЕстьСкидки = Ложь;
ВыборкаСтрокТовары = Шапка.Товары.Выбрать();
Пока ВыборкаСтрокТовары.Следующий() Цикл
Если ВыборкаСтрокТовары.Скидка + ВыборкаСтрокТовары.СкидкаАвтоматическая <> 0 Тогда
ЕстьСкидки = Истина;
КонецЕсли;
КонецЦикла;

ДопКолонка = Константы.ДополнительнаяКолонкаПечатныхФормДокументов.Получить();
Если ДопКолонка = Перечисления.ДополнительнаяКолонкаПечатныхФормДокументов.Артикул Тогда
ВыводитьКоды = Истина;
Колонка = "Артикул";
ИначеЕсли ДопКолонка = Перечисления.ДополнительнаяКолонкаПечатныхФормДокументов.Код Тогда
ВыводитьКоды = Истина;
Колонка = "Код";
Иначе
ВыводитьКоды = Ложь;
КонецЕсли;

ВысотаЗаголовка = ТабДокумент.ВысотаТаблицы;
ПовторятьПриПечатиСтроки = ТабДокумент.Область(1+ВысотаЗаголовка,,1+ВысотаЗаголовка);

ОбластьНомера = Макет.ПолучитьОбласть("ШапкаТаблицы|НомерСтроки");
ОбластьКодов  = Макет.ПолучитьОбласть("ШапкаТаблицы|КолонкаКодов");
ОбластьДанных = Макет.ПолучитьОбласть("ШапкаТаблицы|Данные");
ОбластьСкидок = Макет.ПолучитьОбласть("ШапкаТаблицы|Скидка");
ОбластьСуммы  = Макет.ПолучитьОбласть("ШапкаТаблицы|Сумма");

ТабДокумент.Вывести(ОбластьНомера);
Если ВыводитьКоды Тогда
ОбластьКодов.Параметры.ИмяКолонкиКодов = Колонка;
ТабДокумент.Присоединить(ОбластьКодов);
КонецЕсли;
ТабДокумент.Присоединить(ОбластьДанных);
Если ЕстьСкидки Тогда
ТабДокумент.Присоединить(ОбластьСкидок);
КонецЕсли;
ТабДокумент.Присоединить(ОбластьСуммы);

ОбластьКолонкаТовар = Макет.Область("Товар");
Если Не ВыводитьКоды Тогда
ОбластьКолонкаТовар.ШиринаКолонки = ОбластьКолонкаТовар.ШиринаКолонки
+ Макет.Область("КолонкаКодов").ШиринаКолонки;
КонецЕсли;
Если Не ЕстьСкидки Тогда
ОбластьКолонкаТовар.ШиринаКолонки = ОбластьКолонкаТовар.ШиринаКолонки
+ Макет.Область("СуммаБезСкидки").ШиринаКолонки
+ Макет.Область("СуммаСкидки").ШиринаКолонки;
КонецЕсли;

ОбластьНомера = Макет.ПолучитьОбласть("Строка|НомерСтроки");
ОбластьКодов  = Макет.ПолучитьОбласть("Строка|КолонкаКодов");
ОбластьДанных = Макет.ПолучитьОбласть("Строка|Данные");
ОбластьСкидок = Макет.ПолучитьОбласть("Строка|Скидка");
ОбластьСуммы  = Макет.ПолучитьОбласть("Строка|Сумма");

Сумма          = 0;
ВсегоСкидок    = 0;
ВсегоБезСкидок = 0;

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

ОбластьНомера.Параметры.Заполнить(ВыборкаСтрокТовары);
ТабДокумент.Вывести(ОбластьНомера);

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

ОбластьДанных.Параметры.Заполнить(ВыборкаСтрокТовары);
ОбластьДанных.Параметры.Товар = ?(НЕ ЗначениеЗаполнено(ВыборкаСтрокТовары.ТоварПолноеНаименование),
ВыборкаСтрокТовары.Товар, ВыборкаСтрокТовары.ТоварПолноеНаименование)
+ ФормированиеПечатныхФорм.ПредставлениеСерий(ВыборкаСтрокТовары);
ТабДокумент.Присоединить(ОбластьДанных);

Скидка = ВыборкаСтрокТовары.Цена * ВыборкаСтрокТовары.Количество - ВыборкаСтрокТовары.Сумма;
Если ЕстьСкидки Тогда
ОбластьСкидок.Параметры.Скидка         = Скидка;
ОбластьСкидок.Параметры.СуммаБезСкидки = ВыборкаСтрокТовары.Сумма + Скидка;
ТабДокумент.Присоединить(ОбластьСкидок);
КонецЕсли;

ОбластьСуммы.Параметры.Заполнить(ВыборкаСтрокТовары);
ТабДокумент.Присоединить(ОбластьСуммы);
Сумма          = Сумма + ВыборкаСтрокТовары.Сумма;
ВсегоСкидок    = ВсегоСкидок + Скидка;
ВсегоБезСкидок = Сумма + ВсегоСкидок;
КонецЦикла;

// Вывести Итого.
ОбластьНомера = Макет.ПолучитьОбласть("Итого|НомерСтроки");
ОбластьКодов  = Макет.ПолучитьОбласть("Итого|КолонкаКодов");
ОбластьДанных = Макет.ПолучитьОбласть("Итого|Данные");
ОбластьСкидок = Макет.ПолучитьОбласть("Итого|Скидка");
ОбластьСуммы  = Макет.ПолучитьОбласть("Итого|Сумма");

ТабДокумент.Вывести(ОбластьНомера);
Если ВыводитьКоды Тогда
ТабДокумент.Присоединить(ОбластьКодов);
КонецЕсли;
ТабДокумент.Присоединить(ОбластьДанных);
Если ЕстьСкидки Тогда
ОбластьСкидок.Параметры.ВсегоСкидок    = ВсегоСкидок;
ОбластьСкидок.Параметры.ВсегоБезСкидок = ВсегоБезСкидок;
ТабДокумент.Присоединить(ОбластьСкидок);
КонецЕсли;
ОбластьСуммы.Параметры.Всего = Сумма;
ТабДокумент.Присоединить(ОбластьСуммы);

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

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

ТабДокумент.ПовторятьПриПечатиСтроки = ПовторятьПриПечатиСтроки;

Возврат ТабДокумент;

КонецФункции // ПечатьЧека()


мВалютаРегламентированногоУчета = глЗначениеПеременной("ВалютаРегламентированногоУчета");



Код модуля формы при нажатии на кнопку выполнить:
Процедура КнопкаВыполнитьНажатие(Кнопка)

ТабДокумент = Печать();
УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент);


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



Итог: внешняя печатная форма открывается, но при нажатии на кнопку выполнить выходить следующая ошибка: "{ВнешняяОбработка.ТоварныйЧекНов.Форма.Форма(4,15)}: Недостаточно фактических параметров (Печать)
ТабДокумент = <<?>>Печать(); (Проверка: Толстый клиент (обычное приложение))"

ef0din

У Вас функция Печать имеет 3 параметра, а Вы пишите "Печать()"  - то есть без параметров.

Ошибка, видимо, выскакивает когда Вы через "Открыть" открываете печатную форму? Тогда нужно параметры при вызове функции печать передавать.

alex0402

Цитата: Metr_K от 30 мар 2017, 12:08
ТабДокумент = Печать();

ТабДокумент = Печать(Неопределено);
Спасибо за Сказать спасибо

Metr_K

Цитата: ef0din от 30 мар 2017, 12:13
У Вас функция Печать имеет 3 параметра, а Вы пишите "Печать()"  - то есть без параметров.

Ошибка, видимо, выскакивает когда Вы через "Открыть" открываете печатную форму? Тогда нужно параметры при вызове функции печать передавать.

Спасибо за совет, изменила код, все заработало.
Перем ИмяМакета,КоличествоЭкземпляров,НаПринтер Экспорт;


Процедура КнопкаВыполнитьНажатие(Кнопка)


ТабДокумент = Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь);
УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент);


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

Добавлено: 31 мар 2017, 06:00


1
Добавлено: 31 мар 2017, 06:04


Цитата: Metr_K от 31 мар 2017, 05:21
Цитата: ef0din от 30 мар 2017, 12:13
У Вас функция Печать имеет 3 параметра, а Вы пишите "Печать()"  - то есть без параметров.

Ошибка, видимо, выскакивает когда Вы через "Открыть" открываете печатную форму? Тогда нужно параметры при вызове функции печать передавать.

Спасибо за совет, изменила код, все заработало.
Перем ИмяМакета,КоличествоЭкземпляров,НаПринтер Экспорт;


Процедура КнопкаВыполнитьНажатие(Кнопка)


ТабДокумент = Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь);
УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент);


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

Добавлено: 31 мар 2017, 06:00


Но теперь возникла другая проблема, в 1 С подключила внешнюю печатную форму, захожу в документ открываю кнопку печать, выбираю новую внешнюю печатную форму, выходит следующая ошибка:
Не удалось сформировать внешнюю печатную форму! Недостаточно фактических параметров. Хотя через файл - открыть данная впф работает.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск