gifts2017

Запись во внешние источники данных

Опубликовал Герман (German) в раздел Программирование - Практика программирования

Внешние источники данных, появившиеся в 8.2.14 был отличным шагом навстречу интеграции с другими приложениями. Сейчас на дворе 8.3 и таблицы внешних источников данных:

Почти не имеют ограничений в запросах (помещение во временные таблицы, соединения с 1С таблицами);
Могут стать объектными данными (ссылку на внешнюю таблицу можно указывать как тип в реквизитах внешних таблиц и располагать на форме).
Однако, как и 3 года назад, изменять данные во внешних источниках мы могли  только через ADO

Но, в 8.3.4 мы получаем Функции внешних источников данных

Внешние источники данных, появившиеся в 8.2.14 был отличным шагом навстречу интеграции с другими приложениями. Сейчас на дворе 8.3 и таблицы внешних источников данных:

  1. Почти не имеют ограничений в запросах (помещение во временные таблицы, соединения с 1С таблицами);
  2. Могут стать объектными данными (ссылку на внешнюю таблицу можно указывать как тип в реквизитах внешних таблиц и располагать на форме).
Однако, как и 3 года назад, изменять данные во внешних источниках мы могли  только через ADO хотя и сушествуют такие соблазнительные коллекции как ВнешнийИсточникДанныхТаблицаНаборЗаписей и ВнешнийИсточникДанныхТаблицаЗапись
 
Но, в 8.3.4 мы получаем Функции внешних источников данных

 
При работе с внешними источниками данных реализована возможность использования функций, описанных во внешних источниках данных. Функция может возвращать одно значение, таблицу или не возвращать значений вовсе. Реализована возможность указывать вид таблицы внешнего источника данных - таблица или выражение (для описания функций, возвращающих таблицу).
Для обращения к функциям внешнего источника данных из языка запросов используется один из синтаксисов:
ВнешнийИсточникДанных..Таблица.(,...,);
ВнешнийИсточникДанных..(,...,);
Обращение к функциям с помощью объектной модели возможно с помощью менеджера внешнего источника данных или менеджера таблицы внешнего источника данных.

Да именно функции, не процедуры

 

 
В функции мы можем передать параметры (в том числе ссылки из объектных таблиц внешних источников данных) ну и как водится вернуть 1 значение.
 
Сообщить(ВнешниеИсточникиДанных.ВнешИстоник1.ДобавитьЧек(ПараметрыСеанса.Касса));
 
Все идет по плану до тех пор вы не решаетесь поместить в код функции DML (Data Manipulation Language) операторы (INSERT, UPDATE, DELETE)
 
В MSSQL это по понятным причинам запрещено, исхитрится через динамический SQL тоже не получится, поскольку он тоже запрещен в функциях, до линковки сервера самого на себя я не дошел поскольку переключился на ORACLE
 
В ORACLE DML разрешен в функциях если функция будет выполнятся в автономной транзакции

 

CREATE OR REPLACE FUNCTION RGUSER."F_ADDVOU"(
   p_pos    IN   VOU.pos%TYPE 
) RETURN NUMBER 
IS 
   PRAGMA AUTONOMOUS_TRANSACTION; 
BEGIN
   INSERT INTO RGUSER.VOU (POU, V_,UPD,POS)  VALUES (RGUSER.f_inc ('POU', 0, 0),RGUSER.f_inc('V_', 0,  p_pos),sysdate, p_pos);
   COMMIT;
   RETURN 1;
   EXCEPTION  WHEN OTHERS THEN 
    ROLLBACK;
    RETURN (-1); 
 END ;
 
Теперь мы по настоящему, штатными средствами  изменяем данные во внешних источниках данных в том числе и на Linux!
 

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Александр Зубцов (iov) 11.02.14 23:16
Вот так начали за здравие а пьем за упокой. Все на оракл!!! или всех на оракл. как правильно послать то туда?
Герман а чёто ты на оракл переметнулся? И когда в интеграторе кофеварка появится? :)
2. Герман (German) 11.02.14 23:27
(1)
Герман а чёто ты на оракл переметнулся?


Дак тяжелые времена, кризис. Кофеварка в работе
3. Котэ Пруидзе (kote) 12.02.14 15:44
(0) Герман, а в MySQL и postgre базы что-то пробовали записать? Во многих случаях они могут быть вполне достаточны..
4. Михаил Андрияшкин (mickey.1cx) 12.02.14 16:16
Для создания/обновления записей во внешнем источнике MSSQL можно использовать хранимые процедуры на стороне сервера. На mssql 2008 все получилось.
kser87; AHDP; shmellevich; +3 Ответить
5. Dima Dima (bayce) 15.02.14 00:20
а где это можно использовать?
6. Nathan Rothschild (Rothschild) 16.02.14 20:50
(0) German,
как то все по хакерски в 1С получается...
Не знаешь почему пошли по такому пути - создали очередной костыль???

Могли бы просто "цивилизованно" интегрировать платформу 1С с той же ADO:
1. например могли бы допилить СКД для работы с другими источниками данных.
Это как бы предпологалось при ее появлении, но все осталось как было:
Имеется единственный источник данных в СКД - это локальная база 1С.

2. могли бы сделать встроенную функцию для преобразования объекта
ADODB.RecordSet в таблицу значений.

