При активном взаимодействии с контрагентами часто возникает задача распространения собственного модуля среди десятков или сотен независимых предприятий. Это может быть модуль формирования заявок, просмотра складских остатков или резервирования продукции. Со временем разработчики неизбежно сталкиваются с двумя серьезными проблемами: необходимостью вручную обновлять модуль у каждого клиента при изменении функционала и вмешательством сторонних специалистов в исходный программный код. Разберем основные архитектурные подходы, которые позволяют вынести функционал в единую точку управления, безопасно передавать обновления и защитить алгоритмы от несанкционированного изучения.
Первой идеей, которая нередко приходит в голову разработчикам, является размещение текстового файла с кодом на FTP-сервере или публичном веб-сайте с последующей загрузкой через HTTPСоединение и запуском конструкцией Выполнить(). Проанализируем, почему такой путь признан крайне небезопасным и технически ограниченным:
Выполнить() исполняет лишь линейный фрагмент кода. Он не позволяет объявлять полноценную структуру модуля: процедуры, функции, директивы компиляции (&НаКлиенте, &НаСервере) и переменные уровня модуля.Наиболее надежным и архитектурно правильным решением является перенос критической бизнес-логики на сервер поставщика. В информационные базы клиентов устанавливается лишь минимальная интерфейсная форма — «тонкий клиент», а все расчеты остатков, производственных планов и бронирования выполняются на вашем сервере через HTTP-сервис.
Рассмотрим преимущества такого подхода:
/api/v1/orders и /api/v2/orders. Клиентский модуль передает номер поддерживаемой схемы данных, что исключает ошибки несовместимости при обновлении структуры конфигурации покупателя.Посмотрим на пример отправки запроса к веб-сервису из клиентской базы:
HTTPСоединение = Новый HTTPСоединение("api.myserver.ru", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL());
HTTPЗапрос = Новый HTTPЗапрос("/api/v1/get_remains");
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Попытка
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
ОтветСервера = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("СинхронизацияЗаказов", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;
Если специфика модуля требует глубокой интеграции с документами информационной базы клиента (например, создания локального документа «Заказ поставщику»), выносить весь код на внешний сервер не всегда удобно. В этом случае применяется схема с контролируемым автоматическим обновлением файла внешней обработки.
Разберем по шагам логику этого процесса:
Base64. Модуль декодирует данные, сохраняет файл во временный каталог и подключает его через менеджер внешних обработок.Рассмотрим пример программного подключения обновленной внешней обработки:
ДвоичныеДанные = Base64Значение(СтрокаBase64ОтСервера);
ПутьКВременномуФайлу = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные.Записать(ПутьКВременномуФайлу);
// Подключаем внешнюю обработку в безопасном режиме
ИмяОбработки = ВнешниеОбработки.Подключить(ПутьКВременномуФайлу, , Истина);
ФормаОбработки = ВнешниеОбработки.ПолучитьФорму(ИмяОбработки + ".Форма");
ФормаОбработки.Открыть();
Обратите внимание на параметр БезопасныйРежим. Если передавать Истина, платформа 1С накладывает ограничения: блокируется обращение к файловой системе, вызов внешних компонент и COM-объектов. Если вашему модулю требуется отправлять сетевые запросы, администраторам клиентской базы потребуется настроить профили безопасности в консоли кластера серверов или добавить обработку в доверенные.
Внешние обработки формата .epf имеют серьезный недостаток: платформа не позволяет штатно поставить их без исходных текстов, а скомпилированный байт-код легко восстанавливается декомпиляторами. Если требуется защитить интеллектуальную собственность и предотвратить редактирование кода местными специалистами, оптимально использовать расширения конфигурации.
Проанализируем особенности этого механизма:
&Вместо, &После или &Перед, что избавляет от необходимости вручную встраивать код в чужую конфигурацию.Если бизнес-логика содержит ноу-хау высокой ценности (сложные алгоритмы оптимизации, проприетарные формулы раскроя или планирования), выносить ее в 1С-код не рекомендуется вовсе. В такой ситуации логику компилируют в бинарную библиотеку (DLL/SO) на языках C++ или Rust с использованием стандарта Native API от 1С.
Разберем специфику работы с компонентами:
УстановитьВнешнююКомпоненту() и ПодключитьВнешнююКомпоненту().Таким образом, для устойчивой работы масштабной сети клиентов наилучшим выбором является гибридный подход: передача минимального клиентского интерфейса в виде расширения конфигурации (защищенного от изменения) и обращение к единому HTTP-сервису с версионированным API для получения актуальных данных и обновлений.