Главная » 1С Предприятие » УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ И КОНСТРУКЦИИ

0

2.9.8.   АЛГОРИТМ КАК СОВОКУПНОСТЬ БАЗОВЫХ СТРУКТУР Программа  и  ее  отдельные  части  создаются  на  основе  алгоритмов.  Фактически программа это  кодировка  некоторого алгоритма  или  группы   алгоритмов.  Из  этого

следует, что до написания кода необходимо  разработать и записать (последнее не всег­

да делается) алгоритм.

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

Алгоритм   составляется   из   отдельных   фрагментов,  которые   могут   иметь   одну из  следующих  структур:

•    блок операторов и конструкций;

•    ветвление;

•   цикл.

Блок  операторов  и  конструкций (БОК)  это  выполнение  одного   или  нескольких простых  или сложных действий. БОК может  содержать и ветвления и циклы, которые являются  примерами сложных действий. Простым действием является, например, в ыполнение   присваивания или  вызов  процедуры.   Конструкции состоят  из  нескольких операторов  и  используются  для  выполнения  управляющих  действий,  например  циклов.   Так,   конструкция  Если    …    КонецЕсли   состоит   из   двух  операторов:     Если и КонецЕсли. Последний оператор конструкции должен завершаться точкой с запятой.

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

•    если то;

•    если то иначе;

•    если то иначе если;

•   выбор по ключу  (в 1С это ветвление не используется, вместо него  употребляется "Если то иначе если");

•    попытка.

Цикл  это повторное  выполнение некоторого БОК с разными, как  правило, значениями  входящих в  БОК переменных. Однократное выполнение  БОК цикла  называют итерацией.  БОК цикла также  называют  телом  цикла.

Различают  следующие  циклы:

•    с параметром;

•    пока;

•    до.

Последний вид цикла применяется крайне редко;  в  1С он отсутствует.

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

2.9.9.    ВЕТВЛЕНИЯ  "ЕСЛИ "

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

Рис. 2.5. Ветвления: а ветвление "если то"; б ветвление "если то иначе"

Ветвление "если то" работает  так:

•    вычисляется значение ЛВ;

•    если оно истинно, то выполняется БОК1;

•    если оно ложно, то управление передается БОК2.

Записи ветвления "если то" в линейной  схеме алгоритма:

Х°. Если истинно ЛВ, то [выполнить:] БОК1

конец если [Х°].

В 1С ветвление "если то" записывается очень похоже: если ЛВ тогда

БОК1                                                               //                      Некоторые операторы конецЕсли;

Ветвление "если то иначе" работает  так:

•    вычисляется значение ЛВ;

•    если оно  истинно, то выполняется БОК1

•    если оно ложно, то выполняется БОК2;

•   далее управление передается БОК3.

Запись ветвления "если то иначе" в линейной  схеме алгоритма:

Х°.  Если истинно ЛВ, то [выполнить:] БОК1

иначе [выполнить:]

БОК2

конец если [Х°].

Запись ветвления "если то иначе" в  1С: если ЛВ тогда

БОК1                                                              //                     Некоторые операторы иначе

БОК2                                                               //                     Некоторые операторы конецЕсли;

Пример использования ветвлений "если то" и "если то иначе" см. в разд.  1.7.3.

Замечание.  Если  БОК1   и  БОК2   в ветвлении   "если  то  иначе" являются  выражениями,  то для  выбора  вычисляемого  выражения лучше  употреблять  функцию, вычисляющую  выражение по условию. Ее синтаксис:

результат  =  ?(ЛВ, выражение1 , выражение2 ); Пример:

у = ?(х > 0, Лог(х), х);              //        Вернет Лог(х), если х >0, или х в противном случае Приведенный  оператор заменяет следующее  ветвление:

если х > 0 тогда у = Лог(х);

иначе

у = х; конецЕсли;

Для ветвления "если то иначе если" укажем  только  способ  его записи в  1 С:

если ЛВ1   тогда

БОК1                                             //               Некоторые операторы иначеЕсли ЛВ2  тогда

БОК2                                             //               Некоторые операторы

иначеЕсли ЛВк  тогда

БОКк                                   //                   Некоторые операторы

[иначе                            //                 Последние  два элемента конструкции

БОКк+1 ]                       //              являются необязательными конецЕсли;

2.9.10.    "ПОПЫТКА"

Ветвление Попытка служит для  обработки  исключений  и  реализуется  в   1С  виде следующей  конструкции:

попытка БОК1,

исключение

БОК2

конецПопытки;

В  конструкции  БОК, это  последовательность  операторов, в  которых  может  возникнуть исключение,  а в БОК2 это  последовательность операторов, обрабатывающих исключение.

Напомним, что  исключение  это  ошибка, возникающая  при  исполнении  программы, например  деление на  нуль  или  выход за границы  массива. В первом  случае  система  выдаст сообщение  "Деление  на  0", во  втором  "Значение  индексного  выражения

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

Пример.   Вычисляется   сумма   элементов   вектора.   В   процедуре  при   обращении к вектору умышленно введена ошибка  выход за  границы  вектора.  Для  ее  преодоления применяется конструкция Попытка.

процедура Выполнить()                      //              Запускаем процедуру из обработки Проба  перем а[5], ин, сум;

// Инициализация вектора а

а[1] = 0; а[2] = 1.5; а[3] = 2.5; а[4] = -1; а[5] = 7;

// Сумма элементов массива а. Ожидаемый результат: сум = 10 сум = 0;

// Умышленно для иллюстрации работы конструкции Попытка

