Интеграция 1С с внешними веб-системами — это классическая задача, с которой сталкиваются разработчики при создании интернет-магазинов, личных кабинетов или систем складского учета на базе PHP и MySQL. Основная сложность заключается в поиске баланса между использованием инструментов «из коробки» и необходимостью разработки собственного программного кода. В этой статье мы подробно разберем несколько стратегий решения этой задачи, начиная от простых файловых методов и заканчивая современными API-интерфейсами.
Если мы ищем максимально «коробочное» решение в современной платформе 1С 8.3, то первым делом проанализируем возможности OData. Этот механизм позволяет обращаться к данным 1С по протоколу HTTP без написания кода внутри самой конфигурации.
Рассмотрим по шагам, как активировать этот функционал:
webinst.После этого наше PHP-приложение сможет отправлять GET-запросы и получать данные в формате JSON. Например, для получения списка номенклатуры запрос будет выглядеть примерно так: http://server/base/odata/standard.odata/Catalog_Номенклатура?$format=json. Это позволяет динамически забирать остатки и каталог товаров прямо из базы данных 1С.
Выясним, как использовать штатный функционал «Обмен с сайтом», который присутствует в конфигурациях 1С:Управление торговлей, 1С:ERP или 1С:УНФ. Даже если ваше приложение не является популярной CMS (вроде Bitrix), оно может имитировать протокол обмена.
Проанализируем алгоритм работы этого метода:
Этот способ хорош тем, что в 1С всё настраивается полностью в пользовательском режиме («из коробки»), а вся нагрузка по разработке ложится на веб-часть.
Рассмотрим вариант, предложенный участниками форума, который считается наиболее надежным при отсутствии прямой связи между серверами. Для выгрузки данных из 1С можно использовать стандартный механизм вывода списков.
Выполним следующие действия для выгрузки:
Номенклатура или отчет Остатки товаров.Для обратной загрузки результатов инвентаризации в 1С предусмотрена типовая обработка «Загрузка данных из табличного документа». В документах «Пересчет товаров» или «Инвентаризация» часто присутствует кнопка «Загрузить из внешнего файла». Мы можем просто скопировать данные из PHP-приложения (экспортированные в Excel или CSV) и вставить их в форму загрузки. 1С автоматически сопоставит номенклатуру по артикулу или наименованию.
Если типовых возможностей недостаточно, разберем программный путь создания легкого API. В современных версиях платформы 1С это делается через объект HTTP-сервисы. Рассмотрим пример кода для простейшего сервиса, который возвращает остаток товара по его коду.
В конфигураторе создадим новый объект HTTP-сервис с шаблоном /stock/{ID}. В модуле метода напишем следующий код:
Функция ОстаткиGet(Запрос)
ИдентификаторТовара = Запрос.ПараметрыURL.Получить("ID");
// Логика получения остатка из регистра
ЗапросКБД = Новый Запрос;
ЗапросКБД.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура.Код = &Код) КАК ТоварыНаСкладахОстатки";
ЗапросКБД.УстановитьПараметр("Код", ИдентификаторТовара);
Результат = ЗапросКБД.Выполнить().Выгрузить();
Остаток = 0;
Если Результат.Количество() > 0 Тогда
Остаток = Результат[0].Остаток;
КонецЕсли;
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(Строка(Остаток));
Возврат Ответ;
КонецФункции
Такой подход требует внесения изменений в конфигурацию, но он наиболее производителен и удобен для веб-программиста, работающего с PHP.
Если база данных веб-приложения доступна для прямого подключения с сервера 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С. Помните, что использование Расширений позволяет добавлять собственные сервисы и логику, не снимая основную конфигурацию с поддержки.