Программное создание отчета в HTTP сервисе - не создается

1. virtex3 20 31.01.17 17:06 Сейчас в теме
Здравствуйте.

Абсолютно не имею опыта в программировании в 1С, хотя многолетний опыт в других средах и на других языках.

Проблема следующая: Создал HTTP-сервис, который программным способом формирует отчет и отдает его средствами сервиса.

Устанавливаю все параметры, которые устанавливаются в графическом интерфейсе. Но отчет не компонуется и остается пустым и почему - я не могу понять.

Как узнать почему данные пустые или как понять чего не хватает в настройках СКД, чтобы отчет все же сформировался?

Код вот такой вот.

	ОтчетОбъект = Отчеты.ОборотноСальдоваяВедомостьПоСчетуТиповой.Создать();

	СхемаКомпоновкиДанных = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	
	КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных();
	КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
	КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
	Настройки = КомпоновщикНастроек.Настройки;

	//-----------------------------------------------------------
	//Установка параметров
	Параметры = Настройки.ПараметрыДанных;
	Параметры.УстановитьЗначениеПараметра("НачалоПериода", Дата("20170101"));
	Параметры.УстановитьЗначениеПараметра("КонецПериода", Дата("20170131"));
	Параметры.УстановитьЗначениеПараметра("Периодичность",0);
	Параметры.УстановитьЗначениеПараметра("Счет", ПланыСчетов.Типовой.Товары);

	таблица = Новый ТабличныйДокумент;
	ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки( Настройки );
	ОтчетОбъект.СкомпоноватьРезультат( таблица );
	
	Возврат таблица;
Показать
По теме из базы знаний
Найденные решения
38. virtex3 20 09.02.17 13:11 Сейчас в теме
В общем я добился работы HTTP сервиса.

Внутри модуля спрограммировал 3 основных вида отчета, так как везде приходится формировать СКД программно.

Не стал делать публикацию, потому как лень писать и красочно расписывать.

Картинки и расширение - во вложении. Работает с конфигурацией Бухгалтерия для Казахстана, редакция 3.0,

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

Исправно выдает отчеты когда нет в названиях Контрагентов и Номенклатуры одиночного апострофа - иначе пустая страница и нет никаких ошибок, ни в журнале, ни в браузере

Разработано в течение пары недель без опыта программирования в 1С.

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

Исходный код. Отличный пример как программно формировать настройки и СКД. Собирал по крупицам по всему интернету.
Функция ПолучениеОтчета(Запрос) 
	
	запрос = ОбработатьПараметрыЗапроса(Запрос);
	
	Если запрос.ИмяОтчета = "ping" Тогда
		Возврат СформироватьОтвет(200, "Подключение выполнено успешно!");
	КонецЕсли;
	
	Возврат ПодготовитьОтчет( запрос );

КонецФункции

Функция ОбработатьПараметрыЗапроса(Запрос)
	
	ПараметрыЗапроса = Новый Структура;
	ПараметрыЗапроса.Вставить("НачалоПериода"	, ТекущаяДата());
	ПараметрыЗапроса.Вставить("КонецПериода"	, ТекущаяДата());
	ПараметрыЗапроса.Вставить("ТипОтвета"		, "json");
	ПараметрыЗапроса.Вставить("ИмяОтчета"		, Запрос.ПараметрыURL["name"]);
	ПараметрыЗапроса.Вставить("СтрокаПоиска"	, неопределено);
	
	Для каждого параметр Из Запрос.ПараметрыЗапроса Цикл
		Если параметр.Ключ = "type" Тогда
			ПараметрыЗапроса.Удалить("ТипОтвета");
			ПараметрыЗапроса.Вставить("ТипОтвета", НРег(параметр.Значение));
		КонецЕсли;
		Если параметр.Ключ = "dateFrom" Тогда
			ПараметрыЗапроса.Удалить("НачалоПериода");
			ПараметрыЗапроса.Вставить("НачалоПериода", Дата(параметр.Значение));
		КонецЕсли;
		Если параметр.Ключ = "dateTo" Тогда
			ПараметрыЗапроса.Удалить("КонецПериода");
			ПараметрыЗапроса.Вставить("КонецПериода", Дата(параметр.Значение));
		КонецЕсли;
		Если параметр.Ключ = "name" Тогда
			ПараметрыЗапроса.Удалить("СтрокаПоиска");
			ПараметрыЗапроса.Вставить("СтрокаПоиска", НРег(параметр.Значение));
		КонецЕсли;
	КонецЦикла;
	
	Возврат ПараметрыЗапроса;
	
КонецФункции

Функция ПодготовитьОтчет(запрос)
		
	таблица = СформироватьТаблицу(запрос);
		
	Если запрос.ТипОтвета = "html" Тогда 
		Возврат СформироватьОтвет(200, СформироватьHTMLизРезультата(таблица), "html");
	ИначеЕсли запрос.ТипОтвета = "dump" Тогда
		Возврат СформироватьОтвет(200, ЗначениеВСтрокуВнутр(таблица));
	ИначеЕсли запрос.ТипОтвета = "xlsx" ИЛИ запрос.ТипОтвета = "xls" Тогда
		имяФайла = ПолучитьИмяВременногоФайла( "xlsx" );
		таблица.Записать( имяФайла, ТипФайлаТабличногоДокумента.XLSX );
		двДанные = Новый ДвоичныеДанные( имяФайла );
	 	УдалитьФайлы( имяФайла );
			
		Возврат СформироватьОтвет(200, двДанные, "xlsx", запрос.ИмяОтчета );
			
	Иначе
		Возврат СформироватьОтвет(200, СформироватьJSONизРезультата(таблица), "json" );
	КонецЕсли	
		
КонецФункции

Функция СформироватьОтвет(код, тело, тип = "text", имя = неопределено )
	Ответ = Новый HTTPСервисОтвет(код);
	
	Если тип = "html" Тогда
		Ответ.Заголовки.Вставить("Content-Type", "text/html; charset=utf-8");
		Ответ.УстановитьТелоИзСтроки( НСтр( "ru='"+тело+"'" ) );
	ИначеЕсли тип = "json" Тогда
		Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
		Ответ.УстановитьТелоИзСтроки( НСтр( "ru='"+тело+"'" ) );
	ИначеЕсли тип = "xlsx" Тогда
		Ответ.УстановитьТелоИзДвоичныхДанных( тело );
		Ответ.Заголовки.Вставить("Content-Type", "application/xlsx");
		Ответ.Заголовки.Вставить("Content-Disposition", "attachment; filename=" + КодироватьСтроку( "" + имя + ".xlsx", СпособКодированияСтроки.КодировкаURL));
		//Ответ.Заголовки.Вставить("Content-Disposition", "attachment; filename=""" + имя + ".xlsx""");
	Иначе
		Ответ.Заголовки.Вставить("Content-Type", "text/plain; charset=utf-8");
		Ответ.УстановитьТелоИзСтроки( НСтр( "ru='"+тело+"'" ) );
	КонецЕсли;
	
	Возврат Ответ;
КонецФункции

