Задача:Необходимо создать печатную форму “Спецификация” к документу Реализация товаров и услуг.
1.Создаем внешнюю обработку
2.Добавляем реквизит СсылкаНаОбъект с типом необходимого документа (в моем случае ДокументСсылка.РеализацияТоваровУслуг)
3.Добавляем в обработку форму для облегчения дальнейшей отладки
4.Размещаем на форме реквизит СсылкаНаОбъект
5.В модуле обработки создаем функцию печать(с пометкой экспорт) и назначаем ее на кнопку ‘Выполнить’ в форме обработке
код модуля:
1 2 3 4 5 6 7 | Функция Печать() Экспорт Возврат(ПечатьСпецификации()); КонецФункции Функция ПечатьСпецификации() Сообщить("Здесь будет Печатная форма"); КонецФункции |
код формы:
1 2 3 | Процедура КнопкаВыполнитьНажатие(Кнопка) Печать(); КонецПроцедуры |
6. Уже можно подключать обработку к документу. Добавляем ее в дополнительные печатные формы и определяем принадлежность к документу.
7.Теперь из документа “Реализация Товаров и Услуг” по команде печать можно выбрать и запустить эту обработку, результатом будет выполнение команд в Функции ПечатьСпецификации()
8. Теперь можно приступить непосредственно к созданию макета печатной формы(текст, параметры, оформление, области). Подробнее почитать можно в статье Пример создания внешнего отчета в 1с
9.Для обращения к данным документа как раз и используется реквизит СсылкаНаОбъект, который будет равняться ссылке на документ из которого вы хотите распечатать.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | Функция ПечатьСпецификации() // выполняем запрос для получения данных о продавце и покупателе ЗапросШапкаПодвал = Новый Запрос; ЗапросШапкаПодвал.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект); ЗапросШапкаПодвал.Текст = "ВЫБРАТЬ | РеализацияТоваровУслуг.Дата, | РеализацияТоваровУслуг.ДоговорКонтрагента, | РеализацияТоваровУслуг.Контрагент КАК Покупатель, | РеализацияТоваровУслуг.Организация КАК Поставщик, | РеализацияТоваровУслуг.СуммаДокумента, | РеализацияТоваровУслуг.СуммаВключаетНДС, | РеализацияТоваровУслуг.Сделка, | ВЫБОР | КОГДА РеализацияТоваровУслуг.БанковскийСчетОрганизации.Ссылка ЕСТЬ NULL | ТОГДА РеализацияТоваровУслуг.Организация.ОсновнойБанковскийСчет | ИНАЧЕ РеализацияТоваровУслуг.БанковскийСчетОрганизации | КОНЕЦ КАК БанковскийСчетОрганизации, | РеализацияТоваровУслуг.ДоговорКонтрагента.Дата КАК ДатаДоговора, | РеализацияТоваровУслуг.Контрагент.ОсновноеКонтактноеЛицо как ДиректорП, | РеализацияТоваровУслуг.Контрагент.ОсновноеКонтактноеЛицо.Должность как ДолжностьП |ИЗ | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг |ГДЕ | РеализацияТоваровУслуг.Ссылка = &ТекущийДокумент"; Шапка = ЗапросШапкаПодвал.Выполнить().Выбрать(); Шапка.Следующий(); ДанныеПокупателя=УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка.Покупатель, Шапка.Дата); ДанныеПоставщика=УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Шапка.Поставщик, Шапка.Дата,, Шапка.БанковскийСчетОрганизации); ТабДокумент = Новый ТабличныйДокумент; //подключаем макет и области Макет = ПолучитьМакет("Макет"); ОбластьШапкаОтчета = Макет.ПолучитьОбласть("ШапкаОтчета"); ОбластьСтрокиТаблицы = Макет.ПолучитьОбласть("СтрокиТаблицы"); ОбластьПодвалОтчета = Макет.ПолучитьОбласть("ПодвалОтчета"); // указываем значения параметров в шапке и выводим область шапки ОбластьШапкаОтчета.параметры.ДатаДоговора="от "+формат(шапка.ДатаДоговора,"ДЛФ=DD"); ОбластьШапкаОтчета.параметры.ДатаПоставки=" "+формат(Шапка.Дата,"ДЛФ=DD"); ТабДокумент.Вывести(ОбластьШапкаОтчета); //выводими строки таблицы спецификации //нас интересуют только товары , без услуг товары = СсылкаНаОбъект.Товары; н = 0; //пробегаем по строкам табличной части товары документа Реализация товаров и услуг Для каждого т Из товары Цикл н=н+1; //на всякий случай включим обработку на исключение ошибки (некорректные данные, деление на 0 итп) попытка ОбластьСтрокиТаблицы.параметры.номер=н; ОбластьСтрокиТаблицы.параметры.продукция=т.Номенклатура; ОбластьСтрокиТаблицы.параметры.ЕдИзм=т.ЕдиницаИзмерения; ОбластьСтрокиТаблицы.параметры.КолВо=т.Количество; ОбластьСтрокиТаблицы.параметры.Цена=окр((т.СуммаНДС+т.Сумма)/т.Количество,2); ОбластьСтрокиТаблицы.параметры.Сумма=т.СуммаНДС+т.Сумма; Исключение Сообщить(ОписаниеОшибки()) КонецПопытки; ТабДокумент.Вывести(ОбластьСтрокиТаблицы); КонецЦикла; // вывод подвала документа ОбластьПодвалОтчета.параметры.ДатаПоставки=" "+формат(Шапка.Дата,"ДФ=dd.MM.yyyy"); // данные поставщика ОбластьПодвалОтчета.Параметры.НазваниеП=""+ДанныеПоставщика.ПолноеНаименование; ОбластьПодвалОтчета.Параметры.АдресП=""+ДанныеПоставщика.ЮридическийАдрес; ОбластьПодвалОтчета.Параметры.ИННП="ИНН "+ДанныеПоставщика.ИНН+" КПП "+ ДанныеПоставщика.КПП; ОбластьПодвалОтчета.Параметры.РСП="р/с "+ДанныеПоставщика.НомерСчета; ОбластьПодвалОтчета.Параметры.БанкП=""+ДанныеПоставщика.Банк; ОбластьПодвалОтчета.Параметры.БИКП="БИК"+ДанныеПоставщика.Бик; Руководители = РегламентированнаяОтчетность.ОтветственныеЛицаОрганизаций(Шапка.Поставщик, шапка.Дата,); ОбластьПодвалОтчета.Параметры.ДолжностьП="Генеральный директор "; ОбластьПодвалОтчета.Параметры.ФИОП = ""+Руководители.Руководитель; //данные покупателя ОбластьПодвалОтчета.Параметры.Название=""+ДанныеПокупателя.ПолноеНаименование; ОбластьПодвалОтчета.Параметры.Адрес=""+ДанныеПокупателя.ЮридическийАдрес; ОбластьПодвалОтчета.Параметры.ИНН="ИНН "+ДанныеПокупателя.ИНН+" КПП "+ ДанныеПоставщика.КПП; ОбластьПодвалОтчета.Параметры.РС="р/с "+ДанныеПокупателя.НомерСчета; ОбластьПодвалОтчета.Параметры.Банк=""+ДанныеПокупателя.Банк; ОбластьПодвалОтчета.Параметры.БИК="БИК "+ДанныеПокупателя.Бик; ОбластьПодвалОтчета.Параметры.Должность=" "+Шапка.ДолжностьП; ОбластьПодвалОтчета.Параметры.ФИО=" "+Шапка.ДиректорП; ТабДокумент.Вывести(ОбластьПодвалОтчета); // УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, , , "Спецификация"); КонецФункции |
10. Не забудьте обновить печатную форму в справочнике “Дополнительные печатные формы и обработки”.
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
ПараметрыРегистрации.Вставить(“Вид”, “ДополнительнаяОбработка”);
ПараметрыРегистрации.Вставить(“Назначение”, МассивНазначений);
ПараметрыРегистрации.Вставить(“Наименование”, “ВыгрузкаПоименногоСписка”);
//ПараметрыРегистрации.Вставить(“ИспользоватьДляФормыОбъекта”, Истина);
ПараметрыРегистрации.Вставить(“Версия”, “1.0”);
ПараметрыРегистрации.Вставить(“БезопасныйРежим”, Ложь);
ПараметрыРегистрации.Вставить(“Информация”, “1”);
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд, “ВыгрузкаПоименногоСписка”, “Форма”, “ОткрытиеФормы”, , “”);
ПараметрыРегистрации.Вставить(“Команды”, ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
// Создадим пустую таблицу команд и колонки в ней
Команды = Новый ТаблицаЗначений;
// Как будет выглядеть описание печатной формы для пользователя
Команды.Колонки.Добавить(“Представление”, Новый ОписаниеТипов(“Строка”));
// Имя нашего макета, что бы могли отличить вызванную команду в обработке печати
Команды.Колонки.Добавить(“Идентификатор”, Новый ОписаниеТипов(“Строка”));
// Тут задается, как должна вызваться команда обработки
// Возможные варианты:
// – ОткрытиеФормы – в этом случае в колонке идентификатор должно быть указано имя формы, которое должна будет открыть система
// – ВызовКлиентскогоМетода – вызвать клиентскую экспортную процедуру из модуля формы обработки
// – ВызовСерверногоМетода – вызвать серверную экспортную процедуру из модуля объекта обработки
Команды.Колонки.Добавить(“Использование”, Новый ОписаниеТипов(“Строка”));
// Следующий параметр указывает, необходимо ли показывать оповещение при начале и завершению работы обработки. Не имеет смысла при открытии формы
Команды.Колонки.Добавить(“ПоказыватьОповещение”, Новый ОписаниеТипов(“Булево”));
// Для печатной формы должен содержать строку ПечатьMXL
Команды.Колонки.Добавить(“Модификатор”, Новый ОписаниеТипов(“Строка”));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = “”)
// Добавляем команду в таблицу команд по переданному описанию.
// Параметры и их значения можно посмотреть в функции ПолучитьТаблицуКоманд
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
// МассивНазначений.Добавить(“подсистема.CRMИМАРКЕТИНГ”); //Указываем документ к которому делаем внешнюю печ. форму
ПараметрыРегистрации.Вставить(“Вид”, “ДополнительныйОтчет”); //может быть – ПечатнаяФорма, ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов…
// ПараметрыРегистрации.Вставить(“Назначение”, МассивНазначений);
ПараметрыРегистрации.Вставить(“Наименование”, “ОтчетПоПричинамУвольнений”); //имя под которым обработка будет зарегестрирована в справочнике внешних обработок
ПараметрыРегистрации.Вставить(“БезопасныйРежим”,ИСТИНА);
ПараметрыРегистрации.Вставить(“Информация”, “ОтчетПоПричинамУвольнений”);
ПараметрыРегистрации.Вставить(“Версия”, “1.0”);
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд, “ОтчетПоПричинамУвольнений”, “ОтчетПоПричинамУвольнений”, “ОткрытиеФормы”);
ПараметрыРегистрации.Вставить(“Команды”, ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить(“Представление”, Новый ОписаниеТипов(“Строка”));//как будет выглядеть описание печ.формы для пользователя
Команды.Колонки.Добавить(“Идентификатор”, Новый ОписаниеТипов(“Строка”)); //имя макета печ.формы
Команды.Колонки.Добавить(“Использование”, Новый ОписаниеТипов(“Строка”)); //ВызовСерверногоМетода
Команды.Колонки.Добавить(“ПоказыватьОповещение”, Новый ОписаниеТипов(“Булево”));
Команды.Колонки.Добавить(“Модификатор”, Новый ОписаниеТипов(“Строка”));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = “”)
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
КонецПроцедуры // Печать()