Использование процедур SQL при обращении к внешним источникам данных

20.03.19

Интеграция - Внешние источники данных

Ещё раз обращаемся к проблеме использования в 1C процедур SQL при обращении к внешним источникам данным через механизм ADODB. Данное решение возможно использовать при любом обращении к данным MS SQL Server, когда необходимо использовать динамические SQL-запросы. Приведенное решение применяется в расширении функционала "МФСБ" конфигурации "Промышленная безопасность" и используется для консолидации данных с системами АСУТП предприятия. (МФСБ - многофункциональная система безопасности угольных шахт) Тестирование проводилось на релизе 8.3.14.1630.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Использование процедур SQL при обращении к внешним источникам данным:
.epf 7,81Kb
2
2 Скачать (1 SM) Купить за 1 850 руб.

Для иллюстрации работы технологии приведем пример решения типовой задачи:

1. Начальные условия.

    Существует база сигналов [DB_AGK] и хранится на [AGK1] - MS SQL Server 2014 Standart, где значение каждого сигнала за период опроса хранится в отдельной таблице (количество сигналов в БД более 300). При превышении заданных пороговых значений в базу [MFSB] записывается событие с максимальным значением сигнала. Структура таблиц [MFSB] приведена на прикрепленном рисунке.

Замечание: Сервер [AGK1], содержащий таблицы сигналов, должен быть целевым сервером или быть подключенным к целевому серверу как связанный сервер.

    Например, таблица [SA_SIG_0_16922_5_4] (название её совпадает с именем сигнала) содержит следующие поля:

       [PK_ID_SIG] int -- (первичный ключ) 
       [VALUE] float -- (значение сигнала)
       [TIME] int -- (время в формате Unix - кол-во секунд с 01.01.1970 г.)
       [MSEC] int -- (количество микросекунд с начала секунды времени измерения)

2. Постановка задачи.

   Необходимо за заданный период найти максимальное значение сигнала и вывести в 1С.  

3.  Решение.

3.1 Код для SQL - стандартное решение для таких задач.

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

Код процедуры создаем в базе [MFSB]. Исходник приведен ниже:

--1. Код процедуры MAXEVENT
USE [mfsb]
GO
/****** Object:  StoredProcedure [dbo].[MaxEvent]    Script Date: 19.03.2019 11:03:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date,,>
-- Description:    <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[MaxEvent]
    -- Add the parameters for the stored procedure here
    @Signal        varchar(100),    -- имя таблицы
    @TimeBegin    varchar(100),     -- начало периода в формате времени 1С
    @TimeEnd    varchar(100),       -- конец  периода в формате времени 1С
    @Result        float OUT        -- результат 
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    Declare @t table (MaxVal float)                             -- временная таблица значений
    declare @var_databegin     As int;                          -- время в формате UNIX
    declare @var_dataend        As int;                         -- время в формате UNIX
    DECLARE @SQL                As varchar(max);                -- строка для сборки SQL-выражений 
    
    -- преобразование даты: см. код функции UNIX_TIMESTAMP() ниже, convert() - встроенная функция
    select @var_databegin  = dbo.UNIX_TIMESTAMP(convert(datetime, @TimeBegin,120)); -- преобразуем время
    select @var_dataend    = dbo.UNIX_TIMESTAMP(convert(datetime, @TimeEnd  ,120));

    --Обработка ошибок ()
    if @var_dataend > @var_databegin 
    Begin
      @Result  =-3.0; -- значение, если результат не получен. 
      Return;
    End

    --Формируем строку SQL для запроса максимального результата:
    Set @SQL ='SELECT max([VALUE])
               FROM [AGK1].[DB_AGK].[dbo].'+@Signal+' WHERE ([TIME]>='+convert(varchar(20),@var_databegin)+') and
               ([TIME]<='+Convert(varchar(20),@var_dataend)+')'

    Insert into @t Exec(@Sql) -- выполняем запрос и складываем в таблицу
    Select top 1 @Result = MaxVal From @t -- выборка значимого результата
    if (@Result is Null) set @Result = -3.0 -- значение, если результат не получен. 
END

--2. Код функции UNIX_TIMESTAMP() -- 
USE [mfsb]
GO
/****** Object:  UserDefinedFunction [dbo].[UNIX_TIMESTAMP]    Script Date: 19.03.2019 12:37:49 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date, ,>
-- Description:    <Description, ,>
-- =============================================
CREATE FUNCTION [dbo].[UNIX_TIMESTAMP] (
@ctimestamp datetime
)
RETURNS integer
AS 
BEGIN
  /* Function body */
  declare @return int

  --SELECT @return = DATEDIFF(SECOND,{d '1970-01-01'}, @ctimestamp) -- как вариант
  
  -- Внимание!!! Если у вас есть часовой пояс отличный от Гринвича то вместо '1970-01-01 00:00:00' необходимо указать '1970-01-01 04:00:00' (для Москвы, то есть +4 часа)
  SELECT @return = DATEDIFF(SECOND,Convert(datetime,'1970-01-01 00:00:00',120), @ctimestamp) 

  return @return
