Формирование списка документов и скачивание печатной формы документа через веб-сайт с использованием HTTP-сервиса, плюс особенности авторизации

01.09.21

Интеграция - WEB-интеграция

В статье показан пример, как реализовать формирование списка документов клиента/пользователя по коду, а затем скачать его (документа) печатную форму по ссылке

В продолжение публикации Реализация скачивания печатной формы документа через веб-сайт с использованием HTTP-сервиса , спасибо ув. ltfriend...

Задача: По запросу вида http://<адрес_базы_1с>/hs/GetDocumentsPDF/list/<PIN&Date1&Date2> передавать список документов клиента со ссылками на скачивание по его Pin коду за период Date1-Date2. Выгрузка будет происходить из программы "Бухгалтерия Предприятия 3.0" (БСП 3). Выгружаем печатные формы Актов сверки, Реализаций и Счетов-фактур.

Создадим HTTP-сервис:

Так как http-сервис создавался в Расширении конфигурации, то добавим Подсистему и в нее включим наш сервис:

 

Шаблон №1. Получение списка документов Контрагента:

В созданный шаблон добавим HTTP-метод GET:

Обработчик этого метода:

 

Функция ПолучитьСписокДокументовGET(Запрос)	
	
	Ответ = Новый HTTPСервисОтвет(200);
	ПараметрыЗапроса = Новый Массив;
	Попытка
		ПараметрыЗапроса = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Запрос.ПараметрыURL.Получить("PIN_Date1_Date2"),"&");
		Если ПараметрыЗапроса.Количество() <> 3 Тогда
			HTTPОтвет = Новый HTTPСервисОтвет(400); // 400 - Bad Request
			HTTPОтвет.Заголовки.Вставить("Content-Type","text/html; charset=utf-8");
			HTTPОтвет.УстановитьТелоИзСтроки(НСтр("ru='Переданы неверные параметры'"));
			Возврат HTTPОтвет;
		Иначе
            //По условиям даты передаются в формате "20200101". Если иначе - меняем код.
			Попытка
				ПараметрыЗапроса[1] = Дата(ПараметрыЗапроса[1]+"000000");
				ПараметрыЗапроса[2] = Дата(ПараметрыЗапроса[2]+"235959");
			Исключение
				HTTPОтвет = Новый HTTPСервисОтвет(400); // 400 - Bad Request
				HTTPОтвет.УстановитьТелоИзСтроки(НСтр("ru='Переданы неверные параметры даты'"));
				HTTPОтвет.Заголовки.Вставить("Content-Type","text/html; charset=utf-8");
				Возврат HTTPОтвет;
			КонецПопытки;	
		КонецЕсли;		
	Исключение
		HTTPОтвет = Новый HTTPСервисОтвет(400); // 400 - Bad Request
		HTTPОтвет.УстановитьТелоИзСтроки(НСтр("ru='Переданы неверные параметры'"));
		HTTPОтвет.Заголовки.Вставить("Content-Type","text/html; charset=utf-8");
		Возврат HTTPОтвет;
	КонецПопытки;
	
	ЗапросДокументов = Новый Запрос;
	ЗапросДокументов.УстановитьПараметр("Пин", ПараметрыЗапроса[0]);
	ЗапросДокументов.УстановитьПараметр("ДатаН", ПараметрыЗапроса[1]);
	ЗапросДокументов.УстановитьПараметр("ДатаК", ПараметрыЗапроса[2]);
	ЗапросДокументов.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя","БиллингИД_Договоры"));
	ЗапросДокументов.Текст = 
	               "ВЫБРАТЬ ПЕРВЫЕ 1
	               |	ДоговорыКонтрагентовДополнительныеРеквизиты.Ссылка КАК Договор
	               |ПОМЕСТИТЬ ВТДоговоры
	               |ИЗ
	               |	Справочник.ДоговорыКонтрагентов.ДополнительныеРеквизиты КАК ДоговорыКонтрагентовДополнительныеРеквизиты
	               |ГДЕ
	               |	ДоговорыКонтрагентовДополнительныеРеквизиты.Свойство = &Свойство
	               |	И ДоговорыКонтрагентовДополнительныеРеквизиты.Значение = &Пин
	               |;
	               |
	               |////////////////////////////////////////////////////////////////////////////////
	               |ВЫБРАТЬ РАЗЛИЧНЫЕ
	               |	""АктСверкиВзаиморасчетов"" КАК Type,
	               |	АктСверкиВзаиморасчетов.Ссылка КАК Ref,
	               |	АктСверкиВзаиморасчетов.Номер КАК Number,
	               |	АктСверкиВзаиморасчетов.Дата КАК Date,
	               |	АктСверкиВзаиморасчетов.Представление КАК Present
	               |ИЗ
	               |	ВТДоговоры КАК ВТДоговоры
	               |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.АктСверкиВзаиморасчетов КАК АктСверкиВзаиморасчетов
	               |		ПО ВТДоговоры.Договор = АктСверкиВзаиморасчетов.ДоговорКонтрагента
	               |ГДЕ
	               |	АктСверкиВзаиморасчетов.Дата >= &ДатаН
	               |	И АктСверкиВзаиморасчетов.Дата <= &ДатаК
	               |	И АктСверкиВзаиморасчетов.Проведен
	               |
	               |ОБЪЕДИНИТЬ ВСЕ
	               |
	               |ВЫБРАТЬ
	               |	""РеализацияТоваровУслуг"",
	               |	РеализацияТоваровУслуг.Ссылка,
	               |	РеализацияТоваровУслуг.Номер,
	               |	РеализацияТоваровУслуг.Дата,
	               |	РеализацияТоваровУслуг.Представление
	               |ИЗ
	               |	ВТДоговоры КАК ВТДоговоры
	               |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
	               |		ПО ВТДоговоры.Договор = РеализацияТоваровУслуг.ДоговорКонтрагента
	               |ГДЕ
	               |	РеализацияТоваровУслуг.Дата >= &ДатаН
	               |	И РеализацияТоваровУслуг.Дата <= &ДатаК
	               |	И РеализацияТоваровУслуг.Проведен
	               |
	               |ОБЪЕДИНИТЬ ВСЕ
	               |
	               |ВЫБРАТЬ
	               |	""СчетФактураВыданный"",
	               |	СчетФактураВыданный.Ссылка,
	               |	СчетФактураВыданный.Номер,
	               |	СчетФактураВыданный.Дата,
	               |	СчетФактураВыданный.Представление
	               |ИЗ
	               |	ВТДоговоры КАК ВТДоговоры
	               |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактураВыданный КАК СчетФактураВыданный
	               |		ПО ВТДоговоры.Договор = СчетФактураВыданный.ДоговорКонтрагента
	               |ГДЕ
	               |	СчетФактураВыданный.Дата >= &ДатаН
	               |	И СчетФактураВыданный.Дата <= &ДатаК
	               |	И СчетФактураВыданный.Проведен";
	
    //В моем случае Pin - это дополнительный реквизит справочника договоры
    //Не закидывайте камнями раздел поиска Актов сверки. Клиент сказал, что по каждому договору
    //всегда отдельный акт, поэтому поиск по шапке (ну "Баба с возу...")
	Результат = ЗапросДокументов.Выполнить().Выгрузить();
	Результат.Колонки.Добавить("Link"); //Добавим колонку ссылки на скачивание
	Для Каждого Стр из Результат Цикл		
		Стр.Date = Строка(Стр.Date); //иначе не грузится в JSON
		Стр.Link = Запрос.БазовыйURL+"/download/"+XMLСтрока(Стр.Ref);
	КонецЦикла;
	Результат.Колонки.Удалить("Ref"); // ссылка на документ уже не нужна
	
    //Конвертируем в массив структур и закидываем в JSON
	МассивСтруктур = ОбщегоНазначения.ТаблицаЗначенийВМассив(Результат);
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	
	ЗаписатьJSON(ЗаписьJSON, МассивСтруктур); 
	
	СтрокаДляОтвета = ЗаписьJSON.Закрыть();
		
	Ответ = Новый HTTPСервисОтвет(200);	
	Ответ.Заголовки.Вставить("Content-type", "application/json;  charset=utf-8"); //чтобы небыло ошибок с кодировкой русских букв
	
	Ответ.УстановитьТелоИзСтроки(СтрокаДляОтвета, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
		
	Возврат Ответ;
	
КонецФункции

 

Шаблон №2. Почти ничем не отличается от приведенной выше публикации:

В созданный шаблон добавим HTTP-метод GET:

Обработчик этого метода:


Функция ПолучитьПечатнуюФормуGET(Запрос)
	
	Попытка
		// Получим переданный в HTTP-запросе идентификатор документа.
		Идентификатор = Новый УникальныйИдентификатор(Запрос.ПараметрыURL["Ident"]);
	Исключение
		// Полученный параметр не смогли преобразовать в тип "УникальныйИдентификатор".
		HTTPОтвет = Новый HTTPСервисОтвет(400); // 400 - Bad Request
		HTTPОтвет.Заголовки.Вставить("Content-Type","text/html; charset=utf-8");
		HTTPОтвет.УстановитьТелоИзСтроки(НСтр("ru='Передан неверный идентификатор'"));
		Возврат HTTPОтвет;
	КонецПопытки;
	
	// Найдём документ по полученному идентификатору.
    // Т.к. набор типов ограничен - можно использовать данную конструкцию, Если по всей базе, 
    // то на Infostart встречаются обработки поиска по GUID с перебором
	ДокументСсылка = Документы.АктСверкиВзаиморасчетов.ПолучитьСсылку(Идентификатор);
	ТипДок = "АктСверкиВзаиморасчетов";
	Если ДокументСсылка.ПолучитьОбъект() = Неопределено Тогда
		ДокументСсылка = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Идентификатор);
		ТипДок = "РеализацияТоваровУслуг";
		Если ДокументСсылка.ПолучитьОбъект() = Неопределено Тогда
			ТипДок = "СчетФактураВыданный";
			ДокументСсылка = Документы.СчетФактураВыданный.ПолучитьСсылку(Идентификатор);
		КонецЕсли;
	КонецЕсли;	
	
    // на всякий случай, вдруг не найдено
	Если ДокументСсылка.ПолучитьОбъект() = Неопределено Тогда
		// Документ с таким уникальным идентификатором не существует.
		HTTPОтвет = Новый HTTPСервисОтвет(404); // 404 - Not Found
		HTTPОтвет.Заголовки.Вставить("Content-Type","text/html; charset=utf-8");
		HTTPОтвет.УстановитьТелоИзСтроки(НСтр("ru='Документ не найден'"));
		Возврат HTTPОтвет;
	КонецЕсли;

	//Область формирования Печатных форм - В Акте сверки процедура не экспортная, поэтому требуется обвязка в расширении
	#Область ФормированиеПечатнойФормыДокумента
	Если ТипДок = "АктСверкиВзаиморасчетов" Тогда
		
		МассивОбъектов = Новый Массив;
		МассивОбъектов.Добавить(ДокументСсылка);		
		ОбъектыПечати = Новый СписокЗначений;
		ПараметрыПечати = Новый Структура;
		ПараметрыПечати.Вставить("ДополнитьКомплектВнешнимиПечатнымиФормами", Ложь);
		
		// Вызов вспомогательной процедуры из расширения.
		ТабличныйДокумент = Документы.АктСверкиВзаиморасчетов.HttpСервисПечатныеФормы_ПечатьАктаСверки(МассивОбъектов, ОбъектыПечати, ПараметрыПечати);

	ИначеЕсли ТипДок = "РеализацияТоваровУслуг" Тогда

		МассивОбъектов = Новый Массив;
		МассивОбъектов.Добавить(ДокументСсылка);		
		ОбъектыПечати = Новый СписокЗначений;
		ОбъектыПечати.Добавить(ДокументСсылка, "Документ_1");
		ПараметрыПечати = Новый Структура;
		ПараметрыПечати.Вставить("ДополнитьКомплектВнешнимиПечатнымиФормами", Ложь);
		ПараметрыПечати.Вставить("ИмяПараметровПечати", "ПАРАМЕТРЫ_ПЕЧАТИ_РеализацияТоваровУслуг_ТОРГ12");
		ТаблицаСведенийТОРГ12 = Документы.РеализацияТоваровУслуг.ПолучитьТаблицуСведенийТОРГ12(МассивОбъектов, Истина);

		// Вызов типовой процедуры печати документа.
		ТабличныйДокумент = ПечатьТорговыхДокументов.ПечатьТОРГ12(ТаблицаСведенийТОРГ12, ОбъектыПечати, ПараметрыПечати)

	ИначеЕсли ТипДок = "СчетФактураВыданный" Тогда

		МассивОбъектов = Новый Массив;
		МассивОбъектов.Добавить(ДокументСсылка);		
		ОбъектыПечати = Новый СписокЗначений;
		ПараметрыПечати = Новый Структура;
		ПараметрыПечати.Вставить("ДополнитьКомплектВнешнимиПечатнымиФормами", Ложь);
		//ТекстЗапросаПечатьСчетовФактур = Документы.СчетФактураВыданный.ТекстЗапросаПечатьСчетовФактур(,,Истина);
		// Вызов типовой процедуры печати документа.
		ПорядокПримененияФормСФ = 
			УчетНДСПереопределяемый.СоответствиеВерсийПостановленияФормамСчетовФактур();
		ТипМакета = ПолучитьМакетСФ(ДокументСсылка);
		Если ТипМакета = "КорректировочныйСчетФактура534Прослеж" Тогда
			ТабличныйДокумент = УчетНДС.ПечатьКорректировочныхСчетовФактур534Прослеж(МассивОбъектов, ОбъектыПечати, Документы.СчетФактураВыданный.ТекстЗапросаПечатьКорректировочныхСчетовФактур(ПорядокПримененияФормСФ["КорректировочныйСчетФактура534Прослеж"]), ПараметрыПечати);
		ИначеЕсли ТипМакета = "КорректировочныйСчетФактура534" Тогда
			ТабличныйДокумент = УчетНДС.ПечатьКорректировочныхСчетовФактур534(МассивОбъектов, ОбъектыПечати, Документы.СчетФактураВыданный.ТекстЗапросаПечатьКорректировочныхСчетовФактур(ПорядокПримененияФормСФ["КорректировочныйСчетФактура534"]), ПараметрыПечати);
		ИначеЕсли ТипМакета = "КорректировочныйСчетФактура981" Тогда	
			ТабличныйДокумент = УчетНДС.ПечатьКорректировочныхСчетовФактур981(МассивОбъектов, ОбъектыПечати, Документы.СчетФактураВыданный.ТекстЗапросаПечатьКорректировочныхСчетовФактур(ПорядокПримененияФормСФ["КорректировочныйСчетФактура981"]), ПараметрыПечати);
		ИначеЕсли ТипМакета = "КорректировочныйСчетФактура952" Тогда	
			ТабличныйДокумент = УчетНДС.ПечатьКорректировочныхСчетовФактур952(МассивОбъектов, ОбъектыПечати, Документы.СчетФактураВыданный.ТекстЗапросаПечатьКорректировочныхСчетовФактур(ПорядокПримененияФормСФ["КорректировочныйСчетФактура952"]), ПараметрыПечати);
		ИначеЕсли ТипМакета = "КорректировочныйСчетФактура1137" Тогда
			ТабличныйДокумент = УчетНДС.ПечатьКорректировочныхСчетовФактур1137(МассивОбъектов, ОбъектыПечати, Документы.СчетФактураВыданный.ТекстЗапросаПечатьКорректировочныхСчетовФактур(ПорядокПримененияФормСФ["КорректировочныйСчетФактура1137"]), ПараметрыПечати);
		ИначеЕсли ТипМакета = "КорректировочныйСчетФактура981Аванс" Тогда
			ТабличныйДокумент = УчетНДС.ПечатьКорректировочныхСчетовФактур981Аванс(МассивОбъектов, ОбъектыПечати, Документы.СчетФактураВыданный.ТекстЗапросаПечатьКорректировочныхСчетовФактур(ПорядокПримененияФормСФ["КорректировочныйСчетФактура981Аванс"]), ПараметрыПечати);
		ИначеЕсли ТипМакета = "СчетФактура534Прослеж" Тогда	
			ТабличныйДокумент = УчетНДС.ПечатьСчетовФактур534Прослеж(МассивОбъектов, ОбъектыПечати, Документы.СчетФактураВыданный.ТекстЗапросаПечатьСчетовФактур(ПорядокПримененияФормСФ["СчетФактура534Прослеж"]), ПараметрыПечати);
		ИначеЕсли ТипМакета = "СчетФактура534" Тогда
			ТабличныйДокумент = УчетНДС.ПечатьСчетовФактур534(МассивОбъектов, ОбъектыПечати, Документы.СчетФактураВыданный.ТекстЗапросаПечатьСчетовФактур(ПорядокПримененияФормСФ["СчетФактура534"]), ПараметрыПечати);
		ИначеЕсли ТипМакета = "СчетФактура981" Тогда
			ТабличныйДокумент = УчетНДС.ПечатьСчетовФактур981(МассивОбъектов, ОбъектыПечати, Документы.СчетФактураВыданный.ТекстЗапросаПечатьСчетовФактур(ПорядокПримененияФормСФ["СчетФактура981"]), ПараметрыПечати);
		ИначеЕсли ТипМакета = "СчетФактура1137" Тогда
			ТабличныйДокумент = УчетНДС.ПечатьСчетовФактур1137(МассивОбъектов, ОбъектыПечати, Документы.СчетФактураВыданный.ТекстЗапросаПечатьСчетовФактур(ПорядокПримененияФормСФ["СчетФактура1137"]), ПараметрыПечати);
		ИначеЕсли ТипМакета = "КорректировочныйСчетФактура" Тогда
			ТабличныйДокумент = УчетНДСБП.ПечатьКорректировочныхСчетовФактур(МассивОбъектов, ОбъектыПечати, Документы.СчетФактураВыданный.ТекстЗапросаПечатьКорректировочныхСчетовФактур(ПорядокПримененияФормСФ["КорректировочныйСчетФактура"]), ПараметрыПечати);
		ИначеЕсли ТипМакета = "СчетФактура" Тогда
			ТабличныйДокумент = УчетНДСБП.ПечатьСчетовФактур(МассивОбъектов, ОбъектыПечати, Документы.СчетФактураВыданный.ТекстЗапросаПечатьСчетовФактур(ПорядокПримененияФормСФ["СчетФактура"]), ПараметрыПечати);
		Иначе
    		ТабличныйДокумент = УчетНДС.ПечатьСчетовФактур981(МассивОбъектов, ОбъектыПечати, Документы.СчетФактураВыданный.ТекстЗапросаПечатьСчетовФактур(ПорядокПримененияФормСФ["СчетФактура981"]), ПараметрыПечати);
		КонецЕсли;

	КонецЕсли;
	#КонецОбласти 
	
	// Запишем табличный документ в поток в памяти в формате PDF. Зачет автору Исходной публикации!
	Поток = Новый ПотокВПамяти;
	ТабличныйДокумент.Записать(Поток, ТипФайлаТабличногоДокумента.PDF);
	
	// Получим двоичные данные из потока для отправки клиенту
	ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
	
	
	#Область ОтправкаОтветаКлиенту
	
	// Сформируем имя файла, с которым печатная форма будет загружена у клиента.
	ИмяФайла = Строка(ДокументСсылка) + ".pdf";
	// Кодируем строку URL, чтобы избежать проблем с русскими буквами и другими символами (например, пробел).
	ИмяФайла = КодироватьСтроку(ИмяФайла, СпособКодированияСтроки.КодировкаURL);
	
	// Создадим ответ.
	HTTPОтвет = Новый HTTPСервисОтвет(200); // 200 - OK	
	
	HTTPОтвет.Заголовки.Вставить("Content-Type", "application/pdf"); // Чтобы браузер знал, что это PDF
	HTTPОтвет.Заголовки.Вставить("Content-Disposition", "attachment; filename=""" + ИмяФайла + """");
	
	HTTPОтвет.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанные);	
	
	Возврат HTTPОтвет;
		
	#КонецОбласти 
	
КонецФункции

Функция ПолучитьМакетСФ(Объект)
	
	// Определим дату для получения версии печатной формы.
	Если ТипЗнч(Объект) = Тип("ДокументСсылка.СчетФактураПолученный") Тогда 
		ДатаВерсии = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект, "ДатаВходящегоДокумента");
	Иначе
		РеквизитыСчетаФактуры = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Объект, 
			"Исправление, ВидСчетаФактуры, Дата, ДатаИсходногоДокумента, ДатаИсправляемогоКорректировочногоДокумента");
		Если РеквизитыСчетаФактуры.Исправление Тогда
			Если РеквизитыСчетаФактуры.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.Корректировочный Тогда 
				ДатаВерсии = РеквизитыСчетаФактуры.ДатаИсправляемогоКорректировочногоДокумента;
			Иначе
				ДатаВерсии = РеквизитыСчетаФактуры.ДатаИсходногоДокумента;
			КонецЕсли;
		Иначе
			ДатаВерсии = РеквизитыСчетаФактуры.Дата;
		КонецЕсли;
	КонецЕсли;
	
	Если УчетНДСПереопределяемый.ИспользуетсяПостановлениеНДС1137(ДатаВерсии) Тогда 
			
		ВерсияПостановленияНДС1137 = УчетНДСПереопределяемый.ВерсияПостановленияНДС1137(ДатаВерсии);
		
		Если Объект.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.Корректировочный 
			ИЛИ Объект.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыПолученного.Корректировочный Тогда
			
			Если ВерсияПостановленияНДС1137 >= 5 Тогда
				Если Объект.ЕстьПрослеживаемыеТовары Тогда
					Возврат "КорректировочныйСчетФактура534Прослеж";
				Иначе
					Возврат "КорректировочныйСчетФактура534";
				КонецЕсли;
			ИначеЕсли ВерсияПостановленияНДС1137 = 4 Тогда
				Возврат "КорректировочныйСчетФактура981";
			ИначеЕсли ВерсияПостановленияНДС1137 > 1 Тогда
				Возврат "КорректировочныйСчетФактура952";
			Иначе
				Возврат "КорректировочныйСчетФактура1137";
			КонецЕсли;
		ИначеЕсли Объект.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.КорректировочныйНаАванс Тогда
			Если ВерсияПостановленияНДС1137 >= 5 Тогда
				Возврат "КорректировочныйСчетФактура534";
			Иначе
				Возврат "КорректировочныйСчетФактура981Аванс";
			КонецЕсли;
		Иначе
			Если ВерсияПостановленияНДС1137 >= 5 Тогда
				Если Объект.ЕстьПрослеживаемыеТовары Тогда
					Возврат "СчетФактура534Прослеж";
				Иначе
					Возврат "СчетФактура534";
				КонецЕсли;
			ИначеЕсли ВерсияПостановленияНДС1137 = 4 Тогда
				Возврат "СчетФактура981";
			Иначе
				Возврат "СчетФактура1137";
			КонецЕсли;
		КонецЕсли;
	Иначе
		Если Объект.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.Корректировочный 
			ИЛИ Объект.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыПолученного.Корректировочный Тогда
			Возврат "КорректировочныйСчетФактура";
		Иначе
			Возврат "СчетФактура";
		КонецЕсли;
	КонецЕсли;			
			
КонецФункции

Далее в ММ Акта сверки в расширении добавим вызов НЕэкспортной процедуры печати:


Функция HttpСервисПечатныеФормы_ПечатьАктаСверки(МассивОбъектов, ОбъектыПечати, ПараметрыПечати) Экспорт
	
	Результат = ПечатьАктаСверки(МассивОбъектов, ОбъектыПечати, ПараметрыПечати);
	Возврат Результат;
	
КонецФункции

Таким образом при отправке запроса в браузере к опубликованной на Web-сервере базе (как опубликовать - гугл в помощь, статей - море) вида http://<адрес_базы_1с>/hs/GetDocumentsPDF/list/<PIN&Date1&Date2> мы получаем JSON структуру с готовыми ссылками на скачивание PDF-документов.

 

P.S. Теперь пару слов про авторизацию в 1С при таком подключении. При отправке запроса появляется окно авторизации:

Далее инструкция для сервера Apache 2.4. Для IIS - думаю не сильно сложнее.

Публикуем базу "Второй раз": в файле C:\Apache24\conf\httpd.conf (или другой путь как у вас) добавляем:

# 1c publication Основная
Alias "/YourBase_buh" "C:/www/YourBase_buh/"
<Directory "C:/www/YourBase_buh/">
    AllowOverride All
    Options None
    Require all granted
    SetHandler 1c-application
    ManagedApplicationDescriptor "C:/www/YourBase_buh/default.vrd"
</Directory>

# 1c publication Для Http-сервиса
Alias "/YourBase_http" "C:/www/YourBase_http/"
<Directory "C:/www/YourBase_http/">
    AllowOverride All
    Options None
    Require all granted
    SetHandler 1c-application
    ManagedApplicationDescriptor "C:/www/YourBase_http/default.vrd"
</Directory>

Перезапускаем службу web-сервера.

Теперь в файле C:/www/YourBase_http/default.vrd оставляем/добавляем следующее:

Логин пароль, выключаем обычный вход через Web : enable = "false".

Оставляем только http-сервисы: стандартные выключены, из расширений - включены. Если конфа измененная, то можно один оставить по имени.

<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
		xmlns:xs="http://www.w3.org/2001/XMLSchema"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		base="/YourBase_http"
		ib="Srvr=&quot;127.0.0.1&quot;;Ref=&quot;YourBase_buh&quot;;Usr=HTTPService;Pwd=password" enable="false">
	<httpServices publishExtensionsByDefault="true">
		<service name="ExternalAPI"
				rootUrl="api"
				enable="false"
				reuseSessions="dontuse"
				sessionMaxAge="20"
				poolSize="10"
				poolTimeout="5"/>
		<service name="MobileAppReceiptScanner"
				rootUrl="MobileAppReceiptScanner"
				enable="false"
				reuseSessions="autouse"
				sessionMaxAge="20"
				poolSize="10"
				poolTimeout="5"/>
		<service name="ПередачаДанных"
				rootUrl="dt"
				enable="false"
				reuseSessions="use"
				sessionMaxAge="20"
				poolSize="10"
				poolTimeout="5"/>
		<service name="ЭДО"
				rootUrl="edi"
				enable="false"
				reuseSessions="autouse"
				sessionMaxAge="20"
				poolSize="10"
				poolTimeout="5"/>
	</httpServices>
</point>

 

Все!

http сервис печатные формы

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме. Без существенных изменений типовой конфигурации. Проверено с брендами: Интеграция 1С и GEELY Интеграция 1С и HAVAL Интеграция 1С и KIA Интеграция 1С и FORD Интеграция 1С и LADA ГАРАНТИЯ 100% ВНЕДРЕНИЯ!

36000 руб.

03.08.2020    15663    9    17    

9

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    12811    30    8    

10

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17430    6    15    

13

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25689    9    0    

7

Интеграция с сервисом vetmanager

WEB-интеграция Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    16261    41    49    

22
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. torch 128 28.11.20 08:10 Сейчас в теме
По авторизации... Я так понял, что все запросы попадают на веб-сервер (и в 1С) с предустановленным логином/паролем "HTTPService" - "password". Но это означает, что злоумышленник, прослушав запрос клиента ООО Василек, может получить его PIN, а потом самостоятельно генерировать запросы в Вашу информационную систему и она будет отдавать ему ответ, полагая, что это запрос от клиента ООО Василек.
Я в таких случаях использую проверку на основе хэш-функций (в классической литературе это называется на основе открытого и закрытого ключа). Что надо сделать:
1. Кроме PIN передать клиенту еще секретный пароль, далее по тексту "SecretKEY". Этот пароль нигде в запросах не участвует, пользователи его не видят, прослушать его невозможно.
2. модифицировать запрос: вместо "PIN&Date1&Date2" сделать "PIN&Date1&Date2&OpenKEY&HESH", где OpenKEY - открытый ключ, случайная строка (10 символов достаточно), генерируемый отправителем запроса. В каждом запросе этот параметр должен быть разным. HESH - это хеш, вычисленный от строки PIN&Date1&Date2&OpenKEY&SecretKEY по алгоритму md5 (в 1С уже есть встроенные функции вычисления хэша)
3.При приеме запроса Ваша 1С должна тоже вычислить хзш от строки PIN&Date1&Date2&OpenKEY&SecretKEY и сравнить ее с хэшем из запроса. Если они совпадают - значит запрос именно от клиента ООО Василек, если не совпадают - запрос скомпрометирован и на него отвечать не стоит. А еще лучше внести ip-адрес, с которого пришел запрос, в блэк-лист и игнорировать в дальнейшем на уровне вебсервера
2. R_o_n_n_y 66 28.11.20 14:54 Сейчас в теме
(1) Спасибо за дополнение. Я делал исходя из того, что данный запрос конечный клиент вообще видеть не будет! Этот запрос формирует сайт заказчика к 1С. У клиента в личном кабинете только кнопка "Получить документы за период", а запрос как мне сказали, будет спрятан
3. torch 128 28.11.20 15:05 Сейчас в теме
(2)Если эта задача решалась только для связки "мой сайт" - "моя 1С", то вместо того, что я писал выше, можно на веб-сервер поставить ограничение "принимать запросы только с ip сайта". Это проще, но ограничение в любом случае нужно.
6. user1585233 08.11.23 13:58 Сейчас в теме
(1)
проверку на основе хэш-функций

Подскажите на примере как можно это реализовать, у меня идет запрос акт сверки, по бин контрагента, далее бин организации, период с и по. Создается по этому запросу в 1С документ акт сверки и его обратно кидает в структуру. Я сделал Link, но получается если переходить он будет постоянно запрашивать пароль, а открывать доступ, то потом любой может зайти. Можно поподробнее описать как проработать с OpenKEY&HESH, еще доп параметры. В какой момент их использовать
7. R_o_n_n_y 66 08.11.23 18:37 Сейчас в теме
(6) какой пароль? к базе? в статье писал как опубликовать только http-сервис уже с встроенным логином паролем но без возможности входа в базу (наружу только сервис смотрит)
сделал для эксперимента с получением хеша:
	ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5);
	ХешированиеДанных.Добавить(Строка(PIN&Date1&Date2&OpenKEY&SecretKEY));
	ХешСтроки = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "");
        Если ХешСтроки = HESH (тот что из строки запроса клиента) Тогда
                //Отдаем данные
        КонецЕсли;

Все норм работает.
4. AlexVorDOOM 01.09.21 12:36 Сейчас в теме
Добрый день, сделал как у Вас, только комплект Счет, Акт, и Счет фактура. Счет и Акт прекрасно приходят, а на счет-фактура отдает ошибку
Ошибка - {ОбщийМодуль.УчетНДС.Модуль(11777)}: Поле объекта не обнаружено (Дата)
5. R_o_n_n_y 66 01.09.21 16:22 Сейчас в теме
(4) тут вопрос в коде формирования печатной формы, а отдача ее на сайт тут не при чем. Может особенность в последних релизах (теперь УПД и СФ по-другому формируются) Сейчас проверю - перепишу
Оставьте свое сообщение