Перейти к основному содержимому

Сценарии использования

В общих чертах сценарий использования библиотеки О2 выглядит следующим образом:

  1. На стороне 1С (на сервере) создается модель. Модель - это эбъект, содержащий список неизвестных величин (переменных модели) и список различных логических или математических ограничений, связанных с этими величинами. Модель описывается программным кодом с использованием объектов и методов библиотеки. Пример:

    Модель = О2.СоздатьМодель();

    ПеременнаяX = Модель.Переменная("x"); // <-- неизвестная величина "x"
    ПеременнаяY = Модель.Переменная("y"); // <-- неизвестная величина "y"

    Модель.Ограничения().Соотношение("x + y = 10"); // <-- добавляем ограничение
    Модель.Ограничения().Соотношение("x > 0; y > 0; x - y = 2"); // <-- добавляем еще ограничений

    В реальных задачах под переменными "x" и "y" могут пониматься различные значимые для предприятия величины, например: время начала производственной операции, номер дня выхода сотрудника в наряд, количество изделий к производству и тд...

  2. После того как модель полностью описана она передается решателю. Решатель - это отдельный программный компонент, который принимает на вход двоичные данные модели, производит вычисления и возвращает решение в виде набора найденых значений. Передача данных модели решателю может происходить по разным сценариям, которые описаны ниже. Вот пример с использованием локального встроенного решателя:

    Решение = Модель.Решить(); // <-- будет использован локальный встроенный решатель
  3. Найденное решение передается обратно в 1С, где оно анализируется, а найденные величины используются в последующих алгоритмах для решения прикладных задач предприятия. Пример:

    Если Решение.РешениеНайдено() Тогда
    ЗначениеX = Решение.ЗначениеПеременной(ПеременнаяX); // <-- ЗначениеX = 6
    ЗначениеY = Решение.ЗначениеПеременной(ПеременнаяY); // <-- ЗначениеY = 4

    // ...
    // Используем найденные значения для дальнейших вычислений
    // ...
    КонецЕсли;

В приведенном выше примере используется локальный встроенный решатель. То есть все вычисления будут происходить на сервере, где установлена служба сервера 1С. Модель из двух переменных будет решена мгновенно, для этого не потребуется значимых ресурсов. Но в реалиных задачах модель может содержать сотни и даже тысячи переменных. При решении такой модели все ядра машины будут загнаны в потолок на продолжительное время, оперативная память также может быть исчерпана. Другими словами, нормальный режим работы сервера 1С будет нарушен.

Чтобы решатель не отнимал ресурсы у сервера 1С, лучше запускать вычисения на отдельном сервере, а локальный решатель использовать только для разработки и тестирования моделей.

Ниже приведены различные сценарии использования библиотеки О2 с различными вариантами установки решателя.

Использование локального решателя

Локальный решатель не требует предварительной установки. Компоненты локального решателя встроенны в конфигурацию расширения О2 и разворачиваются в файловой системе сервера 1С автоматически при первом вызове. Установка расширения О2 описана в данном разделе.

Компоненты решателя устанавливаются в следующие директории:

  • для ОС Windows: %LOCALAPPDATA%\1C\O2
  • для ОС Linux: /var/1C/o2

Локальный решатель - является решателем по умолчанию, поэтому при вызове Модель.Решить() без указания параметров будет использован именно локальный решатель.

Для явного указания использования сервиса локального решателя необходимо указать параметры решения:

Сервис = О2.Сервисы().Локальный(); // <-- указываем вид используемого сервиса

ПараметрыПоиска = О2.СоздатьПараметрыПоиска(Сервис);

Решение = Модель.Решить(ПараметрыПоиска); // <-- указываем параметры явно
ПреимуществаНедостатки

Локальный решатель не требует предварительной установки;

Не требуется отдельный сервер. Все вычисления происходят на сервере 1С.

В момент вычислений локальный решатель занимает ресурсы сервера 1С и может нарушить его работу.

Дистрибутив локального решателя включен в сборку полной версии расширения 1С и дополнительно увеличивает объем конфигурации примерно на 120 Мб.

Если вы не планируете использовать локальный решатель, то вы можете установить компактную версию расширения О2 без встроенных компонентов решателя (легче примерно на 120 Мб). В этом случае при попытке запуска вычислений в локальном режиме приложение будет выбрасывать исключение.

