Рисовать блок схемы в 1с

Обновлено: 07.07.2024

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

Как правило, в этих публикациях графическая схема либо сохраняется в файл GRS, который может быть программно изменен, либо используется XML-, JSON- сериализация, конвертация в платформенные структуры и массивы. К сожалению, ни в одной публикации не был упомянут самый простой и логичный (на мой взгляд) способ - использование механизма XDTO. Этот способ имеет много общего с использованием XML-сериализации, но гораздо удобнее в изучении и реализации, а также позволяет получить более понятный код.

Описание механизма

Итак, для работы нам потребуется 2 вида сущностей: ОбъектXDTO - объекты, которые будут для нас элементами графической схемы, и СписокXDTO - список объектов ОбъектXDTO. Многие объекты 1С, в том числе графическая схема, могут быть преобразованы в объекты XDTO:

Каждый объект характеризуется типом. Программист может создавать объекты XDTO произвольных типов. Тип определяется совокупностью двух строк: URIПространстваИмен и Имя типа. Например создание объекта - элемента графической схемы выглядит так:

Возникает вопрос: как перед созданием узнать тип нужного программисту объекта, т.е. Имя и URIПространстваИмен? Существует 2 способа: первый - создать объект вручную и посмотреть в отладчике свойства его типа:


Вариант второй - обратиться к в желтым книжкам, или синтаксис-помощнику. Так, для графической схемы:

. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен . Имя типа XDTO: FlowchartContextType.

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


Как видим, у объекта графической схемы есть собственные свойства, кроме того есть реквизит item - Список XDTO. Забегая вперед, отметим, что это - список графических элементов, т.е. именно то, что нам нужно.


Большинство свойств объектов доступны для изменения.

После модификации Объект XDTO можно преобразовать обратно в объект платформы 1С:

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

  • Сериализуем (т.е. преобразовываем в объект XDTO) графическую схему
  • Меняем свойства объекта XDTO, список графических элементов,
  • Десериализуем объект XDTO обратно в графическую схему.

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

Примеры создания элементов

Для примера попробуем добавить в графическую схему элемент "Действие":

Сериализуем графическую схему и создадим новый элемент схемы:

Реквизит itemType - один из самых важных. Он задает тип графического элемента и его внешний вид.

  • 0 - Декорация
  • 1 - Линия
  • 2 - Старт
  • 3 - Завершение
  • 4 - Условие
  • 5 - Действие
  • 6 - Выбор варианта
  • 7 - Разделение
  • 8 - Слияние
  • 9 - Обработка
  • 10 - Вложенный процесс

Далее зададим имя создаваемого объекта, его идентификатор (должен быть уникальным среди элементов схемы) и номер порядка обхода.

Следующий шаг - мы должны задать координаты прямоугольника, внутри которого будет расположен наш объект. Именно к серединам его сторон будут потом "привязываться" соединительные линии. Координаты отсчитываются от левого верхнего угла схемы.

Заголовок элемента - это несколько вариантов строк, для разных языков. Нам хватит одного.

Определим цвет элемента. В нашем случае - цвет по умолчанию, определяется типом элемента.

Следующий момент - задание типа линии границы элемента - значение реквизита border. На этом шаге спотыкается большинство разработчиков, так как в документации этот вопрос не рассмотрен, а реверс-инжиниринг дает непонятный результат. Правильно делать так:

У нашего объекта есть свойство point - список объектов XDTO - точек вершин элемента. Для корректного отображения элемента их надо задать. Правые и нижние координаты на единицу меньше чем координаты ограничивающего прямоугольника. (Почему так? Кто знает. )

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

И, наконец, добавим наш созданный элемент в список элементов графической схемы и десериализуем ее.

Приведенного выше кода достаточно для отображения элемента "Действие". Но можно настроить и другие свойства: alignHor, alignVer, hyperlink, picturePlacement, pictureStyle, transparent, lineColor, textColor и др. Их назначение понятно из названий.

Аналогичным образом создаются и другие объекты. При этом необходимо учесть несколько особенностей:

Создание соединительной линии несколько отличается от создания прочих объектов:

Здесь надо обратить внимание на следующие реквизиты: connectFromItemId, connectToItemId - идентификаторы объектов, к которым "привязаны" начало и конец линии. portIndexFrom, portIndexTo - номера сторон, к которым присоединены линии.

Список номеров сторон:


  • 1 - середина левой стороны ограничивающего объект прямоугольника
  • 2 - середина верхней стороны
  • 3 - середина правой стороны
  • 4 - середина нижней стороны
  • 6, 8, 10, . - середина левой стороны варианта 1, 2, 3, . для объекта ВыборВарианта
  • 7, 9, 11, . - середина правой стороны варианта 1, 2, 3, . для объекта ВыборВарианта

