Имя: Пароль:
1C
1С v8
Выполнение отчета СКД через COM. Не получается :(
0 fisher
 
04.05.12
14:29
Пытаюсь программно сформировать отчет СКД в другой базе через COM.
Застопорился в самом начале - на получение схемы из макета.
ПолучитьМакет(), ежели строковое название макета сую - ругается на неверное значение параметра. Ежели ссылку метаданных на макет - долго тупит а потом вываливает исключение вида
"Ошибка при выполнении запроса POST к ресурсу ..." (там в дебрях 54-я ошибка дальше, т.е. скорее всего из-за тайм-аута).
Кто-нибуть пытался подобное делать? Как можно исхитриться?
1 AlexTim03
 
04.05.12
14:36
А зачем СКД на той стороне? Выбери там данные запросом в плоскую таблицу, таблицу сюда получаешь, и здесь уже таблицу загоняешь в СКД как внешние источники данных, а далее используешь/рисуешь свой СКД, который выводишь. Единственное, естественно ссылки работать не будут
2 fisher
 
04.05.12
14:49
(1) В моей ситуации удобней именно через СКД (если это вообще реально).
3 gavrikprog
 
04.05.12
19:06
в конце книжки Хрусталевой есть что-то похожее.
Пользоваться не доходилось, хотя интересно
4 Asmody
 
04.05.12
19:21
(0) сделать в другой базе функцию в модуле внешнего соединения, которая тебе сформирует всё и выплюнет готовый табличный документ, не?
5 fisher
 
04.05.12
19:25
(4) Постепенно к подобному и склоняюсь... Менее жесткие варианты канать не хотят.
Даже это v8: Как выполнить произвольный код 1С через COM-соединение? не взлетает.
Только зачем же в модуле внешнего соединения? Можно просто в общем модуле...
6 Адинэснег
 
04.05.12
19:25
(0) на стороне ком-сервера выгрузи табличный документ в html, получи текст html
7 Адинэснег
 
04.05.12
19:26
или ваще двоичные данные передай
8 gavrikprog
 
04.05.12
19:26
мой самый правильный вариант - вероятность 70 процентов.
5 минут назад уже протестировал
9 fisher
 
04.05.12
19:27
(6) Да не в этом затык.
10 Лоботряс
 
04.05.12
19:32
посмотри мой пост в теме v8: Как выполнить произвольный код 1С через COM-соединение?
и еще туда же

// Записать массив в строку XML
Функция МассивВСтрокуXML(Массив) Экспорт
   
   // Создадим объект для записи XML
   ЗаписьXML = Новый ЗаписьXML;
   
   // Укажем необходимость вывода в строку
   ЗаписьXML.УстановитьСтроку();
   
   // Запишем начальный элемент массива
   ЗаписьXML.ЗаписатьНачалоЭлемента("array");
   
   // Переберем элементы массива
   Для Каждого Элемент Из Массив Цикл
       
       // Выведем элемент массива
       СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Элемент);
       
   КонецЦикла;
   
   // Запишем конечный элемент массива
   ЗаписьXML.ЗаписатьКонецЭлемента();
   
   // Закончим вывод
   Возврат ЗаписьXML.Закрыть();

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

// Загрузить массив из строки XML
Функция МассивИзСтрокиXML(Строка) Экспорт
   
   // Создадим объект для чтения значения
   ЧтениеXML = Новый ЧтениеXML;
   
   // Установим строку, из которой будем читать значние
   ЧтениеXML.УстановитьСтроку(Строка);
   
   // Создадим массив, в который будем считывать
   Массив = Новый Массив;
   
   // Считаем элемент начала массива
   ЧтениеXML.Прочитать();
   
   // Считаем начало перовго элемента
   ЧтениеXML.Прочитать();
   
   // Пока не прочитан конечный элемент
   Пока ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента Цикл
       
       // Прочитаем значение
       Значение = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
       
       // Поместим считанное значение в массив
       Массив.Добавить(Значение);
       
   КонецЦикла;
       
   // Чтение закончено - вернем считанный массив
   Возврат Массив;
   
КонецФункции
11 fisher
 
04.05.12
19:38
(10) Посмотрел. Спасибо. Но вывод таки такой, что компоновку нужно полностью проводить от и до на стороне com-сервера (допиливая под это конфу). Прямо работать с СКД через com-соединение не получается.
12 gavrikprog
 
04.05.12
19:42
(11) я тут, я тут... =)

Макет из нашей базы 1 по Ком передаем в базу 2, после виполнения отчета в базе 1 получаем табличный документ.
13 gavrikprog
 
04.05.12
19:43
итого трудозатрат - 15 минут. Копай дальше
14 Лоботряс
 
04.05.12
19:49
(11)не нифига, все можно делать без допиливания конфы. Да, макет передал, на той стороне создал ПрцессорКомпоновки, выполнил, вернул результат.
Мой пример может не совсем удачный но другого нет...
15 fisher
 
04.05.12
19:51
Пока я не увидел примера без допиливания конфы. А у самого не вышло.
16 fisher
 
07.05.12
16:05
По итогу ограничился простенькой функцией в общем модуле (с указанием одних только параметров - больше пока и не нужно). Сериализацию делаю как Лоботряс подсказал. И вообще спасибо ему :)

Функция ПолучитьСериализованныйРезультатПростогоОтчетаСКД(ИмяОтчета, Параметры) Экспорт
   
   Отчет = Отчеты[ИмяОтчета].Создать();
   
   Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ЭтоПолучениеСериализованногоРезультата");
   
   Для Каждого Параметр Из Параметры Цикл
       ПараметрыДанных = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы;
       ПараметрДанных = ПараметрыДанных.Найти(Параметр.Ключ);
       ПользовательскийПараметрДанных = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ПараметрДанных.ИдентификаторПользовательскойНастройки);
       ПользовательскийПараметрДанных.Значение = ДесериализацияXML(Параметр.Значение);
   КонецЦикла;
   
   ТаблицаРезультата = Новый ТабличныйДокумент;
   Отчет.СкомпоноватьРезультат(ТаблицаРезультата);
   
   Возврат СериализацияXML(ТаблицаРезультата);
   
КонецФункции
17 fisher
 
07.05.12
16:08
Хорошо что запостил. Увидел что лишнюю строчку надо из цикла вынести...
18 n koretsky
 
07.05.12
16:18
я делал с помощью хранилища значений.
но без функции на той стороне не обойтись.