END

--3. Код функции UNIX_TO_DATETIME() -- 
-- Приведу еще одну функцию, обратную UNIX_TIMESTAMP, может быть пригодится.

CREATE FUNCTION [dbo].[UNIX_TO_DATETIME] (@Datetime BIGINT)
RETURNS DATETIME
AS
BEGIN

-- закомментированный текст содержит автоматическое определение часового пояса:

-- для этого в выражении RETURN переменную @Datetime замените на @AdjustedLocalDatetime

    --DECLARE @LocalTimeOffset BIGINT;
    --DECLARE @AdjustedLocalDatetime BIGINT;

    --SET @LocalTimeOffset = DATEDIFF(second,GETDATE(),GETUTCDATE())
    --SET @AdjustedLocalDatetime = @Datetime - @LocalTimeOffset

    RETURN (SELECT DATEADD(second, @Datetime, CAST('1970-01-01 00:00:00' AS datetime)))

END;

3.2 Теперь рассмотрим код для 1С.

Пример приведен в виде внешней обработки с одной формой, где в поле "Источник" необходимо задать имя таблицы (сигнала).

Также необходимо выбрать период, заполним поля "Дата начала" и "Дата окончания".

При нажатии кнопки "Расчет" в поле "Результат" будет помещено максимальное значение за заданный период выбранного сигнала.

(естественно, если у вас есть эти данные :-).

Ниже помещен модуль формы.


&НаСервере
Процедура Команда1НаСервере()
	
	Результат = 0;
	СигналТекст = Источник;
	Если ЗначениеЗаполнено(СигналТекст) Тогда
	Тест = ВыполнитьЗапросSQL(СигналТекст, ДатаНачала, ДатаОкончания);
	Результат = Тест;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)

	Команда1НаСервере();

КонецПроцедуры

&НаСервереБезКонтекста
Функция  ВыполнитьЗапросSQL(Источник, ДатаНачала, ДатаОкончания)

    Тест1 = 0; //Инициализация переменной

    //Задаем параметры подключения к MS SQL Server 
    Сервер           = "10.10.10.11"; //ip или имя вашего сервера
    База             = "mfsb";
    Пользователь     = "user"; // пользователь или "sa" ;-) - права пользователя нужны на исполнение
    Пароль           = "123456"; //или пароль "fgR678uЕЕyr#" - например...
	
	СтрокаСоединения = "Provider=SQLOLEDB.1; Trusted_Connection=no; Initial Catalog ="+База
	                  +"; Data Source="+Сервер
	                  +";User ID="+Пользователь
	                  +";Password="+Пароль;
     
    Connection = Новый COMОбъект("ADODB.Connection");
    //Попытка //Для отладки
    Connection.Open(СтрокаСоединения);
	//Исключение
	//    Возврат Неопределено; 
    //    ОписаниеОшибки();
	//КонецПопытки;
    
    Command = Новый COMОбъект("ADODB.Command");
    Command.CommandTimeout = 100;
	Command.ActiveConnection = Connection;

	Command.CommandText ="dbo.MaxEvent";
	Command.CommandType=4;
	
	Param0 = Command.CreateParameter("@Signal", 130, 1, 100);
	Command.Parameters.Append (Param0); 
	Command.Parameters(0).value = Источник; 
	
	Param1 = Command.CreateParameter("@TimeBegin", 130, 1, 100);
	Command.Parameters.Append (Param1); 
	Command.Parameters(1).value = Строка(Формат(ДатаНачала,"ДФ='гггг-ММ-дд чч:мм'"));	
	
	Param2 = Command.CreateParameter("@TimeEnd", 130, 1, 100);
	Command.Parameters.Append (Param2); 
	Command.Parameters(2).value = Строка(Формат(ДатаОкончания,"ДФ='гггг-ММ-дд чч:мм'"));
	
	Param3 = Command.CreateParameter("@Result", 5 , 3, 20);
	Command.Parameters.Append (Param3); ;
	Command.Parameters(3).value = Тест1; 
		
	Command.Prepared = true; 
    Command.Execute();
	
	Тест1 =  Command.Parameters(3).value;
 
    Connection.Close();
	//Сообщить(Тест1);
	Возврат Тест1;
