584 документа
← К списку

Структура

страница

Структура

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

Рис. 7.18****6. Структура – мячики в коробке

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

Описание типа Структура вы можете найти в синтакс-помощнике рядом с массивом (рис. 7.187).

Рис. 7.18****7. Тип «Структура»

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

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

У структуры есть единственное свойство – имя ключа. Почему оно написано в угловых скобках? Ведь имена методов написаны без всяких скобок.

Все дело в том, что имена методов – это именно те самые имена, которые вы должны использовать в программе. А <Имя ключа> – это просто обозначение того, что в программе вы должны будете написать имя того элемента коллекции, к которому хотите обратиться. Ведь заранее неизвестно, какие имена вы придумаете своим элементам.

Чтобы все прояснилось, сделайте простой пример. Создайте структуру и получите некоторые ее элементы (листинг 7.21).

Листинг **7.**21. Структура «МестоРаботы»

МестоРаботы = Новый Структура();

МестоРаботы.Вставить("Должность", "Ведущий специалист");

МестоРаботы.Вставить("НачалоРаботы", Дата(2018, 9, 1));

МестоРаботы.Вставить("Оклад", 40000 );

 

// Обращение к элементам структуры.

ДолжностьСотрудника = МестоРаботы.Должность;

ОкладСотрудника = МестоРаботы.Оклад;

 

Вы создали структуру и добавили в нее три элемента. Первый элемент имеет имя Должность. Его значение – это строка с названием занимаемой должности. Второй элемент с именем НачалоРаботы – это дата начала работы. Ну, и третий элемент с именем Оклад имеет значение 40 000. Это число.

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

примечание

Структура – это именованная коллекция. То есть ее элементы расположены в беспорядке. А обратиться к конкретному элементу можно по имени. И это имя уникально (не повторяется) в пределах одного объекта встроенного языка.

Теперь посмотрите, как выглядит структура «внутри». Запустите проект в режиме отладки и остановитесь на инструкции КонецПроцедуры. Откройте панель Переменные (рис. 7.188).

Рис. 7.18****8. Значение структуры «МестоРаботы»

Строки, выделенные на этом рисунке, показывают элементы структуры в том виде, в котором вы обращались бы к ним во встроенном языке: <имя структуры>.< имя ключа>. Но на самом деле структура устроена сложнее.

Раскройте ветку Элементы. Она показывает физическое устройство структуры (рис. 7.189).

Рис. 7.18****9. Физическое устройство структуры «МестоРаботы»

Если сравнить структуру с массивом, то вы увидите, что элементами массива являлись сами примитивные значения, то есть строки Понедельник, Вторник и так далее.

Элементами структуры, как вы видите, являются не строки («Ведущий специалист», 1 сентября, 40 000), а какие-то КлючИЗначение. КлючИЗначение – это тоже объект встроенного языка. Он нужен исключительно для того, чтобы связать вместе некоторое значение и его имя (ключ).

Если вы раскроете ветки элементов структуры, то 1C:EDT покажет вам эти объекты (рис. 7.190).

Рис. 7.1****90. «КлючИЗначение»

Как видите, у объекта КлючИЗначение всего два свойства: значение, которое вы поместили в структуру, и его ключ, то есть имя. По ключу вы можете обратиться к этому значению.

Структура – удобный объект для того, чтобы познакомиться с еще одной панелью 1C:EDT, панелью Значения. В структуре каждый элемент представлен объектом, который имеет несколько свойств. В случае структуры это два свойства, но их может быть и больше. Просматривать такие сложные объекты удобнее в панели Значения. Стандартно она расположена в нижней части перспективы Отладка (рис. 7.191).

Рис. 7.19****1. Панель «Значения»

Эта панель связана с панелью Переменные. Выделите переменную МестоРаботы – и вы увидите ее значение в этой панели.

Здесь каждому элементу структуры соответствует своя строка. В этой строке сначала показан тип значения – КлючИЗначение. А дальше в отдельных колонках перечислены значения его свойств. Таким образом, вы можете охватить всю структуру одним взглядом, не раскрывая ветки ее элементов, как это было в панели Переменные.

Выполнить «путешествие внутрь структуры» вы можете не только в режиме отладки, но и в синтаксической подсказке (рис. 7.192).

Рис. 7.19****2. Описание структуры в синтаксической подсказке

