Здравствуйте! На основании одной из тем в разделе программирования я решила дать немного подробный инструктаж по изготовлению внешних печатных форм для типовых конфигураций.
Если вам нужен макет счета или типового документа, то его можно скопировать из типовой в свою обработку методом: Ctrl+C (Копировать) Ctrl+V(вставить)
По части регистрации внешней печатной формы приведем пример
Внимание: Работаем в модуле объекта!
Функция СведенияОВнешнейОбработке() Экспорт
// Регистрация ВПФ
//Переменные
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
//Параметры регистрации
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");//Вид формы
МассивНазначений.Добавить("Документ.СчетНаОплатуКлиенту");//Привязка к документу, здесь может быть ваш документ
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "НашаПечатнаяФормасчет");//название формы в справочнике внешних обработок
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);//Безопасный режим включен
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("Информация", "Дополнительная печатная форма к документу СчетНаОплатуКлиенту");
//Добавим команды к форме
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд, "ИмяКнопки","ИмяМакета","ВызовСерверногоМетода",Истина,"ПечатьMXL");//Кнопке можно дать любое имя,А имя/миноним макета - как назовете макет при создании
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование,ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
По печатным формам можно так же в поисковике пробить: Технология создания внешних печатных форм.
Для самого простого варианта, если не нужны никакие настройки на форме, то форму можно вообще не создавать и обработка будет работать из дополнительных Отчетов и Обработок.
Я все таки хочу пояснить немного технологию изготовления собственных макетов
В управляемых формах введена переменная: МассивОбъектов - она введена для того, чтобы мы могли распечатать одновременно несколько документов и они попадут на печать)
В функцию печати для управляемых форм передаем как минимум две переменные:
Функция ПечатьДокумента(МассивОбъектов, ОбъектыПечати)
Функция должна называться как угодно, только не Печать() - так как процедура с именем Печать() уже определена в типовых. Причем как вспомогательная процедура из данных высшего уровня.
1. В типовых сейчас(как бухгалтерия 3.0 или УТ11) в родных макетах немного другие понятия в параметрах запроса, в отличие от Бухгалтерии2.0, как:
Для Родных форм
Запрос.УстановитьПараметр("ТекущийДокумент",ЭтотОбъект.Ссылка);
Для внешних печатных форм
Запрос.УстановитьПараметр("ТекущийДокумент",СсылкаНаОбъект);
Для бухгалтерии 3.0 и в том же духе
Запрос.УстановитьПараметр("МассивОбъектов",МассивОбъектов);
При чем этой переменной можно пользоваться как для самодельной печатной формы внутри конфигурации, так и для внешней печатной формы.
Приведем пример запроса из бух2.0
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект);
Запрос.Текст =
"ВЫБРАТЬ
| Номер,
| Дата,
| ДоговорКонтрагента,
| Контрагент КАК Получатель,
| Организация,
| Организация КАК Поставщик,
| СуммаДокумента,
| ВалютаДокумента,
| УчитыватьНДС,
| СуммаВключаетНДС
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|
|ГДЕ
| РеализацияТоваровУслуг.Ссылка = &ТекущийДокумент";
Шапка = Запрос.Выполнить().Выбрать();
Шапка.Следующий();
и сделаем тот же запрос в бух.3.0
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
Запрос.Текст =
"ВЫБРАТЬ
| Номер,
| Дата,
| ДоговорКонтрагента,
| Контрагент КАК Получатель,
| Организация,
| Организация КАК Поставщик,
| СуммаДокумента,
| ВалютаДокумента,
| УчитыватьНДС,
| СуммаВключаетНДС
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|
|ГДЕ
| РеализацияТоваровУслуг.Ссылка В (&МассивОбъектов)";
Шапка = Запрос.Выполнить().Выбрать();
Пока Шапка.СледующийПоЗначениюПоля("Ссылка");
В обычных формах мы выполнили запрос и приступаем к заполнению документа, на управляемых формах мы сразу же врезаемся в Цикл.
Пока Шапка.СледующийПоЗначениюПоля("Ссылка") Цикл
КонецЦикла
И тут выскакивает ошибка: Неверное Значение аргумента!
Ошибка выскакивает, так как мы пытаемся идти по полю, которого в запросе не существует. В запросе данного поля нет, для устранения ошибки необходимо добавить в запрос Поле: Ссылка
Далее в цикле начинаем заполнять данные. Привожу образец из бухгалтерии 2.0:
ОбластьМакета = Макет.ПолучитьОбласть("Поставщик");
СведенияОбОрганизации = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка.Организация, Шапка.Дата);
ПредставлениеПоставщика = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОбОрганизации, "НаименованиеДляПечатныхФорм,");
ОбластьМакета.Параметры.ПредставлениеПоставщика = ПредставлениеПоставщика;
ТабДокумент.Вывести(ОбластьМакета);
По сравнению с бухгалтерией 2.0 в бухгалтерии 3.0 все модули поменялись, теперь пример будет таким:
СведенияОПоставщике = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(Шапка.Поставщик, Шапка.Дата);
ПредставлениеПоставщика = ОбщегоНазначенияБПВызовСервера.ОписаниеОрганизации(СведенияОПоставщике, "НаименованиеДляПечатныхФорм,");
Область.Параметры.ПредставлениеПродавца = ПредставлениеПоставщика;
ТабДок.Вывести(Область);
Пример для Управленияторговлей Ред11:
ОбластьМакета = Макет.ПолучитьОбласть("Покупатель");
ПредставлениеПокупателя = ФормированиеПечатныхФорм.ОписаниеОрганизации(ФормированиеПечатныхФорм.СведенияОЮрФизЛице(Шапка.Покупатель, Шапка.Дата), "ПолноеНаименование");
ОбластьМакета.Параметры.Покупатель = ПредставлениеПокупателя;
ТабличныйДокумент.Вывести(ОбластьМакета);
В функцию СведенияОЮрФизЛице() необходимо передавать поля с псевдонимом, какой вы ему присвоили. То есть если в запросе было: ВЫБРАТЬ Организация КАК Поставщик, то именно Поле с именем Поставщик должно фигурировать в переменной Шапка результата запроса.
Далее хочу сказать про функцию ФорматСумм();
Бух2.0
ОбщегоНазначения.ФорматСумм(Шапка.СуммаДокумента);
Бухгалтерия3.0 и Торговля11
ОбщегоНазначенияБПВызовСервера.ФорматСумм(Шапка.СуммаДокумента)//Для бухгалтерии 3.0
ФормированиеПечатныхФорм.ФорматСумм(Шапка.СуммаДокумента)//Для Торговли11х
Для ERP2.0 больше функций.
ФормированиеПечатныхФорм.ФорматСумм(Шапка.СуммаДокумента)//Как и в Торговле 11
СуммаПлатежногоДокумента(Сумма, ВыводитьСуммуБезКопеек)//Вывод суммы в рублях без копеек
СуммаРубКоп(Сумма, Валюта, ВалютаРегламентированногоУчета)//Вывод суммы в рублях и копейках
Вывод ответственных лиц.. уже есть разница у бухгалтерии 3.0 и Торговле 11, так как в бухгалтерии 3.0 ответственные лица - это регистр сведений, а в управленииТорговлей11 - это справочник. Так же и функционал вывода тоже раскинут по разным модулям
Бухгалтерия 3.0
ОтветственныеЛицаОрганизации = ОтветственныеЛицаБП.ОтветственныеЛица(Шапка.Организация, Шапка.Дата, Шапка.ПодразделениеОрганизации);
ЗаместительПоПриказу = ОтветственныеЛицаОрганизации.РуководительПредставление;//Или здесь
ПечатьТорговыхДокументов.ЗаполнитьДанныеОтветственныхЛиц(СведенияОДокументе, Новый Структура("ЗаполнятьРуководителя"));
ПечатьТорговыхДокументов.ЗаполнитьДанныеОтветственныхЛиц(СведенияОДокументе, Новый Структура("ЗаполнятьРуководителя"));
УправлениеТорговлей ред11х
ОтветственныеЛицаОрганизации = ОтветственныеЛицаСервер.ПолучитьОтветственныеЛицаОрганизации(Шапка.Организация, Шапка.ДатаДок);
ФИОРуководителя = ОтвЛица.Руководитель.Наименование;
Для ERP2.0
ФизическиеЛица.ФамилияИнициалыФизЛица(Выборка.Кассир)//В торговле и ERP2.0
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
ОтветственныеЛицаСервер.СформироватьВременнуюТаблицуОтветственныхЛицДокументов(МассивОбъектов, МенеджерВременныхТаблиц);// ERP2.0
Функция СформироватьСуммуПрописью() тоже в различных конфигурациях находится в разных модулях
Бух3.0
СуммаПрописью = ОбщегоНазначенияБПВызовСервера.СформироватьСуммуПрописью(СуммаКПрописи, ВалютаРеглУчета);
УТ11
СуммаПрописью = РаботаСКурсамиВалют.СформироватьСуммуПрописью(Шапка.СуммаДокумента,Шапка.Валюта);
Вывод данных физических лиц:
ОбластьПодписи.Параметры.Отпустил = ФизическиеЛица.ФамилияИнициалыФизЛица(Шапка.ОтпускПроизвел);//УТ11
МОЛ = ОтветственныеЛицаБП.ОтветственноеЛицоНаСкладе(Шапка.Склад, Шапка.Дата);//Вывод МОЛ для Бух3.0
ДанныеФизЛица = ОбщегоНазначенияБПВызовСервера.ДанныеФизЛица(Шапка.Организация, МОЛ, Шапка.Дата);//Вывод данных физлица для бух3.0
Вывод штрихкода на печать для торговли и ERP2.0
ШтрихкодированиеПечатныхФорм.ВывестиШтрихкодВТабличныйДокумент(ТабличныйДокумент, Макет, ОбластьМакета, Выборка.Ссылка);
Вывод номера на печать
ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(Выборка.Номер,Ложь, Истина)//Это в большинстве конфигурация, бух3.0,Торговля11 и ERP2.0
Я поработаю над функцией Формирования печатной формы. Примерно опишу как я делала свою самодельную печатную форму.
Приведу пример рисования печатной формы
Создаём макет типа: ТабличныйДокумент.Перед нами откроется таблица типа в Экселе
Далее для создания областей выделяем область ячеек(например слева выделяем несколько номеров ячеек), Далее идем в меню:
Таблица/Имена/Назначить Имя
Пишем Имя, например: Заголовок и жмём ОК.
Для данного варианта есть ещё альтернативный пример, выделяя область, жмем комбинации клавиш(Ctrl+Shift+N) - эта комбинация вызывает ту же команду: НазначитьИмя)
Так мы можем создавать области, которые обычно в стандартных макетах помечаются именами вверху и слева..
Правда если это одна область, тогда
МояОбласть = Макет.ПолучитьОбласть("МояОбласть")
Если область создана и слева и вверху, и у вас на нужной ячейке получается пересечение двух областей, тогда получаем сразу две области:
МояОбласть = Макет.ПолучитьОбласть(ГоризонтальнаяОбласть|ВертикальнаяОбласть);
По теме ячеек...
Если вас не устраивают ячейки в виде таблицы, вы можете выбрать нужное количество ячеек и через Меню: Таблица/Ячейки/Объединить.
Если перестарались, то там же: Таблица/Ячейки/РазбитьЯчейку.
Если вы создали область например слева у вас область, в которую объединено две строки с номерами ячеек и вам их мало, вы бы хотели побольше заголовок? Необязательно пересоздавать область, просто встаньте на одну из цифр ячеек в области, щелкните по ней правой кнопкой мыши и выберите команду: Раздвинуть. И у вас в области будет не две, а на три строки высота)))
То же самое касается ячеек в верхней части макета, их точно так же в случае надобности можно разбивать.
Для данных таблиц лучше создавать две области: Область Шапка(с названиями колонок) и область Строка(с параметрами для заполнения
Создаем ОбластьШапки, выделяем ячейки и щелкаем правой кнопкой Мыши, в контекстном меню ВЫбираем: Свойства
В свойствах есть такие функции, как: Границасверху,ГраницаСнизу,ГраницаСлева,ГраницаСправа и Обвести..
Для начала, если вам нужна просто колонка для наименования, то много строк там ни к чему. Выбираем колонку в области, выделяем все ячейки колонки и с помощью праволй кнопки мыши в контекстном меню выбираем "Объединить"
У вас получится пустая колонка для размещения текста.
далее в свойствах(так же вызываем через контекстное меню) выбираем нужный функционал
1.ВкладкаОсновные.Текст - там пишем имя колонки, например:Наименование
Далее:
Заполнение: Текст \\оставляем как есть
Использование:Ячейка\\оставляем как есть
Далее есть такое свойство, как горизонтальное положение и вертикальное положение - выставив вместо АВТО положение ЦЕНТР - вы сделайте наименование колонки в центре.
В Оформлении вы можете сделать побольше шрифт и изменить его свойства.
Границы. Границы вы можете сами задать как вам удобно.Можете по колонке брать и обводить, где поставите границу, там и будет черная черта при выходе таблицы в пользовательстком режиме.
Заполнение ставится: Текст - Только для ТекстовыхЗаписей или если хотите в пользовательском режиме внести какой комментарий вручную .
Для заполнения из результатов запроса и прочих переменных, необходимо свойство заполнения присвоить значение: Параметр.
Это чаще всего требуется при заполнении области Строка, а так же при заполнении Даты, Номера Документа, вывод дванных кладовщика, Руководителя, Бухгалтера..
Тогда мы можем спокойно заполнять макет так:
МояОбласть.Параметры.ИмяПараметра = ВыборкаЗапроса.НужноеПоле
Живой пример из обработки:
ОбластьТовар.Параметры.Наименование = Товары.Номенклатура;
Привожу пример для УТ11
Функция СформироватьПечатнуюФормуНакладная(МассивОбъектов, ОбъектыПечати)
УстановитьПривилегированныйРежим(Истина);
//Выбираем в запросе чисто те поля, которые нам нужны для вывода.
ЗапросШапка = Новый Запрос;
ЗапросШапка.УстановитьПараметр("МассивОбъектов",МассивОбъектов);
ЗапросШапка.Текст = "ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка КАК Ссылка,
| РеализацияТоваровУслуг.Номер КАК Номер,
| РеализацияТоваровУслуг.Дата КАК Дата,
| РеализацияТоваровУслуг.Партнер КАК Партнер,
| РеализацияТоваровУслуг.Контрагент КАК Получатель,
| РеализацияТоваровУслуг.Организация КАК Организация,
| РеализацияТоваровУслуг.Организация.Префикс КАК Префикс,
| РеализацияТоваровУслуг.Валюта КАК Валюта,
| РеализацияТоваровУслуг.ЦенаВключаетНДС КАК ЦенаВключаетНДС,
| ВЫБОР
| КОГДА РеализацияТоваровУслуг.НалогообложениеНДС = ЗНАЧЕНИЕ(Перечисление.ТипыНалогообложенияНДС.ПродажаНеОблагаетсяНДС)
| ИЛИ РеализацияТоваровУслуг.НалогообложениеНДС = ЗНАЧЕНИЕ(Перечисление.ТипыНалогообложенияНДС.ПродажаОблагаетсяЕНВД)
| ТОГДА ЛОЖЬ
| ИНАЧЕ ИСТИНА
| КОНЕЦ КАК УчитыватьНДС,
| РеализацияТоваровУслуг.Отпустил.Наименование КАК ОтпускПроизвел,
| РеализацияТоваровУслуг.СуммаДокумента
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Ссылка В(&МассивОбъектов)";
//Делаем запрос к табличной части товаров
ЗапросТовары = Новый Запрос;
ЗапросТовары.УстановитьПараметр("МассивОбъектов",МассивОбъектов);
ЗапросТовары.Текст = "ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Номенклатура,
| РеализацияТоваровУслугТовары.Количество,
| РеализацияТоваровУслугТовары.Цена,
| РеализацияТоваровУслугТовары.Сумма,
| РеализацияТоваровУслугТовары.НомерСтроки,
| РеализацияТоваровУслугТовары.Упаковка
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка В(&МассивОбъектов)";
Шапка = ЗапросШапка.Выполнить().Выбрать();
ТабличныйДокумент = Новый ТабличныйДокумент;
ПервыйДокумент = Истина;
Пока Шапка.СледующийПоЗначениюПоля("Ссылка") Цикл
// Макет необходимо получать для каждого документа,
//т.к. размеры колонок изменяются динамически
Макет = ПолучитьМакет("ВПФ_Накладная");
Если Не ПервыйДокумент Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ПервыйДокумент = Ложь;
НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
// Выводим шапку накладной
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьЗаголовок.Параметры.Номер = Шапка.Номер;
ОбластьЗаголовок.Параметры.Дата = Шапка.Дата;
ТабличныйДокумент.Вывести(ОбластьЗаголовок);
ОбластьМакета = Макет.ПолучитьОбласть("Покупатель");
ПредставлениеПокупателя = ФормированиеПечатныхФорм.ОписаниеОрганизации(ФормированиеПечатныхФорм.СведенияОЮрФизЛице(Шапка.Получатель, Шапка.Дата), "ПолноеНаименование");
// В скобках выводим Полное наименование, но можно вывести практически всю инфу про организацию, если что требуется, перечислить можно ИНН,КПП, ит.д.
ОбластьМакета.Параметры.Покупатель = ПредставлениеПокупателя;
ТабличныйДокумент.Вывести(ОбластьМакета);
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ТабличныйДокумент.Вывести(ОбластьШапкаТаблицы);
//Здесь можно пользоваться хоть Выборкой, хоть таблицей значений, но все же лучше рекомендуется выборка.
// Выводим строки таблицы Товары
ОбластьТовар = Макет.ПолучитьОбласть("Строка");
Товары = ЗапросТовары.Выполнить().Выбрать();
Пока Товары.Следующий() Цикл
ОбластьТовар.Параметры.КолВо = Товары.Количество;
ОбластьТовар.Параметры.Наименование = Товары.Номенклатура;
ОбластьТовар.Параметры.НомСтроки = Товары.НомерСтроки;
ОбластьТовар.Параметры.Сумма = Товары.Сумма;
ОбластьТовар.Параметры.Цена = Товары.Цена;
ОбластьТовар.параметры.ЕдИзм = Товары.Упаковка;
ТабличныйДокумент.Вывести(ОбластьТовар);
КонецЦикла;
ОбластьПодписи = Макет.ПолучитьОбласть("Подписи");
// Выводим Сумму прописью
ОбластьПодписи.Параметры.СуммаИтог = ФормированиеПечатныхФорм.ФорматСумм(Шапка.СуммаДокумента, Шапка.Валюта);
ОбластьПодписи.Параметры.СуммаПрописью = РаботаСКурсамиВалют.СформироватьСуммуПрописью(Шапка.СуммаДокумента, Шапка.Валюта);
ТабличныйДокумент.Вывести(ОбластьПодписи);
КонецЦикла;
ТабличныйДокумент.АвтоМасштаб = Истина;
Возврат ТабличныйДокумент;
КонецФункции
Главное правило, следить за перемнными, чтобы не было перменных с одинаковым названием. Если вы уже один раз получили значение перменной, то потом чтобы ею воспользоваться, не надо её получать второй раз. Главное не потерять из виду.
Обработка в вложении для экспериментов.
Отладчик внешних печатных форм можно скачать тут
Обработка для тестирования внешней печатной формы
Информация будет добавляться по мере надобности)