1С и MongoDB: дружба начинается с RESTHeart'а

03.07.17

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

Краткое описание того, как подружить MongoDB и 1С: Предприятие используя один из предлагаемых на официальном сайте RESTFul сервисов - RESTHeart.

Файлы

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

Наименование Скачано Купить файл
1С и MongoDB: дружба начинается с RESTHeart'а:
.zip 5,66Kb
10 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Введение

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

  1. Эти СУБД, как правило, не поддерживают ANSI SQL. Конечно есть ODBC драйверы, которые пытаются переложить SQL запрос на язык СУБД, но это не совсем то.
  2. Структура базы не регламентирована. Внутри каждой базы может быть произвольное число коллекций (таблиц) с произвольным числом документов (записей) произвольной структуры. То есть таблицы в NoSQL базах имеют произвольную структуру.
  3. Нет транзакций в привычном нам понимании этого слова. Можно гарантированно изменить один документ, но для согласованного изменения нескольких документов в разных коллекциях придется прибегнуть к ухищрениям.
  4. Более разнообразные методы распределения данных. Возможность одновременного использования шардинга и репликации. Вы можете как распределять копию всех данных, так и частично распределять данные по серверам, увеличивая производительность чтения данных.

Более подробно можно прочитать тут — https://habrahabr.ru/post/152477/.

