helpf.pro
Регистрация
 0 
Распечатать

Внешние источники данных

Почему данная возможность вызывает такой интерес? Любой человек, который программировал в 1С при этом достаточно неплохо знаком с SQL и хотя бы в общих чертах знаком с архитектурой и принципами разработки других технологических платформ для бизнес приложений с твердой уверенностью скажет вам - что ему нравится больше всего в 1С. Конечно конструктор запросов - самый удобный и продуманный механизм написания запросов для получения данных из реляционных структур, который я лично когда-либо встречал. А теперь 1С нам предоставили такую замечательную возможность использовать его не только с 1С, но и с любыми другими таблицами. Вот только в эту "бочку мёда" насыпана куча "ложек дёгтя". Обо всём по порядку:

1) Настройка и использование - без "танцев с бубном" не получится
a) Добавляете внешний источник данных - вроде ничего сложного
б) ставите галочку "Выбрать из списка" - обязательно - это нужно чтобы проверить работоспособность уже в начале и избавит от лишних заморочек
в) - обязательно нажимаем "..." - подключение именно ODBC. Не OLEDB как мы все привыкли, а на уровень ниже
title
г) А вот здесь будьте ОЧЕНЬ ВНИМАТЕЛЬНЫ.
title
Это драйвер ODBC - в случае использования клиент-серверной версии он должен обязательно быть на сервере. Если вы ведёте разработку на одной системе, а рабочая версия на другой (как это обычно бывает) убедитесь что вас не ждут сюрпризы. Странная рекоммендация, но выбирайте самый древний или самый общий драйвер в случае если вас не особо заботит скорость и за пределы возможностей стандарта SQL92 вы выходить не намерены. Это обеспечит вам лучшую совместимость. Например для SQL Server 2008 лучшим драйвером будет SQL Server Native Client 11, но рекоммендую выбирать просто SQL Server, иначе этот самый native client придётся устанавливать либо на сервер, либо на все клиентские машины (в случае использования файловой версии), а выигрыша особого для простых задач он не даст.
д) Стандартные диалоги выбора Сервера
title
и БД
title
е) На вопрос сохранения пароля рекомендую ответить "да", иначе так и не получится это дело запустить.
ж) Выбираете таблицу и реквизиты... замечательная возможность - её можно сразу же переименовать так как вам нравится (и реквизиты тоже), при этом в свойствах у вас будут отображаться названия полей источника данных
title
з) А теперь запускаете, открываете конструктор запросов - выбираете тупо все записи из таблицы и ОПА - ошибка. Что делать? Если у вас управляемый интерфейс - заглянуть в меню сервис, а если обычный...
Я лично использовал вот такой код:
Код 1C v 8.х
 Параметры = ВнешниеИсточникиДанных.DAX.ПолучитьОбщиеПараметрыСоединения();
Параметры.АутентификацияСтандартная = Истина;
Параметры.ИмяПользователя = "sa";
Параметры.Пароль = "pas";
Параметры.СтрокаСоединения = "DRIVER={SQL Server};SERVER=servet;UID=sa;PWD=;DATABASE=database";
Параметры.СУБД = "MSSQLServer";

ВнешниеИсточникиДанных.DAX.УстановитьОбщиеПараметрыСоединения(Параметры);
ВнешниеИсточникиДанных.DAX.УстановитьПараметрыСоединенияПользователя(ИмяПользователя(), Параметры);
ВнешниеИсточникиДанных.DAX.УстановитьПараметрыСоединенияСеанса(Параметры);

ВнешниеИсточникиДанных.DAX.УстановитьСоединение();

Может каких-то кусков и не нужно, но это работает.
Выполнить код нужно ОДИН РАЗ. После чего будет нормально подключаться... мистика конечно - зачем это было нужно не понятно...

2) Источники данных только для чтения - Да, чудес не бывает... но иногда так хочется....

3) НЕЛЬЗЯ ИХ ИСПОЛЬЗОВАТЬ ВМЕСТЕ С ВНУТРЕННИМИ ИСТОЧНИКАМИ ДАННЫХ
Меня лично этот факт убил наповал
title
Как же так.... то чего так ждали и уже представляли и облизывались как мы сейчас в одном запросе соединим наши данные с 1С-кой свернём - сгруппируем, вставим в отчет, а не тут то было...
Но естественно опытных людей это не останавливает... какая мысль пришла в голову? Правильно - временные таблицы:

4) НЕЛЬЗЯ ИХ ИСПОЛЬЗОВАТЬ ВМЕСТЕ С ВРЕМЕННЫМИ ТАБЛИЦАМИ

title
А вот это уже не похоже на технологические трудности, а очень смахивает на то что нам хотят "чтобы жизнь раем не казалась" сделать ).

