Как решать задачи в 1с

Обновлено: 03.07.2024

Работа с числовыми матрицами в целом и решение систем линейных алгебраических уравнений в частности — классическая математическая и алгоритмическая задача, широко используемая при моделировании и расчёте огромного класса бизнес-процессов (например, при расчёте себестоимости). При создании и эксплуатации конфигураций «1С:Предприятия» многие разработчики сталкивались с необходимостью вручную реализовывать алгоритмы расчёта СЛАУ, а после — с проблемой длительного ожидания решения.

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

Он оптимизирован для использования на данных, имеющих разреженную структуру (то есть содержащие не более 10% ненулевых коэффициентов в уравнениях) и в среднем и в лучшем случаях демонстрирует асимптотику Θ(n⋅log(n)⋅log(n)), где n — количество переменных, а в худшем (при заполненности системы

100%) его асимптотика сопоставима с классическими алгоритмами ( Θ(n 3 )). При этом на системах, имеющих

10 5 неизвестных, алгоритм показывает ускорение в сотни раз по сравнению с реализованными в специализированных библиотеках линейной алгебры (например, superlu или lapack).

image


Важно: статья и описанный алгоритм требуют понимания линейной алгебры и теории графов на уровне первого курса университета.

Представление СЛАУ в виде графа

Рассмотрим простейшую разреженную систему линейных уравнений:

image


Внимание: система сгенерирована случайным образом и будет использоваться далее для демонстрации шагов работы алгоритма

При первом же взгляде на неё возникает ассоциация с другим математическим объектом — матрицей смежности графа. Так почему бы не преобразовать данные в списки смежности, сэкономив оперативную память в процессе выполнения и ускорив доступ к ненулевым коэффициентам?

Для этого нам достаточно транспонировать матрицу и установить инвариант “A[i][j]=z ⇔ i-я переменная входит в j-е уравнение с коэффициентом z”, а после для всякого ненулевого A[i][j] построить соответствующее ребро из вершины i в вершину j.

Полученный граф будет выглядеть так:

image

Даже визуально он оказывается менее громоздким, а асимптотические затраты оперативной памяти снижаются с O(n 2 ) до O(n+m), где m — число коэффициентов в системе.

Выделение компонент слабой связности

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

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

После разделения на компоненты слабой связности граф примет такой вид:

image

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

Редуцирование вершин графа

Следующий шаг алгоритма — как раз то, в чём заключается оптимизация под работу с разреженными матрицами. Даже в графе из примера присутствуют “висячие” вершины, означающие, что в некоторые из уравнений входит всего одна неизвестная и, как мы знаем, значение этой неизвестной легко найти.

Чтобы определить такие уравнения, предлагается хранить массив списков, содержащих номера переменных, входящих в уравнение, имеющее номер этого элемента массива. Тогда, при достижении списком единичного размера, мы можем редуцировать ту самую “единственную” вершину, а полученное значение сообщить остальным уравнениям, в которые эта вершина входит.

Таким образом, вершину 3 из примера мы сможем редуцировать сразу, полностью обработав компоненту:


Аналогично поступим с уравнением 0, так как в него входит всего одна переменная:


Другие уравнения тоже изменятся после нахождения этого результата:


Граф принимает следующий вид:

image

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

Перестроение графа

Простейший пример такого графа: каждая вершина имеет степень вхождения, равную двум, ни одну из вершин нельзя редуцировать.

image

В рамках оптимизации под разреженные матрицы предполагается, что такие подграфы будут иметь малый размер, однако, работать с ними всё-таки придётся. Для расчёта значений неизвестных, входящих в подсистему уравнений, предлагается использовать классические методы решения СЛАУ (именно поэтому во введении указано, что при матрице, у которой все или почти все коэффициенты в уравнениях ненулевые, наш алгоритм будет иметь ту же асимптотическую сложность, что и стандартные).

Например, можно привести оставшееся после редуцирования множество вершин обратно в матричный вид и применить к нему метод Гаусса решения СЛАУ. Таким образом мы получим точное решение, а скорость работы алгоритма будет уменьшена за счёт обработки не всей системы, а лишь некоторой её части.

Тестирование алгоритма

image


Системы имели размер от 1000 до 200000 неизвестных

Для сравнения быстродействия мы использовали наиболее популярные библиотеки для решения задач линейной алгебры, такие как superlu и lapack. Конечно, данные библиотеки ориентированы на решение широкого класса задач и решение СЛАУ в них никак не оптимизировано, поэтому различие в быстродействии оказалось значительным.

image


Тестирование библиотеки ‘lapack’

image


Тестирование библиотеки ‘superlu’

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

image

Заключение

Даже если вы не являетесь разработчиком конфигураций «1С:Предприятие», идеи и методы оптимизации, описанные в данной статье, могут быть использованы вами не только при реализации алгоритма решения СЛАУ, но и для целого класса задач линейной алгебры, связанных с матрицами.

