Начиная с версии платформы 8.3.14, разработчикам стал доступен мощный встроенный инструмент для решения систем линейных алгебраических уравнений (СЛАУ). Ранее подобные задачи решались либо сложными запросами к СУБД (например, в механизме РАУЗ), либо с использованием внешних компонент. В этой статье мы подробно разберем, как работает новый объект РасчетСистемЛинейныхУравнений, в чем его преимущества и как внедрить его в свои проекты.
Основная область применения СЛАУ в автоматизации бизнеса — это расчет себестоимости. В современных системах, таких как 1С:ERP, используется метод расширенной аналитики учета затрат (РАУЗ), где распределение затрат между подразделениями и номенклатурными позициями представляет собой огромную систему уравнений. Проанализируем основные задачи, которые теперь можно решать на уровне платформы:
Разберем по шагам, как взаимодействовать с новым механизмом. В платформе появился специализированный объект РасчетСистемЛинейныхУравнений. Рассмотрим пример типичного кода для формирования и решения системы:
// Создаем новый объект расчета
РасчетСЛАУ = Новый РасчетСистемЛинейныхУравнений;
// Добавляем описание переменных (неизвестных)
РасчетСЛАУ.ДобавитьПеременную("Продукт1");
РасчетСЛАУ.ДобавитьПеременную("Продукт2");
// Формируем коэффициенты уравнений
// Уравнение 1: 10*Продукт1 + 2*Продукт2 = 100
СтрокаУравнения1 = РасчетСЛАУ.ДобавитьСтроку();
РасчетСЛАУ.УстановитьКоэффициент(СтрокаУравнения1, "Продукт1", 10);
РасчетСЛАУ.УстановитьКоэффициент(СтрокаУравнения1, "Продукт2", 2);
РасчетСЛАУ.УстановитьСвободныйЧлен(СтрокаУравнения1, 100);
// Запускаем расчет
Результат = РасчетСЛАУ.Рассчитать();
// Получаем значения
Значение1 = Результат.Получить("Продукт1");
Важно отметить, что внутри математического ядра платформы для ускорения вычислений используется тип Double (число с плавающей запятой 64 бит). Это обеспечивает колоссальный прирост скорости по сравнению со стандартным десятичным типом 1С, при этом точности достаточно для большинства экономических расчетов.
Выясним причину высокой производительности нового механизма. Платформа использует не просто классический метод Гаусса, а целый комплекс оптимизаций для работы с разреженными матрицами (матрицами, где большинство коэффициентов равны нулю).
// Использовать все доступные ядра сервера
РасчетСЛАУ.УстановитьКоличествоПотоков(0);
Один из часто задаваемых вопросов: можно ли использовать этот функционал в 1С:УПП 1.3? Рассмотрим это подробнее. Технически это возможно, но при соблюдении ряда условий:
Во-первых, версия платформы должна быть не ниже 8.3.14. Во-вторых, необходимо изменить режим совместимости конфигурации. Если в УПП установлен режим совместимости "Версия 8.2", объект РасчетСистемЛинейныхУравнений будет недоступен. Однако, как показывает практика разработчиков, снятие режима совместимости в УПП требует тщательного тестирования всех существующих механизмов, особенно в части работы запросов и блокировок.
Проанализируем ситуацию: в старых версиях РАУЗ решение СЛАУ выполнялось итерационным методом Гаусса-Зейделя прямо в СУБД. Это создавало огромную нагрузку на SQL-сервер и требовало постоянной пересылки данных. Новый механизм работает на стороне сервера приложений 1С (написан на C++), что дает следующие преимущества:
Если вы планируете использовать СЛАУ в своих разработках, придерживайтесь следующих правил:
1. Подготовка данных: Максимально очищайте систему от заведомо нулевых коэффициентов. Хотя платформа умеет работать с разреженными матрицами, объем передаваемой памяти в объект РасчетСистемЛинейныхУравнений напрямую влияет на скорость инициализации.
2. Контроль памяти: При расчете очень крупных систем (миллионы переменных) следите за оперативной памятью сервера приложений. Несмотря на оптимизацию, математические операции требуют значительных ресурсов.
3. Обработка исключений: Всегда заключайте вызов метода Рассчитать() в блок Попытка...Исключение, так как система может оказаться вырожденной (не имеющей решения), и платформа выбросит исключение.
Таким образом, появление механизма решения СЛАУ — это качественный скачок платформы 1С в сторону High-load систем и серьезной математической обработки данных, что делает конфигурации вроде 1С:ERP конкурентоспособными на уровне мировых ERP-решений.