и было бы тогда счастье!
;)))
7. Nathan Rothschild (Rothschild) 16.02.14 20:53
(6)
ЗЫ
А под 8.3 эти внешние источники данных научили работать через OLEDB
или все используется только ODBC, который вроде считается устаревшим?
8. Олег Филиппов (comol) 17.02.14 14:43
(2) German, Что я вижу... PL/SQL :))). Мы не одиноки во вселенной? :). Скоро и EI будет под Oracle такими темпами, да? :).

9. Олег Филиппов (comol) 17.02.14 14:44
(7) Rothschild, эээ а разве OLEDB это не "примочка сверху" над ODBC, а ADO соответственно над OLEDB?....
10. Nathan Rothschild (Rothschild) 17.02.14 18:25
(9) comol,
насколько я знаю (могу конечно ошибаться ;) ):

ODBC - одна технология доступа к данным, хронологически более ранняя.
OLEDB - другая технология, более поздняя.

а ADO - это програмный интерфейс (если угодно - "примочка" для приложений),
которая может работать с источниками данных, используя обе технологии.

Сама 1С-ка с СУДБ в серверных базах, думаю работает именно через ADO.
А в файловом режиме - используется какой-то свойский самопал.
11. Nathan Rothschild (Rothschild) 17.02.14 19:56
12. Артур Аюханов (artbear) 18.02.14 22:48
(0) Герман, ты же уже в курсе, что 1С облегчил тебе работу, да ? :)
AllexSoft; _also; xzorkiix; +3 Ответить 1
13. Герман (German) 18.02.14 23:14
(12) Да, Артур ты фдесятке первых :)
14. Антон Стеклов (asved.ru) 19.02.14 06:53
В свете http://v8.1c.ru/o7/201402ext/index.htm подобные извращения становятся малоосмысленными.
AllexSoft; taishy; Dach; +3 Ответить 1
15. Александр Топольский (AlexanderKai) 13.05.14 11:54
(14) asved.ru,
Я так понял, это есть только на 8.3?
16. Герман (German) 13.05.14 23:33
(15) AlexanderKai, только не работает
17. Тарас Курдельчук (softgarant) 20.05.14 00:29
подскажте как в мускул можно сделать запись?
18. Evgeny Melnikov (Melnikovbk) 19.06.14 15:54
Господа а подскажите, в tSQL не силен (говорю сразу =) ),
есть две функции
MyITVFunc возвращает таблицу (в параметре сколько строк вывести (Select TOP (@Parameters)...)

MyITVFunc_2 другая возвращает просто число ( return 1111)


в 1С Создаю внешний источник данных подключаюсь к БД , Функции добавить - выбрать из внешнего источника -
и вот тут вижу только одну функцию, которая возвращает число...


собственно вопрос к функции которая возвращает таблицу мы доступ не имеем???
19. Алексей (kaging) 30.01.15 17:40
(16) German, Работает. И вполне. Только надо всем полям присваивать значения, и есть косяк (((, после записи не выдает ИД созданного объекта (((.
20. Алексей (kaging) 17.02.15 09:04
Да, еще я столкнулся с тем что при возвращении например ID типа Number какого-либо объекта, приходится в Oracle преобразовывать его в строку и уже на стороне 1с обратно. Хотя может это зависит от драйвера ODBC.
21. Юрий Сахацкий (Yurious) 03.12.15 19:03
С функциями всё понятно и без мануала (в MSSQL это хранимая процедура), а как работать с Таблицами вида Выражение (в MSSQL это функция, возращающая табличное значение) у которой так же как и у функции задано Выражение в источнике данных с параметром, например dbo.ft_OrgAddress(&1) ?

Есть таблица dbo_t_Organization, Вид таблицы=Таблица, Имя в источнике данных=dbo.t_Organization. Открываем форму списка, которую платформа генерирует в польз. режиме и видим все записи таблицы.
Есть в MSSQL функция, возращающая табличное значение dbo.ft_OrgAddress (по ID_Organization выдает таблицу адресов). Во ВнешИстДанных 1С добавляется в Таблицы, а не Функции, Вид таблицы=Выражение, Имя в источнике данных=dbo.ft_OrgAddress(&1). Открываем форму списка, которую платформа генерирует в польз. режиме и видим ошибку:

Ошибка при выполнении запроса. Ошибка при выполнении запроса.
по причине:
Ошибка получения данных
по причине:
Ошибка создания набора данных "НаборДанныхДинамическогоСписка"
по причине:
Ошибка при исполнении запроса набора данных
по причине:
{(27, 2)}: Неверные параметры "ВнешнийИсточникДанных.ЦБ.Таблица.dbo_ft_OrgAddress"
<<?>>ВнешнийИсточникДанных.ЦБ.Таблица.dbo_ft_OrgAddress КАК ВнешнийИсточникДанныхЦБТаблицаdbo_ft_OrgAddress


Где и каким образом задать параметр &1 и какие вообще возможности работы с этим объектом?
22. Александр Ахунов (Sanya1) 30.11.16 08:49
У вас написано: Почти не имеют ограничений в запросах (помещение во временные таблицы, соединения с 1С таблицами)
Разве возможно в запросе соединить данные из внешнего источника и из 1С ?