Обычное применение таких СУБД – высоконагруженные системы обрабатывающие большой объем информации с произвольной структурой. Можно ли применять такие СУБД в обычной жизни? Конечно можно и нужно, но каждый раз мы должны отдавать себе отчет, что для каждой конкретной задачи нужно применять наиболее подходящий для этого инструмент. Например, для хранения данных структуры базы 1С NoSQL не подходит, т.к. нам нужны транзакции и у нас фиксированная структура. А вот для хранения журнала регистрации (пример хранения журнала регистрации в MongoDB — //infostart.ru/public/558101), файлов (пример хранения файлов в MongoDB — //infostart.ru/public/624829/), какой-то произвольной не регламентированной по структуре информации мы вполне можем использовать базу вроде MongoDB, т.к. транзакции нам не нужны, но нужна высокая скорость и хранение больших объемов.

RESTHeart

REST – это регламент взаимодействия с сетевым приложением, когда все инструкции для приложения мы передаем через HTTP запросы. RESTHeart представляет собой веб сервер, написанный на Java, который принимает REST команды и трансформирует их в команды MongoDB. В традиционном HTTP есть два запроса: GET для получения данных и POST для их модификации. Но для REST их число пришлось расширить: PUT, DELETE, PATCH.

Структура данных в запросе выглядит следующим образом:

/DataBase/Collection/DocID?Parameters, где

  • DataBase – имя базы данных,
  • Collection – имя коллекции,
  • DocID – идентификатор документа
  • Parameters – дополнительные параметры

Примеры запросов

Тип запроса Текст запроса Описание
GET /DB/Col Получение всех документов из коллекции Colбазы DB
GET /DB/Col/id Получение документа с идентификатором id из коллекции Col из базы DB
GET /DB/Col?filter="{‘name’:’Alex’}" Получение всех документов из коллекции Colиз базы DB у которых свойство name = Alex
PUT /DB/Col Создание коллекции Col в базе DB
POST /DB/Col {"address": "Red square", "city": "Moscow"} Создание в коллекции Col базы DB документа со свойствами address = Red square и city = Moscow
DELETE /DB/Col/id Удаление документа с идентификатором id из коллекции Col из базы DB

Логика довольно проста и понятна. Теперь разберемся с тем, как нам установить этот сервер.

  • Скачаем и установим СУБД MongoDB с сайта https://www.mongodb.com/. Базовая версия – бесплатна.
  • Скачаем оболочку для работы с MongoDB – RoboMongo с сайта https://robomongo.org/. Она так же бесплатна.
  • Создадим на диске С каталог Data\Db, это каталог для баз по умолчанию, чтобы не разбираться с параметрами запуска MongoDB.
  • Запустим сервер СУБД командой mongod.exe Это запустит сервер без авторизации под полными правами.
  • Запустим RoboMongo и подключимся к локальному серверу. Наш сервер будет запущен на localhost или 127.0.0.1 на стандартном порту 27017.
  • Создадим на сервере базу FileBase и коллекцию в ней – FileTable.
  • Создадим пользователя, для работы с базой. Для этого запустим shell в RoboMongo. Важно создать пользователя именно через shell, иначе его нельзя будет использовать при авторизации (видимо глюк приложения).
use admin

db.createUser({user: “admin”,pwd: “pwd”,roles:[“root”]})
  • Теперь прервем приложение mongod.exe и запустим его заново командой «mongod.exe —auth», теперь наша база работает с использованием авторизации и без учетных данных мы к ней не подключимся.
  • Скачиваем и устанавливаем Java SE с сайта Oracle.
  • Скачиваем сервер RESTHeart с официального сайта http://restheart.org/. Данный продукт – бесплатен.
  • Настраиваем RESTHeart сервер, для этого отредактируем файл security.yml. В секции users зададим пользователя, под которым будем заходить в базу. Для простоты будем использовать административную учетную запись.
users:

  — userid: admin

      password: pwd

      roles: [admins]
  • Продолжим настройку и отредактируем файл restheart.yml. Отредактируем секцию с указанием протокола и порта для подключения, оставим только стандартный протокол http
https-listener: false

https-host: 0.0.0.0

https-port: 4443

 

http-listener: true

http-host: 0.0.0.0

http-port: 8080

 

ajp-listener: false

ajp-host: 0.0.0.0

ajp-port: 8009
  • Отредактируем mongo-uri строку в restheart.yml
mongo-uri: mongodb://admin:pwd@127.0.0.1/?authSource=admin
  • Наш сервер готов к работе, запустим его командой «java -server -jar restheart.jar etc/restheart.yml»

Теперь наша связка RESTHeart и MongoDB готова и ждет наших команд.

Вот пример кода 1С для нашего сервера RESTHeart который создает документ с идентификатором Объект.ID. Функция ХэшАвторизации – это строка вида «admin:pwd» закодированная в Base64.

HTTPСоединение 	= Новый HTTPСоединение("127.0.0.1", 8080, "admin", "pwd",,	10);
ЧтениеJSON = Новый ЧтениеJSON;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаголовокЗапроса = Новый Соответствие;
ЗаголовокЗапроса.Вставить("Content-Type", "application/json");
ЗаголовокЗапроса.Вставить("Authorization", "Basic " + ХэшАвторизации("admin", "pwd"));
	
HTTPЗапрос = Новый HTTPЗапрос("/FileBase/FileTable/" + Объект.ID + "?id_type=STRING", ЗаголовокЗапроса);
Ответ = HTTPСоединение.ВызватьHTTPМетод("PUT", HTTPЗапрос);

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

Если вас интересует пример реализации хранения файлов и изображений из базы 1С в MongoDB, то можете рассмотреть мою публикацию //infostart.ru/public/624829/, в ней реализован такой функционал. Во вложении к данной публикации я разместил файлы настроек RESTHeart, с которыми у меня на локальной машине все работало.

Вступайте в нашу телеграмм-группу Инфостарт

MongoDB REST RESTHeart

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь 1С:Предприятие 8 1C:Бухгалтерия Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

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

28500 руб.

15.11.2022    29551    38    49    

44

Внешние источники данных Программист Бизнес-аналитик 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Розница 3.0 Платные (руб)

Обработка для выгрузки данных из подготовленных СКД в фоновом режиме в базу ClickHouseDB, PostgreSQL, MySQL, в шину данных с поддержкой REST API (CSV, JSON. SQL), в локальные файлы (CSV, JSON, XLS, XLSX) или в Google Sheets. Это дополнительная подключаемая обработка.

18000 руб.

21.08.2024    7142    18    4    

15

Внешние источники данных Пользователь 1С:Предприятие 8 1C:Бухгалтерия 1С:Розница 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Платные (руб)

Быстро и легко. Выгрузка всех элементов и групп номенклатуры (с их иерархией), кроме помеченных на удаление. Без использования COM-объектов.

4880 руб.

16.08.2023    3348    7    8    

9

Оптовая торговля Розничная торговля Внешние источники данных Прайсы 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

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

15250 руб.

15.05.2024    3632    6    1    

7

Внешние источники данных Мастера заполнения Бизнес-аналитик Бухгалтер Пользователь 1С:Предприятие 8 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 1С:Розница 3.0 1С:Документооборот Россия Платные (руб)

Решение позволяет по ИНН производить проверку контрагентов, получая сведения: видов деятельности, данных ЕГРЮЛ, связанных организаций, отчетности, налогов, финансовый анализ, а также в один клик заполнить карточки справочников контрагентов/партнеров по ИНН в программе 1С по данным государственных реестров.

6000 руб.

12.08.2025    2357    8    20    

9

Розничная торговля Внешние источники данных Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Бухгалтерия 3.0 Фармацевтика, аптеки Россия Бухгалтерский учет Платные (руб)

Внешняя обработка загрузки данных из файла-выгрузки, сформированного в программе F3 TAIL версии 3.4 (и выше) или еФарма версии 2.1, в базу конфигурации 1С: Бухгалтерия предприятия 8, ред. 3.0 (Базовая, ПРОФ, КОРП, ФРЕШ (тонкий клиент)).

17080 руб.

19.12.2016    52507    111    107    

78
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. capone 25 03.07.17 16:50 Сейчас в теме
Люто и беспощадно))
2. Fox-trot 166 01.08.17 14:23 Сейчас в теме
а в чем преимущество такого подхода?
не проще ли хранить все как есть на диске?
3. Silenser 617 01.08.17 22:25 Сейчас в теме
(2)Не проще. Посмотрите комментарии в моей старой публикации, этот вопрос там обсуждался.
4. user679689_redbull4561 11.09.17 14:16 Сейчас в теме
(3) Делаю тестовую доработку по вышей статье. Возвращается код состояния 401

