Php и 1с как связать
Перейти к содержимому

Php и 1с как связать

  • автор:

Интеграция сайта на Laravel с 1С — туториал-исповедь от оптимиста.

Арсен Гоян

Решил написать статью о том, как скрестить пингвина с дельфином на русском, т.к. целевая аудитория для 1С в основном русскоязычная. Статья предназначена для PHP-разработчиков, которым предстоит реализовать интеграцию сайта на Laravel с продуктом компании 1С.

Из скиллов нужно — composer, Laravel, будет полезно уметь дебажить с помощью xdebug и PHPStorm.

Когда я услышал, что предстоит синхронизировать заказы в интернет-магазине с приложением “1С-Предприятие”, эмоции были смешанные. С одной стороны — это точно понадобится! С другой стороны, один только бренд “1С” вызывает у разработчика ноющую боль где-то в верхней части желудка.

Стоило взглянуть на документацию, и стало понятно, что “Протокол обмена”, как они его назвали, это просто какой-то франкенштейн в мире программных интерфейсов. Такое впечатление, что они внимательно почитали все существующие гайдлайны и конвенции, а потом сделали наоборот. Но, по крайней мере, создалось впечатление, что в этот раз обойдётся без кода кириллицей (я ошибался).

Но делать надо было. Так что не долго думая, я избрал путь самурая, то есть — делать. Лишь позже я прочитал, что по статистике от трети до половины попыток интеграции сайта с 1С заканчивается провалом.

TL;DR

  1. composer require mavsan/laravel-1c-protocol и composer require arsengoian/commerce-ml
  2. Выполнить всё, написанное тут.
  3. Прописать в конфиге ‘saleShareModel’ => OneCExportOrders::class , реализовать эту модель. Она должна реализовать интерфейс Mavsan\LaProtocol\Interfaces\ExportOrders .
  4. Создать адаптеры для классов заказа и товара, наследующие от CommerceML\Constructors\Document , CommerceML\Constructors\Product
  5. На выходе должен выйти файл, подобный этому.
  6. Настраиваем “Обмен данными с WEB-сайтом” в 1С и тестируем

Что это вообще и зачем?

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

  1. Любой компании нужен учёт (зарплат, складов, заказов итп), будь то для внутренних потребностей (руководство хочет оценить успешность бизнеса) либо для внешних (надо заплатить налоги и сдать отчётность).
  2. Отчётность надо сдавать согласно местному законодательству (Например, в Украине — НПСБО), а значит 99.9% известных западных ERP-систем не годится, т.к. нет соответствующих модулей.
  3. Решение для большого бизнеса — допилить модуль самостоятельно. Решения для малого бизнеса — купить родную СНГ-шную систему, например (в большинстве случаев) — 1С.
  4. Для бизнесов, которые решились на п̶р̶о̶т̶и̶в̶о̶е̶с̶т̶е̶с̶т̶в̶е̶н̶н̶о̶е̶ сайт на Битриксе, интеграция идет “из коробки”.

Путь самурая

Сайт у нас не на Битриксе, а на Laravel. Так что всю интеграцию пришлось делать ручками!

Итак, расстановка сил была следующая:

  • Laravel 5.7 + PHP 7.2
  • 1C-Предприятие 8.2
  • Shared хостинг на одном из популярных украинских сервисов
  • Лаконичная документация
  • 1 печальный бэкенд-инженер

Как?

Конечно, ни о каких вебхуках или REST API речи даже не идёт. Идея такова: приложение 1С на Windows само отправляет запрос типа http://<сайт>/<путь> /1c_exchange.php?type=TYPE&mode=MODE.

Получается 4 таких шага:

  1. mode=checkauth Начало сеанса — сайт получает в HTTP заголовке юзернейм и пароль и в ответ отправляет куки в теле HTTP ответа. Куки с одному Богу известной целью отправляются на каждом следующем шаге вместе с юзернеймом.
  2. mode=init Уточнение параметров сеанса — сайт должен отдать инфу о поддержке zip-сжатия и максимальном размере выгружаемого с 1С файла (человеческим языком, максимальный размер тела HTTP-запроса для импорта на сайт), так словно нельзя было это отдать в предыдущем запросе.
  3. mode=query “Полезный” запрос — мы возвращаем список заказов в формате CommerceML! Чтоо? А это ещё что? XML-схема, придуманная 1C для обмена с сайтом. С тегами на русском. И кодировкой Windows-1251. О ней поговорим позже.
  4. mode=success Да, серьёзно. Ну вы поняли.