Функция СобратьСообщениеОбОшибке(ИнформацияОбОшибке)
		СообщениеОбОшибке = НСтр(
				"ru = '
				| Описание:" + ИнформацияОбОшибке.Описание + "
				| Причина: " + ИнформацияОбОшибке.Причина + "
				| ИмяМодуля: " + ИнформацияОбОшибке.ИмяМодуля + "
				| ИсходнаяСтрока: " + ИнформацияОбОшибке.ИсходнаяСтрока + "
				| НомерСтроки: " + ИнформацияОбОшибке.НомерСтроки + "
				| '");
	Возврат СообщениеОбОшибке;	
КонецФункции


////////////////////////////////////////////////////////////­////////////////////
// Формирование отчетов

Функция СформироватьТаблицу(запрос) Экспорт
	
	ПараметрыОтчета = ПолучитьНастройкиПоОтчету(запрос);
	
	// Если мы не получили параметров
	Если ПараметрыОтчета = неопределено Тогда
		Если запрос.ТипОтвета <> "json" Тогда
			Возврат Новый ТабличныйДокумент;
		Иначе
			Возврат Новый ТаблицаЗначений;
		КонецЕсли;
	КонецЕсли;
	
	СхемаКомпоновки = СформироватьСхемуПоПараметрам(ПараметрыОтчета);

	Если запрос.ТипОтвета <> "json" Тогда
		Возврат СформироватьОтчет(СхемаКомпоновки, "ТабличныйДокумент");
	Иначе
		Возврат СформироватьОтчет(СхемаКомпоновки, "ТаблицаЗначений");
	КонецЕсли;

КонецФункции

Функция СформироватьСхемуПоПараметрам(ПараметрыОтчета)
	
	ДанныеРасшифровкиОбъект = Неопределено;
	ПараметрыИсполненияОтчета = Неопределено;
	
	Попытка

		Если ПараметрыОтчета.Свойство("ОтчетОбъект") И ПараметрыОтчета.ОтчетОбъект <> Неопределено Тогда
			МенеджерОтчета = ПараметрыОтчета.ОтчетОбъект;
		Иначе
			МенеджерОтчета = Отчеты[ПараметрыОтчета.ИдентификаторОтчета];
		КонецЕсли;
		
		//Попытка
			ПараметрыИсполненияОтчета = МенеджерОтчета.ПолучитьПараметрыИсполненияОтчета();
		//Исключение
		//	ВызватьИсключение НСтр("ru = '"+ ПодробноеПредставлениеОшибки( ИнформацияОбОшибке() ) +"'");
		//КонецПопытки;
		
		ИспользоватьВнешниеНаборыДанных            = Ложь;
		ИспользоватьПриВыводеЗаголовка             = Ложь;
		ИспользоватьПриВыводеПодвала               = Ложь;
		ИспользоватьПередКомпоновкойМакета         = Ложь;
		ИспользоватьПослеКомпоновкиМакета          = Ложь;
		ИспользоватьПередВыводомЭлементаРезультата = Ложь;
		ИспользоватьПослеВыводаРезультата          = Ложь;
		ИспользоватьДанныеРасшифровки              = Истина;
		
		Если ПараметрыИсполненияОтчета <> Неопределено Тогда
			Если ПараметрыИсполненияОтчета.Свойство("ИспользоватьВнешниеНаборыДанных") Тогда
				ИспользоватьВнешниеНаборыДанных = ПараметрыИсполненияОтчета.ИспользоватьВнешниеНаборыДанных;
			КонецЕсли;
			Если ПараметрыИсполненияОтчета.Свойство("ИспользоватьПриВыводеЗаголовка") Тогда
				ИспользоватьПриВыводеЗаголовка = ПараметрыИсполненияОтчета.ИспользоватьПриВыводеЗаголовка;
			КонецЕсли;
			Если ПараметрыИсполненияОтчета.Свойство("ИспользоватьПриВыводеПодвала") Тогда
				ИспользоватьПриВыводеПодвала = ПараметрыИсполненияОтчета.ИспользоватьПриВыводеПодвала;
			КонецЕсли;
			Если ПараметрыИсполненияОтчета.Свойство("ИспользоватьПередКомпоновкойМакета") Тогда
				ИспользоватьПередКомпоновкойМакета = ПараметрыИсполненияОтчета.ИспользоватьПередКомпоновкойМакета;
			КонецЕсли;
			Если ПараметрыИсполненияОтчета.Свойство("ИспользоватьПослеКомпоновкиМакета") Тогда
				ИспользоватьПослеКомпоновкиМакета = ПараметрыИсполненияОтчета.ИспользоватьПослеКомпоновкиМакета;
			КонецЕсли;
			Если ПараметрыИсполненияОтчета.Свойство("ИспользоватьПередВыводомЭлементаРезультата") Тогда
				ИспользоватьПередВыводомЭлементаРезультата = ПараметрыИсполненияОтчета.ИспользоватьПередВыводомЭлементаРезультата;
			КонецЕсли;
			Если ПараметрыИсполненияОтчета.Свойство("ИспользоватьПослеВыводаРезультата") Тогда
				ИспользоватьПослеВыводаРезультата = ПараметрыИсполненияОтчета.ИспользоватьПослеВыводаРезультата;
			КонецЕсли;
			Если ПараметрыИсполненияОтчета.Свойство("ИспользоватьДанныеРасшифровки") Тогда
				ИспользоватьДанныеРасшифровки = ПараметрыИсполненияОтчета.ИспользоватьДанныеРасшифровки;
			КонецЕсли;
		КонецЕсли;
		
		Если ТипЗнч(ПараметрыОтчета.СхемаКомпоновкиДанных) = Тип("Строка") Тогда
			Если ЭтоАдресВременногоХранилища(ПараметрыОтчета.СхемаКомпоновкиДанных) Тогда
				СхемаКомпоновкиДанных = ПолучитьИзВременногоХранилища(ПараметрыОтчета.СхемаКомпоновкиДанных);
			КонецЕсли;
		Иначе
			СхемаКомпоновкиДанных = ПараметрыОтчета.СхемаКомпоновкиДанных;
		КонецЕсли;
		
		КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
		КомпоновщикНастроек.ЗагрузитьНастройки(ПараметрыОтчета.НастройкиКомпоновкиДанных);
		КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
		
		ВыводитьЗаголовок = ?(ПараметрыОтчета.Свойство("ВыводитьЗаголовок") <> Ложь, ПараметрыОтчета.ВыводитьЗаголовок, Истина);
		ВыводитьПодписи   = ?(ПараметрыОтчета.Свойство("ВыводитьПодписи")   <> Ложь, ПараметрыОтчета.ВыводитьПодписи  , Истина);
		
		ВыводитьПодписиРуководителей = ?(ПараметрыОтчета.Свойство("ВыводитьПодписиРуководителей") <> Ложь,
		                                 ПараметрыОтчета.ВыводитьПодписиРуководителей, Ложь);
		
		Результат = Новый ТабличныйДокумент;
		
		Если ВыводитьЗаголовок Тогда
			Если ИспользоватьПриВыводеЗаголовка Тогда
				МенеджерОтчета.ПриВыводеЗаголовка(ПараметрыОтчета, Результат);
			Иначе
				БухгалтерскиеОтчетыВызовСервера.ВывестиЗаголовокОтчета(ПараметрыОтчета, КомпоновщикНастроек, Результат);
			КонецЕсли;
		КонецЕсли;
		

		Если ИспользоватьПередКомпоновкойМакета Тогда
			// Очистка пользовательских настроек
			КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки              = "";
			КомпоновщикНастроек.Настройки.Порядок.ИдентификаторПользовательскойНастройки            = "";
			КомпоновщикНастроек.Настройки.УсловноеОформление.ИдентификаторПользовательскойНастройки = "";

			МенеджерОтчета.ПередКомпоновкойМакета(ПараметрыОтчета, СхемаКомпоновкиДанных, КомпоновщикНастроек);
		КонецЕсли;
		
		КомпоновщикНастроек.Восстановить();
			
		НастройкиДляКомпоновкиМакета = КомпоновщикНастроек.ПолучитьНастройки();
			
		Если ПараметрыОтчета.Свойство("СвойМакетОформления") И ПараметрыОтчета.СвойМакетОформления
			И ПараметрыОтчета.Свойство("МакетОформления") И ЗначениеЗаполнено(ПараметрыОтчета.МакетОформления) Тогда
			СвойМакетОформления = МенеджерОтчета.ПолучитьМакет(ПараметрыОтчета.МакетОформления);
		Иначе
			БухгалтерскиеОтчетыВызовСервера.УстановитьМакетОформленияОтчета(ПараметрыОтчета, НастройкиДляКомпоновкиМакета);
			СвойМакетОформления = Неопределено;
		КонецЕСли;
		
		РезультатВыполнения = Новый Структура;
		
		РезультатВыполнения.Вставить("СхемаКомпоновкиДанных"				, СхемаКомпоновкиДанных);
		РезультатВыполнения.Вставить("НастройкиДляКомпоновкиМакета"			, НастройкиДляКомпоновкиМакета);
		РезультатВыполнения.Вставить("ИспользоватьДанныеРасшифровки"		, ИспользоватьДанныеРасшифровки);
		РезультатВыполнения.Вставить("ДанныеРасшифровкиОбъект"				, ДанныеРасшифровкиОбъект);
		РезультатВыполнения.Вставить("СвойМакетОформления"					, СвойМакетОформления);
		РезультатВыполнения.Вставить("ИспользоватьВнешниеНаборыДанных"		, ИспользоватьВнешниеНаборыДанных);
		РезультатВыполнения.Вставить("ИспользоватьПослеКомпоновкиМакета"	, ИспользоватьПослеКомпоновкиМакета);
		РезультатВыполнения.Вставить("МенеджерОтчета"						, МенеджерОтчета);
		РезультатВыполнения.Вставить("ПараметрыОтчета"						, ПараметрыОтчета);

	Исключение
		
		ВызватьИсключение СобратьСообщениеОбОшибке(ИнформацияОбОшибке());

	КонецПопытки;

	Возврат РезультатВыполнения;
		
КонецФункции

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

		Если типОтчета <> "ТаблицаЗначений" Тогда
			//Вызываем событие отчета
			Если ИспользоватьПослеКомпоновкиМакета Тогда
				МенеджерОтчета.ПослеКомпоновкиМакета(ПараметрыОтчета, МакетКомпоновки);
			КонецЕсли;
		КонецЕсли;
		
		Если ИспользоватьВнешниеНаборыДанных Тогда
			ВнешниеНаборыДанных = МенеджерОтчета.ПолучитьВнешниеНаборыДанных(ПараметрыОтчета, МакетКомпоновки);
		КонецЕсли;

		
		//Создадим и инициализируем процессор компоновки
		ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
		Если ВнешниеНаборыДанных = Неопределено Тогда
			ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,                    , ДанныеРасшифровкиОбъект, Истина);
		Иначе
			ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровкиОбъект, Истина);
		КонецЕсли;	
		
		Если типОтчета = "ТаблицаЗначений" Тогда
			Результат = Новый ТаблицаЗначений;
			ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
			ПроцессорВывода.УстановитьОбъект(Результат);
			
		Иначе
			Результат = Новый ТабличныйДокумент;
			ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;	
			ПроцессорВывода.УстановитьДокумент(Результат);	
		КонецЕсли;
		
		ПроцессорВывода.Вывести(ПроцессорКомпоновки);

	Исключение
		ВызватьИсключение СобратьСообщениеОбОшибке(ИнформацияОбОшибке());
	КонецПопытки;
	
	Возврат Результат;
КонецФункции

Функция ПолучитьНастройкиПоОтчету(запрос)	
	Если запрос.ИмяОтчета = "AccountsPayable" ИЛИ запрос.ИмяОтчета = "AccountsReceivable" Тогда 
		Возврат АнализСубконтоТиповой(запрос);
	ИначеЕсли запрос.ИмяОтчета = "Funds" ИЛИ запрос.ИмяОтчета = "Goods" Тогда 
		Возврат ОборотноСальдоваяВедомостьПоСчетуТиповой(запрос);
	Иначе
		ВызватьИсключение "Отчет не найден";
	КонецЕсли;
	
КонецФункции

////////////////////////////////////////////////////////////­////////////////////
// Функции по каждому отдельному отчету