Для разработчиков же 1С добавим, что новая функциональность решения СЛАУ поддерживает параллельное использование вычислительных ресурсов, и можно регулировать количество используемых потоков вычисления.

Во время аттестации «Специалист» по платформе на решение задач отводится целых 5 часов, тем не менее времени не хватает. Чтобы успеть решить все задачи и сделать это правильно, нужно заранее, во время подготовки к экзамену, разработать шаблоны решения, то есть тщательно продумать последовательность действий и хорошо запомнить необходимые куски программного кода.

Тем самым материал будет «разложен по полочкам», и его будет легко извлекать из головы в нужный момент. На экзамене не придется заглядывать в книжки и учебные пособия, вспоминая последовательность действий при решении задач.

Если разработанный шаблон изложить в виде текста (на бумаге или в компьютере), то будет легко сделать еще один важный шаг к успешной сдаче – полностью повторить материал непосредственно перед аттестацией, «забрать его в голову» накануне вечером или по дороге на экзамен.

На мой взгляд, хороший шаблон должен:

  1. Обеспечивать правильное решение.
  2. Обеспечивать максимальную скорость решения.
  3. Легко запоминаться.

Задачи по бизнес-процессам (БП-задачи) очень хороши для разработки шаблона, поскольку они решаются единообразно.

Вы можете использовать предлагаемый шаблон или на его основе сделать собственный.

2. Составление шаблона


По БП-задачам есть много информации в книгах и учебных курсах (см. список в конце статьи). Предлагаемый шаблон основан на нескольких источниках, но в точности не повторяет ни один из них.

Наиболее подробно БП-задачи рассмотрены в курсах [5,6,9]. Методики, изложенные в этих источниках, не могут быть использованы в качестве шаблонов, поскольку цель обучения – обеспечить понимание, дать концептуальное видение объектов конфигурации, которые используются в БП-задачах. В результате, демонстрируя решение задач, преподаватели многократно переходят от одного объекта к другому и обратно. Такая последовательность действий заняла бы на аттестации много времени, и ее сложнее запомнить. Шаблон, предлагаемый в этой статье, построен по принципу: «зашел в объект, сделал все что нужно и не возвращаешься в него». Последовательность работы с объектами соответствует их порядку в дереве конфигурации.

Последовательность действий в шаблоне наиболее близка к [4,8]. В шаблон внесен весь необходимый программный код.

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

В [1,2,3,5,6,7,8] значение параметра сеанса устанавливается в модуле сеанса, а в [4,9] – с помощью кнопки «Сделать текущим» в справочнике физических лиц. В шаблоне использован первый вариант.

Обновление карты маршрута в шаблоне сделано так, как было рекомендовано на консультации [5]. Альтернативный вариант – с помощью кнопки «Обновить карту» в форме бизнес-процесса изложен в [6,7,8].

3. Шаблон решения БП-задач

На экзамене условие БП-задачи содержит в себе текст задания, изображение карты маршрута и таблицу адресации. Далее по тексту последние две части обозначены как «карта маршрута задания» и «таблица адресации задания».

Последовательность шагов шаблона:

1) Добавить подсистему «БизнесПроцессы»: Общие -> Подсистемы -> Добавить (по правой кнопке мыши).

2) Включить в эту подсистему справочники «ФизическиеЛица» и «Подразделения», регистр сведений «РегистрАдресации».

3) Добавить параметр сеанса «ТекИсполнитель», тип СправочникСсылка.ФизическиеЛица: Общие -> Параметры сеанса -> Добавить (по правой кнопке мыши).

4) Создать модуль сеанса «УстановкаПараметровСеанса»: Корень дерева конфигурации -> Открыть модуль сеанса (по правой кнопке мыши) -> В списке процедур и функций выбрать "".

5) Создать роль «Администратор». Общие -> Роли -> Добавить (по правой кнопке мыши). Действия -> Установить все права. Поставить галочку «Устанавливать права для новых объектов».

6) По карте маршрута и таблице адресации задания определить список необходимых сотрудников. Например, если в карте маршрута задания указан сотрудник Иванов, то такого сотрудника помещаем в список; если указана должность «Кладовщик», то добавляем в список всех сотрудников из таблицы адресации с этой должностью и т.д.

Если текущее содержание справочника «ФизическиеЛица» не соответствует заданию, дополнить справочник – добавить предопределенные значения, которые есть в получившемся списке сотрудников, но отсутствуют в конфигурации.

7) По списку сотрудников, составленному на предыдущем шаге, создать пользователей с ролью «Администратор»: Администрирование -> Пользователи -> Добавить.

Пользователей можно создавать, копируя фамилии из справочника «ФизическиеЛица».

