У многих сразу может возникнуть вопрос: «Зачем нужен обмен через MySQL, если есть API?». Тут может быть сразу несколько вариантов:
- Сайт сильно доработан, поэтому через API невозможно забрать всю необходимую информацию
- Версия сайта не поддерживает API, при этом часто это обосновывается еще и предыдущим пунктом
Теперь давайте по шагам рассмотрим, как я делаю обмены с сайтами через базу данных MYSQL.
ШАГ №1. MySQL: Получение / Запись данных
Так как я делаю обмены с MYSQL часто, для оптимизации этого процесса я разработал внешнюю компоненту «MySQL2JSON». Эта компонента позволяет как читать данных из MYSQL, так и делать запись в базу данных. При этом результат работы компоненты возвращается в JSON формате. Что по сути превращает интеграцию c MYSQL в «культурный обмен», на подобии обмена по API c INSALES или Storeland.
Еще одна особенность компоненты: для ее работы не требуется никаких дополнительных драйверов на ПК клиента, не нужно ничего настраивать. Она работает всегда предсказуемо и идентично на любом ПК. Ну и конечно же она является «Нативной» (то есть сделанной по стандартам и требованиям «1С»)
Обычно я размещаю ее в качестве макета прямо в конфигурации или через расширение, что позволяет не снимать с поддержки конфигурацию клиента. Выглядит это вот таким образом:
Если тема со внешними компонентами будет интересна – сделаю отдельную статью, так как информации на эту тему катастрофически мало. А возможности, которые они дают – просто огромные.
ШАГ №2. Получение доступа к базе
Для того, чтобы читать / писать данные извне из базы данных MySQL необходимо сделать ряд настроек на стороне хостинга. А именно открыть доступ извне. На хостинге beget это выглядит вот так:
Хочу заметить, что на скрине стоит галочка «Единый доступ с любого IP». Эту опцию удобно использовать для работы с базой с учетом того, у Вас динамический IP адрес. Когда загрузчик будет стоять на сервере клиента, нужно будет снять эту опцию и ограничить доступ для определенных IP адресов. Проще говорят эта опция нужна только для удобной отладки, но для «рабочей базы» это не безопасно.
Кстати, у меня есть оплаченный аккаунт именно на этом хостинге именно из-за удобства работы с БД извне. Я обычно копирую базу клиента (и сайт) и разворачиваю у себя копию, чтобы ускорить процесс разработки, потому что ожидание доступов часто это совсем не быстрый процесс.
ШАГ №3. Написание SQL Запросов (чтение данных)
Для получения данных о заказах из MySQL необходимо написать SQL запрос, причем не один, а два. Возможно, этот этап вызовет некоторые сложности у «1С»-ника, который привык работать с удобным «Конструктом запросов». Однако, не стоит пугаться, SQL это родственник Языка запросов 1С, поэтому ожидаемое текст первого запроса будет начинаться с SELECT. Кстати, в «английской версии» Языка запросов 1С, сходств с SQL очень много.
Первый запрос будет получать список заказов со всеми реквизитами, но без состава. Причем отбор мы будем делать за период. Чуть позже я рассажу как удобно делать отбор за период. Важная особенность WooCommerce – это то место, где хранятся реквизиты заказа. Это таблица wp_postmeta. По сути общая таблица, где хранится очень много информации, например та же информация о товарах, статьях, и.т.д. Для «1С»-ника это может показаться диким, но причина тому то, что WooCommerce, хоть и очень популярный скрипт для интернет-магазина, но является плагином для Wordpress, а тот в свою очередь изначально был предназначен для блогов (Помните такие сайты?). Для получения списка заказов со всеми реквизитами, нужно сделать связь wp_wc_order_stats с таблице wp_postmeta. Первая содержит базовую информацию о заказе: Дату создания, Идентификатор заказа, статус, и.т.д.
Где писать запросы? Тут у нас есть огромный выбор. Наверное самый простой вариант для работы с базой MYSQL будет mysql front. Программа абсолютно бесплатная и для написания простых запросов ее вполне будет достаточно. Перед запуском программы, нас будет приветствовать вот такое окно:
Здесь нам предстоит ввести параметры подключения безе данных и название самого подключения. Получится примерно так:
- Любое имя, наиболее удобно ввести сюда имя сайта, чтобы не путаться
- Здесь должен быть IP адрес сервера или домен. Хочу заметить, что если клиент вам скопирует просто параметры подключения к базе из строки подключения к базе из сайта – вместо этого параметр будет LOCALHOST. Это нам категорически не подходит, так как сайт находится с базой данных на одном сервере, а мы подключаемся извне. Это параметр можно подсмотреть на хостинге. Например у BEGET это выглядит так:
3-4-5. Тут как правило все очевидно. Это имя пользователя, пароль и имя базы. Причем Имя базы и имя пользователя часто идентичны.
После создания настройки подключения к БД сайта, перед нами откроется окно со списком всех таблиц базы (слева) и содержимым выбранной таблицы (справа).
Для написание самого запроса нам нужно будет перейти на вкладку SQL Editor (1), написать сам запрос в текстовом поле (2) и выполнить команду Execute.
Запрос не претендует на самое оптимальное решение:
И вторая часть
В результате мы получим нечто такое:
Второй запрос будет получать список товаров по нужному заказу, причем его мы будем выполнять только в том случае, если заказ ранее не был загружен. Эти проверки будут проходить уже в коде самой обработки для интеграции с сайтом.
Текст второго запроса зависит от того, каким способом Вы будете идентифицировать товар, и еще ряда параметров. Тут могут быть вариации по составу таблиц и данным. Ниже я приведу пример моего запроса:
В качестве примера я использую параметр order_id = 21076. Безусловно в рабочей версии он будет меняться на нужное значение (ИД Заказа).
А в результате мы получим:
Из таблицы wp_woocommerce_order_items мы забираем «order_item_name» и «order_item_type». Это соотвественно название товара и тип (товар или доставка).
Таблица wp_wc_order_product_lookup содержит «product_qty», «product_net_revenue», «product_id» и «variation_id». Это количество товара, цена, ИД товара и ИД характеристики.
Из wp_wc_product_meta_lookup заберем только артикул.
Шаг №4. Получение данных
На мой взгляд, наиболее удобный методы работы с SQL запросами – это хранение текста запроса в макетах с типом «Текстовый документ».
Как можно видеть на скриншоте, у меня для каждого запроса создан отдельный макет. Если бы я хранил запросы в коде обработки, работать с ним было бы крайне не удобно. Используя макеты, я могу просто скопировать текст запроса из MYSQL FRONT (или аналогичного редактора) в «один клик» и сразу проверить как изменилось поведение обработки.
Теперь более детально посмотрим на текст запроса и на то, как я ним работаю в модуле обработки.
В коде обработки я получаю текст SQL запроса из макета, а далее меняю 2 «параметра», которые на скриншоты выделены красным (служащие параметрами отбора заказов за период)
Далее полученный текст запроса, я «скармливаю» своей внешней компоненте. Выглядит это таким образом:
Как видно из кода выше, результатом работы внешней компоненты является JSON, с которым в «1С» работать очень просто. В данном примере переменная «ТаблицаЗаказов» имеет тип «Соответствие», где обращение к данным происходит либо с помощью метода «Получить», либо просто указывая имя нужной переменной в квадратных скобках (например ТаблицаЗаказов["data"]).
Шаг №5. Немного про создание заказа
Если ранее Вы не делали интеграцию с сайтами, здесь я хотел бы немного пробежаться по этапам загрузки заказов. Думаю, это будет удобной шпаргалкой, если вдруг Вам придется писать обмен с «0».
- Идентификация клиента по номеру телефона, который в идеале перед началом поиска привести к стандартизированному виду. То есть убрать пробелы, знаки «-», +7 и 8.
- С договором думаю все очевидно, если Контрагент найден – берем «Договор по умолчанию» иначе создаем новый
- Идентификация товара зависит от типа обмена. Самый простой вариант -поиск товара по Артикулу, Коду товара (если конечно, он был предварительно выгружен на сайт) или даже наименованию товара (хоть это и не очень надежно). В противном случае приходится заводит таблицы соответствия товаров сайта и «1С». В данном вопросе все очень индивидуально и напрямую зависит от того, каким образом формировался каталог товаров на сайте. Если вы начали заниматься интеграцией, когда каталог на сайте был пуст – это замечательно. Так как перед выгрузкой Вы сможете либо выгрузить свой идентификатор на сайт, либо сразу же при выгрузке формировать таблицу соответствия ID товара на сайте и Кода товара 1С. Ну и конечно же, если Вы сами формируете каталог – Артикул на сайте точно будет соответствовать артикулу в «1С».
- Ну и конечно же не забывайте про Журнал регистрации для фиксации сбоев при загрузке / выгрузке данных
Шаг №6. Выгрузка данных
Если при написании запроса на получение данных, можно было найти некоторые сходство с языком запросов «1С». То с выгрузкой данных все несколько сложнее, так как для выгрузки мы будем использовать команду UPDATE (обновление записи в таблице БД).
Команда имеет следующий синтаксис:
UPDATE <имя таблицы> SET <имя столбца1> = <значение2>, <имя столбца2> = <значение2>...
WHERE <имя столбца> = <значение>
Пожалуй, самой популярной выгрузкой данных на сайт является выгрузка остатков и цен товаров и 1С. Безусловно, я встречал и «полные» обмены, когда выгружать приходилось буквально все изменения по заказу и данным клиента. Но это совсем не про этот обмен. Все гораздо проще.
Особенность этого сайта, что в нем для поиска товара по «Коду 1С» используется новое «свойство» товара «_product_code1c». Оно было создано при выгрузке товаров на сайт. Однако если бы выгрузка остатков была например с идентификацией по Артикулу, нам пришлось изменить всего 1 поле в запросе.
Запрос на выгрузку остатков выглядит так:
Как вы могли догадаться, товары хранятся в той же таблице wp_postmeta, что и заказы (это особенность woocommerce). Сначала мы находим post_id по «Коду 1С», а далее делаем update meta_key = «_stock». Значение остатков пишем в «колонку» meta_value
Как видно из скрина «МОЙ_КОД_1С» и «значение2» - это параметры, которые при формировании запроса будут заменены на код товара 1С и значение остатка этого товара.
Для того, чтобы полностью закрыть вопрос с выгрузкой остатков, нам необходимо выгрузить признак наличия или отсутствия товара. Следующий запрос как раз делает эту задачу:
Здесь отличия только в meta_key = «_stock_status». В качестве «значение3» сюда нужно передать "instock" или "outofstock", когда товара нет в наличии.
Ну и последний запрос, который мы рассмотрим – обновление цен:
В коде обработки «значение1» нужно заменить на актуальную цену по товару с кодом «МОЙ_КОД_1С».
Заключение
Итак, мы с Вами рассмотрели, как работает обмен с сайтом через чтение/запись базы данных MYSQL. Аналогичным образом можно реализовать обмен с любым другим сайтом, например на платформе OpenCart или Moguta. В отдельных статьях мы посмотрим и на структуру баз данных этих CMS.
Тестирование проводилось на платформе - 1С:Предприятие 8.3 (8.3.10.2650), (8.3.17.1549), (8.3.20.1613).