Функция АнализСубконтоТиповой(запрос)
	
	ПараметрыОтчета = Новый Структура;
	
	Отчет = Отчеты.АнализСубконтоТиповой.Создать();
	Отчет.Группировка.Очистить();
	
	ПараметрыОтчета.Вставить("НачалоПериода"                         , запрос.НачалоПериода);
	ПараметрыОтчета.Вставить("КонецПериода"                          , запрос.КонецПериода);
	ПараметрыОтчета.Вставить("ПоказательБУ"                          , Истина);
	ПараметрыОтчета.Вставить("ПоказательВалютнаяСумма"               , Ложь);
	ПараметрыОтчета.Вставить("ПоказательКоличество"                  , Ложь);
	ПараметрыОтчета.Вставить("ПоказательРазвернутоеСальдо"           , Ложь);
	ПараметрыОтчета.Вставить("РазмещениеДополнительныхПолей"         , 0);
	ПараметрыОтчета.Вставить("Периодичность"                         , 0);
	ПараметрыОтчета.Вставить("ПоСубсчетам"                           , Ложь);

		
	//Формируем нашу собственную настройку и загружаем ее в отчет
	Настройка = НашаНастройкаКомпоновки();
		
	Если запрос.ИмяОтчета = "AccountsPayable" Тогда
		
		НовыйЭлемент  = Настройка.Элементы.Добавить(Тип("ОтборКомпоновкиДанных"));
		НовыйЭлемент.ИдентификаторПользовательскойНастройки = "Отбор";  
				
		Счета = Новый СписокЗначений;
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3310"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3320"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3330"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3340"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3350"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3360"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3370"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3380"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3390"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3510"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("4110"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("4120"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("4130"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("4140"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("4150"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("4160"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("4170"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("4410"));
		
		ЗаполнитьЭлементОтбора(НовыйЭлемент,Истина,ВидСравненияКомпоновкиДанных.ВСписке,"Счет",Счета);

		НовыйЭлемент  = Настройка.Элементы.Добавить(Тип("ПорядокКомпоновкиДанных"));
		НовыйЭлемент.ИдентификаторПользовательскойНастройки = "Порядок";  
		ЗаполнитьЭлементПорядка(НовыйЭлемент,Истина,"СальдоНаКонецПериода.БУКонечныйРазвернутыйОстатокКт.ПроцентОбщий",НаправлениеСортировкиКомпоновкиДанных.Убыв);
	
		//ВызватьИсключение ЗначениеВСтрокуВнутр(Настройка);

		ЗагрузитьНастройкуВКомпоновщик(Отчет,Настройка);

		ДобавитьГруппировку(Отчет,"Счет",Истина,"Счет",Перечисления.ТипДетализацииСтандартныхОтчетов.Иерархия); 		
		ДобавитьГруппировку(Отчет,"Субконто1",Истина,"Контрагенты",Перечисления.ТипДетализацииСтандартныхОтчетов.Элементы);
		ПараметрыОтчета.Вставить("Группировка"                           , Отчет.Группировка.Выгрузить());
		
		СписокВидовСубконто = Новый СписокЗначений;
		СписокВидовСубконто.ТипЗначения = Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВидыСубконтоТиповые");
		СписокВидовСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоТиповые.Контрагенты);
		
		ПараметрыОтчета.Вставить("СписокВидовСубконто"                   , СписокВидовСубконто);
		
	ИначеЕсли запрос.ИмяОтчета = "AccountsReceivable" Тогда
		НовыйЭлемент  = Настройка.Элементы.Добавить(Тип("ОтборКомпоновкиДанных"));
		НовыйЭлемент.ИдентификаторПользовательскойНастройки = "Отбор";  
				
		Счета = Новый СписокЗначений;
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1210"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1220"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1230"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1240"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1250"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1260"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1270"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1280"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1290"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1610"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2110"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2120"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2130"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2140"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2150"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2160"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2170"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2180"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2910"));
		
		
		ЗаполнитьЭлементОтбора(НовыйЭлемент,Истина,ВидСравненияКомпоновкиДанных.ВСписке,"Счет",Счета);

		НовыйЭлемент  = Настройка.Элементы.Добавить(Тип("ПорядокКомпоновкиДанных"));
		НовыйЭлемент.ИдентификаторПользовательскойНастройки = "Порядок";  
		ЗаполнитьЭлементПорядка(НовыйЭлемент,Истина,"СальдоНаКонецПериода.БУКонечныйРазвернутыйОстатокДт.ПроцентОбщий",НаправлениеСортировкиКомпоновкиДанных.Убыв);
	
		//ВызватьИсключение ЗначениеВСтрокуВнутр(Настройка);

		ЗагрузитьНастройкуВКомпоновщик(Отчет,Настройка);

		ДобавитьГруппировку(Отчет,"Счет",Истина,"Счет",Перечисления.ТипДетализацииСтандартныхОтчетов.Иерархия); 		
		ДобавитьГруппировку(Отчет,"Субконто1",Истина,"Контрагенты",Перечисления.ТипДетализацииСтандартныхОтчетов.Элементы);
		ПараметрыОтчета.Вставить("Группировка"                           , Отчет.Группировка.Выгрузить());
		
		СписокВидовСубконто = Новый СписокЗначений;
		СписокВидовСубконто.ТипЗначения = Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВидыСубконтоТиповые");
		СписокВидовСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоТиповые.Контрагенты);
		
		ПараметрыОтчета.Вставить("СписокВидовСубконто"                   , СписокВидовСубконто);

	КонецЕсли;

	ПараметрыОтчета.Вставить("ДополнительныеПоля"                    , Отчет.ДополнительныеПоля.Выгрузить());
	ПараметрыОтчета.Вставить("РежимРасшифровки"                      , Ложь);
	ПараметрыОтчета.Вставить("СписокСтруктурныхЕдиниц"               , Новый Массив);
	ПараметрыОтчета.Вставить("СписокПодразделений"                   , Новый Массив);
	ПараметрыОтчета.Вставить("СписокВладельцевГоловныхПодразделений" , Новый Массив);
	ПараметрыОтчета.Вставить("ВыводитьЗаголовок"                     , Ложь);
	ПараметрыОтчета.Вставить("ВыводитьПодписи"                       , Ложь);
	ПараметрыОтчета.Вставить("ВыводитьПодписиРуководителей"          , Ложь);
	ПараметрыОтчета.Вставить("ДанныеРасшифровки"                     , Новый ДанныеРасшифровкиКомпоновкиДанных);
	ПараметрыОтчета.Вставить("МакетОформления"                       , "МакетОформленияОтчетов");	
	ПараметрыОтчета.Вставить("СхемаКомпоновкиДанных"                 , Отчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"));
	ПараметрыОтчета.Вставить("ИдентификаторОтчета"                   , "АнализСубконтоТиповой");
	ПараметрыОтчета.Вставить("НастройкиКомпоновкиДанных"             , Отчет.КомпоновщикНастроек.ПолучитьНастройки());
	ПараметрыОтчета.Вставить("НаборПоказателей"                      , Отчеты[ПараметрыОтчета.ИдентификаторОтчета].ПолучитьНаборПоказателей());

	
	Возврат ПараметрыОтчета;

КонецФункции

Функция ОборотноСальдоваяВедомостьПоСчетуТиповой(запрос)
	ПараметрыОтчета = Новый Структура;
	
	Отчет = Отчеты.ОборотноСальдоваяВедомостьПоСчетуТиповой.Создать();
	Отчет.Группировка.Очистить();
	
	//Формируем нашу собственную настройку и загружаем ее в отчет
	Настройка = НашаНастройкаКомпоновки();
	
	ПараметрыОтчета.Вставить("НачалоПериода"							, запрос.НачалоПериода);
	ПараметрыОтчета.Вставить("КонецПериода"								, запрос.КонецПериода);
	ПараметрыОтчета.Вставить("РежимРасшифровки"							, Ложь);
	ПараметрыОтчета.Вставить("СписокСтруктурныхЕдиниц"					, Новый Массив);
	ПараметрыОтчета.Вставить("СписокПодразделений"						, Новый Массив);
	ПараметрыОтчета.Вставить("СписокВладельцевГоловныхПодразделений"	, Новый Массив);
	ПараметрыОтчета.Вставить("ВыводитьЗаголовок"						, Ложь);
	ПараметрыОтчета.Вставить("ВыводитьПодписи"							, Ложь);
	ПараметрыОтчета.Вставить("ВыводитьПодписиРуководителей"				, Ложь);
	ПараметрыОтчета.Вставить("ДанныеРасшифровки"						, Новый ДанныеРасшифровкиКомпоновкиДанных);
	ПараметрыОтчета.Вставить("МакетОформления"							, "МакетОформленияОтчетов");
	ПараметрыОтчета.Вставить("СхемаКомпоновкиДанных"					, Отчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"));
	ПараметрыОтчета.Вставить("ИдентификаторОтчета"						, "ОборотноСальдоваяВедомостьПоСчетуТиповой");
	ПараметрыОтчета.Вставить("НаборПоказателей"							, Отчеты[ПараметрыОтчета.ИдентификаторОтчета].ПолучитьНаборПоказателей());
	
	Если запрос.ИмяОтчета = "Funds" Тогда
		
		ПараметрыОтчета.Вставить("Счет"										, ПланыСчетов.Типовой.ДенежныеСредства);
		ПараметрыОтчета.Вставить("ПоказательБУ"								, Истина);
		ПараметрыОтчета.Вставить("ПоказательВалютнаяСумма"					, Ложь);
		ПараметрыОтчета.Вставить("ПоказательКоличество"						, Ложь);
		ПараметрыОтчета.Вставить("ПоказательРазвернутоеСальдо"				, Ложь);
		ПараметрыОтчета.Вставить("РазмещениеДополнительныхПолей"			, 0);
		ПараметрыОтчета.Вставить("Периодичность"							, 0);
		ПараметрыОтчета.Вставить("ПоСубсчетам"								, Истина);
		
		ДобавитьГруппировку(Отчет,"Счет",Истина,"Счет",Перечисления.ТипДетализацииСтандартныхОтчетов.Иерархия); 		
		ДобавитьГруппировку(Отчет,"Субконто1",Истина,"Денежные средства",Перечисления.ТипДетализацииСтандартныхОтчетов.Элементы);
		
		ПараметрыОтчета.Вставить("Группировка"								, Отчет.Группировка.Выгрузить());
		ПараметрыОтчета.Вставить("ДополнительныеПоля"                    	, Отчет.ДополнительныеПоля.Выгрузить());   // FIXME: если будет отчет где нужны поля, то придется реализовать как с группировка
		
		ЗагрузитьНастройкуВКомпоновщик(Отчет,Настройка);
		ПараметрыОтчета.Вставить("НастройкиКомпоновкиДанных"				, Отчет.КомпоновщикНастроек.ПолучитьНастройки());
		
		Возврат ПараметрыОтчета;
		
	ИначеЕсли запрос.ИмяОтчета = "Goods" Тогда
		
		Если запрос.СтрокаПоиска <> неопределено Тогда
			Список = ПоискПоНоменклатуре(запрос.СтрокаПоиска);
			Если Список <> неопределено Тогда
				НовыйЭлемент  = Настройка.Элементы.Добавить(Тип("ОтборКомпоновкиДанных"));
				НовыйЭлемент.ИдентификаторПользовательскойНастройки = "Отбор";
				ЗаполнитьЭлементОтбора(НовыйЭлемент,Истина,ВидСравненияКомпоновкиДанных.ВСписке,"Субконто1",Список);
			Иначе
				Возврат неопределено;
			КонецЕсли;
		КонецЕсли;
		
		ПараметрыОтчета.Вставить("Счет"										, ПланыСчетов.Типовой.Товары);
		ПараметрыОтчета.Вставить("ПоказательБУ"								, Истина);
		ПараметрыОтчета.Вставить("ПоказательВалютнаяСумма"					, Ложь);
		ПараметрыОтчета.Вставить("ПоказательКоличество"						, Истина);
		ПараметрыОтчета.Вставить("ПоказательРазвернутоеСальдо"				, Ложь);
		ПараметрыОтчета.Вставить("РазмещениеДополнительныхПолей"			, 0);
		ПараметрыОтчета.Вставить("Периодичность"							, 0);
		ПараметрыОтчета.Вставить("ПоСубсчетам"								, Истина);
		
		ДобавитьГруппировку(Отчет,"Счет",Истина,"Счет",Перечисления.ТипДетализацииСтандартныхОтчетов.Иерархия); 		
		ДобавитьГруппировку(Отчет,"Субконто1",Истина,"Номенклатура",Перечисления.ТипДетализацииСтандартныхОтчетов.Элементы);
		
		ПараметрыОтчета.Вставить("Группировка"								, Отчет.Группировка.Выгрузить());
		ПараметрыОтчета.Вставить("ДополнительныеПоля"                    	, Отчет.ДополнительныеПоля.Выгрузить());   // FIXME: если будет отчет где нужны поля, то придется реализовать как с группировка
		
		ЗагрузитьНастройкуВКомпоновщик(Отчет,Настройка);
		ПараметрыОтчета.Вставить("НастройкиКомпоновкиДанных"				, Отчет.КомпоновщикНастроек.ПолучитьНастройки());
		
		Возврат ПараметрыОтчета;
		
	КонецЕсли;	
КонецФункции


////////////////////////////////////////////////////////////­////////////////////
// Формирователи настроек компоновки

Функция НашаНастройкаКомпоновки()
	МоиНастройки  = Новый ПользовательскиеНастройкиКомпоновкиДанных;
	
	НовыйЭлемент  = МоиНастройки.Элементы.Добавить(Тип("УсловноеОформлениеКомпоновкиДанных"));
	НовыйЭлемент.ИдентификаторПользовательскойНастройки = "УсловноеОформление";  
	ЗаполнитьЭлементОформления(НовыйЭлемент,"ВыделятьОтрицательные",Истина,"Выделять отрицательные");
	ЗаполнитьЭлементОформления(НовыйЭлемент,"Шрифт",Новый Шрифт(,9),"Основной шрифт");

	Возврат МоиНастройки;
КонецФункции

Процедура ЗагрузитьНастройкуВКомпоновщик(Отчет,Настройка)
	// Вытащим текущие настройки чтобы определить где что менять
	ТекущиеНастройки = Отчет.КомпоновщикНастроек.Настройки;
			
	// Установим маркеры пользовательских настроек
	ТекущиеНастройки.Отбор.ИдентификаторПользовательскойНастройки              = "Отбор";
	ТекущиеНастройки.Порядок.ИдентификаторПользовательскойНастройки            = "Порядок";
	ТекущиеНастройки.УсловноеОформление.ИдентификаторПользовательскойНастройки = "УсловноеОформление";

	// Перенос пользовательских настроек в основные		
	Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(Настройка);
	Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Отчет.КомпоновщикНастроек.ПолучитьНастройки());	
КонецПроцедуры

Процедура ЗаполнитьЭлементОформления(ЭлементНастройки,Параметр,Значение,Представление)
    
    НовыйЭлемент = ЭлементНастройки.Элементы.Добавить();
	НовыйЭлемент.Представление = Представление;
	НовыйЭлемент.Оформление.УстановитьЗначениеПараметра(Параметр,Значение);
	
КонецПроцедуры

Процедура ЗаполнитьЭлементОтбора(ЭлементНастройки,Использование,ВидСрав,ИмяПоля,ЗначениеОтбора)
	
    НовыйЭлемент = ЭлементНастройки.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	    
    НовыйЭлемент.Использование  = Использование;
    НовыйЭлемент.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных(ИмяПоля);
    НовыйЭлемент.ВидСравнения   = ВидСрав;
    НовыйЭлемент.ПравоеЗначение = ЗначениеОтбора;
    
КонецПроцедуры

Процедура ЗаполнитьЭлементПорядка(ЭлементНастройки,Использование,Поле,ТипУпорядочивания)
    
    НовыйЭлемент = ЭлементНастройки.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
    
    НовыйЭлемент.Использование  	= Использование;
    НовыйЭлемент.Поле				= Новый ПолеКомпоновкиДанных(Поле);
    НовыйЭлемент.ТипУпорядочивания	= ТипУпорядочивания;
    
КонецПроцедуры

Процедура ДобавитьГруппировку(Отчет,Поле,Использование,Представление,ТипГруппировки)
	
			НоваяСтрока = Отчет.Группировка.Добавить();
			НоваяСтрока.Поле           = Поле;
			НоваяСтрока.Использование  = Использование;
			НоваяСтрока.Представление  = НСтр("ru = '"+Представление+"'");
			НоваяСтрока.ТипГруппировки = ТипГруппировки;	
	
КонецПроцедуры


////////////////////////////////////////////////////////////­////////////////////
// Преобразователи данных

Функция СформироватьHTMLизРезультата(ТабДокумент)
	
	//ВызватьИсключение ЗначениеВСтрокуВнутр(ТабДокумент);
	Попытка
		имяФайла = ПолучитьИмяВременногоФайла( "html" );
		ТабДокумент.Записать( имяФайла, ТипФайлаТабличногоДокумента.HTML5 );
		
		Текст = Новый ЧтениеТекста( имяФайла, КодировкаТекста.UTF8);
		ТекстHTML = Текст.Прочитать();
		//ТекстHTML = "";
		//Для НомерСтроки=1 по 2797+22+22+22+22+22 Цикл
		//	 ТекстHTML = ТекстHTML + Текст.ПрочитатьСтроку() + Символы.ПС;
		//КонецЦикла;
		
		Текст.Закрыть();
		УдалитьФайлы( имяФайла );
	Исключение
		ВызватьИсключение СобратьСообщениеОбОшибке(ИнформацияОбОшибке());
	КонецПопытки;

	Возврат ТекстHTML;
	
КонецФункции

Функция СформироватьJSONизРезультата(данные)
	
	массивСтруктур = Новый Массив;     		
	колонки = данные.Колонки;
		
	Для каждого цСтрока Из данные Цикл      			
		структ = Новый Структура;   			
		Для каждого цКолонка Из колонки Цикл 				
			значение = цСтрока[цКолонка.Имя];				
			типЗначения = ТипЗнч( значение );				
			Если типЗначения = Тип("Булево")
				ИЛИ типЗначения = Тип("Строка")
				ИЛИ типЗначения = Тип("Дата")
				ИЛИ типЗначения = Тип("Число") Тогда 					
				структ.Вставить( цКолонка.Имя, значение ); 					
			Иначе 					
				структ.Вставить( цКолонка.Имя, Строка( значение ) );					
			КонецЕсли;				
		КонецЦикла;
		массивСтруктур.Добавить( структ );
	КонецЦикла;
		
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON( ЗаписьJSON, массивСтруктур );
    Возврат ЗаписьJSON.Закрыть();
КонецФункции


////////////////////////////////////////////////////////////­////////////////////
// Проверочные и поисковые функции 

Функция ПравоНаПросмотр(ЛюбаяСсылка)         // НЕ ИСПОЛЬЗУЮТСЯ
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
	               |	ИдентификаторыОбъектовМетаданных.Ссылка
	               |ИЗ
	               |	Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыОбъектовМетаданных
	               |ГДЕ
	               |	ИдентификаторыОбъектовМетаданных.Ссылка = &Ссылка";  
	Запрос.УстановитьПараметр("Ссылка", ЛюбаяСсылка );
	
	Если Запрос.Выполнить().Пустой() Тогда
		Возврат Ложь;
	КонецЕсли;
	Возврат Истина;
КонецФункции

Функция ПоискПоНоменклатуре(СтрокаПоиска)
	Запрос = Новый Запрос;
	
	Запрос.УстановитьПараметр("СтрокаПоиска1","%" + СтрокаПоиска + "%"); // Содержит
	Запрос.УстановитьПараметр("СтрокаПоиска2",СтрокаПоиска + "%");       // Начинается
	Запрос.УстановитьПараметр("СтрокаПоиска3","%" + СтрокаПоиска);       // Заканчивается
	
	Запрос.Текст = "ВЫБРАТЬ
					| 	Ссылка
					| ИЗ
					| 	Справочник.Номенклатура
					| ГДЕ
					|   (Услуга = ЛОЖЬ И ЭтоГруппа = ЛОЖЬ )
					|	И (
					| 		Артикул ПОДОБНО &СтрокаПоиска1 ИЛИ
					|   	Наименование ПОДОБНО &СтрокаПоиска1 ИЛИ
					|   	НаименованиеПолное ПОДОБНО &СтрокаПоиска1 ИЛИ
					| 		Артикул ПОДОБНО &СтрокаПоиска2 ИЛИ
					|   	Наименование ПОДОБНО &СтрокаПоиска2 ИЛИ
					|   	НаименованиеПолное ПОДОБНО &СтрокаПоиска2 ИЛИ
					| 		Артикул ПОДОБНО &СтрокаПоиска3 ИЛИ
					|   	Наименование ПОДОБНО &СтрокаПоиска3 ИЛИ
					|   	НаименованиеПолное ПОДОБНО &СтрокаПоиска3
					|   )"; 
					
	Результат = Запрос.Выполнить();
	
	Если Результат.Пустой() Тогда
		Возврат неопределено;
	Иначе
		Результаты = Результат.Выгрузить();
		Значение = Новый СписокЗначений;
		Значение.ЗагрузитьЗначения(Результаты.ВыгрузитьКолонку("Ссылка"));
		
		Возврат Значение;
	КонецЕсли;
	
КонецФункции
Показать
Прикрепленные файлы:
HTTP сервис - формирователь отчетов.cfe
user1316759; sml; user792355; igor_L; +4 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. starik-2005 3156 31.01.17 20:33 Сейчас в теме
(1) нафига Вам умные существа из 1С запилили кучу полезного? Чтобы городить огород?
	Отчет = отчеты.Отчет1.Создать();
	Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Отчет.СхемаКомпоновкиДанных.ВариантыНастроек[1].Настройки);
	Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Период", ТекущаяДата());
	Отчет.СкомпоноватьРезультат(Результат);


Здесь:
1. "Отчет1" - имя отчета;
2. Вариант настроек выбирается 2-й (второй), укажете [0] - будет первый;
3. "Период" - это параметр отчета.
4. Результат - это реквизит формы типа "Табличный документ".
Если нужно в произвольный ТД поместить, то напишите "Результат = Новый ТабличныйДокумент;"
5. virtex3 20 31.01.17 21:01 Сейчас в теме
(4)
нафига Вам умные существа из 1С запилили кучу полезного? Чтобы городить огород?


Спасиб, добрый человек!

Ваш код работает также как и мой ))). Я его в первую очередь пробовал найдя на просторах интернета.

Проблема в том, что ни то ни другое не работает на отчетах в моей конфигурации. Вот просто не работает и все.

В результате пусто. И нет никаких ошибок.
6. starik-2005 3156 31.01.17 21:35 Сейчас в теме
(5) параметры правильные передавайте. Что за "типовой"? Нахрена инициализировать настройки? С какого хрена дата окончания началом дня? Ответьте на все подобные вопросы - и будет Вам счастье.
8. virtex3 20 31.01.17 21:47 Сейчас в теме
(6)
параметры правильные передавайте
стараюсь... если не правильно передаю, то ругается.

(6)
Что за "типовой"?
на скрине все есть. Не я же конфигурацию создавал.

(6)
Нахрена инициализировать настройки?
ну потому что изначально нужно все отдавать по сервису в виде таблицы значений. Но так как не заработало, то я попытался вытащить хотя бы в табличном варианте. Но это тоже не работает

(6)
Ответьте на все подобные вопросы - и будет Вам счастье.
ну как-то вот нет пока счастья
Прикрепленные файлы:
7. spacecraft 31.01.17 21:44 Сейчас в теме
(5) пусто совсем, или макет выводит, но без данных по ресурсам?
9. virtex3 20 31.01.17 21:52 Сейчас в теме
(7)
пусто совсем, или макет выводит, но без данных по ресурсам?

из всей кучи стандартных отчетов выводится в макет только 2 - самые простые и бесполезные.

И то, у одного кривой макет и не совпадает с тем что в программе, а у второго значения стоят в макете не там где положены.

Все остальные пустые... я даже вывожу результат через ЗначениеВСтрокуВнутр и там сплошные нули.
11. spacecraft 01.02.17 01:33 Сейчас в теме
(9) для начала попробовать просто внешней обработкой программно получить отчет. Если получится, то смотреть права внешнего пользователя.
12. virtex3 20 01.02.17 07:16 Сейчас в теме
(11) Программно проверяется что есть разрешения, на всякий случай

 Функция ПравоНаПросмотр(ЛюбаяСсылка)
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
	               |	ИдентификаторыОбъектовМетаданных.Ссылка
	               |ИЗ
	               |	Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыОбъектовМетаданных
	               |ГДЕ
	               |	ИдентификаторыОбъектовМетаданных.Ссылка = &Ссылка";  
	Запрос.УстановитьПараметр("Ссылка", ЛюбаяСсылка );
	
	Если Запрос.Выполнить().Пустой() Тогда
		Возврат Ложь;
	КонецЕсли;
	Возврат Истина;
КонецФункции
Показать



Плюс к сервису подключается пользователь с полными правами, то есть под логином администратора.

Ну и ко всему, в настройках самого сервиса отмечены все галки в каких подсистемах он участвует.

Сейчас почитаю как внешние обработки создаются, попробую и там.
39. пользователь 10.09.17 16:24
Сообщение было скрыто модератором.
...
2. SyachinS 31.01.17 18:36 Сейчас в теме
У меня вот такой код для программного формирования отчета
	МакетКомпоновки = КомпоновщикМакета.Выполнить(МакетСКД,НастройкиСКД,ДанныеРасшифровки);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(Результат);
	
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Показать
3. virtex3 20 31.01.17 19:14 Сейчас в теме
(2)
У меня вот такой код


Попробовал по вашему примеру, и даже установил в макете отчета значения по умолчанию.

	ОтчетОбъект = Отчеты.ОборотноСальдоваяВедомостьПоСчетуТиповой.Создать();

    СхемаКомпоновкиДанных = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
        
	ДанныеРасшифровки = неопределено;
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();  
	
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,СхемаКомпоновкиДанных.НастройкиПоУмолчанию,ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);
	
	Результат = Новый ТабличныйДокумент;
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Результат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);

		СообщениеОбОшибке = НСтр(
			"ru = '" + ЗначениеВСтрокуВнутр(Результат) + "'");
		ВызватьИсключение СообщениеОбОшибке;

