Внутри модуля спрограммировал 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
| )";
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат неопределено;
Иначе
Результаты = Результат.Выгрузить();
Значение = Новый СписокЗначений;
Значение.ЗагрузитьЗначения(Результаты.ВыгрузитьКолонку("Ссылка"));
Возврат Значение;
КонецЕсли;
КонецФункции
Здесь:
1. "Отчет1" - имя отчета;
2. Вариант настроек выбирается 2-й (второй), укажете [0] - будет первый;
3. "Период" - это параметр отчета.
4. Результат - это реквизит формы типа "Табличный документ".
Если нужно в произвольный ТД поместить, то напишите "Результат = Новый ТабличныйДокумент;"
(5) параметры правильные передавайте. Что за "типовой"? Нахрена инициализировать настройки? С какого хрена дата окончания началом дня? Ответьте на все подобные вопросы - и будет Вам счастье.
ну потому что изначально нужно все отдавать по сервису в виде таблицы значений. Но так как не заработало, то я попытался вытащить хотя бы в табличном варианте. Но это тоже не работает
Попробовал по вашему примеру, и даже установил в макете отчета значения по умолчанию.
ОтчетОбъект = Отчеты.ОборотноСальдоваяВедомостьПоСчетуТиповой.Создать();
СхемаКомпоновкиДанных = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
ДанныеРасшифровки = неопределено;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,СхемаКомпоновкиДанных.НастройкиПоУмолчанию,ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);
Результат = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
СообщениеОбОшибке = НСтр(
"ru = '" + ЗначениеВСтрокуВнутр(Результат) + "'");
ВызватьИсключение СообщениеОбОшибке;
Показать
Но не выводится отчет.. в Результате пустые значения.
При чем если взять другой отчет, где нет ни группировок, ни показателей, то все работает, например Шахматная ведомость. Но в остальных отчетах есть показатели и группировки и я так подозреваю из-за них и не работает
И кстати СКД довольно таки капризный инструмент
она может не работать на пустом месте и это может быть связано чисто с правами.
Хотя и не факт. Сама я сейчас с СКД особо не работаю, подзабыла уже.
Попробуйте сначала обычный отчет, не СКД - работает или нет через сервис.
Я только не поняла что означает Программное создание отчета в HTTP сервисе. В опубликованной базе 1с в браузере формируете отчет или чтото ещё?
Я только не поняла что означает Программное создание отчета в HTTP сервисе. В опубликованной базе 1с в браузере формируете отчет или чтото ещё?
во-во... я бы давно нанял программиста и заплатил чтобы работало, только никто не понимает что я хочу сделать. Приходило трое человек, делали круглые глаза, обещали что подумают и так никто не перезвонил. Поэтому сижу сам сейчас пытаюсь сделать сам.
Я делаю аналогичное. Сервис по сути является внешней обработкой, только вместо вывода на экран клиентской программы он выдает данные в браузер. При чемв браузер выдает так как вы хотите: либо в тестовом варианте, либо в HTML таблице, либо вообще просто скачивается файл.
Мне самое главное сделать чтобы работал один отчет - ОСВ, из него можно любые данные дергать. Остальные отчеты не нужны.
аботает ли на обычной демо последней версии БП для России
я свой HTTP сервис написал... могу выгрузить как расширение и дать глянуть. Как на других конфигурациях работать будет - не в курсе. Там в коде надо будет изменить ссылочность и только.
да и после недели всяких тестов, проб и бессонных ночей хочется все уже бросить... люди даже за деньги не хотят связываться, потому что не сталкивались.. хотя опытному программисту там 10-20 строк написать и все будет работать.
(24) похоже что эта тема новая и не очень то еще востребованная поэтому и не занимались.
группировку сделать не сложно в отчете.
Отчет - основная Схема Компоновки Данных, жмете на лупу закладка настройки
открыть конструктор Настройки тип отчета список - Далее
выбираете поля, далее - выбираете поля группировки. вот и все.
это для простого отчета
Но оборотно сальдовая ведомость не строится по настройкам СКД а формируется программно. разбираться нужно
Вот чтото мне захотелось попробовать даже :)
Впереди бессонные ночи наверное))
еще как востребованная... просто никто не понимает или не осознает.
Например есть CRM система и нужно быстро и оперативно узнать количество товара на складе, допустим. Делаешь HTTP запрос по номенклатуре и вуаля - видишь количество, себестоимость. Это как пример. Либо есть интернет магазин и хочется видеть актуальное количество на складах... без битрикса.
Я через ODATA уже реализовал автоматическое создание счетов, вывожу структуру подчиненности документов, список контактных лиц по контрагенту.. да что угодно. Проблема ODATA в том, что не работает с отчетами. Поэтому попытался реализовать через HTTP-сервис средствами самого 1С.
(28) Когда данные переносятся с клиента на сервер и обратно то они это делают через хранилище. если модуль объекта то автоматом &НаСервере в форме объекта уже прямо указывает &НаКлиенте или &НаСервере
похоже что эта тема новая и не очень то еще востребованная
Тема сия не новая и достаточно востребованная в больших базах, ибо вынесение отчетов во внешнюю базу данных резко разгружает SQL-сервер от блокировок. При количестве пользователей больше 50-ти только так и следует поступать, перенаправляя формирование отчетов из текущей базы в снапшот (который 10 сек делается) или копию (от получаса). Я такое делал на прошлой работе - при формировании отчета дергался сервис (правда не HTTP, а SOAP, но сути это не меняет) другой базы, в которой данный отчет с данными параметрами и формировался. Любой отчет на СКД (навороченный или простой) сериализовался, передавался со всеми настройками в сервис, там формировался и передавался назад для отображения. Так работало все на 100%, включая расшифровку. Любой отчет на СКД превращался во внешний путем добавления к нему всего пяти строк. Для простого случая формирования отчета работает то, что написано в (4). Главное - загрузить нужный вариант настроек и установить верные параметры (например, если вместо контрагента установишь в параметр физлицо, то не жди, что отчет что-либо вернет).
(29) я с такими большими базами не работала)
но это верно - настройки компоновки данных сделали неявно сложно, пока разберешься
или не те настройки или не те загружаешь
В общем долго и упорно сидел и дебажил сам сервер 1С.
Повесил кучу отладчиков и ловил данные, которые передаются между функциями и процедурами. Сравнивал свои сформированные параметры с теми, которые создаются с программном отчете.
Даже пришлось в настройки SQL сервера поставить чтобы он логировал все запросы, потом эти запросы сравнивал и пытался понять что где происходит и как ведет себя 1С и как собирает запросы.
Как тут раньше и сказали, СКД формируется программно и если подсунуть ОсновнаяСхемаКомпоновкиДанных, то 99.9% что ничего не выведется.
В моей конфигурации отчет создается в ОбщемМодуле, куда модуль отчета, формируя настройки отчета, передает данные в ОбщийМодуль и затем извлекает из временного хранилища.
Для реализации сервиса по выводу отчетов в браузер необходимо для каждого нужного отчета в 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
| )";
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат неопределено;
Иначе
Результаты = Результат.Выгрузить();
Значение = Новый СписокЗначений;
Значение.ЗагрузитьЗначения(Результаты.ВыгрузитьКолонку("Ссылка"));
Возврат Значение;
КонецЕсли;
КонецФункции