// задаем верхний параметр цикла большим числа элементов вектора а для ин = 1 по 7 цикл

Сообщить(ОписаниеОшибки() + ". Вычисления будут продолжены."); конецПопытки;

конецЦикла; // для

Сообщить("сум = " + сум);                 //                 Напечатает  10 конецПроцедуры // Выполнить

Замечание.   Встроенная функция  ОписаниеОшибки  возвращает  описание  ошибки в том виде,  в каком  оно  выдается системой в окно  сообщений  при отсутствии обработки исключений.

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

Пример.   Вычисляется   сумма   элементов   вектора.   В   процедуре  при   обращении к вектору  умышленно  введена ошибка  выход за  его  границы.   Для  ее  преодоления  применяется конструкция Попытка.  Однако в этот раз в результате применения оператора   ВызватьИсключение  осуществляется   выход   из   цикла  и   передача  управления внешнему  обработчику.

процедура Выполнить()              //         Запускаем процедуру из обработки Проба  перем а[5], ин, сум;

// Инициализация вектора а

а[1] = 0; а[2] = 1.5; а[3] = 2.5; а[4] = -1; а[5] = 7;

// Сумма элементов массива а. Ожидаемый результат:  сум = 10 сум = 0;

// Умышленно для иллюстрации работы конструкций Попытка

// задаем верхний параметр цикла большим числа элементов вектора а попытка

для ин = 1 по 7 цикл

попытка           //             При выходе за границы вектора передадим

сум = сум + а[ин];     //   управление внешнему обработчику исключений

исключение

вызватьИсключение;    //  Передача управления внешнему обработчику конецПопытки; // внутренней

конецЦикла; // для исключение

Сообщить(ОписаниеОшибки() + ". Осуществлен выход из цикла. Работа продолжается"); конецПопытки; // внешней

Сообщить("сум = " + сум);                 //                 Напечатает 10 конецПроцедуры // Выполнить

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

2.9.11.                  ЦИКЛЫ

В цикле "с параметром n" задаются начальное значение  параметра к, его  конечное значение  к и  шаг  ш отличная  от нуля  величина,  на которую  изменяется значение  параметра   и  после   выполнения  очередной  итерации. В  1С  шаг  ш  всегда принимается равным  единице. Параметр п  также  называют  переменной  цикла,  которая должна  быть целочисленной. Параметры  ник  являются  в   1С  числовыми  выражениями  и  представляют  соответственно  нижнюю  и  верхнюю  границы  переменной цикла.  Если  параметр н(к)   вычисляется  с  нецелым  значением, то  в  качестве  параметра используется  целая  часть   результата.

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

Графически  цикл "с параметром" иллюстрирует рис. 2.6.

6

Рис. 2.7. Циклы: а цикл Пока; б цикл До

Замечание.  При  работе  с циклами  Пока  и  До  надо  следить,  чтобы  ЛВ  обязательно рано  или поздно  приняло  значение ложь.  Иначе произойдет зацикливание "бесконечное" выполнение операторов цикла.

Запись циклов Пока  в линейной  схеме  алгоритма:

Х°. Пока  истинно ЛВ [, выполнить:] БОК

конец цикла Х°.

и в 1С:

пока ЛВ цикл

БОК                                     //                      Некоторые операторы конецЦикла;

Замечания:

1.      Далее  при  ссылке  на  циклы  будем  использовать  принятые  в  1С  имена  операторов циклов Для и Пока.

2.       Циклы Для  и Пока  могут быть вложенными.  То есть в теле цикла Для (Пока) могут быть другие циклы Для  и/или Пока.

Проиллюстрируем  второе  замечание  примером,  записав  код  вывода групп  подряд  следующих непериодических констант,  сообщающий перед  выводом  группы  ее номер.  (Уточним:  в  примере  группа  это  подмножество подряд  следующих непериодических констант,  не  имеющее  периодических констант.  То  есть  группы  разделяются  одной  и более  периодическими константами.)

// Процедура, выводящая группы непериодических констант

// Запускается из обработки Проба процедура  Выполнить()

перем всегоКонстант, ин, номерГруппы, идеи; ОчиститьОкноСообщений();

номерГруппы = 0;

всегоКонстант  = Метаданные.Константа();

ин = 1;                                  //                    Номер константы пока ин <= всегоКонстант цикл

если Метаданные.Константа(ин).Периодический = 0 тогда номерГруппы = номерГруппы + 1;

Сообщить("Выводится группа с номером " + номерГруппы);

// Вложенный цикл Пока

пока Метаданные.Константа(ин).Периодический = 0 цикл идеи = Метаданные.Константа(ин).Идентификатор; Сообщить(иден + " " + Константа.ПолучитьАтрибут(иден));

ин = ин + 1;          //      Не забываем перейти к следующей константе

если ин > всегоКонстант тогда

прервать;           //      Досрочный выход из вложенного цикла конецЕсли;

конецЦикла; // пока Метаданные.Константа(ин).Периодический = 0

иначе

//

Имеем  периодическую константу

ин = ин +  1;

//

Не забываем перейти к следующей константе

конецЦикла; // пока ин <= всегоКонстант если номерГруппы = 0 тогда

Сообщить("В  конфигураторе нет непериодических констант"); конецЕсли;

конецПроцедуры // Выполнить

Источник: Бартеньев О. В. 1С:Предприятие:  программирование для  всех.  Базовые объекты и расчеты на одной дискете. М.: Диалог-МИФИ, 2005. 464 с.

По теме:

  • Комментарии