Использование веб-службы решателя

Решатель может быть установлен как отдельное приложение на отдельном сервере в локальной корпоративной сети. В этом случае решатель работает как веб-сервис, принимая HTTP запросы от сервера 1С. Установка решателя описана в данном разделе.

Для использования веб-службы решателя необходимо указать соответсвующие настройки в параметрах решения:

Сервис = О2.Сервисы().ВебСлужба(
Новый HTTPСоединение("my-server.local", 4762) // <-- указываем адрес сервера решателя и порт
);

ПараметрыПоиска = О2.СоздатьПараметрыПоиска(Сервис);

Решение = Модель.Решить(ПараметрыПоиска); // <-- данные модели будут отправлены решателю HTTP запросом
Для справки

Сервис решателя поддерживает работу только по протоколу HTTP. Если вам необходимо передавать данные по защищенному каналу с использваоние HTTPS, то необходимо дополнительно развернуть обратный прокси сервер, например Nginx или Apache.

ПреимуществаНедостатки

Решатель может полностью использовать ресурсы отдельного сервера, не мешая работе сервра 1С.

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

Требуется предварительная установка службы решателя;

Требуется дополнительный сервер.

Использование облачной функции

Решатель может быть развернут как облачная функции в инфраструктуре Яндекс.Облако. В этом случае облачная функция принимает HTTP запросы от сервера 1С так же, как и веб-служба, но в отличие от веб-службы вам не требуется отдельный сервер, а тарификация происходит только за время выполнения вычислений. Создание облачной функции описано в данном разделе.

Для использования облачной функции решателя необходимо указать соответсвующие настройки в параметрах решения:

Сервис = О2.Сервисы().ЯндексОблако(
"xxxxxxxxxxxxxxxx", // <-- укажите свой идентификатор облачной функции
"yyyyyyyyyyyyyyyy" // <-- укажите свой секретный ключ доступа
);

ПараметрыПоиска = О2.СоздатьПараметрыПоиска(Сервис);

Решение = Модель.Решить(ПараметрыПоиска); // <-- данные модели будут отправлены HTTP запросом в облачную функцию

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

ПреимуществаНедостатки

Не требуется отдельный сервер;

Тарифицируется только время, затраченное на вычисления. Простой функции не оплачивается.

Облачная функция легко масштабируется при необходимости обработки нескольких одновременных запросов.

Требуется учетная запись сервиса Яндекс.Облако;

Требуется предварительная установка и настройка решателя в виде облачной функции;

Сервер 1С должен иметь доступ в открытую сеть;

Вычислительные ресурсу ограничены лимитами и квотами облака.

Использование консольной утилиты

Решатель, установленный как отдельное приложение, может работать не только как веб-служба, но и как консольная утилита. Использование консольной утилиты позволяет вам отделить процесс решения от основного кода вашего приложения. Предыдущие сценарии предполагают синхронное выполнение поиска решения. То есть при вызове метода Модель.Решить() поток серверного вызова останавливается и ждет окончания вычислений. Для моделей с большим количеством переменных вычисления могут быть длительными. В этом случае можно рассмотреть сценарий с асинхронными вычислениями. Например:

  1. Сохраняем модель в виде двоичного файла:

    Модель.Записать("C:\path\to\my\model.o2m"); // <-- указываем имя файла для сохранения
  2. Пересылаем файл с данными модели на сервер с установленным решателем любым доступным способом;

  3. На сервере с установленным решателем используем консольную утилиту, для получения файла с данными решения. Для этого выполняем команду:

    o2 solve "/path/to/my/model.o2m" --output "/path/to/my/solution.o2s"

    Консольная утилита запустит вычисления и сохранит результат в виде файла по указанному пути.

  4. Пересылаем файл решения обратно на сервер 1С любым доступным способом;

  5. На сервере 1С загружаем решение из полученного файла:

    Решение = О2.ЗагрузитьРешение("С:\path\to\my\solution.o2s"); // <-- указываем имя файла для загрузки

Для записи модели и чтения решения могут быть использованы не только файлы, но и произвольные потоки. То есть вместо файлов для чтения и записи могут быть переданы потоки для чтения и для записи. Это позволяет создавать конвейеры с асинхронной обоработкой данных произвольной конфигурации с проивольными механизмами транспорта данных.

Подробнее интерфейс консольной утилиты описан в данном разделе.