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

Публикация № 1295588 18.09.20

Разработка - Практика программирования

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

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

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

 

Все!

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. torch 119 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 61 28.11.20 14:54 Сейчас в теме
(1) Спасибо за дополнение. Я делал исходя из того, что данный запрос конечный клиент вообще видеть не будет! Этот запрос формирует сайт заказчика к 1С. У клиента в личном кабинете только кнопка "Получить документы за период", а запрос как мне сказали, будет спрятан
3. torch 119 28.11.20 15:05 Сейчас в теме
(2)Если эта задача решалась только для связки "мой сайт" - "моя 1С", то вместо того, что я писал выше, можно на веб-сервер поставить ограничение "принимать запросы только с ip сайта". Это проще, но ограничение в любом случае нужно.
4. AlexVorDOOM 01.09.21 12:36 Сейчас в теме
Добрый день, сделал как у Вас, только комплект Счет, Акт, и Счет фактура. Счет и Акт прекрасно приходят, а на счет-фактура отдает ошибку
Ошибка - {ОбщийМодуль.УчетНДС.Модуль(11777)}: Поле объекта не обнаружено (Дата)
5. R_o_n_n_y 61 01.09.21 16:22 Сейчас в теме
(4) тут вопрос в коде формирования печатной формы, а отдача ее на сайт тут не при чем. Может особенность в последних релизах (теперь УПД и СФ по-другому формируются) Сейчас проверю - перепишу
Оставьте свое сообщение

См. также

Аналог PIVOT в запросе 1С (как выполнить транспонирование таблицы в запросе 1С) Промо

Практика программирования v8 Бесплатно (free)

В статье показывается простой метод реализации аналога оператора PIVOT в запросе 1С без использования соединений.

12.12.2020    3954    Eugen-S    21    

Полезные примеры СКД, ч.2

Практика программирования v8 v8::СКД Бесплатно (free)

Еще несколько примеров решения задач в СКД.

06.04.2021    10098    Neti    8    

Обзор полезных методов БСП 3.1.4

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Бесплатно (free)

Библиотека стандартных подсистем (далее - БСП) является частью любой типовой конфигурации, поэтому умение применять готовые процедуры и функции повышает качество разработки и избавляет от написания лишнего кода. К сожалению, не у всех есть время и упорство овладеть всей документацией, поэтому я собрал воедино наиболее популярный функционал.

25.03.2021    37515    rayastar    51    

Звуковое управление в 1С 8.3

Практика программирования v8 1cv8.cf Бесплатно (free)

В данной статье описано создание библиотеки для звукового управления (выполнение команд голосом) для платформы 1С 8.3. Задача была поставлена так, чтобы модуль функционировал непосредственно на клиенте 1С, осуществляя управление формами, и взаимодействовал с интерфейсом.

16.03.2021    6911    velemir    31    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    85117    Serginio    115    

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions

Универсальные функции Практика программирования v8 Бесплатно (free)

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    8603    comol    31    

Базовые вещи БСП, которые облегчат жизнь программисту 1С

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Россия Бесплатно (free)

В данной публикации я опишу полезные процедуры и функции модуля общего назначения библиотеки стандартных подсистем, обязательные к использованию любым программистом 1С.

30.08.2020    19472    quazare    34    

Форма выбора (подбор) в управляемых формах

Практика программирования v8 v8::УФ 1cv8.cf Россия Бесплатно (free)

Разбор небольших примеров того, как правильно открывать форму выбора (подбора) в управляемых формах, не прибегая к модальным окнам.

08.05.2020    73134    user5300    19    

Копирование числовых ячеек из 1С в Excel Промо

Загрузка и выгрузка в Excel Администрирование данных 1С v8 1cv8.cf Бесплатно (free)

Решение проблемы, когда значения скопированных ячеек из табличных документов 1С в Excel воспринимаются последним как текст, т.е. без дополнительного форматирования значений невозможно применить арифметические операции. Поводом для публикации послужило понимание того, что целое предприятие с более сотней активных пользователей уже на протяжении года мучилось с такой, казалось бы на первый взгляд, тривиальной проблемой. Варианты решения, предложенные специалистами helpdesk, обслуживающими данное предприятие, а так же многочисленные обсуждения на форумах, только подтвердили убеждение в необходимости описания способа, который позволил мне качественно и быстро справиться с ситуацией.

15.01.2019    34665    itriot11    27    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    63221    ids79    26    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    42430    John_d    22    

Последовательности событий при проведении документа 1С. Шпаргалка + про формы + про расширения

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    34073    kuzyara    38    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    40878    unichkin    74    