Показать


Но не выводится отчет.. в Результате пустые значения.
При чем если взять другой отчет, где нет ни группировок, ни показателей, то все работает, например Шахматная ведомость. Но в остальных отчетах есть показатели и группировки и я так подозреваю из-за них и не работает
Прикрепленные файлы:
10. virtex3 20 31.01.17 21:57 Сейчас в теме


Вот два отчета работающих с горем пополам.

Но у них в СКД нет ни группировок, ни показателей, поэтому мне кажется они и работают.
Прикрепленные файлы:
13. Swetlana 27 01.02.17 08:55 Сейчас в теме
(10) попробуйте все таки в этих отчетах создать группировки и какой будет результат?
15. virtex3 20 01.02.17 09:43 Сейчас в теме
(13) пробовал. Не получается. Только не в курсе, правильно ли я делаю или нет. Но ошибок не выдает. Ошибка вылезает, если поля такого не существует.
		Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
		Группировка.Имя = "Группировка";
		Группировка.Использование = Истина;

		ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));       
		ПолеГруппировки.Использование      = Истина;
		ПолеГруппировки.Поле               = Новый ПолеКомпоновкиДанных("Счет");
		ПолеГруппировки.ТипГруппировки		= ТипГруппировкиКомпоновкиДанных.Иерархия;
Показать



14. Swetlana 27 01.02.17 09:05 Сейчас в теме
И кстати СКД довольно таки капризный инструмент
она может не работать на пустом месте и это может быть связано чисто с правами.
Хотя и не факт. Сама я сейчас с СКД особо не работаю, подзабыла уже.
Попробуйте сначала обычный отчет, не СКД - работает или нет через сервис.
Я только не поняла что означает Программное создание отчета в HTTP сервисе. В опубликованной базе 1с в браузере формируете отчет или чтото ещё?
16. virtex3 20 01.02.17 09:51 Сейчас в теме
(14) да я вот прям сейчас попробую создать внешнюю обработку, только вот что-то не получается. С 1С не знаком.


(14)
Я только не поняла что означает Программное создание отчета в HTTP сервисе. В опубликованной базе 1с в браузере формируете отчет или чтото ещё?
во-во... я бы давно нанял программиста и заплатил чтобы работало, только никто не понимает что я хочу сделать. Приходило трое человек, делали круглые глаза, обещали что подумают и так никто не перезвонил. Поэтому сижу сам сейчас пытаюсь сделать сам.

Вот здесь есть пример: http://its.1c.ru/db/v836doc#bookmark:dev:TI000001389

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

Мне самое главное сделать чтобы работал один отчет - ОСВ, из него можно любые данные дергать. Остальные отчеты не нужны.
17. starik-2005 3156 01.02.17 09:51 Сейчас в теме
- У меня не работает Ваша программа!
- А у меня все работает.
18. virtex3 20 01.02.17 10:44 Сейчас в теме
Вот есть аналог

http://infostart.ru/public/545389/

делаю тоже самое. Но у меня отчеты не выходят
19. Swetlana 27 01.02.17 11:34 Сейчас в теме
(18) Интересно, надо будет посмотреть. Сейчас на работе.
В посте по ссылке сделано через расширение - это не обязательно.

Вы бы уточнили какую конфигурацию БП вы используете и на какой платформе. Возможно что просто платформа не поддерживает эту фичу.
20. virtex3 20 01.02.17 11:43 Сейчас в теме
(19) 1С:Предприятие 8.3 (8.3.9.2033)

Конфигурация: Бухгалтерия для Казахстана, редакция 3.0, разработка для Казахстана: «1С-Рейтинг» (3.0.11.11)

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

простые отчеты работают, сложные не хотят.
21. Swetlana 27 01.02.17 11:49 Сейчас в теме
(20) а если простой работающий отчет усложнить тогда будет работать?
Просто добавить группировку в отчете?
23. virtex3 20 01.02.17 13:15 Сейчас в теме
(21) вот этого не умею... Не смотря на то что 15 лет опыта c PSQL, синтаксис 1С меня приводит в ступор как зайца на фару. Да и вообще опыта с 1С нету
22. Swetlana 27 01.02.17 12:07 Сейчас в теме
(20) и работает ли на обычной демо последней версии БП для России
24. virtex3 20 01.02.17 13:19 Сейчас в теме
(22)
аботает ли на обычной демо последней версии БП для России
я свой HTTP сервис написал... могу выгрузить как расширение и дать глянуть. Как на других конфигурациях работать будет - не в курсе. Там в коде надо будет изменить ссылочность и только.

