Разработка и Конфигурация · 11 мин
PHP и 1С: как связать сайт с базой 1С
Как связать PHP и 1С: обмен через HTTP-сервисы, веб-сервисы SOAP, CommerceML и файлы. Примеры кода, настройка публикации, типичные ошибки и FAQ.
Связка PHP и 1С нужна всякий раз, когда сайт на PHP (интернет-магазин, личный кабинет, корпоративный портал) должен обмениваться данными с учётной системой: получать остатки и цены, отправлять заказы, синхронизировать контрагентов и номенклатуру. Прямого подключения PHP к базе 1С не существует — 1С не работает как обычная СУБД, и лезть в её таблицы напрямую через SQL нельзя: это нарушает целостность данных и лицензионные ограничения.
Правильная интеграция строится через официальные механизмы: HTTP-сервисы и веб-сервисы, которые публикует сама 1С, либо через файловый обмен по стандарту CommerceML. Выбор зависит от требований к скорости обмена, объёма данных и того, кто является инициатором обмена — сайт или 1С.
Ниже разобраны четыре рабочих способа связи, настройка публикации на веб-сервере, примеры кода на PHP и типичные ошибки, из-за которых обмен «вроде настроен, но не работает».
Обзор способов интеграции PHP с 1С
Все легальные способы обмена сводятся к четырём архитектурам. Они не исключают друг друга: в одном проекте часто комбинируют, например, CommerceML для выгрузки каталога и HTTP-сервис для передачи заказов в реальном времени.
Сравнение способов связи PHP и 1С
1С сама отвечает на HTTP-запросы. Подходит для оперативного обмена: заказы, остатки, статусы. Требует публикации на веб-сервере и доработки конфигурации.
Классический вариант с WSDL-описанием. Надёжен, но громоздок; PHP работает через SoapClient. Оправдан, если уже используется в инфраструктуре.
Стандартный файловый обмен (XML): 1С выгружает каталог, сайт отдаёт заказы. Поддерживается типовыми конфигурациями без доработок, но обмен не мгновенный.
1С и PHP пишут/читают общую MySQL-базу, RabbitMQ или файлы на диске. Просто и надёжно, но появляется лишнее звено и задержка.
Критерии выбора простые. Если нужен обмен в реальном времени (проверка остатка при оформлении заказа, мгновенная регистрация заказа в 1С) — только HTTP-сервисы или SOAP. Если достаточно обновления каталога несколько раз в день — CommerceML проще и дешевле в поддержке. Если 1С нельзя публиковать в интернет вообще — остаётся промежуточное хранилище, куда 1С выгружает данные по расписанию.
HTTP-сервисы 1С: универсальный вариант для новых проектов
HTTP-сервис — это объект конфигурации 1С, который принимает HTTP-запросы и отвечает на них произвольным содержимым, обычно JSON. С точки зрения PHP это обычный REST API: отправили GET или POST — получили ответ. Создание HTTP-сервиса выполняется в конфигураторе: добавляется объект «HTTP-сервис», в нём описываются шаблоны URL (например, /api/orders) и обработчики методов на встроенном языке 1С.
Со стороны PHP обращение к такому сервису выглядит как обычный HTTP-запрос через cURL с базовой авторизацией (логин и пароль пользователя 1С):
$ch = curl_init('https://1c.example.com/base/hs/api/orders');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERPWD => 'site_user:ПарольПользователя',
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode([
'number' => 'A-1042',
'contragent' => 'ООО Ромашка',
'items' => [['sku' => 'T-100', 'qty' => 3]],
]),
CURLOPT_TIMEOUT => 30,
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
// логировать ошибку, не пытаться гадать причину
}
Обработчик на стороне 1С разбирает тело запроса, создаёт документ и возвращает результат. Важно: вся бизнес-логика (проверка остатков, заполнение реквизитов) должна жить в 1С, а PHP лишь передаёт данные и обрабатывает ответ.
- 1В конфигураторе создайте объект «HTTP-сервис», задайте корневой URL (например, api) и шаблоны URL для каждой операции.
- 2Напишите обработчики методов: разбор JSON из тела запроса, вызов прикладной логики, формирование ответа с HTTP-кодом.
- 3Опубликуйте базу на веб-сервере (Apache или IIS) с включённой публикацией HTTP-сервисов.
- 4Создайте отдельного пользователя 1С для сайта с минимально необходимыми правами.
- 5Проверьте запрос из PHP или curl: ответ 200 с ожидаемым JSON означает, что связка работает.
Веб-сервисы SOAP: когда уже есть WSDL
1С умеет публиковать веб-сервисы по протоколу SOAP с автоматически генерируемым WSDL-описанием. PHP подключается к ним штатным классом SoapClient — достаточно указать URL WSDL и передать параметры авторизации. Этот способ исторически первый и до сих пор встречается в давно работающих интеграциях.
$client = new SoapClient(
'https://1c.example.com/base/ws/Orders.1cws?wsdl',
[
'login' => 'site_user',
'password' => 'ПарольПользователя',
'trace' => true,
'exceptions' => true,
]
);
$result = $client->CreateOrder(['Number' => 'A-1042']);
Недостатки SOAP: многословный XML, чувствительность к точному соответствию типов данных, сложная отладка. Если интеграция создаётся с нуля и нет готовых веб-сервисов, HTTP-сервисы с JSON — более удобный путь. SOAP имеет смысл оставить там, где он уже работает.
Обмен по CommerceML: типовой обмен с сайтом
Типовые конфигурации («Управление торговлей», «Управление нашей фирмой» и другие) содержат готовый механизм обмена с сайтом по протоколу на базе CommerceML. Схема такая: 1С обращается по HTTP к специальному скрипту на сайте, передаёт ему XML-файлы каталога (import.xml, offers.xml) и забирает файл заказов. PHP-скрипт должен реализовать протокол: этапы авторизации, инициализации, загрузки и выгрузки файлов.
Настройка на стороне 1С сводится к созданию узла обмена с сайтом: указывается адрес скрипта на PHP, логин, пароль, расписание и состав выгружаемых данных. На стороне PHP скрипт принимает запросы вида ?type=catalog&mode=checkauth, mode=init, mode=file, mode=import и отвечает текстовыми маркерами протокола («success», «progress», «failure»). Разбор XML выполняется через SimpleXML или DOMDocument.
Главное ограничение — обмен идёт сеансами, а не в реальном времени. Если на сайте критична актуальность остатков «на секунду», CommerceML придётся дополнять точечными запросами через HTTP-сервис.
Публикация 1С на веб-сервере и авторизация
HTTP-сервисы и веб-сервисы 1С работают только через веб-сервер: Apache (с модулем 1С) или IIS. Публикация выполняется из конфигуратора («Администрирование → Публикация на веб-сервере») или утилитой webinst. В настройках публикации отдельно отмечается, что публикуются HTTP-сервисы и/или веб-сервисы — по умолчанию они могут быть выключены.
Авторизация при обращении из PHP — по пользователю информационной базы. Обязательные правила: завести отдельного технического пользователя только для сайта, дать ему права ровно на те объекты, которые нужны обмену, и запретить ему интерактивный вход. Пароль передаётся в заголовке Basic-авторизации, поэтому соединение должно идти только по HTTPS — иначе логин и пароль передаются открытым текстом.
Проверка результата и типичные ошибки
После настройки обмен проверяется по цепочке: сначала доступность сервиса, затем корректность данных. Запрос из браузера или curl к URL HTTP-сервиса с логином и паролем должен вернуть осмысленный ответ, а не страницу ошибки веб-сервера. Затем тестовый заказ с сайта должен появиться в 1С с правильными реквизитами, а изменение цены в 1С — отразиться на сайте после обмена.
Как проверить результат
Запрос возвращает HTTP 200 и JSON/XML с данными
Ошибка 404 (сервис не опубликован), 401 (неверный логин) или 500 (ошибка в коде 1С)
Документ создан в 1С, заполнены контрагент, товары, суммы
Документа нет, либо пустые табличные части и незаполненные реквизиты
Кириллица передаётся без искажений в обе стороны
Вопросительные знаки или «кракозябры» вместо русских букв
Обмен работает под техническим пользователем с минимальными правами
Обмен работает только под полными правами — признак избыточного доступа
Самый надёжный ключ синхронизации между сайтом и 1С — GUID объекта 1С. Храните его в базе сайта рядом с товаром и контрагентом. Наименования и артикулы меняются, GUID — никогда.
FAQ: частые вопросы о связке PHP и 1С
Можно ли связать PHP с 1С без доработки конфигурации?
Да, если конфигурация типовая и содержит механизм обмена с сайтом (CommerceML): достаточно настроить узел обмена и написать PHP-скрипт, реализующий протокол. HTTP-сервисы и веб-сервисы в типовых конфигурациях обычно требуют добавления своих объектов, то есть доработки.
Что выбрать для интернет-магазина: CommerceML или HTTP-сервисы?
Практичный вариант — комбинация: каталог, цены и остатки выгружать по CommerceML по расписанию, а заказы и оперативную проверку остатков передавать через HTTP-сервис. Так достигается и простота типового обмена, и актуальность критичных данных.
Работает ли обмен, если 1С находится в локальной сети без белого IP?
Да, но инициатором должен быть тот, кто имеет доступ к другой стороне. Обычно 1С сама обращается к сайту по расписанию (выгружает данные и забирает заказы), а сайт до 1С «достучаться» не может. Альтернатива — промежуточное хранилище в интернете (база данных, очередь сообщений, файловое хранилище).
Какой формат данных лучше: JSON или XML?
Для HTTP-сервисов удобнее JSON: он компактнее и нативно разбирается в PHP через json_decode, а в 1С — через ЧтениеJSON. XML остаётся обязательным для CommerceML и SOAP. Смешивать форматы в рамках одного сервиса не стоит.
Как отладить обмен, если данные не доходят?
Включите логирование с обеих сторон: в PHP — запись тела запроса, HTTP-кода и ответа в файл; в 1С — журнал регистрации и временные записи в начале обработчика HTTP-сервиса. Проверьте запрос вручную через curl или Postman: это отделяет проблемы публикации и авторизации от ошибок в коде PHP.
Безопасно ли открывать HTTP-сервисы 1С в интернет?
Безопасно при соблюдении правил: только HTTPS, отдельный технический пользователь с минимальными правами, сложный пароль, проверка входных данных в каждом обработчике и ограничение доступа по IP на уровне веб-сервера, если адрес сайта фиксирован.
Что важно запомнить
PHP и 1С связываются только через механизмы платформы: HTTP-сервисы, веб-сервисы SOAP или обмен CommerceML — никогда напрямую через SQL. Для новых проектов оптимальны HTTP-сервисы с JSON, для типового обмена каталогом — CommerceML. Обязательны HTTPS, отдельный технический пользователь с минимальными правами и синхронизация объектов по GUID.