При построении корпоративных информационных систем часто возникает задача интеграции внешних веб-порталов (например, Microsoft SharePoint) с учетными базами на платформе «1С:Предприятие» (в частности, 1С:Управление производственным предприятием 1.3). Типовой сценарий — предоставление сотрудникам или клиентам возможности оформить документ Заказ покупателя через простую веб-форму на портале без предоставления прямого доступа в интерфейс 1С.
Рассмотрим подробно, почему идея создания документов через прямую вставку в таблицы MS SQL является критической ошибкой, разберем юридические и технические особенности лицензирования, а также проанализируем правильные архитектурные решения для построения надежного шлюза интеграции.
Попытка реализовать интеграцию через хранимые процедуры или прямые SQL-запросы (INSERT INTO) в базу данных 1С влечет за собой фатальные последствия для стабильности и целостности учета. Проанализируем основные причины недопустимости такого подхода:
ПередЗаписью, ПриЗаписи, ОбработкаПроведения, расчетом автоматических скидок, автонумерацией, заполнением реквизитов и проверкой прав. Прямая вставка в SQL создает «мертвую» запись, у которой будут отсутствовать системные движения по регистрам накопления, регистрам бухгалтерии и сведений.GUID (в бинарном формате UNIQUEIDENTIFIER или BINARY(16)), а также поддерживает служебные таблицы итогов регистров. Нарушение внутренних алгоритмов индексации приведет к тому, что при первом же пересчете итогов или тестировании и исправлении база признает такие данные поврежденными._Document123, _Reference456) формируются динамически. При обновлении конфигурации или реструктуризации эти идентификаторы могут измениться, что полностью сломает логику внешних хранимых процедур.Часто интеграцию через сторонний портал пытаются применить для «экономии» пользовательских лицензий 1С. Разберем правовую и техническую сторону вопроса:
С точки зрения лицензионного соглашения, если внешнее приложение собирает запросы от десятков реальных пользователей и отправляет их в 1С через единую сервисную учетную запись, это признается мультиплексированием (pooling/multiplexing). Согласно правилам «1С:Предприятие 8», каждый конечный пользователь, инициирующий ввод или обработку данных, должен быть обеспечен клиентской лицензией.
С технической стороны, при обращении внешних систем к HTTP-сервисам или Web-сервисам (SOAP) сервер 1С захватывает клиентскую лицензию из пула только на миллисекунды выполнения конкретного HTTP-запроса, после чего моментально освобождает ее. Это позволяет обрабатывать очереди запросов с минимальной нагрузкой на пул лицензий, однако юридические требования по лицензированию рабочих мест остаются обязательными к соблюдению.
Наиболее современным, надежным и быстрым вариантом является разработка собственного REST API на стороне 1С. Веб-часть SharePoint формирует простой JSON-пакет с параметрами заказа и отправляет POST-запрос к опубликованному HTTP-сервису 1С.
Разберем по шагам создание сервиса обработки заказа:
HTTP-сервисы с именем ИнтеграцияПортал.portal_api./orders/create и метод POST с обработчиком СоздатьЗаказ.Посмотрим на пример программного кода обработчика в модуле HTTP-сервиса:
Функция orderscreatePOST(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
СтрокаJSON = Запрос.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
Попытка
ДанныеЗаказа = ПрочитатьJSON(ЧтениеJSON, Истина);
Исключение
Ответ.КодСостояния = 400;
Ответ.УстановитьТелоИзСтроки("{""error"": ""Некорректный формат JSON""}");
Возврат Ответ;
КонецПопытки;
// Создаем документ средствами объектной модели 1С
Попытка
НовыйЗаказ = Документы.ЗаказПокупателя.СоздатьДокумент();
НовыйЗаказ.Дата = ТекущаяДата();
// Поиск контрагента по ИНН или коду
СсылкаКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ДанныеЗаказа["КонтрагентИНН"]);
Если СсылкаКонтрагент.Пустая() Тогда
ВызватьИсключение "Контрагент с ИНН " + ДанныеЗаказа["КонтрагентИНН"] + " не найден в базе 1С";
КонецЕсли;
НовыйЗаказ.Контрагент = СсылкаКонтрагент;
НовыйЗаказ.ДоговорКонтрагента = СсылкаКонтрагент.ОсновнойДоговорКонтрагента;
// Заполнение табличной части Товары
Для Каждого СтрокаТовара Из ДанныеЗаказа["Товары"] Цикл
СсылкаНоменклатура = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", СтрокаТовара["Артикул"]);
Если Не СсылкаНоменклатура.Пустая() Тогда
НоваяСтрока = НовыйЗаказ.Товары.Добавить();
НоваяСтрока.Номенклатура = СсылкаНоменклатура;
НоваяСтрока.Количество = СтрокаТовара["Количество"];
НоваяСтрока.Цена = СтрокаТовара["Цена"];
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
НоваяСтрока.СтавкаНДС = СсылкаНоменклатура.СтавкаНДС;
КонецЕсли;
КонецЦикла;
// Запись документа с отработкой стандартных механизмов
НовыйЗаказ.Записать(РежимЗаписиДокумента.Запись);
СтруктураОтвета = Новый Структура;
СтруктураОтвета.Вставить("Status", "Success");
СтруктураОтвета.Вставить("DocumentNumber", НовыйЗаказ.Номер);
СтруктураОтвета.Вставить("DocumentDate", НовыйЗаказ.Дата);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураОтвета);
Ответ.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть());
Возврат Ответ;
Исключение
Ответ.КодСостояния = 500;
Ответ.УстановитьТелоИзСтроки("{""error"": """ + ОписаниеОшибки() + """}");
Возврат Ответ;
КонецПопытки;
КонецФункции
Если веб-сервер 1С периодически подвергается высоким пиковым нагрузкам, перезагружается при регламентных работах или связь между порталом и базой нестабильна, целесообразно использовать асинхронную модель обмена:
РегламентныеЗадания, которое запускается каждые 2–5 минут.HTTPСоединение опрашивает REST API SharePoint, забирает новые заявки со статусом «Новый», создает документы ЗаказПокупателя в 1С и обновляет статус заявки на портале на «Обработан», проставляя номер созданного документа 1С.Такой подход гарантирует, что ни одна заявка с портала не будет потеряна, даже если база 1С временно недоступна для обслуживания.
Главная сложность при создании формы заказа на портале — необходимость оперировать справочниками номенклатуры, контрагентов, договоров и складов. Рассмотрим три практических подхода к решению проблемы НСИ:
/portal_api/nomenclature/search?q=кабель. Сервис возвращает JSON с первыми 20 совпадениями.ЗаявкаПокупателя. Ответственный менеджер внутри 1С видит поступившую заявку, проверяет корректность реквизитов и одной кнопкой «Ввести на основании» генерирует чистовой ЗаказПокупателя.Отказ от попыток прямой записи в СУБД MS SQL в пользу стандартизированных HTTP-сервисов или асинхронных очередей позволяет создать отказоустойчивую интеграцию между SharePoint и 1С. Это защищает базу от повреждения структуры данных, сохраняет целостность регистров и обеспечивает корректную работу всех регламентных алгоритмов системы.