Особенности работы с линиями:

  • Если линия начинается из варианта объекта ВыборВарианта, то реквизит connectFromPortIndex равен номеру варианта.
  • Реквизит decorativeLine - флаг декоративной линии.
  • Соединительная линия, в отличие от декоративной, перестраивается при перемещении объекта, к которому присоединена. Присоединенная декоративная линия также перемещается вслед за перемещаемым объектом, но, как правило, ее форма не так сильно меняется.
  • Декоративная линия может иметь наконечники разных типов, а соединительная - только в виде заполненной стрелки.
  • Нельзя допускать наличия соседних сегментов линии, лежащих на одной прямой, иначе перемещение линии вызывает странные визуальные эффекты.

Библиотека для работы с графической схемой

Для упрощения работы с графической схемой была разработана библиотека функций, приложенная к статье.

Функции создания и удаления объектов:

Функции работы с вариантами:

Функция соединения объектов:

Задача соединения объектов линией оказалась неожиданно непростой. Количество вариантов взаимного расположения объектов с учетом комбинаций соединяемых сторон довольно велико. Для сокращения количества вариантов пришлось использовать поворот объектов вокруг оси координат так, чтобы линия в первый объект входила всегда с левой стороны. Интересной выглядит следующая задача: написать алгоритм построения соединительной линии так, чтобы а) линия по возможности огибала бы другие элементы схемы и б) количество пересечений с другими линиями было бы минимально. Задача а) уже решена в платформе. Желающие могут из решения этой задачи сделать очень хорошую публикацию.

Пример использования библиотеки:

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

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

Графическая схема 1С:Предприятие используется в рассматриваемом примере для записи блок-схемы алгоритма. Затем решается задача перевода блок-схемы алгоритма в его линейную схему.
Порядок следования инструкций в линейной схеме определяется содержанием Подсказки элемента (блока) в графической схеме.
Подсказка элемента графической схемы – это его номер в блок-схеме с учетом имеющейся иерархии. Номер завершается точкой. Так, "Начало" - первый элемент блок-схемы имеет номер "1.".
Ветвление "Если – Тогда – Иначе – КонецЕсли" отображается элементом "Условие" графической схемы. Если "Условие" имеет номер (подсказку) "3.", то первый элемент в ветви "Да" этого условия имеет номер "3.1.1.", второй - "3.1.2." и т. д. Соответственно первый элемент этого условия в ветви "Нет" имеет номер "3.2.1.", второй - "3.2.2." и т. д.
Номера-подсказки переносятся в линейную схему алгоритма без изменений.
Алгоритм рассматриваемого примера прост. Его запись в виде линейной схемы:

  1. Начало.
  2. Ввод А, Б и В.
  3. Если А > Б Тогда
    3.1.1. Б = В.
    Иначе
    3.2.1. А = В.
    КонецЕсли
  4. Вывод А и Б.
  5. Останов.

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

Форма отчета с графической схемой

Форма отчета приведена на рис. 1.

Рис. 1. В графической схеме набрана блок-схема алгоритма

Элементы графической схемы имеют Подсказки, приведенные в нижеследующей таблице.

  1. Каждый блок снабжается Подсказкой, содержащей номер блока в блок-схеме. Принцип нумерации блоков описан выше.
  2. Действие, следующее после Ветвления, имеет флажок "Групповая". Наличие такого Действия воспринимается процедурой перевода блок-схемы в линейную схему как признак завершения блока Ветвление.

При нажатии на кнопку "Линейная схема" вызывается процедура, строящая по блок-схеме алгоритма его линейную схему.

Преобразование блок-схемы в линейную схему

В общем случае алгоритм может содержать следующие блоки:

  1. Начало.
  2. Останов.
  3. Следование.
  4. Ветвление.
  5. Выбор.
  6. Цикл "С параметром".
  7. Цикл "Пока".
  8. Цикл "Для каждого".

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

  • Точка старта.
  • Точка завершения.
  • Действие.
  • Условие.
  • Соединительная линия.

Рис. 2. Список элементов блок-схемы, упорядоченный по Подсказке

Линейная схема записывается в текстовый документ "ЛС".
В процедуре прежде формируется список значений "СЗ", содержащий в качестве значений все элементы графической схемы, кроме соединительных линий, а в качестве представлений - их Подсказки.
Далее в цикле перебираются элементы этого списка.
Все элементы, кроме Условия, дают новую строку текстового документа, содержащую Подсказку элемента графической схемы и его наименование. Подсказка и наименование разделяются символом неразрывного пробела - Символ(160).
При обнаружении Условия формируется конструкция Если - Тогда - Иначе - КонецЕсли, в ветвях которой может быть произвольное количество Действий.

