Прямые запросы к базе 1С на SQL-сервере. Зачем нужно? Насколько оправдано? Как сделать?

Программирование - Практика программирования

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

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

Итак, имеем портал. Есть у нас web-сервер, который подключается к 1с через WS, и обменивается данными в формате JSON. Как это происходит?

При получении данных из 1С:

Клиент авторизуется на сайте (авторизация совпадает с авторизацией 1С)
web-сервер (через PHP) авторизуется в 1С
Уходит запрос на сервер 1С
Сервер 1с интерпретирует запрос в формат SQL
Идет запрос на SQL-сервер
Сервер 1с разбирает ответ от SQL-сервера
Укладываем его в JSON
На web-сервере (через PHP) разбираем JSON
Отдаем клиенту

При записи данных в 1С:

Клиент авторизуется на сайте (авторизация совпадает с авторизацией 1С)
web-сервер (через PHP) авторизуется в 1С
Уходят данные на сервер 1С
Сервер 1С создает нужный документ, заполняет обработчиком поля,….

Видно, что запись документов лучше доверить серверу 1С. Тогда нам, по крайней мере, не придется дублировать программную часть 1С в PHP.

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

Более того, если запрос сделать в виде:

«
SELECT
'<td>'+q11._Description+'</td><td>'+q12._Description+'</td><td>'+convert(nvarchar(10), q13._Fld28515)+'</td><td>'+convert(nvarchar(10), q13._Fld28516)+'</td></tr>' from …
»
то он вернет кусок готового HTML-кода, который выводится совсем просто:
while(odbc_fetch_row ($per))
{
$i++;
echo '<tr><td>'.$i.'</td>';
echo odbc_result($per,1) ;
}

 

буквально «на лету».

Отличие от классической выгрузки-загрузки (например, в интернет-магазин) в том, что всё происходит в реальном времени. И все дисконты,.. считает 1с. Нет нужды дописывать математику в 1с и «магазине». 

 Основная нагрузка будет только при записи документа. Хотя, что нам мешает, для снижения нагрузки, писать в таблицу на том-же SQL-сервере, а 1с-кой просто «забирать» оттуда данные? Т.е., цены у контрагента будут актуальные, а документы мы будем забирать и проводить в «свободное» время.

Замечу, что и из 1с мы можем получать вместо JSON – а, текст с готовой HTML-разметкой. Но, как показала практика, это будет гораздо медленнее.

При таком подходе, не будет разницы, на каком сервере (MSSQL или PSQL) крутится 1С. Однако, если вы хотите записывать в базу 1С данные напрямую, исключая оболочку, то стоит помнить, что MSSQL блокирует таблицы при записи, а PSQL использует версирование. 

См. также

Комментарии
1. Денис Харченко (nomadon) 133 10.10.17 06:53 Сейчас в теме
2. RK (rk) 18 10.10.17 08:58 Сейчас в теме
Способы борьбы те-же, что и на обычных сайтах. Отключи ошибки и передавай данные, форматированные в нужный тип и нужной длины.
3. Max Avramenko (A_Max) 14 10.10.17 11:39 Сейчас в теме
(2) Правильный способ это использовать параметры вместо плюсиков.

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

В принципе можно и в базу CMS писать/читать.
4. RK (rk) 18 10.10.17 14:25 Сейчас в теме
(3) "В принципе можно и в базу CMS писать/читать." Можно и так. Только теряется работа в реальном времени.
"Правильный способ это использовать параметры вместо плюсиков." - согласен. Пример приведен в качестве наглядной демонстрации. И плюсиками создается строка html. В реальности, создаются глобальные временные таблицы, а уже из них идет выборка. Причем, в другом соединении. Прямого взаимодействия с таблицами БД 1С нет.
5. Max Avramenko (A_Max) 14 10.10.17 17:38 Сейчас в теме
(4) Чем же теряется онлайновость если в 1С повесить подписки и в них делать "выгрузку". Ну и в качестве дальнейшего развития я бы вообще на MQ перевёл.
6. RK (rk) 18 11.10.17 08:31 Сейчас в теме
(5)"Чем же теряется онлайновость если в 1С повесить подписки и в них делать "выгрузку". В этом случае не теряется. Тоже можно так. Это даже позволит распределить железные ресурсы под портал, и под базу 1С. Можно даже в другую подсеть вытащить, ради большей безопасности...

Ну да, раз в сутки остатки обновлять, а потом просто движения добивать. Таблицы маленькие, нагрузка небольшая. Туда-же можно и заказы кидать, чтобы 1С потом забирала и документы создавала. Полная развязка по безопасности, и высокая скорость.
7. Антон Стеклов (asved.ru) 33 11.10.17 09:11 Сейчас в теме
Описанный метод доступа является нарушением лицензионного соглашения 1С.
Andle; Reaper_1C; +2 1 Ответить
8. RK (rk) 18 11.10.17 09:32 Сейчас в теме
(7) Сам по себе, метод не может нарушать лицензионное соглашение. Это не решение. Потому, вопросы лицензирования не рассматриваются.
9. Антон Стеклов (asved.ru) 33 11.10.17 12:47 Сейчас в теме
(8) Лицензионное соглашение прямо запрещает именно использование методов, не предусмотренных в сопроводительной документации, для доступа к информационной базе.

