Идея в следующем, Сайт GET запросом отдает идентификатор контрагента (в нашем случае это просто ИНН), и на выходе получает файл отчета в формате двоичных данных, далее уже сайт обрабатывает эти данные и отображает их контрагенту.
Чтоб не изобретать велосипед и максимально использовать стандартный функционал за основу был взят стандартный механизм БСП "Рассылка отчетов". В Нем мы настраиваем рассылку отчета с вариантом "свой отчет для каждого получателя" (куда мы добавляем необходимый вариант отчета для контрагента) и благодаря этому в настройках у нас есть необходимый параметр для идентификации контрагента, который мы будем в дальнейшем использовать.
И теперь нам не надо ломать голову над программным формированием отчета на СКД, передачей параметров, созданием интерфейса для формирования настроек.
Остается только чуточку разобраться как работает механизм рассылки отчетов и программно подтолкнуть его для формирования необходимого файла в формате двоичных данных.
Ниже код модуля метода, в нем все самое интересное, также добавил сам файл расширения, если кому будет мало).
Функция ПолучитьОтчетАгентскиеВариант1ОтправитьОтчет(Запрос)
ЗначенияПараметров = новый Структура;
Для каждого Элемент ИЗ Запрос.ПараметрыURL цикл
ЗначенияПараметров.Вставить(Элемент.Ключ,Элемент.Значение);
КонецЦикла;
табДок = СформироватьОтчетИСохранитьВФайл (ЗначенияПараметров);
ИмяФайла = ПолучитьИмяВременногоФайла( "xls" );
табДок.Записать( имяФайла, ТипФайлаТабличногоДокумента.xls );
ДвоичныеДанные = Новый ДвоичныеДанные( имяФайла );
УдалитьФайлы( имяФайла );
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзДвоичныхДанных( ДвоичныеДанные );
Ответ.Заголовки.Вставить("Content-Type", "application/xlsx");
Ответ.Заголовки.Вставить("Content-Disposition", "attachment; filename=" + КодироватьСтроку( "test.xls", СпособКодированияСтроки.КодировкаURL));
Возврат Ответ;
КонецФункции
Функция СформироватьОтчетИСохранитьВФайл(ЗначенияПараметров)
//1.получим необходимый вариант отчета
ПараметрыОтчета = ПолучитьВариантОтчетаСНастройками(ЗначенияПараметров.reportid);
//2 Инициализация отчета.
РассылкаОтчетов.ИнициализироватьОтчет(Неопределено, ПараметрыОтчета, Истина);
//3 установим значение получателя
// Заполнение персонализированных данных получателей.
// Настройки подключения отчета.
ПараметрыФормирования = Новый Структура;
Получатель = Справочники.контрагенты.НайтиПоРеквизиту ("ИНН",ЗначенияПараметров.Beneficiarieid);
Если Получатель <> Неопределено И ПараметрыОтчета.Свойство("ПерсональныеОтборы") Тогда
Если ПараметрыОтчета.СКД Тогда
ПользовательскиеНастройкиКД = ПараметрыОтчета.КомпоновщикНастроекКД.ПользовательскиеНастройки;
Для Каждого КлючИЗначение Из ПараметрыОтчета.ПерсональныеОтборы Цикл
Настройка = ПользовательскиеНастройкиКД.ПолучитьОбъектПоИдентификатору(КлючИЗначение.Ключ);
Если ТипЗнч(Настройка) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
Настройка.ПравоеЗначение = Получатель;
ИначеЕсли ТипЗнч(Настройка) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
Настройка.Значение = Получатель;
КонецЕсли;
КонецЦикла;
ПараметрыФормирования.Вставить("ПользовательскиеНастройкиКД", ПользовательскиеНастройкиКД);
Иначе
Для Каждого КлючИЗначение Из ПараметрыОтчета.ПерсональныеОтборы Цикл
ПараметрыОтчета.Объект[КлючИЗначение.Ключ] = Получатель;
КонецЦикла;
КонецЕсли;
КонецЕсли;
ПараметрыФормирования.Вставить("Подключение", ПараметрыОтчета);
Формирование = ВариантыОтчетов.СформироватьОтчет(ПараметрыФормирования, Истина, Не ПараметрыОтчета.ОтправлятьЕслиПустой);
Возврат Формирование.ТабличныйДокумент ;
КонецФункции // СформироватьОтчетИСохранитьВФайл()
Функция ПолучитьВариантОтчетаСНастройками(ИмяОтчета)
// определяем отчет по имени АПИ
Если ИмяОтчета = "agent_var1" тогда
НаименованиеНастроеннойРассылки = "АгентскиеАналитика_agent_var1";
//ЗначениеВариантаОтчета = "ДетализацияРасчетовДоДокумента";
КонецЕсли;
////////////////////////////////
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| РассылкиОтчетовОтчеты.Ссылка КАК Ссылка,
| РассылкиОтчетовОтчеты.НомерСтроки КАК НомерСтроки,
| РассылкиОтчетовОтчеты.Отчет КАК Отчет,
| РассылкиОтчетовОтчеты.ОтправлятьЕслиПустой КАК ОтправлятьЕслиПустой,
| РассылкиОтчетовОтчеты.Настройки КАК Настройки
|ИЗ
| Справочник.РассылкиОтчетов.Отчеты КАК РассылкиОтчетовОтчеты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.РассылкиОтчетов КАК РассылкиОтчетов
| ПО (РассылкиОтчетовОтчеты.Ссылка = РассылкиОтчетов.Ссылка)
|ГДЕ
| РассылкиОтчетов.Наименование = &Наименование";
Запрос.УстановитьПараметр("Наименование", НаименованиеНастроеннойРассылки);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
НайденныйОтчет = Новый Структура;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НайденныйОтчет.Вставить("Отчет",ВыборкаДетальныеЗаписи.Отчет);
НайденныйОтчет.Вставить("ОтправлятьЕслиПустой",ВыборкаДетальныеЗаписи.ОтправлятьЕслиПустой);
// Настройки
Настройки = ВыборкаДетальныеЗаписи.Настройки.Получить();
Если ТипЗнч(Настройки) = Тип("ТаблицаЗначений") Тогда
ИтоговыеНастройки = Новый Структура;
Найденные = Настройки.НайтиСтроки(Новый Структура("Использование", Истина));
Для Каждого СтрокаНастройка Из Найденные Цикл
ИтоговыеНастройки.Вставить(СтрокаНастройка.Реквизит, СтрокаНастройка.Значение);
КонецЦикла;
Иначе
ИтоговыеНастройки = Настройки;
КонецЕсли;
//////////
НайденныйОтчет.Вставить("Настройки",ИтоговыеНастройки);
КонецЦикла;
Возврат НайденныйОтчет
КонецФункции // ПолучитьВариантОтчета()
Это как пример, как можно использовать функционал БСП для программной работы с Отчетами, этот подход я также использую для формирования, к примеру, прайса по брендам, где на каждом листе свой отчет, ну это уже другая история)).
Тестировалось на версии БП 3.0.88.28.
Платформа 8.3.18.1289.