Графическая схема 1С:Предприятие используется в рассматриваемом примере для записи блок-схемы алгоритма. Затем решается задача перевода блок-схемы алгоритма в его линейную схему.
Порядок следования инструкций в линейной схеме определяется содержанием Подсказки элемента (блока) в графической схеме.
Подсказка элемента графической схемы – это его номер в блок-схеме с учетом имеющейся иерархии. Номер завершается точкой. Так, "Начало" - первый элемент блок-схемы имеет номер "1.".
Ветвление "Если – Тогда – Иначе – КонецЕсли" отображается элементом "Условие" графической схемы. Если "Условие" имеет номер (подсказку) "3.", то первый элемент в ветви "Да" этого условия имеет номер "3.1.1.", второй - "3.1.2." и т. д. Соответственно первый элемент этого условия в ветви "Нет" имеет номер "3.2.1.", второй - "3.2.2." и т. д.
Номера-подсказки переносятся в линейную схему алгоритма без изменений.
Алгоритм рассматриваемого примера прост. Его запись в виде линейной схемы:
Этот алгоритм записывается в графической схеме в виде блок-схемы. Далее создается код, переводящий блок-схему в линейную схему.
Форма отчета приведена на рис. 1.
Рис. 1. В графической схеме набрана блок-схема алгоритма
Элементы графической схемы имеют Подсказки, приведенные в нижеследующей таблице.
Имя | Заголовок | Подсказка |
---|---|---|
ТочкаСтарта | Начало | 1. |
ДействиеВводДанных | Ввод А, Б и В | 2. |
УсловиеАБольшеБ | А > Б | 3. |
ДействиеБПрисвоитьВ | Б = В | 3.1.1. |
ДействиеАПрисвоитьВ | А = В | 3.2.1. |
ДействиеВыводДанных | Вывод А и Б | 4. |
ТочкаЗавершения | Останов | 5. |
Замечания:
При нажатии на кнопку "Линейная схема" вызывается процедура, строящая по блок-схеме алгоритма его линейную схему.
В общем случае алгоритм может содержать следующие блоки:
Ниже приводится упрощенный вариант процедуры перевода блок-схемы в линейную схему, распознающий первые 4 блока из вышеприведенного списка с одним уровнем вложенности. То есть графическая схема может содержать такие элементы, как
Рис. 2. Список элементов блок-схемы, упорядоченный по Подсказке
Линейная схема записывается в текстовый документ "ЛС".
В процедуре прежде формируется список значений "СЗ", содержащий в качестве значений все элементы графической схемы, кроме соединительных линий, а в качестве представлений - их Подсказки.
Далее в цикле перебираются элементы этого списка.
Все элементы, кроме Условия, дают новую строку текстового документа, содержащую Подсказку элемента графической схемы и его наименование. Подсказка и наименование разделяются символом неразрывного пробела - Символ(160).
При обнаружении Условия формируется конструкция Если - Тогда - Иначе - КонецЕсли, в ветвях которой может быть произвольное количество Действий.
// Вызывается при нажатии на кнопку "Линейная схема"
процедура кнопкаВыполнитьНажатие(кнопка)
// грСх - элемент типа ПолеГрафическойСхемы
грСх = элементыФормы.грСх;
сх = грСх.ПолучитьСхему();
схЭгс = сх.ЭлементыГрафическойСхемы;
лС = новый текстовыйДокумент;
сз = новый списокЗначений;
к = 0;
// Формируем список значений из элементов схемы без соединительных линий
пока к < схЭгс.Количество() цикл
эгс = схЭгс[к];
если не типЗнч(эгс) = тип("ЭлементГрафическойСхемыСоединительнаяЛиния") тогда
сз.Добавить(эгс, эгс.подсказка);
конецЕсли;
к = к + 1;
конецЦикла;
сз.СортироватьПоПредставлению();
сз.ВыбратьЭлемент("Сортировка по Подсказке");
к = 0;
вс = сз.Количество();
пока к < вс цикл
эгс = сз[к].значение;
нмр = эгс.подсказка;
к = к + 1;
если типЗнч(эгс) = тип("ЭлементГрафическойСхемыУсловие") тогда
лС.ДобавитьСтроку(нмр + символ(160) + "Если " + эгс.наименование + " Тогда");
кД = к;
кН = к;
нмрД = нмр + "1";
нмрН = нмр + "2";
д = стрДлина(нмрН);
смвл = "";
для л = 1 по д цикл смвл = смвл + символ(160) конецЦикла;
// Ветвь "Да"
однаВетвь(кД, вс, нмрД, д, сз, лС, смвл);
лС.ДобавитьСтроку(смвл + "Иначе");
// Ветвь "Нет"
однаВетвь(кН, вс, нмрН, д, сз, лС, смвл);
лС.ДобавитьСтроку(смвл + "КонецЕсли");
к = макс(кД, кН) - 1;
иначе
лС.ДобавитьСтроку(нмр + символ(160) + эгс.наименование + ".");
конецЕсли;
конецЦикла;
лС.Показать("Линейная схема");
КонецПроцедуры
процедура однаВетвь(кДН, вс, нмрДН, д, сз, лС, смвл)
пока кДН < вс цикл
эгс = сз[кДН].значение;
нмр = сз[кДН].представление;
кДН = кДН + 1;
// Обнаружено действие, следующее сразу после Ветвления
если типЗнч(эгс) = тип("ЭлементГрафическойСхемыДействие") и эгс.групповая тогда прервать конецЕсли;
если лев(нмр, д) = нмрДН тогда
лС.ДобавитьСтроку(смвл + символ(160) + нмр + символ(160) + эгс.наименование + ".")
конецЕсли;
конецЦикла;
конецПроцедуры
Пример получаемого текстового документа показан на рис. 3.
Рис. 3. Линейная схема алгоритма
Если графическая схема создана в макете "мкт", то для ее отображения в форме можно употребить следующий код:
грСх = элементыФормы.грСх;
грСх.Очистить();
// мкт - макет с графической схемой
грСх.УстановитьСхему(получитьМакет("мкт"));
Демонстрация методов работы с графической схемой выполнена на примере построения блок-схемы алгоритма и ее последующего преобразования в линейную схему. Реализован упрощенный вариант преобразователя, не предполагающий вложенности блоков и оперирующий только половиной возможных блоков: Начало, Останов, Действие и Ветвление. Расширение функционала преобразователя является предметом самостоятельной проработки.