Вы видите, что здесь не просто написано, что элементами коллекции являются объекты КлючИЗначение. На этом имени есть гиперссылка. Если вы нажмете на нее, вы перейдете к описанию объекта КлючИЗначение. А чтобы вернуться обратно, вы можете нажать кнопку в командной панели (рис. 7.193).

Рис. 7.19****3. Описание объекта «КлючИЗначение»

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

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

Если вы сразу же знаете, какие значения будут в вашей структуре, вы можете создавать не пустую структуру, а структуру со значениями. Их имена и значения нужно указать в конструкторе. Для структуры, которая сейчас в вашем примере, это будет выглядеть так (листинг 7.22). Можете попробовать.

Листинг **7.**22. Создание структуры с элементами

МестоРаботы = Новый Структура("Должность, НачалоРаботы, Оклад", "Ведущий специалист", Дата(2018, 9, 1), 40000);

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

Еще один метод, о котором важно рассказать, называется Свойство(). На первый взгляд непонятно, зачем он нужен. Но сделайте простой пример.

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

Но ваша программа ожидает, что в структуре оклад будет. Поэтому где-то в своей программе вы получаете оклад из структуры (листинг 7.23).

Листинг **7.**23. В структуре нет оклада сотрудника

// Где-то создается структура.

МестоРаботы = Новый Структура("Должность, НачалоРаботы", "Ведущий специалист", Дата(2018, 9, 1));

 

// Здесь вы хотите использовать оклад.

ОкладСотрудника = МестоРаботы.Оклад;

Если в структуре не будет оклада, вы получите такую ошибку (можете запустить и проверить) – рис. 7.194.

Рис. 7.19****4. Ошибка: в структуре нет оклада сотрудника

Именно для таких случаев и нужен метод Свойство(). Он позволяет избежать ошибки в тех случаях, когда вы не уверены на 100 %, что нужный вам элемент есть в структуре (листинг 7.24).

Листинг **7.**24. Использование метода «Свойство()»

// Здесь вы хотите использовать оклад.

ОкладСотрудника = Неопределено;

Если НЕ МестоРаботы.Свойство("Оклад", ОкладСотрудника) Тогда

ПоказатьПредупреждение( , "Оклад сотрудника отсутствует.");

Возврат;

 

КонецЕсли;

 

ОкладСотрудника = МестоРаботы.Оклад;

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

Если все хорошо, то в переменной оказывается значение элемента, Если не выполняется и продолжается ваш алгоритм.

А если элемента с таким именем нет, метод вернет значение Ложь и выполнится условие Если. В этом условии вы каким-то образом обрабатываете ошибку. Например, выводите сообщение. И если без оклада сотрудника продолжение вашей программы невозможно, можете даже написать Возврат.

Сделайте этот пример в своем проекте и посмотрите, как он работает.

Точно так же, как и любую другую коллекцию, все элементы структуры можно перебрать с помощью инструкции Для Каждого Цикл.

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

Например, в вашем примере узнать размер оклада можно двумя способами (листинг 7.25).

Листинг **7.**25. Узнать размер оклада

ОкладСотрудника = МестоРаботы.Оклад;

ОкладСотрудника = МестоРаботы["Оклад"];

Вторая строка выглядит немного странно, правда? Зачем так усложнять, когда имя можно написать сразу после точки?

Вы абсолютно правы. В подавляющем большинстве случаев именно так и пишут. Точка, а после нее имя.

Но есть случаи, когда вы заранее не знаете имя. Например, где-то в форме пользователь указал, что его интересует оклад. И вы запомнили желание пользователя в переменной ЧтоХочетПользователь.

Теперь, в другом месте программы, у вас есть только структура ОкладСотрудника и только переменная ЧтоХочетПользователь. Как получить из структуры нужный пользователю элемент? Посмотрите на листинг 7.26.

Листинг **7.**26. Получение элемента структуры с помощью квадратных скобок

МестоРаботы = Новый Структура;

МестоРаботы.Вставить("Должность", "Ведущий специалист");

МестоРаботы.Вставить("НачалоРаботы", Дата(2018, 9, 1));

МестоРаботы.Вставить("Оклад", 40000);

 

// Где-то в форме пользователь указал, какая именно информация ему нужна.

ЧтоХочетПользователь = "Оклад";

 

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

// Как этот элемент получить из структуры?

ВернутьПользователю = МестоРаботы[ЧтоХочетПользователь];

Именно для таких случаев и нужна операция «квадратные скобки» при работе со структурой.