Ещё есть mode=file для того, чтобы подтягивать заказы обратно с 1С на сайт (зачем?), но давайте это опустим. Вдруг вы захотите проверить успешность экспорта. Скажу только, что готовое решение, о котором поговорим позже будет паковать заказы в файлы в папке из переменной конфига inputPath . Если вам ценно место на диске, есть смысл поставить на хрон очистку этой папки.

Поняли, о чём я говорил, когда жаловался на протокол обмена?

К счастью, вот тут нашлась готовая либа для интеграции. Даже доступная на packagist.org! Дело в шляпе? А вот и нет. Человек сделал интеграцию для подтягивания каталога (возможно, позже поговорим об этом в другой статье). А 50% кода для подтягивания заказов… Нет!

Окей. Доделаем. Наверное, есть готовое решение для того, чтобы произвольную структуру данных переделать в CommerceML? Нет! Есть только для чтения. А для записи — 0!

Пы.сы. Состоянием на конец 2018 года мой пулл-реквест с экспортом заказов так и висит вот тут. Так что если понадобится, либу берите оттуда…

Боремся с CommerceML

Хорошо. Либы нет — надо делать. Полный мастер-класс тут расписывать не буду, скажу только, что сделал на основании SimpleXML небольшую библиотеку-враппер, которая покрывает только нужные для экспорта заказов теги (да, я лентяй.)

Типизировал все теги, имеющие дочерние элементы. В итоге, создание списка заказов выглядит вот так (если строить не по кусочкам, а все сразу):

Тут сразу у тебя, читатель, рождается закономерный вопрос. Но можно же было просто сделать blade-шаблон с CommerceML и подставить туда нужные значения? Можно. Но мы ступили на путь самурая! И поэтому делать всё будем со вкусом. Расширяемо. Модульно.

Значения в CommerceML

Тут надо отметить: в некоторые поля надо будет прописать типичные значения. В том числе,

  • В документе: экономическая операция — Заказ товара, роль — Продавец, обменный курс1, валюту указывать кирилличным сокращением малыми буквами, например, грн или руб.
  • В контрагентах (пользователях): роль — Покупатель
  • В адресе представление я писал 87698, без понятия, что это значит. Поля — Город и Адрес доставки. То есть:
  • Представителей везде делал пустыми: new Representatives([]) .
  • В продуктах:

Базовая единица (штука, взято с примера):

Что делать с сайтом?

Получается, нам осталось зареквайрить composer’ом mavsan/laravel-1c-protocol и arsengoian/commerce-ml , при чем вместо первой — вставить переделанную версию библиотеки.

Настраиваем библиотеку для синхронизации (скопировал из документации):

  • Зарегистрировать сервис-провайдер в config/app.php
  • Зарегистрировать пакет Chumper/Zipper , как указано в документации:
  • Опубликовать конфигурацию и изменить при необходимости: php artisan vendor:publish —tag=la1CProtocolConfig .

Открываем конфигу, прописываем модель для экспорта.

Эту модель теперь надо реализовать. Она должна реализовать интерфейс Mavsan\LaProtocol\Interfaces\ExportOrders .

Теперь думаем по логике.

Очевидно, что на нашем (hopefully) готовом сайте уже есть готовые классы для продукта и заказа. Просто делаем для них адаптеры. Получается, если у нас обычный сайт, надо создать свою имплементацию для тегов “Документ” и “Товар”. Для этого мы создаём классы DocumentAdapter и ProductAdapter соответсвенно. Они наследуют от имплементаций из библиотеки: CommerceML\Constructors\Document , CommerceML\Constructors\Product соответственно.

Для продукта это будет выглядеть как-то так:

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

Сделали реализацию протокола. Теперь что? Как дебажить?

Пришли к самому замечательному — настройке самой 1С-ки. И заодно рождается вопрос. Как это всё тестить вообще?

Ну, для того, чтобы порядочно это протестировать, должен быть установлен и настроен дебаггер у нас на локальном компе или на удалённом сервере. Если внезапно его всё ещё нет: вот туториал для XDebug и PHPStorm’а.

По сути, выборов тут миллион, я решил работать так: имея уже настроенный комп и ngrok, просто перенастроил свой локальный хост на локалхост и раздал с помощью комманды ngrok http 80 . Отличная утилита, к слову. Как вариант, если настроен локально виртуальный хост, отличный от локалхоста ( dev.localonlinestore.com в примере), можно сделать и так: ngrok http -host-header=rewrite dev.localonlinestore.com:80 . К слову, купив тут платную версию, можно получить статичный домен вроде johndoe.ngrok.io . Очень удобно, так как не надо перенастраивать 1С каждый раз когда включаешь , как я делал.