5) Можно использовать только в соединениях СКД
Для тех кто не знает - это в СКД на вкладке "Связи наборов данных". Часто вы ими пользуетесь? Удобно? Видимо так нас хотят принудить к использованию их чаще. Вот только там есть колонка "Условие связи" и "Параметр связи". Ни в одной типовой конфигурации не нашел примера их использования, в документации и у Хрусталевой тоже как-то всё не прозрачно. Кто-нибудь сможет мне объяснить как работает "условие связи". Если там написать РеквизитИсточника = РевизитПриемника это не работает. Конечно условие можно записать в поле "Выражение" - в большинстве случаев этого хватает... вот только как-то не очень просто получается.

Итого ранее эта задача решалась где-то так:
Код 1C v 8.х
 Функция ИнициализироватьИсточникДанных()

ДатаНач = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[5].Значение;
ДатаКон = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[4].Значение;
Если ДатаКон > '20100101' Тогда
ДатаКон = '20100101';
КонецЕсли;

КЧ = Новый КвалификаторыЧисла(15,2);
КС = Новый КвалификаторыСтроки(255);

МассивЧисло = Новый Массив();
МассивЧисло.Добавить(Тип("Число"));

МассивСтрока = Новый Массив();
МассивСтрока.Добавить(Тип("Строка"));

МассивДата = Новый Массив();
МассивДата.Добавить(Тип("Дата"));

//В таблицу будем заполнять бухгалтерскую себестоимость
ТипЧисло = Новый ОписаниеТипов(МассивЧисло,,КЧ);
ТипСтрока = Новый ОписаниеТипов(МассивСтрока,,КС);
ТипДата = Новый ОписаниеТипов(МассивДата);

//таблица для загрузки данных из SQL
ТЗ = Новый ТаблицаЗначений();
ТЗ.Колонки.Добавить("НоменклатураКод", ТипСтрока);
ТЗ.Колонки.Добавить("Qnty", ТипЧисло);
ТЗ.Колонки.Добавить("Период", ТипДата);

ТЗ.Индексы.Добавить("Период");

//Подключаемся к SQL
СтрокаПодключения = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Pwd=;Data Source=;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=Reports";
Connection = Новый COMОбъект("ADODB.Connection");
Command = Новый COMОбъект("ADODB.Command");
RecordSet = Новый COMОбъект("ADODB.RecordSet");
Дата = "";
Попытка
Connection.Open(СокрЛП(СтрокаПодключения));
Command.ActiveConnection = Connection;
Command.CommandText = "S_elect * from PH where period >= '" + Строка(Формат(ДатаНач, "ДФ=ггггММдд")) + "' and period <= '" + Строка(Формат(ДатаКон, "ДФ=ггггММдд")) + "'";
RecordSet = Command.Execute();
RecordSet.MoveFirst();
Исключение
Возврат ТЗ;
КонецПопытки;

Пока RecordSet.EOF = Ложь Цикл
Строка = ТЗ.Добавить();
Строка.НоменклатураКод = RecordSet.Fields(RecordSet.Fields.Item(1).Name).Value;
Строка.Qnty = RecordSet.Fields(RecordSet.Fields.Item(12).Name).Value;
Строка.Период = RecordSet.Fields(RecordSet.Fields.Item(13).Name).Value;
RecordSet.MoveNext();
КонецЦикла;

Запрос = Новый Запрос();
ВрТаблица = Новый МенеджерВременныхТаблиц();
Запрос.МенеджерВременныхТаблиц = ВрТаблица;
Запрос.УстановитьПараметр("врТаблицаДанных", ТЗ);
Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
Запрос.Текст = "ВЫБРАТЬ
| врТаблицаДанных.НоменклатураКод,
| врТаблицаДанных.Qnty,
| врТаблицаДанных.Период
|ПОМЕСТИТЬ ТаблицаДанных
|ИЗ
| &врТаблицаДанных КАК врТаблицаДанных
|ГДЕ
| врТаблицаДанных.Период >= &ДатаНач
| И врТаблицаДанных.Период <= &ДатаКон";
Запрос.Выполнить();
ТЗ = Неопределено;

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = ВрТаблица;
Запрос.Текст = "Здесь запрос с участием верменной таблицы";

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

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


Внешнийнабор = ИнициализироватьИсточникДанных();
НаборДанных = Новый Структура();
НаборДанных.Вставить("ТаблицаSQL", Внешнийнабор);
ТиповыеОтчеты.СформироватьТиповойОтчет(ЭтотОбъект, Результат, ДанныеРасшифровки, ВыводВФормуОтчета, НаборДанных);


Собственно строчек кода не много и они достаточно стандартны... при этом можно пользоваться полным функционалом конструктора запросов, а в СКД отдать только функцию КОМПАНОВКИ ДАННЫХ

