Данная публикация создана на основании материалов, которые появились в процессе работы над задачей по присоединению печатных форм кассовых чеков в виде файлов к Авансовому отчету (в итоге данная задача была успешна реализована в обработке по загрузке кассовых чеков ФНС).
Рассмотрим решение данной задачи на примере документа «Авансовый отчет» типовой конфигурации «1С:Бухгалтерия предприятия, редакция 3.0». В обычной печатной форме, которую вы можете сформировать в данном документе, есть штатная возможность присоединить созданную печатную форму в виде файла к этому же документу.
Если же для данного документа была создана и подключена новая внешняя печатная форма, то в форме сохранение печатной формы такая возможность уже не отражается.
Создадим внешнюю обработку, на примере которой будет продемонстрировано, как можно реализовать такую возможность.
1. Для начала создадим новую внешнюю обработку и добавим в ней обычную форму.
2. Откроем модуль формы и для добавим в неё четыре процедуры (не забудьте процедуру ПриСозданииНаСервере связать с соответствующим событием на форме):
Процедуры модуля формы обработки
Перем КоллекцияПечатныхФорм;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДобавитьПредварительныйПросмотрПечатнойФормыНаФорму();
КонецПроцедуры
&НаСервере
Функция ЧтоОбработатьИВернуть(СсылкаНаОбъект)
Если Не Истина Тогда
СсылкаНаОбъект = "";
КонецЕсли;
МассивОбъектов = новый Массив(1);
МассивОбъектов[0] = СсылкаНаОбъект;
КоллекцияПечатныхФорм = новый ТаблицаЗначений;
КоллекцияПечатныхФорм.Колонки.Добавить("ИмяВРЕГ");
КоллекцияПечатныхФорм.Колонки.Добавить("ИмяМакета");
КоллекцияПечатныхФорм.Колонки.Добавить("ТабличныйДокумент");
КоллекцияПечатныхФорм.Колонки.Добавить("СинонимМакета");
КоллекцияПечатныхФорм.Колонки.Добавить("Картинка");
КоллекцияПечатныхФорм.Колонки.Добавить("ПолныйПутьКМакету");
КоллекцияПечатныхФорм.Колонки.Добавить("ИмяФайлаПечатнойФормы");
НоваяСтр = КоллекцияПечатныхФорм.Добавить();
НоваяСтр.ИмяВРЕГ = "ЗаявлениеНаВозмещение";
НоваяСтр.ИмяМакета = "ЗаявлениеНаВозмещение";
ОбъектыПечати = новый СписокЗначений;
ЭтаОбработка = РеквизитФормыВЗначение("Объект");
Результат = ЭтаОбработка.Печать(МассивОбъектов,КоллекцияПечатныхФорм,ОбъектыПечати);
ЗначениеВРеквизитФормы(ЭтаОбработка, "Объект");
Возврат Результат;
КонецФункции
&НаСервере
Процедура ДобавитьПредварительныйПросмотрПечатнойФормыНаФорму()
нРеквизиты = Новый Массив;
нРеквизиты.Добавить(Новый РеквизитФормы("ПредварительныйПросмотрПечатнойФормы", Новый ОписаниеТипов("Строка"), , "Предварительный просмотр содержимого чека", Ложь));
нРеквизиты.Добавить(Новый РеквизитФормы("СсылкаНаОбъект", Новый ОписаниеТипов("ДокументСсылка.АвансовыйОтчет"), , "Ссылка на объект", Ложь));
ИзменитьРеквизиты(нРеквизиты);
//создадим реквизит объекта
нЭлемент = Элементы.Добавить("СсылкаНаОбъект", Тип("ПолеФормы"));
нЭлемент.Вид = ВидПоляФормы.ПолеВвода;
нЭлемент.ПутьКДанным = "СсылкаНаОбъект";
//создадим кнопку
Команда = Команды.Добавить("ПрисоединитьПечатнуюФормуКДокументу");
Команда.Заголовок = "Присоединить печатную форму";
Команда.Действие = "КомандаПрисоединитьПечатнуюФормуКДокументу";
КнопкаФормы = Элементы.Добавить("КнопкаПрисоединитьПечатнуюФормуКДокументу", Тип("КнопкаФормы"), );
КнопкаФормы.ИмяКоманды = "ПрисоединитьПечатнуюФормуКДокументу";
КнопкаФормы.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
КонецПроцедуры
&НаКлиенте
Процедура КомандаПрисоединитьПечатнуюФормуКДокументу(Команда)
Если Не Истина Тогда
СсылкаНаОбъект = "";
КонецЕсли;
ТабДок = ЧтоОбработатьИВернуть(СсылкаНаОбъект);
Коллекция = УправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм("Макет");
//структура в массиве
СтруктураКоллекции = Коллекция.Получить(0);
СтруктураКоллекции.ТабличныйДокумент = ТабДок;
//возможность сохранить печатную форму в документ
СсылкаНаДокументДляСохранения = СсылкаНаОбъект;
Если Не СсылкаНаДокументДляСохранения = Неопределено Тогда
ИмяФайлаПечатнойФормы = Новый Соответствие;
ПредставлениеДокументаДляПечатнойФормы = СокрЛП("Форма " + СсылкаНаДокументДляСохранения);
ИмяФайлаПечатнойФормы.Вставить(СсылкаНаДокументДляСохранения,ПредставлениеДокументаДляПечатнойФормы);
СтруктураКоллекции.ИмяФайлаПечатнойФормы = ИмяФайлаПечатнойФормы;
ОбъектыПечати = Новый СписокЗначений;
ОбъектыПечати.Добавить(СсылкаНаДокументДляСохранения,"Шапка");
УправлениеПечатьюКлиент.ПечатьДокументов(Коллекция,ОбъектыПечати,ЭтаФорма);
Иначе
УправлениеПечатьюКлиент.ПечатьДокументов(Коллекция,,ЭтаФорма);
КонецЕсли;
КонецПроцедуры
3. Добавим к обработке новый макет ЗаявлениеНаВозмещение:
4. Отредактируем макет печатной формы (обратите внимание на то, что некоторые элементы макета являются параметрами и шаблонами)
5. После этого откроем общий модуль обработки и добавим две процедуры по формированию внешней печатной формы
Процедуры общего модуля обработки
Функция Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати) Экспорт
п = ПечатьЗаявлениеНаВозмещение(МассивОбъектов, ОбъектыПечати);
Возврат п;
КонецФункции
Функция ПечатьЗаявлениеНаВозмещение(МассивОбъектов, ОбъектыПечати) Экспорт
УстановитьПривилегированныйРежим(Истина);
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.АвтоМасштаб = Истина;
ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЗаявлениеНаВозмещение";
Макет = ПолучитьМакет("ЗаявлениеНаВозмещение");
Область = Макет.ПолучитьОбласть("Шапка");
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
Запрос.Текст =
"ВЫБРАТЬ
| АвансовыйОтчет.ФизЛицо КАК ФизическоеЛицо,
| АвансовыйОтчет.Дата КАК Дата,
| АвансовыйОтчет.Ссылка КАК ДокументСсылка,
| АвансовыйОтчет.Организация КАК Организация,
| АвансовыйОтчет.СуммаДокумента КАК СуммаДокумента
|ИЗ
| Документ.АвансовыйОтчет КАК АвансовыйОтчет
|ГДЕ
| АвансовыйОтчет.Ссылка В(&МассивОбъектов)";
ПервичнаяТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
Если ПривилегированныйРежим() Тогда
// Отключение привилегированного режима при переходе в другую подсистему
УстановитьПривилегированныйРежим(Ложь);
КонецЕсли;
Для Каждого ТаблицаЗапроса Из ПервичнаяТаблицаЗапроса Цикл
Область.Параметры.СуммаКомпенсации = "" + ТаблицаЗапроса.СуммаДокумента + " руб. (" + ЧислоПрописью(ТаблицаЗапроса.СуммаДокумента,,"рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2") + ")";
Запрос.Текст =
"ВЫБРАТЬ
| АвансовыйОтчетТовары.Номенклатура.Представление КАК Номенклатура
|ИЗ
| Документ.АвансовыйОтчет.Товары КАК АвансовыйОтчетТовары
|ГДЕ
| АвансовыйОтчетТовары.Ссылка В(&МассивОбъектов)";
ТаблицаСписокРасходов = Запрос.Выполнить().Выгрузить();
СписокРасходов = "";
Для Каждого ТекСтрока Из ТаблицаСписокРасходов Цикл
СписокРасходов = СписокРасходов + Символы.ПС + "- " + ТекСтрока.Номенклатура + ", ";
КонецЦикла;
Запрос.Текст =
"ВЫБРАТЬ
| АвансовыйОтчетПрочее.Содержание КАК Содержание
|ИЗ
| Документ.АвансовыйОтчет.Прочее КАК АвансовыйОтчетПрочее
|ГДЕ
| АвансовыйОтчетПрочее.Ссылка В(&МассивОбъектов)";
ТаблицаСписокРасходов = Запрос.Выполнить().Выгрузить();
Для Каждого ТекСтрока Из ТаблицаСписокРасходов Цикл
СписокРасходов = СписокРасходов + Символы.ПС + "- " + ТекСтрока.Содержание + ", ";
КонецЦикла;
СписокРасходов = СокрЛП(СписокРасходов);
СписокРасходов = Лев(СписокРасходов,СтрДлина(СписокРасходов)-1)+ ".";
Область.Параметры.СписокРасходов = СписокРасходов;
СведенияОбОрганизации = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(ТаблицаЗапроса.Организация, ТаблицаЗапроса.Дата);
Руководители = ОтветственныеЛицаБП.ОтветственныеЛица(ТаблицаЗапроса.Организация, ТаблицаЗапроса.Дата);
Руководитель = Руководители.РуководительПредставление;
Область.Параметры.Руководителю = СокрЛП(Руководители.РуководительДолжность);
Область.Параметры.Организация = СокрЛП(ТаблицаЗапроса.Организация.НаименованиеСокращенное);
Область.Параметры.ФИОРук = СокрЛП(Руководители.Руководитель);
ДанныеПодотчетногоЛица = ОбщегоНазначенияБПВызовСервера.ДанныеФизЛица(ТаблицаЗапроса.Организация, ТаблицаЗапроса.ФизическоеЛицо, ТаблицаЗапроса.Дата);
ПодотчетноеЛицо = ДанныеПодотчетногоЛица.Представление;
Если ЗначениеЗаполнено(ДанныеПодотчетногоЛица.Должность) Тогда
Должность = ДанныеПодотчетногоЛица.Должность;
Иначе
Сообщить("Должность подотчетного лица не была найдена, поэтому была взята как Завхоз");
Должность = "Завхоз";
КонецЕсли;
Если ЗначениеЗаполнено(ДанныеПодотчетногоЛица.Сотрудник) Тогда
Сотра = ДанныеПодотчетногоЛица.Сотрудник;
Иначе
Сотра = МассивОбъектов[0].ФизЛицо;
КонецЕсли;
Область.Параметры.Заявитель = СокрЛП(Сотра);
Область.Параметры.ДолжностьЗаявителя = СокрЛП(Должность);
Область.Параметры.ЗаявительИнициалы = СокрЛП(Сотра);
ТабличныйДокумент.Вывести(Область);
КонецЦикла;
Возврат ТабличныйДокумент;
КонецФункции
6. Сохраним готовую обработку и откроем её в режиме 1С:Предприятие, где выберем любой документ из списка «Авансовых отчетов» и нажмём кнопку «Присоединить печатную форму»:
7. В результате будет сформирована внешняя печатная форма, в которой появится возможность присоединения печатной формы к документу, на основании которого она и была сформирована:
8. Можно сохранить сформированную печатную форму в виде файла, присоединив его к документу. Результат в виде готового файла можно посмотреть по команде «Присоединенные файлы»:
Вы можете самостоятельно создать обработку для присоединения печатной формы к документу. Для этого вам помогут приведенные в данной публикации модули и картинки. Или можете скачать уже готовую обработку, приложенную к данной публикации.
Разработка и тестирование обработки осуществлялись на типовой конфигурации «1С:Бухгалтерия предприятия, редакция 3.0 (3.0.111.25)» и платформе 1С:Предприятие 8.3 (8.3.18.1483). Работать данная обработка должна практически на любой управляемой конфигурации 1С на любой современной платформе 1С 8.