Тестирование средств 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

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

См. также

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

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    8137    bayselonarrend    20    

156

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

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

06.10.2023    24207    SeiOkami    48    

135

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

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

28.08.2023    15246    YA_418728146    7    

169

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

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

27.06.2023    26519    SeiOkami    32    

115

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

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

27.03.2023    8750    SeiOkami    10    

143

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

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

06.03.2023    33026    dsdred    74    

216

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

В платформе 8.3.22 появилась возможность получать идентификатор в запросе. Лично я ждал этого давно, но по итогу ждал большего. Что не так?

12.01.2023    67627    dsdred    26    

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

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

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

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