да и после недели всяких тестов, проб и бессонных ночей хочется все уже бросить... люди даже за деньги не хотят связываться, потому что не сталкивались.. хотя опытному программисту там 10-20 строк написать и все будет работать.
25. Swetlana 27 01.02.17 13:25 Сейчас в теме
(24) похоже что эта тема новая и не очень то еще востребованная поэтому и не занимались.
группировку сделать не сложно в отчете.

Отчет - основная Схема Компоновки Данных, жмете на лупу закладка настройки
открыть конструктор Настройки тип отчета список - Далее
выбираете поля, далее - выбираете поля группировки. вот и все.
это для простого отчета
Но оборотно сальдовая ведомость не строится по настройкам СКД а формируется программно. разбираться нужно

Вот чтото мне захотелось попробовать даже :)
Впереди бессонные ночи наверное))
26. virtex3 20 01.02.17 13:37 Сейчас в теме
(25)
не очень то еще востребованная
еще как востребованная... просто никто не понимает или не осознает.

Например есть CRM система и нужно быстро и оперативно узнать количество товара на складе, допустим. Делаешь HTTP запрос по номенклатуре и вуаля - видишь количество, себестоимость. Это как пример. Либо есть интернет магазин и хочется видеть актуальное количество на складах... без битрикса.

Я через ODATA уже реализовал автоматическое создание счетов, вывожу структуру подчиненности документов, список контактных лиц по контрагенту.. да что угодно. Проблема ODATA в том, что не работает с отчетами. Поэтому попытался реализовать через HTTP-сервис средствами самого 1С.

27. Swetlana 27 01.02.17 13:54 Сейчас в теме
(26) посмотрю)
для развития полезно
28. virtex3 20 01.02.17 15:47 Сейчас в теме
(25)
Но оборотно сальдовая ведомость не строится по настройкам СКД а формируется программно.


я в этом деле продвинулся немного. Сформировал ПараметрыОтчета также как они формируются в модуле формы и точно также формирую

	АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор);
    БухгалтерскиеОтчетыВызовСервера.СформироватьОтчет(ПараметрыОтчета, АдресХранилища);
	РезультатВыполнения = ПолучитьИзВременногоХранилища(АдресХранилища);
	
	Возврат РезультатВыполнения.Результат;