8) Если в карте маршрута задания указаны должности, необходимо добавить справочник «Должности» (Подсистемы: «БизнесПроцессы») и заполнить его предопределенными значениями: Менеджер, Кладовщик и т.д. В справочник нужно занести только те должности, которые указаны в карте маршрута задания.

9) Если в карте маршрута задания указаны подразделения и/или должности, добавить соответствующие измерения в РегистрАдресации: Подразделение (тип: СправочникСсылка.Подразделения), Должность (тип: СправочникСсылка.Должности). Для реквизита «Исполнитель» установить «Запрет незаполненных значений».

10) Создать задачу «Задача1». Представление списка: «Список задач». Подсистемы: «БизнесПроцессы».

11) На закладке «Адресация». Адресация: «РегистрАдресации».

Добавить реквизиты адресации: Исполнитель, Подразделение, Должность - в соответствии с имеющимися измерениями регистра адресации, созданными на шаге 9.

Для каждого реквизита адресации задать свойство «Измерение адресации»: Исполнитель, Подразделение, Должность (соответственно).

Основной реквизит адресации: Исполнитель.

Текущий исполнитель: ТекИсполнитель.

12) Создать форму списка задач «ФормаСпискаПоИсполнителю», убрать галочку «Назначить форму основной».

По правой кнопке мыши открыть свойства реквизита «Список»:

Основная таблица: Задача.Задача1.ЗадачиПоИсполнителю.

Настройка списка -> Открыть, добавить отбор: «Выполнена Равно Нет».

13) В модуль формы добавить обработчик события «ПриСозданииНаСервере»:

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

14) Вывести форму «ФормаСпискаПоИсполнителю» в рабочей области начальной страницы: Корень дерева конфигурации -> Открыть рабочую область начальной страницы –> Добавить. Шаблон начальной страницы: Одна колонка.

15) Создать бизнес-процесс БизнесПроцесс1. Задачи: «Задача1». Подсистемы: «БизнесПроцессы». На закладке «Прочее» нажать кнопку «Карта маршрута» и создать карту маршрута в соответствии с заданием.

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

Если в карте маршрута задания точка действия представлена в виде нескольких прямоугольников, для нее надо поставить галочку «Групповая».

Если карте маршрута задания есть точка условия, необходимо для бизнес процесса создать одноименный реквизит, например, «ОплатаНаличными», тип: Булево. Для точки условия создать обработчик события «ПроверкаУсловия», например:

Процедура ОплатаНаличнымиПроверкаУсловия( ТочкаМаршрутаБизнесПроцесса, Результат)

Если в точке условия «Результат» - истина, то движение происходит по той ветке карты маршрута, которая помечена серой точкой (эта ветка должна иметь заголовок «Да»).

Для каждой точки действия указать значения реквизитов адресации: Исполнитель, Подразделение, Должность, – в соответствии с картой маршрута, приведенной в задании.

16) Создать форму бизнес-процесса. Добавить реквизит КартаМаршрута, тип: «Графическая схема». Перетащить этот реквизит в элементы формы.

В модуле формы бизнес-процесса:

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

БизнесПроцессОбъект = РеквизитФормыВЗначение("Объект");

КартаМаршрута = БизнесПроцессОбъект.ПолучитьКартуМаршрута();

17) В пользовательском режиме заполнить «РегистрАдресации».

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

По карте маршрута задания нужно последовательно для каждой точки действия определить необходимые подразделения и должности (если они используются). На основе этих данных выбрать строки из таблицы адресации задания и занести их в «РегистрАдресации».

Нужно учитывать, что в отборе данных из регистра адресации участвуют и незаполненные реквизиты адресации (если у точки действия не задан реквизит «Исполнитель»).


Задачи тесно связаны с бизнес-процессами. При продвижении бизнес-процесса по карте маршрута в точках действия или в точках вложенного бизнес-процесса могут автоматически создаваться задачи. Каждая задача связана с бизнес-процессом и точкой маршрута:

Задачи

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

Помимо реквизитов для связи с бизнес-процессом и точкой маршрута у задач есть реквизит Выполнена типа Булево:

Выполнена

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

Выполнено автоматически устанавливается в Истина при выполнении задачи кнопкой Выполнено или Выполнено, закрыть:

Выполнено

В остальном задачи похожи на справочник. Для них можно добавлять реквизиты, табличные части, настраивать нумерацию, создавать формы и т.п.

В настройках нумерации задачи есть свойство Авто префикс. Если там выбрать Номер бизнес-процесса:

Авто префикс

То при создании задач номер бизнес-процесса будет добавляться в номер задачи. Соответственно длина номера задачи должна быть больше, чем длина номера бизнес-процесса.