Отсюда вопрос

ЗаголовокЗапроса.Вставить("Authorization", "Basic " + ХэшАвторизации("admin", "pwd"));


Ключ "Authorization" является обязательным и по нему идет авторизация при обработке данных?
Можете разметить процедуру ХэшАвторизации?
5. Silenser 617 11.09.17 14:59 Сейчас в теме
(4)ИмяФайла = ПолучитьИмяВременногоФайла();
врТекст = Новый ТекстовыйДокумент;
врТекст.УстановитьТекст(ВашЛогин + ":" + ВашПароль);
врТекст.Записать(ИмяФайла, КодировкаТекста.ANSI);
Данные = Новый ДвоичныеДанные(ИмяФайла);
ТоЧтоВамНужно = Base64Строка(Данные);
6. user679689_redbull4561 12.09.17 09:34 Сейчас в теме
(5) Спасибо вроде получилось, но начал выдавать ошибку.

Ошибка работы с Интернет: Failure when receiving data from the peer

Я так понимаю это уже из-за настроек самого сервера?
7. Silenser 617 12.09.17 11:26 Сейчас в теме
(6)Я с такой не сталкивался. Возможно сообщение не совсем соответствует истине и система не может получить какие-то дополнительные данные, например, из-за ограничений шлюза или файрвола.
8. dablack 05.10.17 00:07 Сейчас в теме
Вместо roboMongo советую использовать studio3t
есть бесплатная версия и гораздо удобнее работать в т.ч. и запросы писать.
9. Pryanishnikov_Vladimir 06.08.21 15:08 Сейчас в теме
А как чтото поместить в документ? Нужно добавить к PUT запросу тело в JSON? Кто-нибудь может привести пример записи данных в документ?
10. Silenser 617 11.08.21 09:23 Сейчас в теме
(9) есть пример реализации хранения файлов во внешней СУБД, например тут https://infostart.ru/public/624829/ и тут https://infostart.ru/public/944348/
Для отправки сообщения требуется регистрация/авторизация