Тестирование средств 1С для решения СЛАУ

06.12.22

Разработка - Математика и алгоритмы

В статье анализируются средства платформы для решения системы линейных уравнений в 1С. Приводятся доводы в пользу некорректной работы встроенных алгоритмов, а значит потенциально некорректного расчета себестоимости в типовых конфигурациях.

Введение

Когда-то прочитав публикацию на Зазеркалье о добавлении в платформу метода решения систем линейных уравнений (СЛАУ), был заинтересован, так как раньше немного интересовался алгоритмами решения СЛАУ. Особенно заинтриговала публикаций от 1С на хабре, где они показывают очень уж сильные результаты по времени в сравнении с известными библиотеками. Недавно найдя свои старые наработки по Matlab в части моделирования электромагнитного поля, где как раз и возникают большие линейные уравнения с разреженной, несимметричной матрицей коэффициентов, которые плохо поддаются решению, решил проверить, что покажет на них 1С.

 

Что сравниваем?

    Сравниваем следующие методы:

  • Реализация в 1С, про который немного известно, но судя по описанию с ИТС, у них используется как прямой метод решения, так и итерационный метод, а так же ряд своих оптимизаций, ключевая из которых - это разбить систему на много мелкий, что значительно облегчает поиск решения. Тот или иной метод выбирается в зависимости от вида СЛАУ (разряженные, симметричная и т.д.) и настроек, переданных разработчиком. Так же упоминается, что используются возможности многоядерных процессоров.
  • Реализация в Matlab, которая работает по умолчанию при расчете уравнений x=A\b, где А - коэффициенты уравнений СЛАУ, b-свободные коэффициенты. Matlab так же в зависимости от вида СЛАУ выбирает тот или иной метод. В нашем случае для несимметричных, разреженных матриц (А) будет использоваться метод UMFPACK (V5.4.0 (May 20, 2009), BLAS library used: Fortran BLAS). В свое время выбирая разные методы для своей задачи остановился на нем из-за его всеядности и скорости решения. Метод относится к прямым методам - за конечное число шагов позволяет получить результат. Судя по информации из интернета эта реализация не поддерживает возможности многоядерных процессоров.

 

Тест №1

Возьмем простой пример для понимания процесса оформления решения СЛАУ в системе 1С (на ИТС есть описание):

(1) 1*X1 + 1*X2 + 1*X3 = 2
(2) 5*X1 + 0*X2 + 6*X3 = 3
(3) 4*X1 + 4*X2 + 0*X3 = 4

Для решения нам надо сделать 5 шагов:

  1. Описать таблицу коэффициентов уравнения (то, что слева в системе уравнений от знака равенства)
  2. Описать таблицу свободных коэффициентов уравнения (то, что справа в системе уравнений от знака равенства)
  3. Создать объект платформы РасчетСистемЛинейныхУравнений
  4. Указать таблицы-источники данных уравнения и связываем колонки полей с настройками объекта РасчетСистемЛинейныхУравнений
  5. Расчет
 
 Полный код формирования СЛАУ

Получим "решение" (из трех неизвестных переменных в ответе только одна):



Некорректное решение

 

Однако, если мы не будет добавлять в таблицу нулевые коэффициенты, то есть напишем условие, исключающее их:

Коэффициент = Число(СокрЛП(КоэффициентыУравнения[НомерПеременной]));
Если Коэффициент <> 0 Тогда
	Строка = МатрицаКоэффициентов.Добавить();
	Строка.НомерУравнения = НомерУравнения + 1;
	Строка.НомерПеременной = НомерПеременной + 1;
	Строка.Коэффициент = Коэффициент;
КонецЕсли;

получим корректное решение:

 


Корректное решение

 

Проблема №1: нулевые коэффициенты задавать не нужно, поведение неописанное, значит подходит на ошибку платформы. Косвенно верно, что нет необходимости вставлять нулевые коэффициенты, 1с заявляет решение больших разряженных систем, где нулевые коэффициенты наиболее встречаемые, и если их задавать, скажем в матрице 200 000 х 200 000, может памяти и не хватить, учитывая, что язык 1с интерпретируемый.

Проблема №2: из коробки нельзя проверить решение, только реализовав функцию умножения матриц и вычисления нормы (в нашем случае тоже, что и длина вектора), это не сложно, но зачем, если есть объект решения в платформе и мог бы возвращать точность решения или признак, достигнута ли требуемая точность.

 

Тест №2

