Список работ

1С:Предприятие. Графическая схема

Содержание

Постановка задачи. Нумерация блоков

Графическая схема 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. В графической схеме набрана блок-схема алгоритма

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

ИмяЗаголовокПодсказка
ТочкаСтартаНачало1.
ДействиеВводДанныхВвод А, Б и В2.
УсловиеАБольшеБА > Б3.
ДействиеБПрисвоитьВБ = В3.1.1.
ДействиеАПрисвоитьВА = В3.2.1.
ДействиеВыводДанныхВывод А и Б4.
ТочкаЗавершенияОстанов5.

Замечания:

  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С:Предприятие.

Список работ

Рейтинг@Mail.ru