КонецФункции

  Описание: 

Имеет смысл разобрать только функцию "ВыполнитьЗапросSQL". Она состоит из 4 частей:

 - в первой части формируется строка подключения.

 - во второй части создается COM-объект и выполняется открытие соединения.

 - в третьей части формируются структура Command c 4-мя параметрами и происходит вызов метода Exicute (выполнение)

(Обратите внимание - число параметров должно быть указано как в вашей процедуре на SQL!!!)

 - в четвертой части происходит возврат значения 4-го параметра (Parameters(3) - счет от нуля) и закрытие соединения. 

 

Для более полного ознакомления с темой [Внешние источники данных] рекомендую статью: 

"[ Внешние источники данных ] Пример интеграции базы 1С и внешней СУБД"

 

Ещё замечание (отсюда):

Чтобы правильно установить ADO на вашем компьютере, необходимо установить MDAC. При этом устанавливаются необходимые базовые компоненты ADO и ADO. OLE DB также требует компонентов ODBC версии 3.0 или более поздней.
Компоненты MDAC предоставляется бесплатно загрузить с веб-узла по АДРЕСУ:

http://msdn.microsoft.com/en-us/data/aa937729.aspx

Благодарю за внимание.

Обработка SQL ADO OLE DB

См. также

SALE! 15%

Внешние источники данных Программист Бизнес-аналитик Пользователь Платформа 1С v8.3 Управляемые формы Анализ и прогнозирование Конфигурации 1cv8 Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

28500 руб.

15.11.2022    21150    21    49    

38

Внешние источники данных Зарплата Бюджетный учет Программист Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

48000 руб.

24.04.2017    51425    102    165    

90

SALE! 50%

Поиск данных Внешние источники данных Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Если вам нужно автоматически генерировать представления (view) к вашей базе данных 1С (есть две версии - для СУБД MS SQL Server и для PostgreSQL) по структуре метаданных 1С, то вам необходима данная обработка. Наш "Генератор View", другими словами - это коннектор к данным 1С для Power BI - незаменимый помощник для бизнес-аналитиков, работающих с базами 1С из Yandex Datalens/Power BI и т.д. Работает для обычных и управляемых форм под 1С 8.3

230000 115000 руб.

31.07.2020    13904    13    48    

25

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    11006    13    8    

15

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    25353    22    1    

25

Зарплата Внешние источники данных Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 организаций (далее Парус) в конфигурацию 1С:Зарплата и управление персоналом, ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

84000 руб.

07.06.2021    13335    2    3    

3

Внешние источники данных Облачные сервисы, хостинг Программист Бизнес-аналитик Пользователь Руководитель проекта Платформа 1С v8.3 8.3.14 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Бытовые услуги, сервис Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Гостиничный бизнес Рестораны, кафе и фаст-фуд Реклама, PR и маркетинг Легкая промышленность, мода и одежда Управленческий учет Платные (руб)

Расширение позволяет автоматизировать управление картами лояльности и взаимодействие с покупателями при помощи интеграции корпоративной системы 1С и специализированного облачного сервиса "CARDPR". Автоматическая онлайн синхронизация сведений о владельце электронной карты лояльности и баланса бонусных баллов на карте между корпоративной системой 1С и мобильным устройством покупателя. Оповещение покупателя об изменении баланса его электронной карты лояльности и проведении каких-либо маркетинговых акций в компании при помощи рассылки push-сообщений на его мобильное устройство.

36000 руб.

20.07.2023    3290    1    2    

12
Оставьте свое сообщение