Как известно, решение СЛАУ используется в типовых конфигурациях уровня предприятия для нахождения себестоимости, например, продукции. Рассмотрим 1С:Комплексную конфигурацию 2.5 (2.5.9.135) и процедуру расчета себестоимости, посмотрим, как там отрабатывает механизм решения СЛАУ. У меня под рукой небольшая по номенклатуре база с производством продукции. При закрытии месяца отрабатываются различные расчеты СЛАУ, мы будем рассматривать функцию    РасчетСебестоимостиРешениеСЛУ.РешитьСЛУПлатформой_СебестоимостьОрганизаций, точнее часть, представленную ниже, где мы возьмем одну СЛАУ, а ее данные и решение сохраним в файл, чтобы проанализировать отдельно, расчет отрабатывает без ошибок и закрытие месяца проходит удачно:

 
Доработаем типовой функционал, чтобы собрать нужную информацию через расширение

Чтобы визуально посмотреть, с какой матрицей имеем дело, таблицу коэффициентов визуализировал в Matlab, результат ниже, матрица квадратная, разреженная и несимметричная.

 

Вид матрицы коэффициентов, полученной при расчете себестоимости

 

Так же интересен вопрос, есть ли нулевые коэффициенты в данных. Таких элементов не оказалось, поэтому есть шанс, что не попадем на Проблему №1. Выгрузив/загрузив данные в Matlab для проверки решения, оказалось, что если решение 1С подставить в исходную СЛАУ и вычесть свободные коэффициенты, то получим норму (norm (A*x-b)): 1.7095 * 107 . Норма должна стремится к 0 и чем ближе, тем точнее решение. Рассчитанная норма говорит о том, что получено точно не решение уравнения. Перебирая параметры РасчетСистемЛинейныхУравнений  (точность, количество итераций и т.д.), я так и не смог получить что-то адекватное, а отсутствие ошибок встроенного языка говорит косвенно о том, что мы делаем все верно.  Визуально сравнивая попеременно решения 1С и Matlab, как показано ниже, есть много совпадений по результатам, возможно, оптимизатор 1с разбивает решение на  множество мелких СЛАУ, часть которых сходится к решению, а часть нет.

 


Сравнение решений 1С и Matlab

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

Результат

Мы так и не добрались до сравнения графиков скорости работы, потому как на текущий момент сравнивать нечего, 1С отказывается решать СЛАУ с заданной точностью. О найденных ошибках сообщил в 1С, они порекомендовали обновить Комплексную конфигурацию, но надеюсь пробить первую линию и добраться до разработчиков. Если я не ошибаюсь в выводах и все вычисления провел корректно, то потенциально во многих базах на себестоимость стоит обратить внимание. К Тесту №3 - сравнение скорости решений, можно будет вернуться, когда разрешится вопрос с полученными результатами. Тестирование проводилось на платформе 1С версии 8.3.22.1709.

 
Скрипты для преобразования файлов из вложения в данные Matlab и контрольная проверка результатов решений

 

Update 28.11.2022: Вопрос передали в отдел разработки, номер - 60004240

СЛАУ себестоимость алгоритм

См. также

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    7113    dsdred    36    

113

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    19210    SeiOkami    46    

119

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    9540    YA_418728146    6    

143

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    17053    SeiOkami    31    

104

Расширение глобального поиска 1С, или Глобальный поиск "на максималках"

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Мало кто знает, что поле "Глобального поиска" в 1С можно доработать. Добавить свои варианты поиска, кнопочки в результатах и даже целые пользовательские меню.

27.03.2023    7175    SeiOkami    10    

140

Версионирование объектов VS История данных

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Давайте разберемся в механизме «История данных» и поэкспериментируем для наглядности. Сравним «Версионирование объектов» и «Историю данных».

06.03.2023    20148    dsdred    54    

196

Практическая шпаргалка по новым возможностям языка запросов 1С

Механизмы платформы 1С Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

В предлагаемой статье решил привести примеры применения новых возможностей языка запросов 1С, начиная с версии платформы 8.3.20.

21.11.2022    24034    quazare    36    

122

Шпаргалка по функциям АСИНХ

Механизмы платформы 1С Платформа 1С v8.3 Россия Бесплатно (free)

При знакомстве с новой механикой работы с асинхронностью (обещание, ждать и асинх) делал пометки, которыми и хочу поделиться. Ничего сверхъестественного в них нет, просто небольшие примеры и некоторые всплывшие нюансы использования.

29.07.2022    44312    zeltyr    23    