// Вызывается при нажатии на кнопку "Линейная схема"
процедура кнопкаВыполнитьНажатие(кнопка)
// грСх - элемент типа ПолеГрафическойСхемы
грСх = элементыФормы.грСх;
сх = грСх.ПолучитьСхему();
схЭгс = сх.ЭлементыГрафическойСхемы;
лС = новый текстовыйДокумент;
сз = новый списокЗначений;
к = 0;
// Формируем список значений из элементов схемы без соединительных линий
пока к < схЭгс.Количество() цикл
эгс = схЭгс[к];
если не типЗнч(эгс) = тип("ЭлементГрафическойСхемыСоединительнаяЛиния") тогда
сз.Добавить(эгс, эгс.подсказка);
конецЕсли;
к = к + 1;
конецЦикла;
сз.СортироватьПоПредставлению();
сз.ВыбратьЭлемент("Сортировка по Подсказке");
к = 0;
вс = сз.Количество();
пока к < вс цикл
эгс = сз[к].значение;
нмр = эгс.подсказка;
к = к + 1;
если типЗнч(эгс) = тип("ЭлементГрафическойСхемыУсловие") тогда
лС.ДобавитьСтроку(нмр + символ(160) + "Если " + эгс.наименование + " Тогда");
кД = к;
кН = к;
нмрД = нмр + "1";
нмрН = нмр + "2";
д = стрДлина(нмрН);
смвл = "";
для л = 1 по д цикл смвл = смвл + символ(160) конецЦикла;
// Ветвь "Да"
однаВетвь(кД, вс, нмрД, д, сз, лС, смвл);
лС.ДобавитьСтроку(смвл + "Иначе");
// Ветвь "Нет"
однаВетвь(кН, вс, нмрН, д, сз, лС, смвл);
лС.ДобавитьСтроку(смвл + "КонецЕсли");
к = макс(кД, кН) - 1;
иначе
лС.ДобавитьСтроку(нмр + символ(160) + эгс.наименование + ".");
конецЕсли;
конецЦикла;
лС.Показать("Линейная схема");
КонецПроцедуры

процедура однаВетвь(кДН, вс, нмрДН, д, сз, лС, смвл)
пока кДН < вс цикл
эгс = сз[кДН].значение;
нмр = сз[кДН].представление;
кДН = кДН + 1;
// Обнаружено действие, следующее сразу после Ветвления
если типЗнч(эгс) = тип("ЭлементГрафическойСхемыДействие") и эгс.групповая тогда прервать конецЕсли;
если лев(нмр, д) = нмрДН тогда
лС.ДобавитьСтроку(смвл + символ(160) + нмр + символ(160) + эгс.наименование + ".")
конецЕсли;
конецЦикла;
конецПроцедуры

Пример получаемого текстового документа показан на рис. 3.

Рис. 3. Линейная схема алгоритма

Если графическая схема создана в макете "мкт", то для ее отображения в форме можно употребить следующий код:

грСх = элементыФормы.грСх;
грСх.Очистить();
// мкт - макет с графической схемой
грСх.УстановитьСхему(получитьМакет("мкт"));

Заключение

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

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

1. Как создать справочник в 1С

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



Для выполнения задачи первым делом создадим справочник 1С. Назовем его «Графические схемы 1С» и создадим сразу две формы – списка и элемента.

Откроем форму элемента и добавим два реквизита – АдресВХранилище – строка, ГрафическаяСхема – тип графическая схема.



Вынесем схему на форму, а адрес в хранилище будет служебным реквизитом, который виден не будет.

Теперь мы можем создавать схемы, но при записи и повторном открытии ничего не сохранится.

2. Как сохранять графическую схему в созданном регистре 1С

· Измерение «Наименование» – строка;

· Ресурс «Графическая схема 1С» - хранилище значения.

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

Создадим событие для схемы «ПриИзменении», с помощью которого при каждом изменении будем помещать схему во временное хранилище 1С.



Следующий этап – запись в регистр сведений при записи элемента. Напишем код, для события «ПриЗаписиНаСервере».



Теперь при записи элемента справочника графическая схема сохраняется в созданном в 1С регистре сведений.



Все что осталось сделать, это с помощью ссылки получить графическую схему из регистра, когда открывается форма. Используем для этого событие «ПриСозданииНаСервере».



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

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

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

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

Screenshot_103.jpg

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