В этом случае номер первой задачи по бизнес-процессу будет совпадать с номером бизнес-процесса, а в дальнейшем будет увеличиваться только вторая часть номера:

Авто префикс

Адресация бизнес-процессов

У каждой задачи должен быть исполнитель. Для определения исполнителя используется система адресации бизнес-процессов.

Данная система включает в себя несколько элементов:

  • Регистр адресации (регистр сведений)
  • Параметр сеанса для определения текущего пользователя
  • Реквизиты адресации
  • Вспомогательные справочники

Для начала нужно создать вспомогательные справочники. Это будет 2 справочника: Пользователи и Роли пользователей:

Адресация бизнес-процессов

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

Теперь нужно создать параметр сеанса, в котором будет храниться ссылка на текущего пользователя:

параметр сеанса

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

Процедура УстановкаПараметровСеанса ( ТребуемыеПараметры ) ИмяПользователя = ПользователиИнформационнойБазы . ТекущийПользователь ( ) . Имя ; Пользователь = Справочники . Пользователи . НайтиПоНаименованию ( ИмяПользователя ) ; НовыйПользователь = Справочники . Пользователи . СоздатьЭлемент ( ) ; ПараметрыСеанса . ТекущийПользователь = Пользователь ;

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

регистр адресации

В данном регистре будет храниться список пользователей системы, а также их роли. Например:

регистр адресации

Теперь нужно выполнить настройки системы адресации. Это делается на закладке Адресация в задаче:

Адресация

Во-первых нужно создать реквизиты адресации.

Добавим 2 реквизита адресации: Пользователь и Роль:

Реквизиты адресации

В свойстве Адресация нужно выбрать регистр сведений, который используется для адресации:

Адресация

В свойствах каждого реквизита адресации нужно связать реквизит с измерением регистра сведений. Связь указывается в свойстве Измерение адресации. Соответственно реквизит Пользователь нужно связать с измерением Пользователь, а реквизит Роль с измерением Роль:

Измерение адресации

В свойстве Текущий исполнитель нужно выбрать параметр сеанса, в котором хранится ссылка на текущего пользователя. В свойстве Основной реквизит адресации нужно выбрать тот реквизит адресации, который будет являться основным. Тип этого реквизита должен совпадать с типом параметра сеанса из свойства Текущий исполнитель. Именно этот реквизит адресации должен однозначно определять исполнителя.

Основной реквизит адресации

Теперь для точки действия бизнес-процесса нужно заполнить реквизиты адресации. Это делается в свойствах точки в группе Адресация:

Адресация

В конфигураторе можно выбирать только из предопределенных элементов.

Не предопределенные элементы можно заполнять в обработчике ПриСозданииЗадач у точки действия. У данного обработчика есть параметр ФормируемыеЗадачи, который содержит в себе массив объектов созданных задач.

Например, добавим у бизнес-процесса реквизит Исполнитель типа СправочникСсылка.Пользователи:

бизнес-процесс

В обработчик ПриСозданииЗадач у всех точек действия бизнес-процесса добавим следующий код:

primer

В интернете есть биржи удалённой работы для программистов 1С:Предприятие. Это ресурсы, на которых заказчики выкладывают свои задания, а исполнители их выполняют. Как вообще можно заработать на таких ресурсах и какие задания там размещают?

Могу сказать, что задания на биржах размещаются разного уровня сложности и знания. В большинстве случаев эти задания типовые, т.е. привязанные к ограниченному кругу интерфейсов и задач. Типовые задачи, к примеру, могут быть такими: настройка правил обмена, интеграция 1С с сайтом, консультация по настройке системы, удалённое исправление ошибок, доработка печатных форм, загрузка/выгрузка из файла и т.п.

Задание: «Управление торговлей 10.3 базовая, простые доработки» (стоимость 5000 руб.)

Примеры файлов MS Excel находятся на файлообменнике.

1) Выгрузка/загрузка данных между одинаковыми конфигурациями. Написать инструкцию со скриншотами: как выгрузить конфигурацию из текущей базы, создать новую базу, загрузить в неё конфигурацию, и из одной базы с помощью обработки «Выгрузка загрузка данных XML» перенести, например, справочник номенклатуры.

2) Создать загрузку прайса из MS Excel.

3) Разобраться с печатными формами.

4) Загрузка данных в документы 1С.

Работу надо будет сдавать в готовом виде, так что сразу делайте правильно и тестируйте как надо!

Как на этом можно заработать?

Срок выполнения вышеприведённого задания заказчик оценил в 2 дня с пометкой «Срочно». Вообще среднему программисту, который ни разу не работал с удалёнными заказчиками на бирже фриланса, это задание без сомнений окажется по плечу. Тем более за предложенную стоимость в 5000 руб. выполнить его оказывается не только полезно с точки зрения приобретения практических навыков, но и финансово выгодно.

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

Читайте также: