При создании веб-портала, которому требуется взаимодействовать с системой 1С, особенно если конфигурация 1С является самописной, перед нами встает вопрос выбора оптимальной модели интеграции. Наша задача — не только получить из 1С управляющий сигнал и сформировать текстовый файл, но и предусмотреть возможность будущего двустороннего обмена информацией. Мы рассмотрим различные подходы, проанализируем их преимущества и недостатки, и выберем наиболее подходящие решения.
Если мы хотим быстро и гибко организовать взаимодействие, HTTP-сервисы в 1С представляют собой наиболее современный и рекомендуемый подход. Они позволяют нам превратить 1С в полноценный бэкенд-движок, способный обрабатывать входящие HTTP-запросы и самостоятельно формировать ответы.
GET, POST, PUT, DELETE), что позволяет нам легко реагировать на запросы с веб-портала.Рассмотрим сценарий для нашей задачи:
Наш веб-портал отправляет HTTP-запрос (например, POST или GET) на опубликованный HTTP-сервис 1С. В теле запроса или в параметрах URL мы можем передать управляющий сигнал.
// Пример обработчика в модуле HTTP-сервиса 1С
Процедура ОбработатьЗапрос(Запрос)
// Получаем тело запроса, если данные передаются в JSON
ТекстЗапроса = Запрос.ПолучитьТелоКакСтроку();
ДанныеЗапроса = JSON.Прочитать(ТекстЗапроса); // Предполагаем JSON
// Извлекаем управляющий сигнал
УправляющийСигнал = ДанныеЗапроса.УправляющийСигнал;
// Выполняем действия в 1С
// Например, вызываем функцию, которая формирует текстовый файл
ИмяФайла = УправлениеФайлами.СформироватьТекстовыйФайл(УправляющийСигнал);
// Подготавливаем ответ для веб-портала
Ответ = Новый HTTPСервисОтвет(200); // 200 OK
ОтветДанные = Новый Структура;
ОтветДанные.Вставить("Статус", "Успех");
ОтветДанные.Вставить("Сообщение", "Файл сформирован: " + ИмяФайла);
// Если нужно отправить файл обратно, то здесь мы можем читать его и возвращать в теле ответа
// Например, закодированный в Base64 или как прямую отдачу файла
JSONЗапись = Новый ЗаписьJSON;
JSONЗапись.УстановитьСтроку();
ЗаписатьJSON(JSONЗапись, ОтветДанные);
Ответ.УстановитьТелоИзСтроки(JSONЗапись.Закрыть(), КодировкаТекста.UTF8, "application/json");
Запрос.ОтправитьОтвет(Ответ);
КонецПроцедуры
Если мы работаем с самописной конфигурацией, это не является проблемой. Если же конфигурация типовая, рекомендуется реализовывать HTTP-сервисы в расширениях конфигурации. Это позволяет нам добавлять функциональность, не изменяя основную конфигурацию и сохраняя ее на поддержке.
Когда веб-портал (например, работающий на домене portal.com) пытается обратиться к нашему HTTP-сервису 1С, опубликованному на другом домене или порту (например, 1c.mydomain.ru), браузер может заблокировать такой запрос из-за политики безопасности под названием CORS. Чтобы решить эту проблему, нам необходимо настроить веб-сервер (Apache или IIS), на котором опубликована база 1С, или сам HTTP-сервис 1С для отправки специальных HTTP-заголовков в ответе.
Как настроить CORS:
Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Allow-Headers в конфигурацию веб-сервера. Это позволит браузеру понять, что сервер 1С разрешает кросс-доменные запросы с нашего веб-портала.HTTPСервисОтвет перед его отправкой. Это дает нам более гранулярный контроль над CORS для каждого сервиса.Пример добавления заголовка в 1С:
// Внутри обработчика HTTP-сервиса
Ответ = Новый HTTPСервисОтвет(200);
// Разрешить запросы со всех доменов (для отладки, в продакшене лучше указывать конкретные домены)
Ответ.Заголовки.Вставить("Access-Control-Allow-Origin", "*");
// Разрешить конкретные методы
Ответ.Заголовки.Вставить("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
// Разрешить конкретные заголовки
Ответ.Заголовки.Вставить("Access-Control-Allow-Headers", "Content-Type");
// И т.д. для других заголовков CORS
// ...
Запрос.ОтправитьОтвет(Ответ);
Для более детальной настройки CORS, особенно в контексте 1С, мы можем обратиться к специализированным статьям и документации, например, на информационных ресурсах по 1С.
Помимо HTTP-сервисов, мы можем использовать Web-сервисы, основанные на протоколе SOAP и формате XML. Это более формализованный подход, который имеет свои особенности:
Когда использовать Web-сервисы (SOAP)?
Если нам требуется очень формализованный и строго типизированный обмен данными, где важна автоматическая генерация клиентского кода на основе WSDL, Web-сервисы могут быть хорошим выбором. Однако для простых управляющих сигналов и большинства современных интеграций HTTP-сервисы с JSON обычно оказываются более гибкими и легкими в реализации.
Начиная с версии 8.3.5, платформа 1С предоставляет встроенную поддержку протокола OData (Open Data Protocol). Это мощный REST-интерфейс, который позволяет нам получать и изменять данные информационной базы 1С без написания дополнительного кода в конфигурации.
GET, POST, PUT, DELETE) и синтаксис OData-запросов (например, для фильтрации, сортировки, выбора полей) для взаимодействия с данными.Когда использовать OData?
OData идеально подходит, если наша основная задача — это чтение и запись данных прикладного решения из внешнего приложения, а не вызов специфических функций или бизнес-процессов. Например, для создания личного кабинета, интернет-магазина или другого портала, который напрямую работает с объектами 1С (заказы, товары, контрагенты). OData позволяет нам избежать написания большого количества кода для CRUD-операций (Create, Read, Update, Delete) в 1С.
Для нашей первоначальной задачи (получение управляющего сигнала и формирование файла), OData менее подходит, так как он ориентирован на работу с *данными* как сущностями, а не на вызов *процедур*. Однако для будущего двустороннего обмена данными OData может стать ценным инструментом, дополняющим HTTP-сервисы.
Помимо современных подходов, существуют и другие методы взаимодействия, которые, однако, имеют существенные ограничения и не рекомендуются для новых веб-интеграций.
Теоретически, мы можем организовать прямое взаимодействие 1С с базой данных MySQL веб-портала или наоборот. В 1С для этого можно использовать ODBC-драйверы.
Ограничения и риски:
Когда может быть использовано?
Этот метод крайне не рекомендуется. В очень специфических и редких случаях его можно рассматривать только для чтения отдельных таблиц, где не требуется соблюдение сложной бизнес-логики, и только при условии полной уверенности в стабильности структуры базы данных.
COM-соединение (Component Object Model) позволяет взаимодействовать с 1С из других приложений в среде Windows. В 1С v8.3 для этого используется объект V83.COMConnector.
Почему не рекомендуется для веб-интеграций:
Хотя COM может быть полезен для локальных интеграций между приложениями Windows, для веб-портала мы однозначно похороним этот метод и не будем его использовать.
Одним из простейших, но наименее эффективных методов является обмен файлами через FTP-сервер или общую сетевую папку. В этом случае, управляющий сигнал или данные записываются в файл, который затем периодически отслеживается другой системой.
Механизм:
Веб-портал записывает файл с управляющим сигналом на FTP или в общую папку. В 1С настраивается регламентное задание (или внешняя служба, например, через Cron), которое периодически проверяет наличие новых файлов в этой папке. При обнаружении файла, 1С обрабатывает его содержимое и выполняет необходимые действия.
Недостатки:
При организации взаимодействия между веб-порталом и 1С мы рекомендуем следовать следующим принципам:
Пример кода для вызова функции в 1С с веб-портала (на PHP):
Предположим, у нас есть HTTP-сервис 1С, опубликованный по адресу https://1c.mydomain.ru/ws/signal_service/signal_method, который ожидает JSON-данные.
<?php
// URL нашего HTTP-сервиса 1С
$url = 'https://1c.mydomain.ru/ws/signal_service/signal_method';
// Данные, которые мы отправляем в 1С
$data = array(
'УправляющийСигнал' => 'ФормироватьОтчетПоПродажам',
'Параметры' => array(
'ДатаНачала' => '2023-01-01',
'ДатаОкончания' => '2023-01-31'
)
);
// Кодируем данные в JSON
$jsonData = json_encode($data);
// Инициализируем cURL-сессию
$ch = curl_init($url);
// Настраиваем cURL-запрос
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); // Метод запроса POST
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData); // Отправляем JSON-данные
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Возвращать результат в виде строки
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($jsonData)
));
// Если 1С требует базовую аутентификацию
// curl_setopt($ch, CURLOPT_USERPWD, "ИмяПользователя1С:Пароль1С");
// Выполняем запрос
$response = curl_exec($ch);
// Проверяем на ошибки
if (curl_errno($ch)) {
echo 'Ошибка cURL: ' . curl_error($ch);
} else {
// Декодируем ответ от 1С (если он в JSON)
$result = json_decode($response, true);
echo "Ответ от 1С:<br>";
print_r($result);
}
// Закрываем cURL-сессию
curl_close($ch);
?>
В этом примере PHP-скрипт отправляет HTTP POST-запрос с JSON-телом на HTTP-сервис 1С. 1С обрабатывает этот запрос, выполняет необходимые действия и возвращает ответ, также в формате JSON.
Заключение
Выбор оптимального метода интеграции веб-портала с 1С во многом зависит от наших конкретных задач и требований к обмену данными. Для современной, гибкой и масштабируемой интеграции мы однозначно рекомендуем использовать HTTP-сервисы в 1С, дополняя их OData-интерфейсом для работы с данными. Мы всегда помним о необходимости реализации в расширениях, настройке CORS и обеспечении безопасности, чтобы наша интеграция была надежной и эффективной.