Получение данных из нескольких источников данных недопустимо

Получение данных из нескольких источников данных недопустимо

Релиз 8.2.14.533 — наконец то более-менее стабильный вариант 14-го релиза платформы. Наконец то представился случай испытать в деле замечательную возможность — "внешние источники данных".

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

1) Настройка и использование — без "танцев с бубном" не получится

a) Добавляете внешний источник данных — вроде ничего сложного
б) ставите галочку "Выбрать из списка" — обязательно — это нужно чтобы проверить работоспособность уже в начале и избавит от лишних заморочек
в)
— обязательно нажимаем ". " — подключение именно ODBC. Не OLEDB как мы все привыкли, а на уровень ниже

г)
А вот здесь будьте ОЧЕНЬ ВНИМАТЕЛЬНЫ.
Это драйвер ODBC — в случае использования клиент-серверной версии он должен обязательно быть на сервере. Если вы ведёте разработку на одной системе, а рабочая версия на другой (как это обычно бывает) убедитесь что вас не ждут сюрпризы. Странная рекоммендация, но выбирайте самый древний или самый общий драйвер в случае если вас не особо заботит скорость и за пределы возможностей стандарта SQL92 вы выходить не намерены. Это обеспечит вам лучшую совместимость. Например для SQL Server 2008 лучшим драйвером будет SQL Server Native Client 11, но рекоммендую выбирать просто SQL Server, иначе этот самый native client придётся устанавливать либо на сервер, либо на все клиентские машины (в случае использования файловой версии), а выигрыша особого для простых задач он не даст.
д) Стандартные диалоги выбора Сервера

Читайте также:  Изготовитель оборудования oem зарезервировано

е) На вопрос сохранения пароля рекомендую ответить "да", иначе так и не получится это дело запустить.

ж) Выбираете таблицу и реквизиты. замечательная возможность — её можно сразу же переименовать так как вам нравится (и реквизиты тоже), при этом в свойствах у вас будут отображаться названия полей источника данных

з) А теперь запускаете, открываете конструктор запросов — выбираете тупо все записи из таблицы и ОПА — ошибка. Что делать? Если у вас управляемый интерфейс — заглянуть в меню сервис, а если обычный.
Я лично использовал вот такой код:

Параметры = ВнешниеИсточникиДанных.DAX.ПолучитьОбщиеПараметрыСоединения();
Параметры.АутентификацияСтандартная = Истина;
Параметры.ИмяПользователя = "sa";
Параметры.Пароль = "pas";
Параметры.СтрокаСоединения = "DRIVER=;SERVER=servet;UID=sa;PWD=;DATABASE=database";
Параметры.СУБД = "MSSQLServer";

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

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

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

3) НЕЛЬЗЯ ИХ ИСПОЛЬЗОВАТЬ ВМЕСТЕ С ВНУТРЕННИМИ ИСТОЧНИКАМИ ДАННЫХ
Меня лично этот факт убил наповал

Как же так. то чего так ждали и уже представляли и облизывались как мы сейчас в одном запросе соединим наши данные с 1С-кой свернём — сгруппируем, вставим в отчет, а не тут то было.

Но естественно опытных людей это не останавливает. какая мысль пришла в голову? Правильно — временные таблицы:

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

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

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

Читайте также:  Проверьте принадлежит ли точка данной закрашенной области

Итого ранее эта задача решалась где-то так:

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

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

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

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

МассивДата = Новый Массив();

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

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

//Подключаемся к SQL
СтрокаПодключения = "Provider=SQLOLEDB.1;Persist Security Info=True;User Source=;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation 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.CommandText = "Select * from PH where period >= ‘" + Строка(Формат(ДатаНач, "ДФ=ггггММдд")) + "’ and period = &ДатаНач
| И врТаблицаДанных.Период

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

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

Очень часто бывают ситуации, когда необходимо сделать отчет СКД на сложном запросе, который используюет в себе вложенные запросы и объединения внутренние и полные и т.д. — в результате в консоли этот запрос формируется верно, а в скд половина полей пустые! Связано это с особенностью СКД в объединении внутренних данных, а так же не стоит забывать что в СКД наборы данных связываются как левое соединение.

Читайте также:  Орион device is unknown for hwserver

Решения возможны следующие:

  • Изменить запрос в СКД
  • Сформировать запрос обычным способом и подставить эти данные в СКД как внешние

Рассмотрим последний вариант:

Внешний источник данных, грузим из ТЗ

Для вывода отчета я использую шаблон All4CF.ru_Template_SKD_v4.1 в нем уже реализованы почти все необходимые функции и работает в Обычных и УП формах.

В модуле объекта уже есть функция

установим в ней наш запрос, получается примерно так:

Ниже в коде происходит установка внешних данных из нашей ТЗ с именем ТаблицаВнешнегоНабораДанных

В самой компоновке добавляем набор Объект с именем ТаблицаВнешнегоНабораДанных и перечисляем поля, которые будут использоваться в отчете:

Как я уже говорил выше, далее нам необходимо получить остатки взаиморасчетов на дату документа:

Получение остатков на документ в СКД

Набор данных Запрос — назвали его Остатки:

Теперь установим связи Запроса и Объекта

Остатки нужно получать на дату документа и по контрагенту

Далее, если нужно, задайте вычисляемые поля, ресурсы, параметры и Настройте Список вывода.

Простыми словами о сложном

15 мая 2017 г.

Получение данных из нескольких источников недопустимо

Есть ограничения в платформе 1С:Підприємство 8.3 (8.3.10.2168), ну и ниже версий.

Нельзя использовать одновременно соединение таблиц базы данных (например таблицы регистра) и данные из ВнешнеИсточникиДанных в запросах.

Обойти это ограничение возможно сначала обратиться к ВнешниеИсточникиДанных с помощью запроса, а результат запроса выгрузить в таблицу значений.

Далее сделать еще один запрос и в качестве источника данных выбрать ранее выгруженную таблицу значений.
А далее в этом запросе готовую таблицу значений соединяем с нашими данными из базы 1С (например, регистром сведений).

У меня данный пример реализован в функции ПолучитьТЗ()

Ссылка на основную публикацию
Показать скрытые папки в тотал коммандер
Одной из многочисленных функций ОС Windows является скрытие видимости файлов и папок. Это позволяет уберечь конфиденциальные данные, хотя для предотвращения...
Планшет не работает половина сенсорного экрана
Компоненты электронных приборов при небрежной эксплуатации могут сломаться. Если не работает часть сенсорного экрана на телефоне, это может быть вызвано...
Площадь полигона по координатам
Вычисление площади выпуклого многоугольника по координатам вершин. Выпуклый многоугольник строится по точкам с использованием алгоритма Джарвиса Калькулятор ниже был написан...
Полотно в ворде как сделать
Рисунок. Полотно "Создайте рисунок" Но полотно порой необходимо в следующих случаях: 1. Если необходимо ограничить пространство рисования объектов. 2. Если...
Adblock detector