Здравствуйте.

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

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

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

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

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

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

    СхемаКомпоновкиДанных = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

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

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

    таблица = Новый ТабличныйДокумент;
    ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки( Настройки );
    ОтчетОбъект.СкомпоноватьРезультат( таблица );

    Возврат таблица;
```
---
В общем я добился работы HTTP сервиса.

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

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

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

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

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

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

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

Исходный код. Отличный пример как программно формировать настройки и СКД. Собирал по крупицам по всему интернету.

```1c
    Функция ПолучениеОтчета(Запрос)

    запрос = ОбработатьПараметрыЗапроса(Запрос);

    Если запрос.ИмяОтчета = "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
    | )";

    Результат = Запрос.Выполнить();

    Если Результат.Пустой() Тогда
    Возврат неопределено;
    Иначе
    Результаты = Результат.Выгрузить();
    Значение = Новый СписокЗначений;
    Значение.ЗагрузитьЗначения(Результаты.ВыгрузитьКолонку("Ссылка"));

    Возврат Значение;
    КонецЕсли;

    КонецФункции
```
---
нафига Вам умные существа из 1С запилили кучу полезного? Чтобы городить огород?
```1c
    Отчет = отчеты.Отчет1.Создать();
    Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Отчет.СхемаКомпоновкиДанных.ВариантыНастроек[1].Настройки);
    Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Период", ТекущаяДата());
    Отчет.СкомпоноватьРезультат(Результат);
```

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

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

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

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

В результате пусто. И нет никаких ошибок.
---
параметры правильные передавайте. Что за "типовой"? Нахрена инициализировать настройки? С какого хрена дата окончания началом дня? Ответьте на все подобные вопросы - и будет Вам счастье.
---
параметры правильные передавайте стараюсь... если не правильно передаю, то ругается.

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

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

(6) Ответьте на все подобные вопросы - и будет Вам счастье. ну как-то вот нет пока счастья
---
пусто совсем, или макет выводит, но без данных по ресурсам?
---
пусто совсем, или макет выводит, но без данных по ресурсам?
из всей кучи стандартных отчетов выводится в макет только 2 - самые простые и бесполезные.

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

Все остальные пустые... я даже вывожу результат через ЗначениеВСтрокуВнутр и там сплошные нули.
---
для начала попробовать просто внешней обработкой программно получить отчет. Если получится, то смотреть права внешнего пользователя.
---
Программно проверяется что есть разрешения, на всякий случай

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

    Если Запрос.Выполнить().Пустой() Тогда
    Возврат Ложь;
    КонецЕсли;
    Возврат Истина;
    КонецФункции
```

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

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

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

```1c
    МакетКомпоновки = КомпоновщикМакета.Выполнить(МакетСКД,НастройкиСКД,ДанныеРасшифровки);

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);

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

    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
```
---
У меня вот такой код

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

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

    СхемаКомпоновкиДанных = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

    ДанныеРасшифровки = неопределено;

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();

    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,СхемаКомпоновкиДанных.НастройкиПоУмолчанию,ДанныеРасшифровки);

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);

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

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

Но не выводится отчет.. в Результате пустые значения.
При чем если взять другой отчет, где нет ни группировок, ни показателей, то все работает, например Шахматная ведомость. Но в остальных отчетах есть показатели и группировки и я так подозреваю из-за них и не работает
---
Вот два отчета работающих с горем пополам.

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

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

    ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
    ПолеГруппировки.Использование = Истина;
    ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Счет");
    ПолеГруппировки.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Иерархия;