196
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. pstrig 24.11.22 14:00 Сейчас в теме
Спасибо за исследование. Интересно, чем закончится переписка с разработчиками 1с.
cleaner_it; dabu-dabu; +2 Ответить
2. gzharkoj 504 24.11.22 15:29 Сейчас в теме
(1) Обязательно отпишусь.
Jimbo; Batman; cleaner_it; dabu-dabu; roman72; +5 Ответить
3. roman72 380 25.11.22 22:50 Сейчас в теме
Самое удивительное, что 1С использует просто расчёт СЛАУ. И без всякой оптимизации - поиска оптимального решения.
Меня и удивляет, что при расчете себестоимости это ещё и ладно, решением будет любой набор переменных, укладывающихся в область допустимых решений.
Но в расчете производственной программы СЛАУ без оптимальной функции - это ни о чём. Или....1С не использует СЛАУ в расчете производства...

Вообще говоря, то что расчет от 1С и расчёт от Матлаб несколько расходятся не должно удивлять, если оба решения входят в пространство допустимых решений. Ведь ищется не оптимальное решение, а любое из области допустимых решений.
А вопрос погрешности интересный.
И вопрос разреженных матриц интересный.
Вообще разреженные матрицы - это свойственно областям из физики.
Для области экономики матрицы не должны быть разреженными или настолько разреженными, что решение СЛАУ требует разбиения на подматрицы.
Также для областей экономики характерна целочисленность решений, а значит расчет СЛАУ должен выдавать нулевую погрешность.
Т.е. должна решаться целочисленная СЛАУ.
Этого явно в методе 1С нет.
С Матлаба здесь спросу нет, он скорее для физических областей науки предназначен, чем для экономических.
RustIG; cleaner_it; +2 Ответить
4. gzharkoj 504 25.11.22 23:45 Сейчас в теме
(3) Мы говорим о математических методах, область допустимых решений определяется погрешностью решения, полученное решение в него не укладывается. Обратите внимание, невязка 10^+7 степени, вместо условного 0.000001. Расчеты расходятся значительно. Это удивительно.
Я тестировал на СЛАУ физической задачи, там все плохо.
В экономических задачах системы проще, но подходы к улучшению сходимости общие. Поэтому 1с и не стало использовать известные методы, а сделало, как они заявляют свой, под особенности задачи расчета себестоимости.
Меня удивляется еще тот факт, что
их метод всегда возвращает решение, без информации уложился он в ограничения или нет. И описание того, что может вернутся все, что угодно нет. Вопросов много, как этим пользоваться.
Jimbo; cleaner_it; +2 Ответить
5. roman72 380 26.11.22 03:19 Сейчас в теме
(4) Если
а) как вы говорите решение СЛАУ от 1С вышло за пределы области допустимых решений
б) полученное решение не проверяется на допустимость (ведь банальная подстановка в матрицу это несложно, да?)

то вывод достаточно простой:
1) 1С не знакомо с теорией решения СЛАУ в необходимом объёме (особенно в части достижения точности результатов)
2) 1С не усложняла себе жизнь и сделала банальный решебник СЛАУ в расчёте на то что погрешность округления не будет слишком большой

Вывод:
пользоваться функцией расчета СЛАУ от 1С рискованно.
cleaner_it; +1 Ответить
6. gzharkoj 504 26.11.22 08:54 Сейчас в теме
(5) вы верно написали, но с теорией они точно знакомы, жду разъяснений от 1С, каков был замысел: возможно ошибка в реализаци, а возможно что-то не описали в документации.
Jimbo; cleaner_it; +2 Ответить
7. roman72 380 26.11.22 22:20 Сейчас в теме
(6) Буду признателен, если уведомите что же они ответили в конце концов.
cleaner_it; +1 Ответить
8. Jimbo 9 29.11.22 08:33 Сейчас в теме
Из серии ничего не понятно, но очень интересно!
9. Cmapnep 18 29.11.22 18:57 Сейчас в теме
Решение СЛАУ в платформе разрабатывал Никита Старичков
Попробуйте с ним связаться в чате сообщества в телеграм "e1c_community"
Он там админ, ник у него @demist
Думаю, что он сможет ответить на все ваши вопросы, а также ускорить решение вопроса
gzharkoj; +1 Ответить
10. gzharkoj 504 01.12.22 10:01 Сейчас в теме
11. gzharkoj 504 12.12.22 21:38 Сейчас в теме
(9)Написал,ответил,когда-то участвовал в этом проекте, но больше не имеет отношения, пытать его вопросами не стал.
Aphanas; Cmapnep; +2 Ответить
12. scientes 289 30.11.23 10:26 Сейчас в теме
Добрый день, Геннадий. Вы проводили тестирование решения СЛАУ на новых платформах ? Спасибо.
13. gzharkoj 504 30.11.23 10:28 Сейчас в теме
(12) Нет, замечания мои, отправленные в 1с, в стадии рассмотрения, код приведенный можно проверить на любой платформе, по крайней мере в тесте 1.
Оставьте свое сообщение