Имя: Пароль:
1C
1С v8
Отчет с помощью Com - соединения (в базе УПП, и УТ)
0 Артем12345
 
26.08.16
04:32
Здравствуйте! Выручайте, не могу понять, что не так (с Com соединениями столкнулся впервые). Задача состоит в том, что нужно из базы УТ выдернуть реквизит "Направление" из справочника Партнеры, в базу УПП, с помощью Com соединения и вывести в отчет.
Партнеры в базах в основном совпадают, но не все.
Отчет делаю через СКД. Создал два набора данных: 1)Запрос (где данные из УПП, выводятся все норм. Поля: Партнер; ТорговыйАгент; Документ; СуммаДокумента.) 2) Объект (Имя объекта, содержащего данные назвал "ВнешниеДанные", и добавил
поля: Партнер и Направление. СвязиНаборовДанных сделал по Партнеру. Если в цикле Запроса делаю (//Сообщить(База.String(Выборка.Партнер));//Сообщить(База.String(Выборка.Направление));), данные сообщаются все верно.
НО в отчет почему то выводятся пустые колонки (Если убираю Набор данных - Запрос, то выводится во всех строках "COM Объект". Помогите разобраться, буду рад любой информации. Заранее благодарю за помощь!!!



Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    V82=Новый COMОбъект("V82.COMConnector");
    Попытка
        База=V82.Connect("Srvr=***;Ref=***;Usr=***;Pwd=***");
    Исключение
        Инфо = ИнформацияОбОшибке();
        Сообщить("Описание='" + Инфо.Описание + "'"+Символы.ПС+"Не могу открыть базу УТ");
        Возврат;
    КонецПопытки;
    
    ВнешниеДанные = Новый ТаблицаЗначений;
    ВнешниеДанные.Колонки.Очистить();
    ВнешниеДанные.Очистить();
    
    ВнешниеДанные.Колонки.Добавить("Партнер");
    ВнешниеДанные.Колонки.Добавить("Направление");
    
    Состояние("Получение и обработка данных внешней базы...");
    
    Попытка
        
        ТекстЗапроса = "ВЫБРАТЬ
        |    Партнеры.Ссылка КАК Партнер,
        |    Партнеры.Направление КАК Направление
        |ИЗ
        |    Справочник.Партнеры КАК Партнеры";
        
        Запрос = База.NewObject("Запрос");
        Запрос.Текст = ТекстЗапроса;      
        
        Выборка=Запрос.Выполнить().Выбрать();
        
        Пока Выборка.Следующий() Цикл
            
            НовСтр = ВнешниеДанные.Добавить();
            ЗаполнитьЗначенияСвойств(НовСтр,Выборка);
                        
        КонецЦикла;
        
    Исключение
        Сообщить(ОписаниеОшибки(),СтатусСообщения.Внимание);
    КонецПопытки;
    
    База = Неопределено;
    
    
    Если ВнешниеДанные.Количество()=0 Тогда
        Предупреждение("Внешние данные не загружены или отсутствуют...");
        Возврат;
    КонецЕсли;
    ВнешниеНаборыДанных=Новый Структура;
    ВнешниеНаборыДанных.Вставить("ВнешниеДанные",ВнешниеДанные);
    КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных;
    Настройки=КомпоновщикНастроек.ПолучитьНастройки();
    МакетКомпоновки=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки,ДанныеРасшифровки);
    
    ПроцессорКомпоновки=Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,ВнешниеНаборыДанных,ДанныеРасшифровки);
    
    
    ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    
    ПроцессорВывода.НачатьВывод();
    
    Пока Истина Цикл
        ЭлементРезультата=ПроцессорКомпоновки.Следующий();
        Если ЭлементРезультата=Неопределено Тогда
            Прервать;
        Иначе
            ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
        КонецЕсли;
    КонецЦикла;
    
    ПроцессорВывода.ЗакончитьВывод();
    
    ДокументРезультат.ОтображатьСетку=Ложь;
    ДокументРезультат.ОтображатьЗаголовки=Ложь;
    ДокументРезультат.Показать();
    
        
КонецПроцедуры
1 DiMel_77
 
26.08.16
05:41
У тебя таблица значений заполнена COM объектами. Ты либо делай сопоставление к объектам в текущей базе, либо заполняй таблицу примитивными типами (например Партнер.Наименование).
2 craxx
 
26.08.16
06:08
(0) Крайне не рекомендую. На больших объемах данных будет ад. Это не считая того, что тебе все надо приводить к примитивным типам, либо создавать свои элементы справочников в той базе где отчет запускаешь.
3 impulse9
 
26.08.16
06:10
(0) получай в запросе в COM-соединении только примитивные типы (строки, числа)
Сопоставление можно делать по кодам элементов
4 Рэйв
 
26.08.16
06:11
Сделай реквизит Направление в УПП и заполни его один раз для партнеров из УТ, хотябы через тот же COM. Тогда не придется городить огород с пдключением - будешь все на месте брать
5 Артем12345
 
26.08.16
07:45
(1), (3) - Большое спасибо, привел поля Партнер  и Направление к примитивным данным, всё отобразилось прекрасно. Единственное, в таком случае нельзя расшифровать Партнера(
(2),(4)  - Это всё понятно, только я рядовой программист в крупной организации. Мне сказали, что нужно сделать именно через COM-соединение.
6 Рэйв
 
26.08.16
07:50
(5)Меньше слушай что "тебе сказали" и больше думай своей головой. А то так и останешься "рядовым".
7 DiMel_77
 
26.08.16
07:52
(5) Правильнее необходимо конечно заполнять в таблицу ссылки из текущей базы. В простейшем случае это поиск по коду, но правильнее делать закладку с синхронизируемыми значениями и использовать регистр сведений "СоответствияОбъектовИнформационныхБаз".
8 2083
 
26.08.16
07:55
com-соединение - это зло и долго... лучше использовать ws
9 gigi789
 
26.08.16
08:29
(8) лучше быть молодым и богатым, чем старым и больным.  Хорошие советы не зная не структуру сети не уровень задачи не частоту выполнения.
Например если отчет выполняется раз в месяц, то всем в принципе плевать будет он делаться 15 сек или о ужас 1.5 минуты.
Если нет поднятого веб сервера то подымать ради 1 отчета тоже вопрос.
И много еще всяких если...
10 2083
 
26.08.16
08:39
(9) все так говорят: 1 отчет всего 1
Ошибка? Это не ошибка, это системная функция.