Размер шрифта
Цвет фона и шрифта
Изображения
Озвучивание текста
Обычная версия сайта
Интегратор по CRM решениям - АКАМ
Интегратор CRM систем
+7-495-481-60-08
+7-495-481-60-08
Заказать звонок
E-mail
sale@akam.ru
Адрес
Москва, Дмитровское шоссе, д. 9, стр. 2, этаж 4, офис 458
Режим работы
Пн. – Пт.: с 9:30 до 18:00
Подать заявку
Решения
  • B2B кабинеты
  • Разработки АКАМ
  • Типовые решения
1С:Предприятие.Элемент
  • О технологии
  • Стоимость лицензий
  • Новое в версии 7.0
Услуги
  • Аудит CRM-систем
  • Внедрение CRM-систем
  • Корпоративное сопровождение CRM
  • Интеграция 1С-Рарус с телефонией
Статьи
Клиенты и кейсы
О компании
  • Вакансии
  • Сертификаты
  • Новости
  • Цены
    • Решения АКАМ
    • 1С:CRM
    • 1С:Предприятие, лицензии
  • Отзывы
  • Реквизиты
  • Контакты, офисы
Контакты
Интегратор по CRM решениям - АКАМ
Интегратор CRM систем
Разработка B2B-кабинетов
+7-495-481-60-08
+7-495-481-60-08
Заказать звонок
E-mail
sale@akam.ru
Адрес
Москва, Дмитровское шоссе, д. 9, стр. 2, этаж 4, офис 458
Режим работы
Пн. – Пт.: с 9:30 до 18:00
Заказать звонок
Подать заявку
Решения
  • B2B кабинеты
  • Разработки АКАМ
  • Типовые решения
1С:Предприятие.Элемент
  • О технологии
  • Стоимость лицензий
  • Новое в версии 7.0
Услуги
  • Аудит CRM-систем
  • Внедрение CRM-систем
  • Корпоративное сопровождение CRM
  • Интеграция 1С-Рарус с телефонией
Статьи
Клиенты и кейсы
О компании
  • Вакансии
  • Сертификаты
  • Новости
  • Цены
  • Отзывы
  • Реквизиты
  • Контакты, офисы