Немного сложнее будет настроить xdebug или zend debugger на удалённом сервере. Тогда можно к ним подсоединиться через ssh-туннель коммандой ssh -R 9000:localhost:9000 user@yourvps.com , где 9000 — порт, на котором настроен дебаггер. Плюс опять в том, что не надо настраивать заново 1С каждый раз. Больше об удалённом дебаггинге, если не слышали, в этом туториале, опять-таки для PhpStorm’а. К сожалению, со своим shared hosting не мог себе это позволить.

Третий вариант — ваш 1С уже стоит локально на компе рядом с сайтом. Ура! Можно дебажить локально.

Настроив дебаггер, ставим брейкпойнт где-то в коде нашей модели.

В крайнем случае, если всё это не получилось, в Laravel к вашим услугам удобнейший логгер, хотя на дебаг уйдет в 3 раза больше времени, так что…)

Как настроить 1С?

Логинимся в наш компьютер с 1С, заходим в приложение. Радуемся тёплому и интуитивному интерфейсу.

Если настроек ещё не создавали, сразу откроется окно создания.

Обратите внимание, добавляем к пути параметр XDEBUG_SESSION_START=ide_key , где ide_key — ваш настроенный в php.ini ключ. Это если мы собираемся дебажить!

На счёт параметра пути 1c-exchange — это значение ключа 1cRouteNameCatalog в конфиге config/protocolExchange1C.php .

Ещё одно — для меня оказалось это полнейшим сюрпризом, но 1С вплоть до новейших подверсий 8.3. не поддерживает HTTPS. Так что копируем адрес ngrok.io с HTTP. (Или настраиваем свой сервер соответствующим образом).

А вот при настройке продакшновой версии интеграции если у вас на сайте авторедирект с HTTP на HTTPS (а он должен быть, 2019 год на улице), вам не повезло. Придётся настроить субдомен. По сути, можно скопировать файл public/index.php в какую-то папку рядом с public и настроить там корень субдомена. У меня вышло 1c.website.com. Не забудьте отключить редирект для субдомена!

На следующем этапе настраиваем все параметры тут. Выбираем организацию, ответственного и т.д. Если не существует — создаём. Тут всё просто. Рекомендую посоветоваться тут с админом 1С или бухгалтером.

На следующем шагу настраиваем регулярность (не чаще 30 минут…) и… готово!

Можем сразу открыть нашу новую настройку для редактирования.

Если всё вышло, получим что-то такое:

В случае, если в процессе будет выброшено исключение, если повезёт, весь мусор будет напечатан в том же логе, но я не стал бы на это рассчитывать =)

Интеграция PHP и приложений 1С

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

В этом случае взаимодействие 1С Бухгалтерия или типовых приложений организовывается с помощью скриптов на PHP. Благодаря им можно не переносить вручную заказы на сайте в программу 1С и вносить изменения в учет. Рассмотрим несколько примеров того, как вызывать скрипты на PHPиз приложений на платформе 1С Предприятие.

Примеры работы со скриптами

Для взаимодействия сайтами в программах 1С 8.3 используется объект HTTPСоединение. Он дает возможность авторизоваться в административной части сайта и указать, какой механизм запускается на исполнение.

В качестве опций к этому объекту передаются такие переменные:

  • Адрес интернет-ресурса и название скрипта на языке PHP;
  • Данные для авторизации, чтобы получить доступ к защищенным данным (логин и пароль).

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

HTTP = новый HTTPСоединение(«_АдресСайта_/ImportPrice1C.php»,,ЛогинПользователя,ПарольПользователя,,);

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

После успешного соединения можно запускать на выполнение нужный скрипт на сайте. Но перед непосредственно запуском производится проверка успешности подключения путем анализа информации из записанного до этого файла. Для этого используется еще один объект — екстовыйДокумент(). Если при чтении файла программой будет обнаружена искомая последовательность символов success, можно приступать к выполнению программы.

Заключение

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

Как сделать подключение к базе 1С из PHP?

Я исследую возможность завязать 1С-приложение (через которое ведется учет товаров, поставщиков, продаж, отгрузок, генерация накладных и т.п.) с веб сайтом.
Чтобы заказчик мог через веб-сайт сгенерировать себе счет для оплаты, узнать наличие товаров и т.п.

Кто-нибудь сталкивался с подобными рода задачами? Возможно ли из php подключиться к базе 1C напрямую? (Я понятия не имею, как устроен 1С и какие БД там используются)

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