Заметки по Конвертации данных 3.0

Обмен данными 1С v8 1cv8.cf Бесплатно (free)

Написал небольшие заметки по конвертации данных 3.0.

18.11.2019    21297    John_d    18    

Полезные процедуры и функции для программиста

Практика программирования Универсальные функции v8 1cv8.cf Россия Бесплатно (free)

Все мы пишем программный код и часто используем процедуры, облегчающие его написание. Ниже приведена выборка таких полезных процедур и функций.

07.10.2019    39145    HostHost    41    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    51877    Yashazz    56    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    35826    tormozit    106    

Самый примитивный HTTP-сервис в мире

WEB v8 Бесплатно (free)

Пошаговый пример создания простейшего HTTP-сервиса, который генерирует HTML-страницу для поиска товара, а также реализует асинхронное получение данных из базы.

12.09.2019    25109    YPermitin    27    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    98317    rpgshnik    75    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    75813    ids79    55    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    82617    tormozit    131    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    45431    YPermitin    25    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    29987    YPermitin    81    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    44457    ids79    22    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    54044    tormozit    51    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    147125    ids79    75    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

Как легко запускать выполнение в фоне, не прибегая к долгому описанию фоновых процедур.

02.08.2019    59176    avalakh    26    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    102807    ids79    16    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    50813    tormozit    74    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    47643    ids79    27    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    22373    SeiOkami    53    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    74695    ids79    28    

Регистры накопления. Структура хранения в базе данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    62267    YPermitin    31    

Выгрузка документа по условию

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    17897    m-rv    3    

HTML-клиент у конфигурации 1С

WEB v8 Бесплатно (free)

Приветствую. В этой публикации опишу свой опыт создания html-клиента для конфигурации 1С с помощью http-сервисов. HTML-клиент в этом случае - это frontend (html + css+ js), который генерирует и выдает пользователю конфигурация + backend, который тоже реализован в этой же конфигурации.

17.04.2019    21691    Smaylukk    122    

Как прикрутить ГУИД к регистру сведений

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

... и немного теории обмена данными. В частности, разберем боль всех, кто пишет небанальные обмены данными: как набору записей регистра сведений назначить гуид и далее использовать его в обмене для идентификации этого набора.

16.04.2019    23158    m-rv    18    

Excel vs 1С: битва с неожиданным исходом

Анализ учета Универсальные обработки Загрузка и выгрузка в Excel Финансовые Управленческие v8 1cv8.cf Россия Бесплатно (free)

Что лучше 1С или Excel? Разберемся, в казалось бы, очевидном, чтобы получить невероятное!

11.04.2019    41400    bolefirenko    122    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    42194    ellavs    131    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    31751    ellavs    90    

RabbitMQ + Конвертация Данных 3.0

Внешние источники данных Обмен через XML Интеграция Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

Предлагаем ознакомиться с хронологией проекта, проследить ход мыслей от снятия потребностей до реализации, и решить, удалось ли проектной команде найти оптимальное архитектурное решение под конкретный кейс заказчика путем совмещения двух известных, но до сих пор не пересекавшихся технологий, и получилось ли сложить плюсы и устранить минусы каждой из них.

21.03.2019    30506    barelpro    87    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    40747    YPermitin    53    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

Практика программирования БСП (Библиотека стандартных подсистем) Роли и права v8 v8::Права Бесплатно (free)

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    63780    ids79    11    

Запись одной книги Excel на нескольких листах средствами 1С (без внешних компонент)

Загрузка и выгрузка в Excel v8 1cv8.cf Бесплатно (free)

Пользователи часто просят сохранить им стопиццот отчетов в один файл Excel, чтобы отчеты были в одном файле. Ну или клиент хочет счет, накладную и счет-фактуру получить в одном документе. 1С умеет это делать без всяких там COM-объектов. Давайте разберемся, куда нажимать и что крутить.

14.01.2019    28396    starik-2005    36    

Новый подход к обмену данными EnterpriseData

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Хочу предложить Вашему вниманию цикл статей, посвященных обмену данными через универсальный формат (EnterpriseData или ED).

14.12.2018    51962    ids79    82    

EnterpriseData - пример доработки правил конвертации без использования КД 3.0 в расширении конфигурации

Практика программирования Обмен через XML v8 v8::УФ БП3.0 УТ11 Россия Бесплатно (free)

В статье подробно описан реальный пример доработки обмена данными через EnterpriseData (универсальный формат обмена) между конфигурациями УТ 11.4 и Бухгалтерия 3.0

16.11.2018    44209    ids79    50