Как интегрировать 1С с внешним веб-приложением на PHP+MySQL для выгрузки каталога и загрузки результатов инвентаризации?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Интеграция 1С с внешними веб-системами — это классическая задача, с которой сталкиваются разработчики при создании интернет-магазинов, личных кабинетов или систем складского учета на базе PHP и MySQL. Основная сложность заключается в поиске баланса между использованием инструментов «из коробки» и необходимостью разработки собственного программного кода. В этой статье мы подробно разберем несколько стратегий решения этой задачи, начиная от простых файловых методов и заканчивая современными API-интерфейсами.

Способ 1. Использование интерфейса OData (Автоматический REST-сервис)

Если мы ищем максимально «коробочное» решение в современной платформе 1С 8.3, то первым делом проанализируем возможности OData. Этот механизм позволяет обращаться к данным 1С по протоколу HTTP без написания кода внутри самой конфигурации.

Рассмотрим по шагам, как активировать этот функционал:

  1. Опубликуем информационную базу на веб-сервере (Apache или IIS) через конфигуратор или утилиту webinst.
  2. В окне публикации установим флажок «Публиковать стандартный интерфейс OData».
  3. Выберем конкретные объекты (справочники, документы, регистры), которые должны быть доступны внешнему приложению.

После этого наше PHP-приложение сможет отправлять GET-запросы и получать данные в формате JSON. Например, для получения списка номенклатуры запрос будет выглядеть примерно так: http://server/base/odata/standard.odata/Catalog_Номенклатура?$format=json. Это позволяет динамически забирать остатки и каталог товаров прямо из базы данных 1С.

Способ 2. Обмен данными по протоколу CommerceML

Выясним, как использовать штатный функционал «Обмен с сайтом», который присутствует в конфигурациях 1С:Управление торговлей, 1С:ERP или 1С:УНФ. Даже если ваше приложение не является популярной CMS (вроде Bitrix), оно может имитировать протокол обмена.

Проанализируем алгоритм работы этого метода:

  1. В 1С настроим узел обмена с сайтом, указав адрес скрипта на нашем PHP-сервере.
  2. 1С будет автоматически формировать XML-файлы в стандарте CommerceML, содержащие структуру каталога, изображения, цены и остатки.
  3. На стороне PHP нам потребуется реализовать обработчик, который принимает POST-запросы от 1С, сохраняет XML-файлы и парсит их для записи в MySQL.

Этот способ хорош тем, что в 1С всё настраивается полностью в пользовательском режиме («из коробки»), а вся нагрузка по разработке ложится на веб-часть.

Способ 3. Файловый обмен через XLSX и типовые обработки

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

Выполним следующие действия для выгрузки:

  1. Откроем справочник Номенклатура или отчет Остатки товаров.
  2. Настроим нужные фильтры (например, по конкретному складу).
  3. Нажмем кнопку «Еще» — «Вывести список».
  4. В открывшемся табличном документе выберем «Файл» — «Сохранить как...» и выберем формат XLSX.

Для обратной загрузки результатов инвентаризации в 1С предусмотрена типовая обработка «Загрузка данных из табличного документа». В документах «Пересчет товаров» или «Инвентаризация» часто присутствует кнопка «Загрузить из внешнего файла». Мы можем просто скопировать данные из PHP-приложения (экспортированные в Excel или CSV) и вставить их в форму загрузки. 1С автоматически сопоставит номенклатуру по артикулу или наименованию.

Способ 4. Разработка собственных HTTP-сервисов

Если типовых возможностей недостаточно, разберем программный путь создания легкого API. В современных версиях платформы 1С это делается через объект HTTP-сервисы. Рассмотрим пример кода для простейшего сервиса, который возвращает остаток товара по его коду.

В конфигураторе создадим новый объект HTTP-сервис с шаблоном /stock/{ID}. В модуле метода напишем следующий код:


Функция ОстаткиGet(Запрос)
    ИдентификаторТовара = Запрос.ПараметрыURL.Получить("ID");
    
    // Логика получения остатка из регистра
    ЗапросКБД = Новый Запрос;
    ЗапросКБД.Текст = 
        "ВЫБРАТЬ
        |   ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Остаток
        |ИЗ
        |   РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура.Код = &Код) КАК ТоварыНаСкладахОстатки";
    
    ЗапросКБД.УстановитьПараметр("Код", ИдентификаторТовара);
    Результат = ЗапросКБД.Выполнить().Выгрузить();
    
    Остаток = 0;
    Если Результат.Количество() > 0 Тогда
        Остаток = Результат[0].Остаток;
    КонецЕсли;
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки(Строка(Остаток));
    Возврат Ответ;
КонецФункции

Такой подход требует внесения изменений в конфигурацию, но он наиболее производителен и удобен для веб-программиста, работающего с PHP.

Способ 5. Прямое соединение с MySQL через ADO

Если база данных веб-приложения доступна для прямого подключения с сервера 1С, мы можем использовать механизм COM-объектов для записи данных непосредственно в таблицы MySQL. Посмотрим, как может выглядеть процедура подключения:


Процедура ЗаписатьВMySQL(ДанныеИнвентаризации)
    Connection = Новый COMОбъект("ADODB.Connection");
    ConnectionString = "Driver={MySQL ODBC 8.0 Driver};Server=my_web_server;Database=my_db;User=my_user;Password=my_pass;Option=3;";
    
    Попытка
        Connection.Open(ConnectionString);
        Для Каждого СтрокаДанных Из ДанныеИнвентаризации Цикл
            SQL = "UPDATE inventory_table SET stock_fact = " + СтрокаДанных.Количество + " WHERE sku = '" + СтрокаДанных.Артикул + "'";
            Connection.Execute(SQL);
        КонецЦикла;
        Connection.Close();
    Исключение
        Сообщить("Ошибка подключения к MySQL: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Важно: этот метод требует установки соответствующего драйвера ODBC на сервере, где исполняется код 1С, и настройки прав доступа в самой MySQL для внешних соединений.

Резюме и рекомендации

Подводя итог, проанализируем, какой метод выбрать:

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

← На главную