Как организовать создание документов в 1С из корпоративного портала SharePoint и почему нельзя писать напрямую в SQL?

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

При построении корпоративных информационных систем часто возникает задача интеграции внешних веб-порталов (например, Microsoft SharePoint) с учетными базами на платформе «1С:Предприятие» (в частности, 1С:Управление производственным предприятием 1.3). Типовой сценарий — предоставление сотрудникам или клиентам возможности оформить документ Заказ покупателя через простую веб-форму на портале без предоставления прямого доступа в интерфейс 1С.

Рассмотрим подробно, почему идея создания документов через прямую вставку в таблицы MS SQL является критической ошибкой, разберем юридические и технические особенности лицензирования, а также проанализируем правильные архитектурные решения для построения надежного шлюза интеграции.

Почему категорически запрещено создавать документы напрямую в MS SQL

Попытка реализовать интеграцию через хранимые процедуры или прямые SQL-запросы (INSERT INTO) в базу данных 1С влечет за собой фатальные последствия для стабильности и целостности учета. Проанализируем основные причины недопустимости такого подхода:

  1. Обход бизнес-логики и модулей объектов: В платформе 1С запись любого документа сопровождается выполнением процедур модулей: ПередЗаписью, ПриЗаписи, ОбработкаПроведения, расчетом автоматических скидок, автонумерацией, заполнением реквизитов и проверкой прав. Прямая вставка в SQL создает «мертвую» запись, у которой будут отсутствовать системные движения по регистрам накопления, регистрам бухгалтерии и сведений.
  2. Разрушение ссылочной целостности и механизма итогов: Платформа 1С хранит ссылки в виде шестнадцатеричных представлений GUID (в бинарном формате UNIQUEIDENTIFIER или BINARY(16)), а также поддерживает служебные таблицы итогов регистров. Нарушение внутренних алгоритмов индексации приведет к тому, что при первом же пересчете итогов или тестировании и исправлении база признает такие данные поврежденными.
  3. Динамическая структура таблиц: Имена таблиц в СУБД (например, _Document123, _Reference456) формируются динамически. При обновлении конфигурации или реструктуризации эти идентификаторы могут измениться, что полностью сломает логику внешних хранимых процедур.
  4. Нарушение лицензионного соглашения: Лицензионная политика вендора прямо запрещает модификацию и создание данных в таблицах СУБД в обход серверного ядра 1С.

Вопросы лицензирования и мультиплексирования

Часто интеграцию через сторонний портал пытаются применить для «экономии» пользовательских лицензий 1С. Разберем правовую и техническую сторону вопроса:

С точки зрения лицензионного соглашения, если внешнее приложение собирает запросы от десятков реальных пользователей и отправляет их в 1С через единую сервисную учетную запись, это признается мультиплексированием (pooling/multiplexing). Согласно правилам «1С:Предприятие 8», каждый конечный пользователь, инициирующий ввод или обработку данных, должен быть обеспечен клиентской лицензией.

С технической стороны, при обращении внешних систем к HTTP-сервисам или Web-сервисам (SOAP) сервер 1С захватывает клиентскую лицензию из пула только на миллисекунды выполнения конкретного HTTP-запроса, после чего моментально освобождает ее. Это позволяет обрабатывать очереди запросов с минимальной нагрузкой на пул лицензий, однако юридические требования по лицензированию рабочих мест остаются обязательными к соблюдению.

Решение 1. Создание легковесного HTTP-сервиса в 1С (Рекомендуемый подход)

Наиболее современным, надежным и быстрым вариантом является разработка собственного REST API на стороне 1С. Веб-часть SharePoint формирует простой JSON-пакет с параметрами заказа и отправляет POST-запрос к опубликованному HTTP-сервису 1С.

Разберем по шагам создание сервиса обработки заказа:

  1. В дереве метаданных 1С добавим объект HTTP-сервисы с именем ИнтеграцияПортал.
  2. Зададим корневой URL: portal_api.
  3. Добавим шаблон URL: /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"": """ + ОписаниеОшибки() + """}");
        Возврат Ответ;
    КонецПопытки;

КонецФункции

Решение 2. Асинхронная интеграция через списки SharePoint и регламентные задания

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

  1. Пользователь на портале заполняет форму, и SharePoint сохраняет заявку в стандартный список SharePoint (Custom List) или в базу данных портала.
  2. В 1С настраивается РегламентныеЗадания, которое запускается каждые 2–5 минут.
  3. Регламентная процедура через HTTPСоединение опрашивает REST API SharePoint, забирает новые заявки со статусом «Новый», создает документы ЗаказПокупателя в 1С и обновляет статус заявки на портале на «Обработан», проставляя номер созданного документа 1С.

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

Решение проблемы синхронизации справочников (НСИ)

Главная сложность при создании формы заказа на портале — необходимость оперировать справочниками номенклатуры, контрагентов, договоров и складов. Рассмотрим три практических подхода к решению проблемы НСИ:

  1. Динамический поиск (Lazy Loading / Autocomplete): Портал не хранит копию номенклатуры. При вводе пользователем первых 3-х букв наименования или артикула веб-форма отправляет быстрый GET-запрос к HTTP-сервису 1С: /portal_api/nomenclature/search?q=кабель. Сервис возвращает JSON с первыми 20 совпадениями.
  2. Регулярная выгрузка витрины: Из 1С на портал SharePoint выгружается только та номенклатура, которая разрешена к заказу через веб, вместе с актуальными остатками и ценами по расписанию (например, раз в час).
  3. Концепция «Заявка клиента» вместо чистового заказа: На портале создается не системный документ со строгими проверками договоров и счетов учета, а упрощенный промежуточный документ ЗаявкаПокупателя. Ответственный менеджер внутри 1С видит поступившую заявку, проверяет корректность реквизитов и одной кнопкой «Ввести на основании» генерирует чистовой ЗаказПокупателя.

Выводы

Отказ от попыток прямой записи в СУБД MS SQL в пользу стандартизированных HTTP-сервисов или асинхронных очередей позволяет создать отказоустойчивую интеграцию между SharePoint и 1С. Это защищает базу от повреждения структуры данных, сохраняет целостность регистров и обеспечивает корректную работу всех регламентных алгоритмов системы.

← На главную