Лицензиат обязуется не допускать нарушений исключительных прав Правообладателя на ПРОГРАММНЫЙ ПРОДУКТ, в частности, не совершать и не допускать совершения третьими лицами следующих действий без специального письменного разрешения Правообладателя:
...
осуществлять доступ к информационной базе ПРОГРАММНОГО ПРОДУКТА и построение систем на основе ПРОГРАММНОГО ПРОДУКТА с помощью средств и технологических решений, не предусмотренных в сопроводительной документации;
Andle; Reaper_1C; +2 1 Ответить
10. RK (rk) 18 11.10.17 13:10 Сейчас в теме
(9) "Лицензионное соглашение прямо запрещает именно использование методов, не предусмотренных в сопроводительной документации, для доступа к информационной базе. " Ну так не используйте. Я вам не предлагаю решение, нарушающие лицензионное соглашение. И не заставляю вас что-то нарушать.

По вашей логике, ассемблер запретить надо, т.к. с его помощью можно убрать защиту с программы.
16. Антон Стеклов (asved.ru) 33 11.10.17 17:33 Сейчас в теме
(10)
(11)
Прокурору расскажете.

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

Думаете, Вы первый догадались, что технически с базой можно общаться и мимо платформы?
17. RK (rk) 18 11.10.17 17:52 Сейчас в теме
(16) - читай (14), (15). Можно пользоваться веб-сервером 1С. Здесь описан метод получения данных с SQL - сервера. При чем здесь лицензирование? Вопрос не по теме.
22. Александр Антонов (Nenaviju1C) 16.10.17 15:12 Сейчас в теме
(16)
и прокурору расскажу ...

Повешу службу на IIS со своим веб сервисом и 1Ска будет общаться только с ним, а вот серверная часть службы напрямую с базой на SQL сервере. Что то разве нарушил? :)

Запросы к БД напрямую - это и хорошо и плохо, но все зависит от конкретных задач и от рук, которые пишут интеграцию
11. DenisCh Гейтс (DenisCh) 11.10.17 13:11 Сейчас в теме
(9)
осуществлять доступ к информационной базе ПРОГРАММНОГО ПРОДУКТА и построение систем на основе ПРОГРАММНОГО ПРОДУКТА с помощью средств и технологических решений, не предусмотренных в сопроводительной документации;


MS mamagement Studio описана в документации?
12. RK (rk) 18 11.10.17 13:21 Сейчас в теме
(11) "MS mamagement Studio описана в документации?" - НЕТ.

Как и не описано, что нельзя выполнять прямой запрос к серверу из той-же 1С-ки.
Средствами 1С? - Да!
А уж как я обращаюсь - моё дело.

Ещё вопрос: зачем выпускается консоль запросов с трассировкой и показом плана запроса?
13. DenisCh Гейтс (DenisCh) 11.10.17 13:27 Сейчас в теме
(12)
"MS mamagement Studio описана в документации?" - НЕТ.


То есть архивацию средствами SQL-сервера делать нелья. И создавать базу тоже...
15. RK (rk) 18 11.10.17 17:13 Сейчас в теме
(13) Базу предполагается создавать с сервера 1с. А как-уж архивировать, я не знаю.... Видимо, запросом из другой базы 1с:)
(14)
1. Можно и на 1с.
2,3 Предполагается 1 раз НАПИСАТЬ прямой запрос, в который параметрами передавать данные.
4 Да! Но, с сервера приходит готовый html код.
19. John Doe (Reaper_1C) 96 12.10.17 17:01 Сейчас в теме
(13) Внимательно изучите документацию, там все есть:
https://its.1c.ru/db/v83doc#bookmark:cs:TI000000137
14. Василий Григорьев (man-1982) 11.10.17 14:33 Сейчас в теме
Немного не понятна последовательность:
1. POST-ом с клиента отправляете запрос на веб-сервер 1с.
2. На сервере 1с обрабатывает запрос.
3. Преобразуется его в прямой запрос к SQL.
4. Данные обрабатываем сервером 1с и отправляем клиенту
Все верно?
18. Артур Аюханов (artbear) 882 11.10.17 20:07 Сейчас в теме
Как подзадолбали умники по поводу нарушения лицензионного соглашения.
Тот факт, что лицензионное соглашение нарушает закон РФ для ПО, не учитываем?

Это инструменты, в умелых руках полезны, а незнайка может и застрелиться.
20. RK (rk) 18 13.10.17 03:31 Сейчас в теме
Раз уж подняли вопрос:

Будет-ли нарушением лицензионного соглашения 1С, если я грохну данные регистра версирования за определенный период, напрямую на SQL-сервере?

Замечу, что это не обслуживание базы SQL.
21. борян петров (TODD22) 16 13.10.17 04:46 Сейчас в теме
(20)
Будет-ли нарушением лицензионного соглашения 1С, если я грохну данные регистра версирования за определенный период, напрямую на SQL-сервере?

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


(18)
Тот факт, что лицензионное соглашение нарушает закон РФ для ПО, не учитываем?

Можно подробней что именно нарушает?
Оставьте свое сообщение