Но на вид чуть конечно не так красиво... да и выгрузка в таблицу значений каждый раз нужно код писать и проверять не ошибся ли в названии реквизитов... а то что нам дали в 1С выглядит как-то половинчато. Я ещё не определился чем удобнее пользоваться. Вы решайте, и пишите о ваших решениях, и что вас к ним подтолкнуло.
Автор: Олег Филиппов
Разместил:   Версии: | 8.x | 8.2 УП |  Дата:   Прочитано: 31379
 0 
Распечатать
Возможно, вас также заинтересует
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 50
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ
1C медленно работает по сети с базой на SQL Server 22
Данное обстоятельство может быть обусловлено многими причинами. Одна из них - неоптимальная настройка MS SQL . Перечислим неоптимальности в настройке: 1) Неправильно указанный сетевой протокол, используемый для взаимодействия 1С с SQL Server. П
1C: Enterprise Development Tools 52
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем
1Cv8.1CD - Файл данных достиг максимального размера! 8
1С выдает предупреждение " Файл данных достиг максимального размера" . Подскажите из - за чего это и как можно решить ? Превышен размер файла, обычно это сообщение возникает, когда размер файла 1Cv8.1CD приближается к 10 гигабайтам или размер ка
1С 7.x : Как получить курсы валют с сайта НБУ http://www.bank.gov.ua/ за любую дату ? 6
Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 - получем валюты, которые котируются на ежемесячной основе Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯче
Посмотреть все результаты поиска похожих
Комментарии
gromss
01.07.2013 15:35Комментарий: 1
gromss
Решил проблему через СОМ соединение.
Например, само подключение выглядит так:
Код 1C v 8.2 УП
 &НаСервере
Процедура ЗапускОтчета(Команда)
connector = Новый COMObject("V82.COMConnector");
Попытка
ВнешняяБаза = connector.Connect("Srvr=Server1C;Ref=copy2;Usr=Администратор1;Pwd=");
Сообщить("База подключена");
Исключение
//Предупреждение("Ошибка открытия базы!!!");
Сообщить(ОписаниеОшибки());
ВнешняяБаза=Неопределено;
Возврат;
КонецПопытки;
КонецПроцедуры

Тут происходит подключение. Дальше нам нужен выбор данных, которые находятся на этом сервере:
Код 1C v 8.2 УП
 
Запрос = ВнешняяБаза.NewObject("Запрос");
Запрос.Текст =
"ВЫБРАТЬ
| ИЛ_ЛистокРасчетаЛичногоKPI.Ссылка,
| ИЛ_ЛистокРасчетаЛичногоKPI.Сотрудник КАК Сотрудник,
| ИЛ_ЛистокРасчетаЛичногоKPI.Сотрудник.Наименование КАК СотрудникНаименование,
| ИЛ_ЛистокРасчетаЛичногоKPI.Критерии.(
| СУММА(Коэффициент)
| )
|ИЗ
| Документ.ИЛ_ЛистокРасчетаЛичногоKPI КАК ИЛ_ЛистокРасчетаЛичногоKPI
|ГДЕ
| ИЛ_ЛистокРасчетаЛичногоKPI.Критерии.Коэффициент <> &Коэффициент
| И ИЛ_ЛистокРасчетаЛичногоKPI.Дата МЕЖДУ &НачалоМесяца И &КонецМесяца
|
|УПОРЯДОЧИТЬ ПО
| СотрудникНаименование,
| ИЛ_ЛистокРасчетаЛичногоKPI.Дата";

Запрос.УстановитьПараметр("Коэффициент", 1);
Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Месяц));
Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(Месяц));

ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();

Во многих описаниях этих танцев с бубном говорилось, что результат этого запроса нельзя использовать в других запросах - НО ЭТО НЕ ТАК!
Код 1C v 8.2 УП
 
Запрос1 = ВнешняяБаза.NewObject("Запрос");
Запрос1.Текст =
"ВЫБРАТЬ
| ИЛ_ВводЕжемесячныхКоэффициентов.Ссылка
|ИЗ
| Документ.ИЛ_ВводЕжемесячныхКоэффициентов КАК ИЛ_ВводЕжемесячныхКоэффициентов
|ГДЕ
| ИЛ_ВводЕжемесячныхКоэффициентов.ПериодРегистрации = &Месяц
| И ИЛ_ВводЕжемесячныхКоэффициентов.Сотрудники.Сотрудник = &Сотрудник";

Запрос1.УстановитьПараметр("Месяц", НачалоМесяца(Месяц));
ВыборСотр = ВнешняяБаза.Справочники.Сотрудники.НайтиПоНаименованию(ВыборкаДетальныеЗаписи.Ссылка.Сотрудник.Description);
Запрос1.УстановитьПараметр("Сотрудник", ВыборСотр);
Результат1 = Запрос1.Выполнить().Выбрать();

Обрабатывает результаты по желанию )
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.