UPD: Всем огромное спасибо за помощь! Вопрос закрыт. Будем пробовать подключиться напрямую и выбить из 1С-разработчиков информацию о внутреннем устройстве БД

  • Вопрос задан более трёх лет назад
  • 28459 просмотров

Оценить 3 комментария

  • Facebook
  • Вконтакте
  • Twitter

Kwisatz

  • Facebook
  • Вконтакте
  • Twitter

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

Классическое решение от 1С — Битрикс использует следующую схему — выгрузка из 1С в CommerceML (ну в смысле в XML стандартизированного формата CommerceML) и загрузка этого дела на сайт.
Таким образом вы можете загрузить на сайт актуальный ассортимент, прайс лист и остатки на складах.
С сайта вы можете также в XML выгрузить нужные вам счета/заказы и загрузить их в 1С.
Механизм, который позволяет 1С выполнять обмен данными через сереализацию в XML называется конвертацией данных или обменом, конкретный обмен задается правилами обмена (тоже записанными в XML)/ Единтственное, вам конено придется настроить правила обмена, так чтобы 1С отдавала нужные вам данные, а также настроить правила загрузки данных с сайта. Настройка правил обычно выполняется на основе типового шаблона с использованием для допиливания специальной конфигурации, которая так и называется — «Конвертация данных».

Обмен через XML в этом слчае предпочтителен, т.к. вас наверное сервер 1С и web сервер тереторриально разнесены. Т.е. в таком случае COM однозначно не катит, возможен конечно доступ непосредственно к SQL серверу на котором лжит 1С — но здесь тоже непросто, как минимум, для того чтобвы записать счета/заявки в напрямую в SQL базу 1С придется поколдовать (хотя это возможно, и мы так делали).
Дак, как напиасно выше 1С позволяет использовать SOA обертку, но работа с ней требует большего кода на стороне 1С и в целом более сложный механизм, однако позволяет работать с данным полность в реальном времени. Т.е. если в случае выгрзки XML вы можете обновлять на сайте остатки насайте каждый час, то при использовании веб сервиса 1С вы бдете видеть всегда актуальные остатки. Как правило такой оперативности не требуется, если же это то, что вам надо — пишите, распишу иеханизм веб сервисов.

Если требуется более подробный совет пишите в личку — посоветуем, а если надо и поможем;-)

  • Facebook
  • Вконтакте
  • Twitter

1С может работать на нескольких «движках» БД:
— Postgres (не нативно а через костыли)
— MS SQL
— DBase (dbf)
Все перечисленные способы подключения поддерживаются в PHP.

Отвечая на вопрос — да, подключиться к БД можно.

В 1с версии 8 уже есть понятие веб сервисов и можно общаться с 1с через SOAP интерфейс.

Экспорт сделать можно в любой текстовый формат или через COM объект в любой другой

Интеграция PHP и 1С

Анна Викулина

Всегда актуальная информация на сайте. Интеграция с любыми CMS: Битрикс, UMI, WordPress, Joomla, Drupal, Tilda и другие.

Интеграция 1С с Битрикс

Актуальные цены на сайте. Моментальное отображение заказов в 1С. Интеграция со службой доставки и маркетплейсами.

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

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

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

Примеры работы с PHP

Основный объектом платформы 1С 8.3 для работы со скриптами на сайтах является «HTTPСоединение». Именно через него проходит авторизация и определяется, какой механизм на сайте нам нужно запускать. В качестве параметров в новый объект для соединения с сайтом нужно передать следующие данные:

  • Адрес сайта и наименование скрипта на PHP;
  • Имя пользователя для авторизации и получения доступа к данным;
  • Пароль вышеуказанного пользователя.

После выполнения этой строки кода, чтобы работать дальше, необходимо проверить, смогла ли 1С подключиться и авторизоваться для выполнения скрипта. Для этого воспользуемся методом «Получить()», который должен нам вернуть слово «success» в случае положительного результата. Удобнее записать это слово в файл, чтобы была возможность проанализировать ход выполнения программы.

Для этого мы используем еще один параметр, в который нужно положить путь с именем файла:

После того как мы записали ответ с сервера об успехе подключения, можно описывать непосредственно выполнение скрипта PHP. Естественно, необходимо предусмотреть проверку успешности подключения, поэтому придется считывать сообщение из записанного файла. Это можно реализовать при помощи объекта «ТекстовыйДокумент()». Если слово «success» найдено в файле, то можно запускать скрипт PHP прямо из 1С:

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *