Итак, получил задание от бухгалтерии немного доработать печатную форму налоговой накладной. Естественно, сделал внешнюю печатную форму, чтобы не снимать объект с поддержки. После выполнения задачи, оказалось, что мои изменения не передаются в XML-отчет для ГНАУ! Нашел, что выгрузкой занимается РегламентированныйОтчетНалоговаяНакладная, форма ФормаОтчета2012, процедура ЗаполнитьАвто(строка 2245). Начал искать откуда этот отчет тянет показатели, и выяснил что из модуля самой налоговой: функция "Печать" может возвращать или табличный документ или структуру показателей, все зависит от параметра ТолькоФормироватьСтруктуруПоказателейПечатнойФормы.
Таким образом, задача свелась к тому, чтобы доработать РегламентированныйОтчетНалоговаяНакладная (затем зарегистрировать его как внешний регл. отчет), чтоб он мог получить структуру показателей с моей внешней печатной формы. К сожалению, в типовом варианте отчет "не видит" внешнюю печатную форму, а сразу обращается к печатной форме переданного документа-объекта:
СтруктураПараметров = НалоговыйДокументОбъект.ПечатьДокумента(Истина);
Следующий код позволяет использовать внешнюю печатную форму в том случае, если она зарегестрирована вместо стандартной формы.
Заходим в Отчеты->РегламентированныйОтчетНалоговаяНакладная->ФормаОтчета2012->ЗаполнитьАвто(строка 2245). Находим текст
Процедура ЗаполнитьАвто(ИспользоватьДанныеЗЦ = Ложь) Экспорт
перем ИсходноеКоличествоСтрокГруппы;
НалоговыйДокументОбъект = НалоговыйДокумент.ПолучитьОбъект();
Попытка
СтруктураПараметров = НалоговыйДокументОбъект.ПечатьДокумента(Истина);
Исключение
Сообщить(НСТР("ru = 'Заполнение по данным документа невозможно в данной версии конфигурации. Необходимо обновить конфигурацию!'; uk = 'Заповнення даними документа неможливе на поточній версії конфигурації. Необхідно оновити конфігурацію!'"));
Возврат;
КонецПопытки;
Заменяем его на:
Процедура ЗаполнитьАвто(ИспользоватьДанныеЗЦ = Ложь) Экспорт
перем ИсходноеКоличествоСтрокГруппы;
перем ДополнительныеПараметры;
НалоговыйДокументОбъект = НалоговыйДокумент.ПолучитьОбъект();
// Если вместо стандартной печатной формы зарегистрирована внешняя печатная форма - используем ее
СтруктураПараметров = Неопределено;
Попытка
СтруктураВнутреннихПечатныхФорм = НалоговыйДокументОбъект.ПолучитьСтруктуруПечатныхФорм()
Исключение
СтруктураВнутреннихПечатныхФорм = Новый Структура;
КонецПопытки;
ДеревоМакетовПечати = УниверсальныеМеханизмы.ПолучитьДеревоМакетовПечати(НалоговыйДокументОбъект.Ссылка, СтруктураВнутреннихПечатныхФорм);
СтрокаКнопки = ДеревоМакетовПечати.Строки.Найти("Налоговая накладная", "Текст");
Расшифровка = СтрокаКнопки.Расшифровка;
Если ТипЗнч(Расшифровка) = Тип("Структура") Тогда
// печатаем из внешней формы
ИсточникМакета = Расшифровка;
ДвоичныеДанные = ИсточникМакета.СсылкаНаВнешнююОбработку.Принадлежность[ИсточникМакета.НомерСтроки - 1].ХранилищеВнешнейОбработки.Получить();
// Получить дополнительные параметры внешней обработки
ИсточникМакета.Свойство("ДополнительныеПараметрыОбработки", ДополнительныеПараметры);
Если ДополнительныеПараметры = Неопределено Тогда
ДополнительныеПараметры = Новый Структура;
КонецЕсли;
Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда
ДополнительныеПараметры.Вставить("ТолькоФормироватьСтруктуруПоказателейПечатнойФормы", Истина);
КонецЕсли;
Если ДвоичныеДанные = Неопределено Тогда
ДвоичныеДанные = ИсточникМакета.СсылкаНаВнешнююОбработку.ХранилищеВнешнейОбработки.Получить();
КонецЕсли;
Если ДвоичныеДанные = Неопределено Тогда
Сообщить(НСТР("ru = 'Не удалось загрузить внешнюю печатную форму!'; uk = 'Не удалось загрузить внешнюю печатную форму!'"));
Возврат;
КонецЕсли;
ТабДокумент = Неопределено;
ИмяФайла = ПолучитьИмяВременногоФайла("epf");
Попытка
ДвоичныеДанные.Записать(ИмяФайла);
Обработка = ВнешниеОбработки.Создать(ИмяФайла);
Обработка.СсылкаНаОбъект = НалоговыйДокументОбъект.Ссылка;
// Передать внешней обработке дополнительные параметры
Если ДополнительныеПараметры <> Неопределено Тогда
// Если у внешней обработки есть реквизит для дополнительных параметров, присвоить ему значение
Если НЕ Обработка.Метаданные().Реквизиты.Найти("ДополнительныеПараметры") = Неопределено Тогда
Обработка.ДополнительныеПараметры = ДополнительныеПараметры;
КонецЕсли;
КонецЕсли;
СтруктураПараметров = Обработка.Печать();
УдалитьФайлы(ИмяФайла);
Исключение
ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки(),, НСтр("ru='Не удалось сформировать внешнюю печатную форму!';uk='Не вдалося сформувати зовнішню друковану форму!'"));
Возврат;
КонецПопытки;
КонецЕсли;
// Если внешняя печатная форма не вернула структуру параметров (возможно разработчик не предусмотрел такую возможность), используем стандартную печать (типовый механизм)
Если ТипЗнч(СтруктураПараметров) <> Тип("Структура") Тогда
Попытка
СтруктураПараметров = НалоговыйДокументОбъект.ПечатьДокумента(Истина);
Исключение
Сообщить(НСТР("ru = 'Заполнение по данным документа невозможно в данной версии конфигурации. Необходимо обновить конфигурацию!'; uk = 'Заповнення даними документа неможливе на поточній версії конфигурації. Необхідно оновити конфігурацію!'"));
Возврат;
КонецПопытки;
КонецЕсли;
В прикрепленном файле находится пример подключаемой обработки.