Формирование списка документов и скачивание печатной формы документа через веб-сайт с использованием 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 разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    15932    13    18    

13

Интеграция 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    17885    6    15    

13

Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС

Обмен с ГосИС WEB-интеграция Платформа 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

2400 руб.

28.04.2016    88932    163    216    

318

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

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

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

8400 руб.

01.02.2019    25872    9    0    

7

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

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

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

12000 руб.

02.02.2021    16479    42    49    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 67 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 67 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 67 01.09.21 16:22 Сейчас в теме
(4) тут вопрос в коде формирования печатной формы, а отдача ее на сайт тут не при чем. Может особенность в последних релизах (теперь УПД и СФ по-другому формируются) Сейчас проверю - перепишу
+
Оставьте свое сообщение