```
---
И кстати СКД довольно таки капризный инструмент
она может не работать на пустом месте и это может быть связано чисто с правами.
Хотя и не факт. Сама я сейчас с СКД особо не работаю, подзабыла уже.
Попробуйте сначала обычный отчет, не СКД - работает или нет через сервис.
Я только не поняла что означает Программное создание отчета в HTTP сервисе. В опубликованной базе 1с в браузере формируете отчет или чтото ещё?
---
да я вот прям сейчас попробую создать внешнюю обработку, только вот что-то не получается. С 1С не знаком.

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

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

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

Мне самое главное сделать чтобы работал один отчет - ОСВ, из него можно любые данные дергать. Остальные отчеты не нужны.
---
- У меня не работает Ваша программа!
- А у меня все работает.
---
Вот есть аналог

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

делаю тоже самое. Но у меня отчеты не выходят
---
Интересно, надо будет посмотреть. Сейчас на работе.
В посте по ссылке сделано через расширение - это не обязательно.

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

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

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

простые отчеты работают, сложные не хотят.
---
а если простой работающий отчет усложнить тогда будет работать?
Просто добавить группировку в отчете?
---
вот этого не умею... Не смотря на то что 15 лет опыта c PSQL, синтаксис 1С меня приводит в ступор как зайца на фару. Да и вообще опыта с 1С нету
---
и работает ли на обычной демо последней версии БП для России
---
аботает ли на обычной демо последней версии БП для России я свой HTTP сервис написал... могу выгрузить как расширение и дать глянуть. Как на других конфигурациях работать будет - не в курсе. Там в коде надо будет изменить ссылочность и только.

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

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

Вот чтото мне захотелось попробовать даже :)
Впереди бессонные ночи наверное))
---
не очень то еще востребованная еще как востребованная... просто никто не понимает или не осознает.

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

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

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

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

    Возврат РезультатВыполнения.Результат;
```

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

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

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

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

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

    //ПараметрыОтчета.Вставить("СписокСтруктурныхЕдиниц" , СписокСтруктурныхЕдиниц);
    //ПараметрыОтчета.Вставить("СписокПодразделений" , СписокПодразделений);
    //ПараметрыОтчета.Вставить("СписокВладельцевГоловныхПодразделений" , СписокВладельцевГоловныхПодразделений);
    ПараметрыОтчета.Вставить("ВыводитьЗаголовок" , Истина);
    ПараметрыОтчета.Вставить("ВыводитьПодписи" , Ложь);
    ПараметрыОтчета.Вставить("ВыводитьПодписиРуководителей" , Ложь);

    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    ПараметрыОтчета.Вставить("ДанныеРасшифровки" , ДанныеРасшифровки);
    ПараметрыОтчета.Вставить("МакетОформления" , "МакетОформленияОтчетов");
    //ПараметрыОтчета.Вставить("СхемаКомпоновкиДанных" , ПолучитьИзВременногоХранилища(СхемаКомпоновкиДанных));
    ПараметрыОтчета.Вставить("СхемаКомпоновкиДанных" , Отчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"));
    ПараметрыОтчета.Вставить("ИдентификаторОтчета" , "ОборотноСальдоваяВедомостьПоСчетуТиповой");
    ПараметрыОтчета.Вставить("НастройкиКомпоновкиДанных" , Отчет.КомпоновщикНастроек.ПолучитьНастройки());
    ПараметрыОтчета.Вставить("НаборПоказателей" , Отчеты[ПараметрыОтчета.ИдентификаторОтчета].ПолучитьНаборПоказателей());
```
---
только шапка пока, потому что с СКД надо разобраться и сформировать её аналогично как в отчете. Тогда думаю заработает.
---
Когда данные переносятся с клиента на сервер и обратно то они это делают через хранилище. если модуль объекта то автоматом &НаСервере в форме объекта уже прямо указывает &НаКлиенте или &НаСервере
---
похоже что эта тема новая и не очень то еще востребованнаяТема сия не новая и достаточно востребованная в больших базах, ибо вынесение отчетов во внешнюю базу данных резко разгружает SQL-сервер от блокировок. При количестве пользователей больше 50-ти только так и следует поступать, перенаправляя формирование отчетов из текущей базы в снапшот (который 10 сек делается) или копию (от получаса). Я такое делал на прошлой работе - при формировании отчета дергался сервис (правда не HTTP, а SOAP, но сути это не меняет) другой базы, в которой данный отчет с данными параметрами и формировался. Любой отчет на СКД (навороченный или простой) сериализовался, передавался со всеми настройками в сервис, там формировался и передавался назад для отображения. Так работало все на 100%, включая расшифровку. Любой отчет на СКД превращался во внешний путем добавления к нему всего пяти строк. Для простого случая формирования отчета работает то, что написано в (4). Главное - загрузить нужный вариант настроек и установить верные параметры (например, если вместо контрагента установишь в параметр физлицо, то не жди, что отчет что-либо вернет).
---
я с такими большими базами не работала)
но это верно - настройки компоновки данных сделали неявно сложно, пока разберешься
или не те настройки или не те загружаешь
---
после 12 часов непрерывных попыток и тестов наконец удалось создать отчет...
---
В общем долго и упорно сидел и дебажил сам сервер 1С.

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

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

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

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

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

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

Ошибка возникает когда происходит запись ТабличногоДокумента

```1c
    имяФайла = ПолучитьИмяВременногоФайла( "html" );
    ТабДокумент.Записать( имяФайла, ТипФайлаТабличногоДокумента.HTML5 );
```

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

```1c
    колонки = ТаблицаЗначений.Колонки;
    массивСтруктур = Новый Массив;

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

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

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

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

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

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

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

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

Исходный код. Отличный пример как программно формировать настройки и СКД. Собирал по крупицам по всему интернету.

```1c
    Функция ПолучениеОтчета(Запрос)

    запрос = ОбработатьПараметрыЗапроса(Запрос);

    Если запрос.ИмяОтчета = "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
    | )";

    Результат = Запрос.Выполнить();

    Если Результат.Пустой() Тогда
    Возврат неопределено;
    Иначе
    Результаты = Результат.Выгрузить();
    Значение = Новый СписокЗначений;
    Значение.ЗагрузитьЗначения(Результаты.ВыгрузитьКолонку("Ссылка"));

    Возврат Значение;
    КонецЕсли;

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