Предположим, что мы создаём отчёт, в котором должна быть какая-то информация из внешней базы.

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

Первым делом напишем функцию, в которой собственно и выполняется подключение к внешней информационной базе. Функцию размещаем в модуле объекта отчёта.

Функция ПолучитьПодключениеКСервернойБД() 
	
	СтрокаСоединения = "Srvr=""srv1"";Ref=""Baza_02"";Usr=""Администратор"";Pwd=""123456"";";
	V83COMConnector= Новый COMОбъект("V83.COMConnector");
	Попытка
		Base1С = V83COMConnector.Connect(СтрокаСоединения);
		Возврат Base1С; 
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
	
КонецФункции

В переменной СтрокаСоединения указывается сервер и имя базы, к которой выполняется подключение; логин и пароль пользователя внешней базы. Разумеется, у этого пользователя должны быть права на внешнее соединение. Если используется платформа 8.2, то вместо "V83.COMConnector" должно быть "V82.COMConnector". И, конечно, компонент "COM-соединение" должен быть установлен на сервере, где находится внешняя информационная база. Компонент поставляется в составе дистрибутива "Сервер 1С:Предприятия 8".

Далее, создадим функцию, возвращающую текст запроса, который мы будем использовать во внешней базе.

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

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

Наконец, в модуле отчёта создадим процедуру, формирующую результат отчёта, из которой вызовем созданные ранее функции.

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

	Запрос.Текст = ТекстЗапросаВнешнейБазы();
	
	Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
	Запрос.УстановитьПараметр("КонецПериода", КонецПериода);

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

	стрРезультатЗапроса = Соединение.ЗначениеВСтрокуВнутр(РезультатЗапроса);
	ДанныеВнешнейБазы = ЗначениеИзСтрокиВнутр(стрРезультатЗапроса);
	
	// ...
		
КонецПроцедуры

Для создания запроса во внешней базе используется метод NewObject("Запрос"). Результат запроса, который мы получаем из внешней базы, имеет тип значения "Com объект". Для того, чтобы получить из результата запроса тип значения "Таблица значений", можно применить следующую конструкцию:

стрРезультатЗапроса = Соединение.ЗначениеВСтрокуВнутр(РезультатЗапроса);
ДанныеВнешнейБазы = ЗначениеИзСтрокиВнутр(стрРезультатЗапроса);

В результате мы получаем таблицу значений с данными из внешней информационной базы.

Комментарии

  • pavlo 18.09.2018 13:59
    У меня по второму варианту не получилось. При такой настройке появилась колонка построчно со словами названия колонки ресурса.

    Подробнее...

     
  • Altavista- 17.09.2018 20:51
    Не бесспорное решение: 1. В регистр логичнее добавить 2й ресурс ("вТрансфертныхЦенах"); 2. РС "Наценки"? Однозначно, нет. Это реквизит справочника; 3. Реквизита "Контрагент" в условии задачи тоже нет и ...

    Подробнее...

     
  • Андрей 02.08.2018 09:55
    Большое спасибо! По "Варианту 2": в выбранных полях группировки колонок (у меня их несколько) кроме поля самой колонки пришлось добавить и ресурс.

    Подробнее...