Контакты
    Интегратор по CRM решениям - АКАМ
    +7-495-481-60-08
    +7-495-481-60-08
    Заказать звонок
    E-mail
    sale@akam.ru
    Адрес
    Москва, Дмитровское шоссе, д. 9, стр. 2, этаж 4, офис 458
    Режим работы
    Пн. – Пт.: с 9:30 до 18:00
    Заказать звонок
    Поиск
    Подать заявку
    Интегратор по CRM решениям - АКАМ
    Разработка
    B2B-кабинетов
    Телефоны
    +7-495-481-60-08
    Заказать звонок
    E-mail
    sale@akam.ru
    Адрес
    Москва, Дмитровское шоссе, д. 9, стр. 2, этаж 4, офис 458
    Режим работы
    Пн. – Пт.: с 9:30 до 18:00
    Интегратор по CRM решениям - АКАМ
    • Решения
      • Решения
      • B2B кабинеты
      • Разработки АКАМ
      • Типовые решения
    • 1С:Предприятие.Элемент
      • 1С:Предприятие.Элемент
      • О технологии
      • Стоимость лицензий
      • Новое в версии 7.0
    • Услуги
      • Услуги
      • Аудит CRM-систем
      • Внедрение CRM-систем
      • Корпоративное сопровождение CRM
      • Интеграция 1С-Рарус с телефонией
    • Статьи
    • Клиенты и кейсы
    • О компании
      • О компании
      • Вакансии
      • Сертификаты
      • Новости
      • Цены
        • Цены
        • Решения АКАМ
        • 1С:CRM
        • 1С:Предприятие, лицензии
      • Отзывы
      • Реквизиты
      • Контакты, офисы
    • Контакты
    Подать заявку
    • +7-495-481-60-08
      • Телефоны
      • +7-495-481-60-08
      • Заказать звонок
    • Москва, Дмитровское шоссе, д. 9, стр. 2, этаж 4, офис 458
    • sale@akam.ru
    • Пн. – Пт.: с 9:30 до 18:00

    Интеграция 1С с SQL-базами: анализ методов и нюансы их использования

    Главная
    —
    Статьи
    —
    Программирование
    —Интеграция 1С с SQL-базами: анализ методов и нюансы их использования
    Автор
    Метишева Виктория, Соловьева Елизавета
    Дата публикации:
    21.10.2024
    Время чтения:
    12 мин
    Интеграция 1С с SQL-базами: анализ методов и нюансы их использования

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

    Синхронизация и обмен данными с внешними базами данных являются неотъемлемой частью работы многих предприятий. Платформа 1С предоставляет различные способы интеграции с SQL, но каждый из них имеет свои ограничения и особенности. В этой статье мы рассмотрим два способа получения данных из БД SQL, которые можно использовать в зависимости от поставленной задачи и ограничений платформы 1С.

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

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

    Рассмотрим данные способы интеграции на примере двух клиентских задач.

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

    Таблица в SQL базе данных

     

    Текст процедуры запроса

    	 Запрос = Новый Запрос;
    
    	 Запрос.Текст =
    
    	 "ВЫБРАТЬ ПЕРВЫЕ 1
    
    	 |    dbo_tbl_Account.Name КАК Наименование,
    
    	 |    dbo_tbl_Account.INN КАК ИНН,
    
    	 |    dbo_tbl_Account.KPP КАК КПП,
    
    	 |    dbo_tbl_Account.ID КАК ID,
    
    	 |    dbo_tbl_Account.PrimaryContactID КАК PrimaryContactID,
    
    	 |    dbo_tbl_Account.GlobalSourceID КАК GlobalSourceID,
    
    	 |    dbo_tbl_Account.SourceID КАК SourceID,
    
    	 |    dbo_tbl_Account.ManagerID КАК ManagerID,
    
    	 |    dbo_tbl_Account.OwnerID КАК OwnerID,
    
    	 |    dbo_tbl_Account.StateID КАК StateID,
    
    	 |    dbo_tbl_Account.ModifiedOn КАК ПартнерДатаИзменения
    
    	 |ИЗ
    
    	 |    ВнешнийИсточникДанных.sc_Terrasoft.Таблица.dbo_tbl_Account КАК dbo_tbl_Account
    
    	 |ГДЕ
    
    	 |    dbo_tbl_Account.ID = &ID
    
    	 |
    
    	 |УПОРЯДОЧИТЬ ПО
    
    	 |    dbo_tbl_Account.ModifiedOn УБЫВ";
    
    	  
    
    	 Запрос.УстановитьПараметр("ID", ID_CRM);
    
    	 УстановитьПривилегированныйРежим(Истина);
    
    	 РезультатЗапроса = Запрос.Выполнить().Выгрузить();          
    


    Такой способ получения данных прост для понимания, гибок, его удобно отлаживать и легко настроить под конкретную задачу, так как в запросе можно сразу выставить условия и получить только нужные строки таблицы.

    Вторая задача. Запрос клиента - настроить получение данных по тендерным заявкам из системы мониторинга Headway в информационную базу 1С. После подключения базы Headway мы обнаружили одну таблицу, где хранилась информация о полях тендерных заявок и их типах, а также несколько функций внешнего источника данных для получения данных по самим заявкам.

    Следуя рекомендациям разработчиков Headway, мы использовали функции внешнего источника, возвращающие значения. Но и тут возникли сложности - платформа 1С не всегда может корректно обработать результат такой функции (например, если функция возвращает в качестве результата таблицу значений). Для того, чтобы всё-таки получить необходимые данные, существует другой метод, который в итоге и был использован для решения данной задачи - подключение к SQL базе с использованием COM-объекта.

    Для начала создаем таблицу значений, в которую будем загружать результат выполнения функции и сразу добавляем в неё колонки с подходящими описаниями типов значений исходя из возвращаемых параметров.

    	 ТаблицаTender                                             = СоздатьТаблицуTender();                    
    

     

    Затем получаем данные для подключения к базе SQL и создаем подключение через COM-объект.

    Текст процедуры подключения

    	 НастройкиHeadway = АКАМ_HeadwayТорги.ПолучитьДанныеИзХранилищаНастроекHeadway();
    
    	 Если НастройкиHeadway.Количество() = 0 Тогда
    
    	 Возврат Ложь;
    
    	 КонецЕсли;
    
    	 Логин      = НастройкиHeadway.Логин;
    
    	 Пароль          = НастройкиHeadway.Пароль;  
    
    	 ИмяБД      = НастройкиHeadway.ИмяБД;
    
    	 ИмяСервера = НастройкиHeadway.АдресСервера;
    
    	 UserID          = НастройкиHeadway.UserID;
    
    	  
    
    	 Попытка
    
    	 Connection = new COMObject("ADODB.Connection");
    
    	 ConnectionString = СтрШаблон("DRIVER={SQL Server};
    
    	 |SERVER=%1;
    
    	 |DATABASE=%2;
    
    	 |UID=%3;
    
    	 |PWD=%4",
    
    	 ИмяСервера, ИмяБД, Логин, Пароль);
    
    	 Connection.Open(ConnectionString);
    
    	 Исключение
    
    	 СообщениеДействия = СтрШаблон("Не удалось создать подключение по причине: %1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    
    	 Connection = Неопределено;
    
    	 КонецПопытки;
    
    	  
    
    	 Если Connection = Неопределено Тогда
    
    	 Возврат Ложь;
    
    	 КонецЕсли;
    

    Создаем пустые соответствия, заполняя ключи названиями выходных параметров. Затем вызываем функцию, передавая в нее входные параметры, и обрабатываем результат, записывая возвращаемые значения в таблицу значений ТаблицаTender.

    Текст процедуры обработки результата

    	 СоответствиеПолейTender         = ПолучитьСоответствиеПолейЗаявкиTender();
    
    	 СоответствиеПолейTenderДатыСтатус    = ПолучитьСоответствиеПолейЗаявкиTenderДатыСтатус();
    
    	  
    
    	 Попытка
    
    	 // получение данных Tender
    
    	 Сmd = new COMObject("ADODB.Command");
    
    	 Сmd.ActiveConnection = Connection;
    
    	  
    
    	 ТекстПроцедурыСПараметрами = "DECLARE @tmpUserID uniqueidentifier;
    
    	 |SET @tmpUserID = cast('%1' as uniqueidentifier);
    
    	 |EXEC HWC_DATA.dbo.API_TENDER
    
    	 |@UserID = @tmpUserID,
    
    	 |@Field = 'Tender_ID,TenderPrice,NotifNr,NSI_Law,TendNm,Cust_ID,RegNm,Org_ProviderNm_id,NSI_Platform,ClaimReglament,FormT_name,StatusT_name,PublDt,ClaimDtBeg,ClaimDtEnd,ClaimProcDtEnd,ClaimProcDtEnd,TendDt',
    
    	 |%2,
    
    	 |@Entity = 'Tender';";
    
    	  
    
    	 Шаблон = СтрШаблон("@DateStart = '%1',
    
    	 |@DateEnd = '%2'", ДатаНачалаПолученияЗаявок, ДатаОкончанияПолученияЗаявок);
    
    	  
    
    	 ТекстПроцедурыСПараметрами = СтрШаблон(ТекстПроцедурыСПараметрами, UserID, Шаблон);
    
    	  
    
    	 Rs = new COMObject("ADODB.RecordSet");
    
    	 Rs.Open(ТекстПроцедурыСПараметрами, Connection);
    
    	  
    
    	 Rs = Rs.NextRecordSet();
    
    	  
    
    	 Пока НЕ Rs.EOF() Цикл
    
    	  
    
    	 НоваяСтрока = ТаблицаTender.Добавить();
    
    	  
    
    	 Для Каждого Эл Из СоответствиеПолейTender Цикл
    
    	 НоваяСтрока[Эл.Ключ] = Rs.Fields(Эл.Ключ).Value;
    
    	 КонецЦикла;
    
    	  
    
    	 Rs.MoveNext();
    
    	  
    
    	 КонецЦикла;
    
    	  
    
    	 Rs.Close();
    

    Стоит заметить, что иногда при попытке обойти результат возникает ошибка или же результат оказывается пустым, хотя так быть не должно. Справиться с такой ошибкой помогает функция «Rs = Rs.NextRecordSet();» перед началом обхода результата. Если такой ошибки не возникает, то в этой функции нет необходимости.

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

    Для того чтобы вернуть такие значения нужно создать временную таблицу SQL, в которую будут помещаться данные, которые необходимы.

    Текст процедуры работы с временной таблицей

    	 Сmd = new COMObject("ADODB.Command");
    
    	 Сmd.ActiveConnection = Connection;
    
    	  
    
    	 ТекстПроцедурыСПараметрами = "DECLARE @tmpUserID uniqueidentifier;
    
    	 |SET @tmpUserID = cast('%1' as uniqueidentifier);
    
    	 |IF OBJECT_ID('tempdb..#tmpTender') IS NOT NULL
    
    	 |BEGIN
    
    	 |    DROP TABLE #tmpTender
    
    	 |END
    
    	 |CREATE TABLE #tmpTender (
    
    	 |    Tender_ID bigint,
    
    	 |    StatusT_name varchar(300),
    
    	 |    PublDt datetime,
    
    	 |    ClaimDtBeg datetime,
    
    	 |    ClaimDtEnd datetime,
    
    	 |    ClaimProcDtEnd datetime,
    
    	 |    TendDt datetime);   
    
    	 |INSERT INTO #tmpTender(Tender_ID,StatusT_name,PublDt,ClaimDtBeg,ClaimDtEnd,ClaimProcDtEnd,TendDt)
    
    	 |EXEC HWC_DATA.dbo.API_TENDER
    
    	 |@UserID = @tmpUserID,
    
    	 |@Field = 'Tender_ID,StatusT_name,PublDt,ClaimDtBeg,ClaimDtEnd,ClaimProcDtEnd,TendDt',
    
    	 |%2,
    
    	 |@Entity = 'Tender';
    
    	 |SELECT * FROM #tmpTender;";
    
    	  
    
    	 ТекстПроцедурыСПараметрами = СтрШаблон(ТекстПроцедурыСПараметрами, UserID, Шаблон);
    
    	  
    
    	 Rs = new COMObject("ADODB.RecordSet");
    
    	 Rs.Open(ТекстПроцедурыСПараметрами, Connection);
    
    	  
    

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

     

    Текст процедуры работы обработки выборки

    	 Rs = Rs.NextRecordSet();
    
    	 Rs = Rs.NextRecordSet();
    
    	  
    
    	 Пока НЕ Rs.EOF() Цикл
    
    	  
    
    	 НайденнаяСтрока = ТаблицаTender.Найти(Rs.Fields("Tender_ID").Value, "Tender_ID");
    
    	  
    
    	 Если НайденнаяСтрока = Неопределено Тогда Продолжить; КонецЕсли;
    
    	  
    
    	 Для Каждого Эл Из СоответствиеПолейTenderДатыСтатус Цикл
    
    	 НайденнаяСтрока[Эл.Ключ] = Rs.Fields(Эл.Ключ).Value;
    
    	 КонецЦикла;
    
    	  
    
    	 Rs.MoveNext();
    
    	  
    
    	 КонецЦикла;
    	  
    
    	 Rs.Close();
    
    	  
    
    	 Исключение
    
    	  
    
    	 СообщениеДействия = СообщениеДействия + Символы.ПС + СтрШаблон(
    
    	 "Не удалось получить данные таблицы Tender по причине: %1",
    
    	 ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); 
    
    КонецПопытки;
    
    	  
    

    Этот способ получения данных из БД SQL достаточно сложный в реализации, так как требует знаний по написанию запросов на языке SQL.

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


    Назад к списку
    • 1С:Предприятие.Элемент 8
    • Интеграции 8
    • Методики 21
    • Обучение 18
    • Отрасли 1
    • Переход на 1C:CRM 12
    • Программирование 13
    • Решения АКАМ 12
    • Юридические 3
    CRM Администрирование Оптимизация Печатные формы Проекты Торги Управление задолженностью Учёт
    Страницы, которые просматривают сейчас
    Кейс по внедрению 1С:CRM. Модуль для 1С:ERP и 1С:КА2 для ТД "ТУЛА-СТАЛЬ" Реализация комплексного проекта по импортозамещению иностранной CRM-системы на решение российского производства 1С:CRM. Бренды 1С:Совместимо - "АКАМ: Google API для 1С:CRM" АКАМ - 2 место в Рейтинга Рунета 2024 по CRM
    О компании
    Вакансии
    Отзывы
    Сертификаты
    Новости
    Реквизиты
    Цены
    Контакты
    Типовые решения
    1С:CRM ПРОФ
    1C:CRM КОРП
    АКАМ:Инвестиционные проекты
    АКАМ:Торги (TRM)
    АКАМ: Управление задолженностью
    Услуги
    Аудит CRM-систем
    Внедрение CRM-систем
    Корпоративное сопровождение CRM
    Интеграция 1С-Рарус с телефонией
    Обследование CRM систем
    Внедрение 1C:CRM
    Настройка Интеграции с телефонией
    Корпоративное сопровождение 1C:CRM
    Разработка корпоративных порталов
    Клиенты и кейсы
    Статьи
    Акции
    +7-495-481-60-08
    +7-495-481-60-08
    Заказать звонок
    E-mail
    sale@akam.ru
    Адрес
    Москва, Дмитровское шоссе, д. 9, стр. 2, этаж 4, офис 458
    Режим работы
    Пн. – Пт.: с 9:30 до 18:00
    sale@akam.ru
    Москва, Дмитровское шоссе, д. 9, стр. 2, этаж 4, офис 458
    © 2025 Интегратор по CRM решениям - АКАМ
    Политика конфиденциальности
    Версия для слабовидящих