Схемы можно рисовать самым разным образом. Если схема должна описывать бизнес-процесс, то такую схему принято рисовать определённым образом. Способ её отображения называют нотациями. Тут мы встречаем новое понятие, которое называется нотация бизнес-процессов. В конечно счёте, нотация - это некоторый гост или стиль записи, которого придерживаются для того, чтобы легче понимать друг друга. Нотаций существует несколько. Про это мы рассказывали в статье на нашем канале дзен. Там мы разобрали четыре основных типа нотаций. Соответственно, одним из первых моментов, которые нужно знать для правильного составления схемы - это нотации или условные обозначения. Это первое, что нужно уяснить. Но пожалуй, перейдем к поэтапной методике разработки любой схемы.

Шаг 1. Осознание информации

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

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

Шаг 2. Научитесь видеть самое важное

Когда есть общее понимание происходящего и мы знаем, что не тыкаем пальцем в небо, а разбираемся в какой-то слаженной системе, следует научиться выделять самое главное. Логика тут простая. Сначала нужно нарисовать или описать "хребет" происходящего, а потом обвешать его дополнительными вспомогательными данными.

Это чем-то напоминает строительство каркасного дома. Сначала строится каркас из бруса, а потом его обивают досками или утепляют.

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

Screenshot_104.jpg

Но очевидно, что с такой простенькой схемкой ни одно приложение работать не будет. Поэтому, ту же процедуру нажатия на кнопку нужно значительно развернуть. В реальности это было бы примерно так: Выдать уведомление - получить ответ от пользователя - сгруппировать данные для отправки в единый массив - занести их в рабочий буфер временной памяти - соединиться с сервером - получиться уведомление от сервера о соединении - начать передачу данных - уведомить пользователя - обозначить процедуру как "успешно". Это только частичная расшифровка одной из стадий расшифровки.

Шаг 3. Изучить условные обозначения

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

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

Шаг 4. Выбор рабочего инструмента

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

В зависимости от сложности задачи можно использовать самые разные приложения, но, исходя из нашего опыта, хорошо себя зарекомендовали для решения самых разных задач приложения Visio и Draw.io

Одно из них входит в состав программного продукта Office, является платным и в общем-то, ничем особенно примечательным не отличается. Речь идёт про Visio. Все основные функции там есть. Нарисовать схему практически любой сложности вполне возможно и даже относительно удобно.

Visio_1 (1).jpg

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

Это приложение draw.io. Адрес программы в интернете вот тут. Оно снабжено удобными интеграциями буквально со всеми существующими и, наверное, даже не существующими сервисами. Распространяется бесплатно, очень хорошо дружит с сервисами от google и позволяет строить буквально любые схемы. Работать можно как в режиме он-лайн, так и скачать программу на свой компьютер или мобильный.

draw.io_.diagrama.jpg

Шаг 5. Знать основные правила построения блок-схем

Для удобства полезно знать несколько полезных советов или негласных логичных правил, которые позволят строить поэтапную блок-схему.

  • Обязательно в схеме должно присутствовать два блока – это «Начало» и «Конец». Очевидно, что у любого алгоритма или бизнес-процесса может быть только одно начало или только один конец.
  • Начальный блок связывается с конечным посредством линий связи, которые могут быть дополнены различными промежуточными операциями. Из всех блоков, кроме конечного, должны выходить линии потока.
  • Все блоки удобно пронумеровывать. Так легче ориентироваться и вам при разборе схемы, и тому, кто пытается осмыслить полученный вами результат.
  • Не секрет, что линии делятся на входящие и выходящие. Если блоки не начальные или конечные, или концевые для конкретной ветки, то одна и та же линия является для одного блока выходящей, а для другого входящей.
  • Допускается наличие разрывов в линиях потока. Это обычное дело! Ведь у каждого ответвления рано или поздно происходит логическое завершение.
  • Логика процесса может быть линейная, разветвляющаяся или циклическая. Предположительно, тут вопрос появиться не должно :) Если блоки на прямой линии - это линейный вариант. Если на схеме есть разветвления - то схема разветвляющаяся (всегда реальная схема такая). Циклическая - для программиста обычное дело, а вот для бизнес-аналитика более редкая. Скажем, заправка автомобиля перед каждым рейсом - это циклическая операция.

Шаг 6. Проработка существующей схемы процесса "от" и "до"

Когда схема нарисована, нужно проверить, соблюдается ли логика и действительно ли по разработанной схеме можно сделать хоть что-то? Если это так, то с задачей мы справились. Но если схема получилась с ошибками и логика прорисовки нарушена, то это будет видно и получится внести изменения.

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

Ну а дальше следует проработать всю схему поэтапно и удостовериться, что кирпичиков из блоков вполне хватает. Если это сделать получается, то блок схему мы построили.

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