Подходы к решению
Решение задачи целиком в 1С
В этом подходе разработчик использует расширение O2, которое позволяет описывать математическую модель задачи непосредственно на языке 1С. Решение выполняется через встроенную интеграцию с отдельной службой-решателем, но весь процесс — от построения модели до получения результата — находится под контролем кода 1С.
┌───────────────────────────────────────────────┐
│ 1С │
│ ┌───────────────────────────────────────┐ │
│ │ Код на 1С (O2) | |
│ │ ┌───────────────────────────────┐ │ │
│ │ │ Построение модели (O2) │ │ │
│ │ └───────────────────────────────┘ │ │
│ │ ↓ сериализация │ │
│ │ ┌───────────────────────────────┐ │ │
│ │ │ Вызов службы решателя (HTTP) │ │ │
│ │ └───────────────────────────────┘ │ │
│ │ ↓ результат │ │
│ │ ┌───────────────────────────────┐ │ │
│ │ │ Обработка решения в 1С │ │ │
│ │ └───────────────────────────────┘ │ │
│ └───────────────────────────────────────┘ │
└───────────────────────────────────────────────┘
Преимущества:
-
Весь код находится в 1С. Нет необходимости изучать или поддерживать сторонние технологии.
-
Не требуется отдельная интеграция с внешними системами.
-
Можно быстро встраивать оптимизацию в существующие бизнес-процессы и формы.
Недостатки:
-
1С работает существенно медленнее, чем низкоуровневые языки: по оценке, атомарные операции в 1С выполняются в 20–30 раз медленнее, чем, например, в C++ или C#.
-
1С однопоточна — это ограничивает производительность при формировании крупных моделей.
-
В 1С отсутствует полноценная работа с числовыми типами: все вычисления происходят в формате Decimal, что дополнительно снижает скорость.
Этот подход особенно удобен в ситуациях, когда модель небольшая или средняя по объему, и важно максимально сократить трудозатраты на разработку. Он также подходит для команд, работающих преимущественно в экосистеме 1С.
Формирование и решение модели вне 1С
Второй подход предполагает, что модель формируется и решается во внешней программе — на языке, более подходящем для числовых вычислений (например, C#, Python или C++). А в 1С реализуется только интеграция с этим сервисом: отправка входных данных, получение результата и его обработка. Для создания таких интеграций может быть использована библиотека Brom, которая упрощает взаимодействие между 1С и внешними системами.
┌───────────────────────────┐ ┌───────────────────────────────────┐
│ 1С │ │ Внешняя программа │
│ ┌───────────────────┐ │ │ ┌───────────────────────────┐ │
│ │ Модуль интеграции │◄─────────────────────────►│Построение и решение модели│ │
│ └───────────────────┘ │ Brom/SOAP/REST | │ (C++, C#, Python и др.) │ |
│ ↓ │ │ └───────────────────────────┘ │
│ ┌───────────────────┐ │ └───────────────────────────────────┘
│ │ Обработка ответа │ │
│ └───────────────────┘ │
└───────────────────────────┘
Преимущества:
-
Формирование модели происходит значительно быстрее, особенно при работе с большими объемами данных.
-
Более гибкий доступ к возможностям решателей: можно использовать их полные API и подключать библиотеки, не поддерживаемые в O2.
-
Легче масштабировать вычисления — например, запускать их параллельно или в распределенной среде.
Недостатки:
-
Необходима реализация и сопровождение внешнего кода на других языках.
-
Требуются усилия по разработке и поддержке интеграции между 1С и внешним решателем.
-
Повышается сложность сопровождения: появляется зависимость от сторонних технологий.
Этот подход предпочтителен в проектах с высокими требованиями к производительности, при необходимости использовать специфические решатели или при наличии команды разработчиков, работающих вне 1С.
Почему важно разделение 1С и службы решателя
Независимо от выбранного подхода, важно понимать архитектурное обоснование вынесения решающей логики за пределы 1С. Основные причины:
-
Производительность. Платформа 1С значительно уступает по скорости низкоуровневым языкам при выполнении числовых операций. Например, генерация даже простой модели на 100 000 переменных может занять десятки секунд в 1С, тогда как аналогичный код на C# выполнится за доли секунды.
-
Однопоточность. 1С не умеет эффективно использовать многопроцессорные системы, что делает её неподходящей средой для ресурсоёмких вычислений.
-
Тип данных Decimal. В 1С отсутствует поддержка числовых типов с плавающей точкой, что ограничивает как производительность, так и совместимость с решателями, ожидающими float/double.
Выводы
Библиотека O2 позволяет разработчику 1С реализовать задачи оптимизации без глубоких знаний в области численных методов или внешних языков программирования. При этом архитектура O2 учитывает технические ограничения платформы 1С и позволяет выносить вычисления в более подходящую среду.
Выбор подхода зависит от масштаба задачи, требований к скорости решения и состава команды. O2 не ограничивает разработчика: вы можете начать с простого подхода «всё в 1С», а в дальнейшем перейти к интеграции, не меняя кардинально архитектуру.