Уже шапка выводится, но пока без данных. Грешу на
ПараметрыОтчета.Вставить("СхемаКомпоновкиДанных"                 , Отчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"));


В оригинале отчета он формируется вот так вот
ПараметрыОтчета.Вставить("СхемаКомпоновкиДанных"                 , ПолучитьИзВременногоХранилища(СхемаКомпоновкиДанных));


пробегаясь по коду вижу что где-то СКД меняется, суется обратно в хранилище, потом снова вытаскивается. Сижу дальше разбираюсь
Swetlana; +1 Ответить
31. Fox-trot 163 01.02.17 16:02 Сейчас в теме
(28) а счет-то сам как заполняется? что-то не видно его
33. virtex3 20 01.02.17 16:14 Сейчас в теме
(31) я просто не стал всю портянку сувать

	Отчет = Отчеты.ОборотноСальдоваяВедомостьПоСчетуТиповой.Создать();
	
	ПараметрыОтчета = Новый Структура;
	ПараметрыОтчета.Вставить("НачалоПериода"                         , запрос.началоПериода);
	ПараметрыОтчета.Вставить("КонецПериода"                          , запрос.конецПериода);
	ПараметрыОтчета.Вставить("ПоказательБУ"                          , Истина);
	ПараметрыОтчета.Вставить("ПоказательВалютнаяСумма"               , Ложь);
	ПараметрыОтчета.Вставить("ПоказательКоличество"                  , Истина);
	ПараметрыОтчета.Вставить("ПоказательРазвернутоеСальдо"           , Ложь);
	ПараметрыОтчета.Вставить("РазмещениеДополнительныхПолей"         , 0);
	ПараметрыОтчета.Вставить("Периодичность"                         , 0);
	ПараметрыОтчета.Вставить("Счет"                                  , НайтиСчетПоКоду("1330"));
	ПараметрыОтчета.Вставить("ПоСубсчетам"                           , Ложь);
	ПараметрыОтчета.Вставить("Группировка"                           , Отчет.Группировка.Выгрузить());
	ПараметрыОтчета.Вставить("ДополнительныеПоля"                    , Отчет.ДополнительныеПоля.Выгрузить());
	ПараметрыОтчета.Вставить("РежимРасшифровки"                      , Отчет.РежимРасшифровки);
	
	
	//ПараметрыОтчета.Вставить("СписокСтруктурныхЕдиниц"               , СписокСтруктурныхЕдиниц);
	//ПараметрыОтчета.Вставить("СписокПодразделений"                   , СписокПодразделений);
	//ПараметрыОтчета.Вставить("СписокВладельцевГоловныхПодразделений" , СписокВладельцевГоловныхПодразделений);
	ПараметрыОтчета.Вставить("ВыводитьЗаголовок"                     , Истина);
	ПараметрыОтчета.Вставить("ВыводитьПодписи"                       , Ложь);
	ПараметрыОтчета.Вставить("ВыводитьПодписиРуководителей"          , Ложь);
	
	ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
	ПараметрыОтчета.Вставить("ДанныеРасшифровки"                     , ДанныеРасшифровки);
	ПараметрыОтчета.Вставить("МакетОформления"                       , "МакетОформленияОтчетов");	
	//ПараметрыОтчета.Вставить("СхемаКомпоновкиДанных"                 , ПолучитьИзВременногоХранилища(СхемаКомпоновкиДанных));
	ПараметрыОтчета.Вставить("СхемаКомпоновкиДанных"                 , Отчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"));
	ПараметрыОтчета.Вставить("ИдентификаторОтчета"                   , "ОборотноСальдоваяВедомостьПоСчетуТиповой");
	ПараметрыОтчета.Вставить("НастройкиКомпоновкиДанных"             , Отчет.КомпоновщикНастроек.ПолучитьНастройки());
	ПараметрыОтчета.Вставить("НаборПоказателей"                      , Отчеты[ПараметрыОтчета.ИдентификаторОтчета].ПолучитьНаборПоказателей());
	
Показать
34. virtex3 20 01.02.17 16:18 Сейчас в теме
(31) только шапка пока, потому что с СКД надо разобраться и сформировать её аналогично как в отчете. Тогда думаю заработает.
Прикрепленные файлы:
32. Swetlana 27 01.02.17 16:11 Сейчас в теме
(28) Когда данные переносятся с клиента на сервер и обратно то они это делают через хранилище. если модуль объекта то автоматом &НаСервере в форме объекта уже прямо указывает &НаКлиенте или &НаСервере
29. starik-2005 3156 01.02.17 15:53 Сейчас в теме
(25)
похоже что эта тема новая и не очень то еще востребованная
Тема сия не новая и достаточно востребованная в больших базах, ибо вынесение отчетов во внешнюю базу данных резко разгружает SQL-сервер от блокировок. При количестве пользователей больше 50-ти только так и следует поступать, перенаправляя формирование отчетов из текущей базы в снапшот (который 10 сек делается) или копию (от получаса). Я такое делал на прошлой работе - при формировании отчета дергался сервис (правда не HTTP, а SOAP, но сути это не меняет) другой базы, в которой данный отчет с данными параметрами и формировался. Любой отчет на СКД (навороченный или простой) сериализовался, передавался со всеми настройками в сервис, там формировался и передавался назад для отображения. Так работало все на 100%, включая расшифровку. Любой отчет на СКД превращался во внешний путем добавления к нему всего пяти строк. Для простого случая формирования отчета работает то, что написано в (4). Главное - загрузить нужный вариант настроек и установить верные параметры (например, если вместо контрагента установишь в параметр физлицо, то не жди, что отчет что-либо вернет).
Swetlana; +1 Ответить
30. Swetlana 27 01.02.17 15:58 Сейчас в теме
(29) я с такими большими базами не работала)
но это верно - настройки компоновки данных сделали неявно сложно, пока разберешься
или не те настройки или не те загружаешь
35. virtex3 20 01.02.17 22:22 Сейчас в теме
после 12 часов непрерывных попыток и тестов наконец удалось создать отчет...
Прикрепленные файлы:
Swetlana; +1 Ответить
36. virtex3 20 02.02.17 08:41 Сейчас в теме
В общем долго и упорно сидел и дебажил сам сервер 1С.

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

Как тут раньше и сказали, СКД формируется программно и если подсунуть ОсновнаяСхемаКомпоновкиДанных, то 99.9% что ничего не выведется.

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

Для реализации сервиса по выводу отчетов в браузер необходимо для каждого нужного отчета в HTTP сервисе создать свои настройки программно.
Проще всего скопировать код из ОбщегоМодуля, подогнать под свои нужды и формировать СКД также программно.

Как закончу, выложу модуль. Правда он будет заточен под мою конфигурацию, но как пример весьма будет полезен.
утюгчеловек; Swetlana; +2 Ответить
37. virtex3 20 07.02.17 13:34 Сейчас в теме
Баг платформы, над которым бился всю неделю.... Не формируется определенный отчет и все!!!

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

Ошибка возникает когда происходит запись ТабличногоДокумента
		имяФайла = ПолучитьИмяВременногоФайла( "html" );
		ТабДокумент.Записать( имяФайла, ТипФайлаТабличногоДокумента.HTML5 );


Либо если пробегать циклом по ТаблицеЗначений

	колонки = ТаблицаЗначений.Колонки;
	массивСтруктур = Новый Массив;     		
		
	Для каждого цСтрока Из данные Цикл      			
		структ = Новый Структура;   			
		Для каждого цКолонка Из колонки Цикл 				
			значение = цСтрока[цКолонка.Имя];				
			типЗначения = ТипЗнч( значение );				
			Если типЗначения = Тип("Булево")
				ИЛИ типЗначения = Тип("Строка")
				ИЛИ типЗначения = Тип("Дата")
				ИЛИ типЗначения = Тип("Число") Тогда 					
				структ.Вставить( цКолонка.Имя, значение ); 					
			Иначе 					
				структ.Вставить( цКолонка.Имя, Строка( значение ) );					
			КонецЕсли;				
		КонецЦикла;
		массивСтруктур.Добавить( структ );
	КонецЦикла;
		
Показать
38. virtex3 20 09.02.17 13:11 Сейчас в теме
В общем я добился работы HTTP сервиса.

Внутри модуля спрограммировал 3 основных вида отчета, так как везде приходится формировать СКД программно.

Не стал делать публикацию, потому как лень писать и красочно расписывать.

Картинки и расширение - во вложении. Работает с конфигурацией Бухгалтерия для Казахстана, редакция 3.0,

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

Исправно выдает отчеты когда нет в названиях Контрагентов и Номенклатуры одиночного апострофа - иначе пустая страница и нет никаких ошибок, ни в журнале, ни в браузере

Разработано в течение пары недель без опыта программирования в 1С.

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

Исходный код. Отличный пример как программно формировать настройки и СКД. Собирал по крупицам по всему интернету.
Функция ПолучениеОтчета(Запрос) 
	
	запрос = ОбработатьПараметрыЗапроса(Запрос);
	
	Если запрос.ИмяОтчета = "ping" Тогда
		Возврат СформироватьОтвет(200, "Подключение выполнено успешно!");
	КонецЕсли;
	
	Возврат ПодготовитьОтчет( запрос );

КонецФункции

Функция ОбработатьПараметрыЗапроса(Запрос)
	
	ПараметрыЗапроса = Новый Структура;
	ПараметрыЗапроса.Вставить("НачалоПериода"	, ТекущаяДата());
	ПараметрыЗапроса.Вставить("КонецПериода"	, ТекущаяДата());
	ПараметрыЗапроса.Вставить("ТипОтвета"		, "json");
	ПараметрыЗапроса.Вставить("ИмяОтчета"		, Запрос.ПараметрыURL["name"]);
	ПараметрыЗапроса.Вставить("СтрокаПоиска"	, неопределено);
	
	Для каждого параметр Из Запрос.ПараметрыЗапроса Цикл
		Если параметр.Ключ = "type" Тогда
			ПараметрыЗапроса.Удалить("ТипОтвета");
			ПараметрыЗапроса.Вставить("ТипОтвета", НРег(параметр.Значение));
		КонецЕсли;
		Если параметр.Ключ = "dateFrom" Тогда
			ПараметрыЗапроса.Удалить("НачалоПериода");
			ПараметрыЗапроса.Вставить("НачалоПериода", Дата(параметр.Значение));
		КонецЕсли;
		Если параметр.Ключ = "dateTo" Тогда
			ПараметрыЗапроса.Удалить("КонецПериода");
			ПараметрыЗапроса.Вставить("КонецПериода", Дата(параметр.Значение));
		КонецЕсли;
		Если параметр.Ключ = "name" Тогда
			ПараметрыЗапроса.Удалить("СтрокаПоиска");
			ПараметрыЗапроса.Вставить("СтрокаПоиска", НРег(параметр.Значение));
		КонецЕсли;
	КонецЦикла;
	
	Возврат ПараметрыЗапроса;
	
КонецФункции

Функция ПодготовитьОтчет(запрос)
		
	таблица = СформироватьТаблицу(запрос);
		
	Если запрос.ТипОтвета = "html" Тогда 
		Возврат СформироватьОтвет(200, СформироватьHTMLизРезультата(таблица), "html");
	ИначеЕсли запрос.ТипОтвета = "dump" Тогда
		Возврат СформироватьОтвет(200, ЗначениеВСтрокуВнутр(таблица));
	ИначеЕсли запрос.ТипОтвета = "xlsx" ИЛИ запрос.ТипОтвета = "xls" Тогда
		имяФайла = ПолучитьИмяВременногоФайла( "xlsx" );
		таблица.Записать( имяФайла, ТипФайлаТабличногоДокумента.XLSX );
		двДанные = Новый ДвоичныеДанные( имяФайла );
	 	УдалитьФайлы( имяФайла );
			
		Возврат СформироватьОтвет(200, двДанные, "xlsx", запрос.ИмяОтчета );
			
	Иначе
		Возврат СформироватьОтвет(200, СформироватьJSONизРезультата(таблица), "json" );
	КонецЕсли	
		
КонецФункции

Функция СформироватьОтвет(код, тело, тип = "text", имя = неопределено )
	Ответ = Новый HTTPСервисОтвет(код);
	
	Если тип = "html" Тогда
		Ответ.Заголовки.Вставить("Content-Type", "text/html; charset=utf-8");
		Ответ.УстановитьТелоИзСтроки( НСтр( "ru='"+тело+"'" ) );
	ИначеЕсли тип = "json" Тогда
		Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
		Ответ.УстановитьТелоИзСтроки( НСтр( "ru='"+тело+"'" ) );
	ИначеЕсли тип = "xlsx" Тогда
		Ответ.УстановитьТелоИзДвоичныхДанных( тело );
		Ответ.Заголовки.Вставить("Content-Type", "application/xlsx");
		Ответ.Заголовки.Вставить("Content-Disposition", "attachment; filename=" + КодироватьСтроку( "" + имя + ".xlsx", СпособКодированияСтроки.КодировкаURL));
		//Ответ.Заголовки.Вставить("Content-Disposition", "attachment; filename=""" + имя + ".xlsx""");
	Иначе
		Ответ.Заголовки.Вставить("Content-Type", "text/plain; charset=utf-8");
		Ответ.УстановитьТелоИзСтроки( НСтр( "ru='"+тело+"'" ) );
	КонецЕсли;
	
	Возврат Ответ;
КонецФункции

Функция СобратьСообщениеОбОшибке(ИнформацияОбОшибке)
		СообщениеОбОшибке = НСтр(
				"ru = '
				| Описание:" + ИнформацияОбОшибке.Описание + "
				| Причина: " + ИнформацияОбОшибке.Причина + "
				| ИмяМодуля: " + ИнформацияОбОшибке.ИмяМодуля + "
				| ИсходнаяСтрока: " + ИнформацияОбОшибке.ИсходнаяСтрока + "
				| НомерСтроки: " + ИнформацияОбОшибке.НомерСтроки + "
				| '");
	Возврат СообщениеОбОшибке;	
КонецФункции


////////////////////////////////////////////////////////////­////////////////////
// Формирование отчетов

Функция СформироватьТаблицу(запрос) Экспорт
	
	ПараметрыОтчета = ПолучитьНастройкиПоОтчету(запрос);
	
	// Если мы не получили параметров
	Если ПараметрыОтчета = неопределено Тогда
		Если запрос.ТипОтвета <> "json" Тогда
			Возврат Новый ТабличныйДокумент;
		Иначе
			Возврат Новый ТаблицаЗначений;
		КонецЕсли;
	КонецЕсли;
	
	СхемаКомпоновки = СформироватьСхемуПоПараметрам(ПараметрыОтчета);

	Если запрос.ТипОтвета <> "json" Тогда
		Возврат СформироватьОтчет(СхемаКомпоновки, "ТабличныйДокумент");
	Иначе
		Возврат СформироватьОтчет(СхемаКомпоновки, "ТаблицаЗначений");
	КонецЕсли;

КонецФункции

Функция СформироватьСхемуПоПараметрам(ПараметрыОтчета)
	
	ДанныеРасшифровкиОбъект = Неопределено;
	ПараметрыИсполненияОтчета = Неопределено;
	
	Попытка

		Если ПараметрыОтчета.Свойство("ОтчетОбъект") И ПараметрыОтчета.ОтчетОбъект <> Неопределено Тогда
			МенеджерОтчета = ПараметрыОтчета.ОтчетОбъект;
		Иначе
			МенеджерОтчета = Отчеты[ПараметрыОтчета.ИдентификаторОтчета];
		КонецЕсли;
		
		//Попытка
			ПараметрыИсполненияОтчета = МенеджерОтчета.ПолучитьПараметрыИсполненияОтчета();
		//Исключение
		//	ВызватьИсключение НСтр("ru = '"+ ПодробноеПредставлениеОшибки( ИнформацияОбОшибке() ) +"'");
		//КонецПопытки;
		
		ИспользоватьВнешниеНаборыДанных            = Ложь;
		ИспользоватьПриВыводеЗаголовка             = Ложь;
		ИспользоватьПриВыводеПодвала               = Ложь;
		ИспользоватьПередКомпоновкойМакета         = Ложь;
		ИспользоватьПослеКомпоновкиМакета          = Ложь;
		ИспользоватьПередВыводомЭлементаРезультата = Ложь;
		ИспользоватьПослеВыводаРезультата          = Ложь;
		ИспользоватьДанныеРасшифровки              = Истина;
		
		Если ПараметрыИсполненияОтчета <> Неопределено Тогда
			Если ПараметрыИсполненияОтчета.Свойство("ИспользоватьВнешниеНаборыДанных") Тогда
				ИспользоватьВнешниеНаборыДанных = ПараметрыИсполненияОтчета.ИспользоватьВнешниеНаборыДанных;
			КонецЕсли;
			Если ПараметрыИсполненияОтчета.Свойство("ИспользоватьПриВыводеЗаголовка") Тогда
				ИспользоватьПриВыводеЗаголовка = ПараметрыИсполненияОтчета.ИспользоватьПриВыводеЗаголовка;
			КонецЕсли;
			Если ПараметрыИсполненияОтчета.Свойство("ИспользоватьПриВыводеПодвала") Тогда
				ИспользоватьПриВыводеПодвала = ПараметрыИсполненияОтчета.ИспользоватьПриВыводеПодвала;
			КонецЕсли;
			Если ПараметрыИсполненияОтчета.Свойство("ИспользоватьПередКомпоновкойМакета") Тогда
				ИспользоватьПередКомпоновкойМакета = ПараметрыИсполненияОтчета.ИспользоватьПередКомпоновкойМакета;
			КонецЕсли;
			Если ПараметрыИсполненияОтчета.Свойство("ИспользоватьПослеКомпоновкиМакета") Тогда
				ИспользоватьПослеКомпоновкиМакета = ПараметрыИсполненияОтчета.ИспользоватьПослеКомпоновкиМакета;
			КонецЕсли;
			Если ПараметрыИсполненияОтчета.Свойство("ИспользоватьПередВыводомЭлементаРезультата") Тогда
				ИспользоватьПередВыводомЭлементаРезультата = ПараметрыИсполненияОтчета.ИспользоватьПередВыводомЭлементаРезультата;
			КонецЕсли;
			Если ПараметрыИсполненияОтчета.Свойство("ИспользоватьПослеВыводаРезультата") Тогда
				ИспользоватьПослеВыводаРезультата = ПараметрыИсполненияОтчета.ИспользоватьПослеВыводаРезультата;
			КонецЕсли;
			Если ПараметрыИсполненияОтчета.Свойство("ИспользоватьДанныеРасшифровки") Тогда
				ИспользоватьДанныеРасшифровки = ПараметрыИсполненияОтчета.ИспользоватьДанныеРасшифровки;
			КонецЕсли;
		КонецЕсли;
		
		Если ТипЗнч(ПараметрыОтчета.СхемаКомпоновкиДанных) = Тип("Строка") Тогда
			Если ЭтоАдресВременногоХранилища(ПараметрыОтчета.СхемаКомпоновкиДанных) Тогда
				СхемаКомпоновкиДанных = ПолучитьИзВременногоХранилища(ПараметрыОтчета.СхемаКомпоновкиДанных);
			КонецЕсли;
		Иначе
			СхемаКомпоновкиДанных = ПараметрыОтчета.СхемаКомпоновкиДанных;
		КонецЕсли;
		
		КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
		КомпоновщикНастроек.ЗагрузитьНастройки(ПараметрыОтчета.НастройкиКомпоновкиДанных);
		КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
		
		ВыводитьЗаголовок = ?(ПараметрыОтчета.Свойство("ВыводитьЗаголовок") <> Ложь, ПараметрыОтчета.ВыводитьЗаголовок, Истина);
		ВыводитьПодписи   = ?(ПараметрыОтчета.Свойство("ВыводитьПодписи")   <> Ложь, ПараметрыОтчета.ВыводитьПодписи  , Истина);
		
		ВыводитьПодписиРуководителей = ?(ПараметрыОтчета.Свойство("ВыводитьПодписиРуководителей") <> Ложь,
		                                 ПараметрыОтчета.ВыводитьПодписиРуководителей, Ложь);
		
		Результат = Новый ТабличныйДокумент;
		
		Если ВыводитьЗаголовок Тогда
			Если ИспользоватьПриВыводеЗаголовка Тогда
				МенеджерОтчета.ПриВыводеЗаголовка(ПараметрыОтчета, Результат);
			Иначе
				БухгалтерскиеОтчетыВызовСервера.ВывестиЗаголовокОтчета(ПараметрыОтчета, КомпоновщикНастроек, Результат);
			КонецЕсли;
		КонецЕсли;
		

		Если ИспользоватьПередКомпоновкойМакета Тогда
			// Очистка пользовательских настроек
			КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки              = "";
			КомпоновщикНастроек.Настройки.Порядок.ИдентификаторПользовательскойНастройки            = "";
			КомпоновщикНастроек.Настройки.УсловноеОформление.ИдентификаторПользовательскойНастройки = "";

			МенеджерОтчета.ПередКомпоновкойМакета(ПараметрыОтчета, СхемаКомпоновкиДанных, КомпоновщикНастроек);
		КонецЕсли;
		
		КомпоновщикНастроек.Восстановить();
			
		НастройкиДляКомпоновкиМакета = КомпоновщикНастроек.ПолучитьНастройки();
			
		Если ПараметрыОтчета.Свойство("СвойМакетОформления") И ПараметрыОтчета.СвойМакетОформления
			И ПараметрыОтчета.Свойство("МакетОформления") И ЗначениеЗаполнено(ПараметрыОтчета.МакетОформления) Тогда
			СвойМакетОформления = МенеджерОтчета.ПолучитьМакет(ПараметрыОтчета.МакетОформления);
		Иначе
			БухгалтерскиеОтчетыВызовСервера.УстановитьМакетОформленияОтчета(ПараметрыОтчета, НастройкиДляКомпоновкиМакета);
			СвойМакетОформления = Неопределено;
		КонецЕСли;
		
		РезультатВыполнения = Новый Структура;
		
		РезультатВыполнения.Вставить("СхемаКомпоновкиДанных"				, СхемаКомпоновкиДанных);
		РезультатВыполнения.Вставить("НастройкиДляКомпоновкиМакета"			, НастройкиДляКомпоновкиМакета);
		РезультатВыполнения.Вставить("ИспользоватьДанныеРасшифровки"		, ИспользоватьДанныеРасшифровки);
		РезультатВыполнения.Вставить("ДанныеРасшифровкиОбъект"				, ДанныеРасшифровкиОбъект);
		РезультатВыполнения.Вставить("СвойМакетОформления"					, СвойМакетОформления);
		РезультатВыполнения.Вставить("ИспользоватьВнешниеНаборыДанных"		, ИспользоватьВнешниеНаборыДанных);
		РезультатВыполнения.Вставить("ИспользоватьПослеКомпоновкиМакета"	, ИспользоватьПослеКомпоновкиМакета);
		РезультатВыполнения.Вставить("МенеджерОтчета"						, МенеджерОтчета);
		РезультатВыполнения.Вставить("ПараметрыОтчета"						, ПараметрыОтчета);

	Исключение
		
		ВызватьИсключение СобратьСообщениеОбОшибке(ИнформацияОбОшибке());

	КонецПопытки;

	Возврат РезультатВыполнения;
		
КонецФункции

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

		Если типОтчета <> "ТаблицаЗначений" Тогда
			//Вызываем событие отчета
			Если ИспользоватьПослеКомпоновкиМакета Тогда
				МенеджерОтчета.ПослеКомпоновкиМакета(ПараметрыОтчета, МакетКомпоновки);
			КонецЕсли;
		КонецЕсли;
		
		Если ИспользоватьВнешниеНаборыДанных Тогда
			ВнешниеНаборыДанных = МенеджерОтчета.ПолучитьВнешниеНаборыДанных(ПараметрыОтчета, МакетКомпоновки);
		КонецЕсли;

		
		//Создадим и инициализируем процессор компоновки
		ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
		Если ВнешниеНаборыДанных = Неопределено Тогда
			ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,                    , ДанныеРасшифровкиОбъект, Истина);
		Иначе
			ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровкиОбъект, Истина);
		КонецЕсли;	
		
		Если типОтчета = "ТаблицаЗначений" Тогда
			Результат = Новый ТаблицаЗначений;
			ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
			ПроцессорВывода.УстановитьОбъект(Результат);
			
		Иначе
			Результат = Новый ТабличныйДокумент;
			ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;	
			ПроцессорВывода.УстановитьДокумент(Результат);	
		КонецЕсли;
		
		ПроцессорВывода.Вывести(ПроцессорКомпоновки);

	Исключение
		ВызватьИсключение СобратьСообщениеОбОшибке(ИнформацияОбОшибке());
	КонецПопытки;
	
	Возврат Результат;
КонецФункции

Функция ПолучитьНастройкиПоОтчету(запрос)	
	Если запрос.ИмяОтчета = "AccountsPayable" ИЛИ запрос.ИмяОтчета = "AccountsReceivable" Тогда 
		Возврат АнализСубконтоТиповой(запрос);
	ИначеЕсли запрос.ИмяОтчета = "Funds" ИЛИ запрос.ИмяОтчета = "Goods" Тогда 
		Возврат ОборотноСальдоваяВедомостьПоСчетуТиповой(запрос);
	Иначе
		ВызватьИсключение "Отчет не найден";
	КонецЕсли;
	
КонецФункции

////////////////////////////////////////////////////////////­////////////////////
// Функции по каждому отдельному отчету

Функция АнализСубконтоТиповой(запрос)
	
	ПараметрыОтчета = Новый Структура;
	
	Отчет = Отчеты.АнализСубконтоТиповой.Создать();
	Отчет.Группировка.Очистить();
	
	ПараметрыОтчета.Вставить("НачалоПериода"                         , запрос.НачалоПериода);
	ПараметрыОтчета.Вставить("КонецПериода"                          , запрос.КонецПериода);
	ПараметрыОтчета.Вставить("ПоказательБУ"                          , Истина);
	ПараметрыОтчета.Вставить("ПоказательВалютнаяСумма"               , Ложь);
	ПараметрыОтчета.Вставить("ПоказательКоличество"                  , Ложь);
	ПараметрыОтчета.Вставить("ПоказательРазвернутоеСальдо"           , Ложь);
	ПараметрыОтчета.Вставить("РазмещениеДополнительныхПолей"         , 0);
	ПараметрыОтчета.Вставить("Периодичность"                         , 0);
	ПараметрыОтчета.Вставить("ПоСубсчетам"                           , Ложь);

		
	//Формируем нашу собственную настройку и загружаем ее в отчет
	Настройка = НашаНастройкаКомпоновки();
		
	Если запрос.ИмяОтчета = "AccountsPayable" Тогда
		
		НовыйЭлемент  = Настройка.Элементы.Добавить(Тип("ОтборКомпоновкиДанных"));
		НовыйЭлемент.ИдентификаторПользовательскойНастройки = "Отбор";  
				
		Счета = Новый СписокЗначений;
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3310"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3320"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3330"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3340"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3350"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3360"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3370"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3380"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3390"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("3510"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("4110"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("4120"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("4130"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("4140"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("4150"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("4160"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("4170"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("4410"));
		
		ЗаполнитьЭлементОтбора(НовыйЭлемент,Истина,ВидСравненияКомпоновкиДанных.ВСписке,"Счет",Счета);

		НовыйЭлемент  = Настройка.Элементы.Добавить(Тип("ПорядокКомпоновкиДанных"));
		НовыйЭлемент.ИдентификаторПользовательскойНастройки = "Порядок";  
		ЗаполнитьЭлементПорядка(НовыйЭлемент,Истина,"СальдоНаКонецПериода.БУКонечныйРазвернутыйОстатокКт.ПроцентОбщий",НаправлениеСортировкиКомпоновкиДанных.Убыв);
	
		//ВызватьИсключение ЗначениеВСтрокуВнутр(Настройка);

		ЗагрузитьНастройкуВКомпоновщик(Отчет,Настройка);

		ДобавитьГруппировку(Отчет,"Счет",Истина,"Счет",Перечисления.ТипДетализацииСтандартныхОтчетов.Иерархия); 		
		ДобавитьГруппировку(Отчет,"Субконто1",Истина,"Контрагенты",Перечисления.ТипДетализацииСтандартныхОтчетов.Элементы);
		ПараметрыОтчета.Вставить("Группировка"                           , Отчет.Группировка.Выгрузить());
		
		СписокВидовСубконто = Новый СписокЗначений;
		СписокВидовСубконто.ТипЗначения = Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВидыСубконтоТиповые");
		СписокВидовСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоТиповые.Контрагенты);
		
		ПараметрыОтчета.Вставить("СписокВидовСубконто"                   , СписокВидовСубконто);
		
	ИначеЕсли запрос.ИмяОтчета = "AccountsReceivable" Тогда
		НовыйЭлемент  = Настройка.Элементы.Добавить(Тип("ОтборКомпоновкиДанных"));
		НовыйЭлемент.ИдентификаторПользовательскойНастройки = "Отбор";  
				
		Счета = Новый СписокЗначений;
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1210"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1220"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1230"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1240"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1250"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1260"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1270"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1280"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1290"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("1610"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2110"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2120"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2130"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2140"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2150"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2160"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2170"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2180"));
		Счета.Добавить(ПланыСчетов.Типовой.НайтиПоКоду("2910"));
		
		
		ЗаполнитьЭлементОтбора(НовыйЭлемент,Истина,ВидСравненияКомпоновкиДанных.ВСписке,"Счет",Счета);

		НовыйЭлемент  = Настройка.Элементы.Добавить(Тип("ПорядокКомпоновкиДанных"));
		НовыйЭлемент.ИдентификаторПользовательскойНастройки = "Порядок";  
		ЗаполнитьЭлементПорядка(НовыйЭлемент,Истина,"СальдоНаКонецПериода.БУКонечныйРазвернутыйОстатокДт.ПроцентОбщий",НаправлениеСортировкиКомпоновкиДанных.Убыв);
	
		//ВызватьИсключение ЗначениеВСтрокуВнутр(Настройка);

		ЗагрузитьНастройкуВКомпоновщик(Отчет,Настройка);

		ДобавитьГруппировку(Отчет,"Счет",Истина,"Счет",Перечисления.ТипДетализацииСтандартныхОтчетов.Иерархия); 		
		ДобавитьГруппировку(Отчет,"Субконто1",Истина,"Контрагенты",Перечисления.ТипДетализацииСтандартныхОтчетов.Элементы);
		ПараметрыОтчета.Вставить("Группировка"                           , Отчет.Группировка.Выгрузить());
		
		СписокВидовСубконто = Новый СписокЗначений;
		СписокВидовСубконто.ТипЗначения = Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВидыСубконтоТиповые");
		СписокВидовСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоТиповые.Контрагенты);
		
		ПараметрыОтчета.Вставить("СписокВидовСубконто"                   , СписокВидовСубконто);

	КонецЕсли;

	ПараметрыОтчета.Вставить("ДополнительныеПоля"                    , Отчет.ДополнительныеПоля.Выгрузить());
	ПараметрыОтчета.Вставить("РежимРасшифровки"                      , Ложь);
	ПараметрыОтчета.Вставить("СписокСтруктурныхЕдиниц"               , Новый Массив);
	ПараметрыОтчета.Вставить("СписокПодразделений"                   , Новый Массив);
	ПараметрыОтчета.Вставить("СписокВладельцевГоловныхПодразделений" , Новый Массив);
	ПараметрыОтчета.Вставить("ВыводитьЗаголовок"                     , Ложь);
	ПараметрыОтчета.Вставить("ВыводитьПодписи"                       , Ложь);
	ПараметрыОтчета.Вставить("ВыводитьПодписиРуководителей"          , Ложь);
	ПараметрыОтчета.Вставить("ДанныеРасшифровки"                     , Новый ДанныеРасшифровкиКомпоновкиДанных);
	ПараметрыОтчета.Вставить("МакетОформления"                       , "МакетОформленияОтчетов");	
	ПараметрыОтчета.Вставить("СхемаКомпоновкиДанных"                 , Отчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"));
	ПараметрыОтчета.Вставить("ИдентификаторОтчета"                   , "АнализСубконтоТиповой");
	ПараметрыОтчета.Вставить("НастройкиКомпоновкиДанных"             , Отчет.КомпоновщикНастроек.ПолучитьНастройки());
	ПараметрыОтчета.Вставить("НаборПоказателей"                      , Отчеты[ПараметрыОтчета.ИдентификаторОтчета].ПолучитьНаборПоказателей());

	
	Возврат ПараметрыОтчета;

КонецФункции

Функция ОборотноСальдоваяВедомостьПоСчетуТиповой(запрос)
	ПараметрыОтчета = Новый Структура;
	
	Отчет = Отчеты.ОборотноСальдоваяВедомостьПоСчетуТиповой.Создать();
	Отчет.Группировка.Очистить();
	
	//Формируем нашу собственную настройку и загружаем ее в отчет
	Настройка = НашаНастройкаКомпоновки();
	
	ПараметрыОтчета.Вставить("НачалоПериода"							, запрос.НачалоПериода);
	ПараметрыОтчета.Вставить("КонецПериода"								, запрос.КонецПериода);
	ПараметрыОтчета.Вставить("РежимРасшифровки"							, Ложь);
	ПараметрыОтчета.Вставить("СписокСтруктурныхЕдиниц"					, Новый Массив);
	ПараметрыОтчета.Вставить("СписокПодразделений"						, Новый Массив);
	ПараметрыОтчета.Вставить("СписокВладельцевГоловныхПодразделений"	, Новый Массив);
	ПараметрыОтчета.Вставить("ВыводитьЗаголовок"						, Ложь);
	ПараметрыОтчета.Вставить("ВыводитьПодписи"							, Ложь);
	ПараметрыОтчета.Вставить("ВыводитьПодписиРуководителей"				, Ложь);
	ПараметрыОтчета.Вставить("ДанныеРасшифровки"						, Новый ДанныеРасшифровкиКомпоновкиДанных);
	ПараметрыОтчета.Вставить("МакетОформления"							, "МакетОформленияОтчетов");
	ПараметрыОтчета.Вставить("СхемаКомпоновкиДанных"					, Отчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"));
	ПараметрыОтчета.Вставить("ИдентификаторОтчета"						, "ОборотноСальдоваяВедомостьПоСчетуТиповой");
	ПараметрыОтчета.Вставить("НаборПоказателей"							, Отчеты[ПараметрыОтчета.ИдентификаторОтчета].ПолучитьНаборПоказателей());
	
	Если запрос.ИмяОтчета = "Funds" Тогда
		
		ПараметрыОтчета.Вставить("Счет"										, ПланыСчетов.Типовой.ДенежныеСредства);
		ПараметрыОтчета.Вставить("ПоказательБУ"								, Истина);
		ПараметрыОтчета.Вставить("ПоказательВалютнаяСумма"					, Ложь);
		ПараметрыОтчета.Вставить("ПоказательКоличество"						, Ложь);
		ПараметрыОтчета.Вставить("ПоказательРазвернутоеСальдо"				, Ложь);
		ПараметрыОтчета.Вставить("РазмещениеДополнительныхПолей"			, 0);
		ПараметрыОтчета.Вставить("Периодичность"							, 0);
		ПараметрыОтчета.Вставить("ПоСубсчетам"								, Истина);
		
		ДобавитьГруппировку(Отчет,"Счет",Истина,"Счет",Перечисления.ТипДетализацииСтандартныхОтчетов.Иерархия); 		
		ДобавитьГруппировку(Отчет,"Субконто1",Истина,"Денежные средства",Перечисления.ТипДетализацииСтандартныхОтчетов.Элементы);
		
		ПараметрыОтчета.Вставить("Группировка"								, Отчет.Группировка.Выгрузить());
		ПараметрыОтчета.Вставить("ДополнительныеПоля"                    	, Отчет.ДополнительныеПоля.Выгрузить());   // FIXME: если будет отчет где нужны поля, то придется реализовать как с группировка
		
		ЗагрузитьНастройкуВКомпоновщик(Отчет,Настройка);
		ПараметрыОтчета.Вставить("НастройкиКомпоновкиДанных"				, Отчет.КомпоновщикНастроек.ПолучитьНастройки());
		
		Возврат ПараметрыОтчета;
		
	ИначеЕсли запрос.ИмяОтчета = "Goods" Тогда
		
		Если запрос.СтрокаПоиска <> неопределено Тогда
			Список = ПоискПоНоменклатуре(запрос.СтрокаПоиска);
			Если Список <> неопределено Тогда
				НовыйЭлемент  = Настройка.Элементы.Добавить(Тип("ОтборКомпоновкиДанных"));
				НовыйЭлемент.ИдентификаторПользовательскойНастройки = "Отбор";
				ЗаполнитьЭлементОтбора(НовыйЭлемент,Истина,ВидСравненияКомпоновкиДанных.ВСписке,"Субконто1",Список);
			Иначе
				Возврат неопределено;
			КонецЕсли;
		КонецЕсли;
		
		ПараметрыОтчета.Вставить("Счет"										, ПланыСчетов.Типовой.Товары);
		ПараметрыОтчета.Вставить("ПоказательБУ"								, Истина);
		ПараметрыОтчета.Вставить("ПоказательВалютнаяСумма"					, Ложь);
		ПараметрыОтчета.Вставить("ПоказательКоличество"						, Истина);
		ПараметрыОтчета.Вставить("ПоказательРазвернутоеСальдо"				, Ложь);
		ПараметрыОтчета.Вставить("РазмещениеДополнительныхПолей"			, 0);
		ПараметрыОтчета.Вставить("Периодичность"							, 0);
		ПараметрыОтчета.Вставить("ПоСубсчетам"								, Истина);
		
		ДобавитьГруппировку(Отчет,"Счет",Истина,"Счет",Перечисления.ТипДетализацииСтандартныхОтчетов.Иерархия); 		
		ДобавитьГруппировку(Отчет,"Субконто1",Истина,"Номенклатура",Перечисления.ТипДетализацииСтандартныхОтчетов.Элементы);
		
		ПараметрыОтчета.Вставить("Группировка"								, Отчет.Группировка.Выгрузить());
		ПараметрыОтчета.Вставить("ДополнительныеПоля"                    	, Отчет.ДополнительныеПоля.Выгрузить());   // FIXME: если будет отчет где нужны поля, то придется реализовать как с группировка
		
		ЗагрузитьНастройкуВКомпоновщик(Отчет,Настройка);
		ПараметрыОтчета.Вставить("НастройкиКомпоновкиДанных"				, Отчет.КомпоновщикНастроек.ПолучитьНастройки());
		
		Возврат ПараметрыОтчета;
		
	КонецЕсли;	
КонецФункции


////////////////////////////////////////////////////////////­////////////////////
// Формирователи настроек компоновки

Функция НашаНастройкаКомпоновки()
	МоиНастройки  = Новый ПользовательскиеНастройкиКомпоновкиДанных;
	
	НовыйЭлемент  = МоиНастройки.Элементы.Добавить(Тип("УсловноеОформлениеКомпоновкиДанных"));
	НовыйЭлемент.ИдентификаторПользовательскойНастройки = "УсловноеОформление";  
	ЗаполнитьЭлементОформления(НовыйЭлемент,"ВыделятьОтрицательные",Истина,"Выделять отрицательные");
	ЗаполнитьЭлементОформления(НовыйЭлемент,"Шрифт",Новый Шрифт(,9),"Основной шрифт");

	Возврат МоиНастройки;
КонецФункции

Процедура ЗагрузитьНастройкуВКомпоновщик(Отчет,Настройка)
	// Вытащим текущие настройки чтобы определить где что менять
	ТекущиеНастройки = Отчет.КомпоновщикНастроек.Настройки;
			
	// Установим маркеры пользовательских настроек
	ТекущиеНастройки.Отбор.ИдентификаторПользовательскойНастройки              = "Отбор";
	ТекущиеНастройки.Порядок.ИдентификаторПользовательскойНастройки            = "Порядок";
	ТекущиеНастройки.УсловноеОформление.ИдентификаторПользовательскойНастройки = "УсловноеОформление";

	// Перенос пользовательских настроек в основные		
	Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(Настройка);
	Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Отчет.КомпоновщикНастроек.ПолучитьНастройки());	
КонецПроцедуры

Процедура ЗаполнитьЭлементОформления(ЭлементНастройки,Параметр,Значение,Представление)
    
    НовыйЭлемент = ЭлементНастройки.Элементы.Добавить();
	НовыйЭлемент.Представление = Представление;
	НовыйЭлемент.Оформление.УстановитьЗначениеПараметра(Параметр,Значение);
	
КонецПроцедуры

Процедура ЗаполнитьЭлементОтбора(ЭлементНастройки,Использование,ВидСрав,ИмяПоля,ЗначениеОтбора)
	
    НовыйЭлемент = ЭлементНастройки.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	    
    НовыйЭлемент.Использование  = Использование;
    НовыйЭлемент.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных(ИмяПоля);
    НовыйЭлемент.ВидСравнения   = ВидСрав;
    НовыйЭлемент.ПравоеЗначение = ЗначениеОтбора;
    
КонецПроцедуры

Процедура ЗаполнитьЭлементПорядка(ЭлементНастройки,Использование,Поле,ТипУпорядочивания)
    
    НовыйЭлемент = ЭлементНастройки.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
    
    НовыйЭлемент.Использование  	= Использование;
    НовыйЭлемент.Поле				= Новый ПолеКомпоновкиДанных(Поле);
    НовыйЭлемент.ТипУпорядочивания	= ТипУпорядочивания;
    
КонецПроцедуры

Процедура ДобавитьГруппировку(Отчет,Поле,Использование,Представление,ТипГруппировки)
	
			НоваяСтрока = Отчет.Группировка.Добавить();
			НоваяСтрока.Поле           = Поле;
			НоваяСтрока.Использование  = Использование;
			НоваяСтрока.Представление  = НСтр("ru = '"+Представление+"'");
			НоваяСтрока.ТипГруппировки = ТипГруппировки;	
	
КонецПроцедуры


////////////////////////////////////////////////////////////­////////////////////
// Преобразователи данных

Функция СформироватьHTMLизРезультата(ТабДокумент)
	
	//ВызватьИсключение ЗначениеВСтрокуВнутр(ТабДокумент);
	Попытка
		имяФайла = ПолучитьИмяВременногоФайла( "html" );
		ТабДокумент.Записать( имяФайла, ТипФайлаТабличногоДокумента.HTML5 );
		
		Текст = Новый ЧтениеТекста( имяФайла, КодировкаТекста.UTF8);
		ТекстHTML = Текст.Прочитать();
		//ТекстHTML = "";
		//Для НомерСтроки=1 по 2797+22+22+22+22+22 Цикл
		//	 ТекстHTML = ТекстHTML + Текст.ПрочитатьСтроку() + Символы.ПС;
		//КонецЦикла;
		
		Текст.Закрыть();
		УдалитьФайлы( имяФайла );
	Исключение
		ВызватьИсключение СобратьСообщениеОбОшибке(ИнформацияОбОшибке());
	КонецПопытки;

	Возврат ТекстHTML;
	
КонецФункции

Функция СформироватьJSONизРезультата(данные)
	
	массивСтруктур = Новый Массив;     		
	колонки = данные.Колонки;
		
	Для каждого цСтрока Из данные Цикл      			
		структ = Новый Структура;   			
		Для каждого цКолонка Из колонки Цикл 				
			значение = цСтрока[цКолонка.Имя];				
			типЗначения = ТипЗнч( значение );				
			Если типЗначения = Тип("Булево")
				ИЛИ типЗначения = Тип("Строка")
				ИЛИ типЗначения = Тип("Дата")
				ИЛИ типЗначения = Тип("Число") Тогда 					
				структ.Вставить( цКолонка.Имя, значение ); 					
			Иначе 					
				структ.Вставить( цКолонка.Имя, Строка( значение ) );					
			КонецЕсли;				
		КонецЦикла;
		массивСтруктур.Добавить( структ );
	КонецЦикла;
		
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON( ЗаписьJSON, массивСтруктур );
    Возврат ЗаписьJSON.Закрыть();
КонецФункции


////////////////////////////////////////////////////////////­////////////////////
// Проверочные и поисковые функции 

Функция ПравоНаПросмотр(ЛюбаяСсылка)         // НЕ ИСПОЛЬЗУЮТСЯ
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
	               |	ИдентификаторыОбъектовМетаданных.Ссылка
	               |ИЗ
	               |	Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыОбъектовМетаданных
	               |ГДЕ
	               |	ИдентификаторыОбъектовМетаданных.Ссылка = &Ссылка";  
	Запрос.УстановитьПараметр("Ссылка", ЛюбаяСсылка );
	
	Если Запрос.Выполнить().Пустой() Тогда
		Возврат Ложь;
	КонецЕсли;
	Возврат Истина;
КонецФункции

Функция ПоискПоНоменклатуре(СтрокаПоиска)
	Запрос = Новый Запрос;
	
	Запрос.УстановитьПараметр("СтрокаПоиска1","%" + СтрокаПоиска + "%"); // Содержит
	Запрос.УстановитьПараметр("СтрокаПоиска2",СтрокаПоиска + "%");       // Начинается
	Запрос.УстановитьПараметр("СтрокаПоиска3","%" + СтрокаПоиска);       // Заканчивается
	
	Запрос.Текст = "ВЫБРАТЬ
					| 	Ссылка
					| ИЗ
					| 	Справочник.Номенклатура
					| ГДЕ
					|   (Услуга = ЛОЖЬ И ЭтоГруппа = ЛОЖЬ )
					|	И (
					| 		Артикул ПОДОБНО &СтрокаПоиска1 ИЛИ
					|   	Наименование ПОДОБНО &СтрокаПоиска1 ИЛИ
					|   	НаименованиеПолное ПОДОБНО &СтрокаПоиска1 ИЛИ
					| 		Артикул ПОДОБНО &СтрокаПоиска2 ИЛИ
					|   	Наименование ПОДОБНО &СтрокаПоиска2 ИЛИ
					|   	НаименованиеПолное ПОДОБНО &СтрокаПоиска2 ИЛИ
					| 		Артикул ПОДОБНО &СтрокаПоиска3 ИЛИ
					|   	Наименование ПОДОБНО &СтрокаПоиска3 ИЛИ
					|   	НаименованиеПолное ПОДОБНО &СтрокаПоиска3
					|   )"; 
					
	Результат = Запрос.Выполнить();
	
	Если Результат.Пустой() Тогда
		Возврат неопределено;
	Иначе
		Результаты = Результат.Выгрузить();
		Значение = Новый СписокЗначений;
		Значение.ЗагрузитьЗначения(Результаты.ВыгрузитьКолонку("Ссылка"));
		
		Возврат Значение;
	КонецЕсли;
	
КонецФункции
Показать
Прикрепленные файлы:
HTTP сервис - формирователь отчетов.cfe
user1316759; sml; user792355; igor_L; +4 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот