Понятие «массив» уже давно используется в программировании и, чаще всего, под ним понимают некоторую структуру в памяти, состоящую из последовательности элементов. Массив в 1С – самая простая из универсальных коллекций значений. Помимо массива к универсальным коллекциям относятся:

  1. Список значений (в отличие от массива у значений из списка есть представление, реализована возможность сортировки и интерфейсного представления коллекции);
  2. Таблица значений – коллекция, имеющая колонки для расширенного описания значения, подобную структуру можно получить, выполнив запрос;
  3. Дерево – очень похоже на таблицу, дополненную структурой подчиненности;
  4. Структура – динамический набор имен и значений переменных;
  5. Соответствие – подобно структуре, только переменные сопоставляются не строковым представлениям, а друг другу.

Методы массива

Программное создание экземпляра массива происходит с помощью с помощью оператора Новый() (Рис.1).

Как видно из приведенного примера массивы можно создавать как с фиксированным количеством элементов, так и без этого ограничения.

Прежде, чем приступать к обсуждению методов работы с массивом, давайте определимся с двумя понятиями:

  • Индекс элемента – можно представить как порядковый номер отдельно взятого значения;
  • Количество элементов – число элементов в коллекции, его определение доступно с помощью метода Количество().

Важно знать: в 1С подсчет количества значений любой коллекции начинается с 1, а раздача индексов с 0, т.е первый элемент в массиве имеет индекс 0. Таким образом, обход коллекции с помощью цикла с итератором должен начинаться с 0 и заканчиваться количеством элементов минус 1, в противном случае система с помощью окна (Рис.2) уведомит о наступлении исключительной ситуации.

Рис.2

Любой объект конфигурации имеет свои методы для работы, массив не исключение, перечислим их с некоторой расшифровкой:

  • ВГраница() – с помощью метода можно получить максимальный индекс элемента, для пустого массива будет возвращено значение (-1);
  • Вставить() – этот метод имеет два параметра: индекс и значение, индекс указывает куда в массив вставить новый элемент, добавляемое значение может быть пустым;
  • Добавить() – этот метод вставки значения можно использовать, когда место размещения элемента непринципиально, с его помощью новые данные будут записаны в конец имеющегося массива;
  • Найти() – в случае успешного выполнения возвращает индекс указанного в скобках значения, в противном случае возвращает «Неопределено»;
  • Очистить() –очищает коллекцию;
  • Получить() – читает данные, расположенные в массиве по указанному индексу, можно заменить квадратными скобками ;
  • Удалить() – удаляет элемент с указанным индексом;
  • Установить() – заменяет данные в указанной ячейке массива.

Одномерные и многомерные массивы

В простейшем случае одномерный массив может содержать значения различных типов (Рис.3)

Рис.3.

Результат выполнения вышеприведенного кода представлен на Рис.4

Рис.4

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

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

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

Допустим, перед нами стоит задача создать массив из фамилии, имени и отчества двух сотрудников. С помощью кода (Рис.5) создаем соответствующий массив с фиксированным количеством столбцов и строк.

Рис.5

Для его обхода нам понадобится два цикла, в первом цикле мы обходим массив по строкам, во втором разбираем строку на элементы. Это можно сделать либо с помощью цикла «Для каждого …. Из» (Рис.6)

Рис.6

Либо с помощью цикла с итератором «Для … по» (Рис.7)

Рис.7

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

Использование массива

Массивы в 1С чаще всего используются для:

  1. Создания различных отборов используемых при работе с запросами и другими коллекциями значений;
  2. Передачи списков в качестве параметров между процедурами и функциями;
  3. Обмена данными с внешними компонентами, подключенными с использованием COM технологии.

Безусловно, это далеко неполный список того, в каких целях можно задействовать объект «Массив».

О чем эта статья

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

  • Что такое универсальные коллекции, когда и в каких случаях их необходимо использовать?
  • Что общего у всех универсальных коллекций? Какие приемы можно использовать для работы со всеми ними?
  • Что такое массив, как и когда его использовать? Какие у него есть методы?
  • Зачем использовать структуру? В чем её отличие от массива?
  • В каких случаях использовать список значений? Как отобразить его на форме?
  • Соответствие – что это и когда его использовать? В чем преимущества относительно структуры?
  • Для чего используется таблица значений? Как описать ее структуру? Как добавить/удалить строки? Как вывести ее на форму?
  • Дерево значений – для чего используется? Как заполнить и вывести на форму? Как с ним работать?

Применимость

В статье рассматривается платформа 1С:Предприятие 8.3 актуальной редакции.

Как в 1С работать с универсальными коллекциями

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

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

Важно понимать, что коллекции не хранятся в базе данных (о типе данных Хранилище значений, которое может сохранять практически любой тип данных, речь пока не идет).

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

Коллекция может создаваться в результате работы какой-либо функции (функция возвращает в качестве значения универсальную коллекцию).

Можно получить новую коллекцию вручную, обратившись к конструктору и создав экземпляр класса.

Например: НашМассив = Новый Массив;

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

Так, в конструкторе для можно указать количество элементов в соответствующих измерениях. Т.е. можно сразу же объявлять многомерные .

Соответствующее описание конструктора есть в синтакс-помощнике.

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

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

Почти любую универсальную коллекцию можно создать с помощью конструктора (исключением являются табличные части, которые выступают в качестве объектов конфигурации).

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

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

Например, НашМассив . Обратите внимание, в этом случае система возвращает элемент Массива с индексом 3, а по порядку это четвертый элемент Массива.

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

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

Для всех коллекций используется обход элементов коллекции. Обход возможен двумя способами: циклом Для и циклом Для каждого из .

Для большинства универсальных коллекций применимы методы: Количество, Индекс, Добавить, Вставить, Удалить и Найти.

Количество – это функция, которая возвращает количество элементов коллекции. Она может использоваться перед циклом Для , как представлено на рисунке.

Метод Индекс существует не у всех коллекций, а только у тех, на элементы которой можно сослаться. В качестве примера можно привести ТаблицуЗначений .

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

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

Метод Индекс позволяет определить, какой индекс соответствует данной строке (т.е. текущую позицию строки в таблице). Значения индекса начинаются с нуля.

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

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

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

Синтаксис: Вставить (,)

Первым параметром указывается индекс, в который будет вставлено новое значение. Т.е. мы, например, можем указать, что каждое значение нужно вставлять в начало списка (второй способ на рисунке выше).

Для удаления элементов из коллекции используется метод Удалить . В методе Удалить указывается по индексу, какой элемент мы будем удалять.

Синтаксис: Удалить()
Пример использования: НашМассив.Удалить(5);

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

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

Например, в ТаблицеЗначений можно указать те строки, те колонки, в которых нужно осуществлять поиск.

Если значение найдено, то данный метод возвращает индекс или определенную строку. Если значение не найдено, возвращается значение типа Неопределено . Применительно к Массиву возвращается Индекс , либо значение Неопределено .

Пример использования: НашаПеременная = НашМассив.Найти(8);

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

Дополнительные методы для Массива

Метод ВГраница() возвращает количество элементов минус один. Т.е. если мы используем цикл Для , то вместо метода Количество можем сразу использовать метод Граница() .

В частности, переменную КоличествоВМассиве можно было определить иначе:

КоличествоВМассиве = НашМассив.ВГраница();
Тогда при описании самого цикла отнимать от данной переменной единицу не следует.

Метод Установить позволяет присвоить значение элементу Массива по индексу.

Синтаксис: Установить(,)

Пример: НашМассив.Установить (2,8);

Альтернативный вариант: НашМассив = 8;

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

Синтаксис: Получить()

Пример: НашаПеременная = НашМассив.Получить(2);

Альтернативный вариант: НашаПеременная = НашМассив;

Универсальная коллекция Структура

Структура, так же как и Массив, может иметь неограниченное количество элементов, но вот содержание элемента отличается от Массива.

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

Ключ – это строго строковый тип данных, который описывает значение. Например, Ключу «Код» может соответствовать значение 113; Ключу «Имя» значение «Вася». На само Значение ограничение типа данных не накладывается.

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

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

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

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

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

Тогда гораздо удобнее записать все параметры в Структуру и именно ее и передавать. Т.е. происходит «упаковка» параметров процедур и функций.

Отдельно следует отметить, что в качестве Ключа в Структуре может выступать не абсолютно любая строка. Накладываются определенные ограничения.

Ключ должен выступать в качестве идентификатора. Это означает, что в Ключе не должно быть пробелов и он не может начинаться с цифры.

Допустимо начало Ключа с буквы или знака подчеркивания. Таким образом, Ключ должен удовлетворять требованиям к созданию идентификаторов.

Отметим, чем еще Сруктура отличается от Массива. В Структуре есть метод Вставить , в Массиве есть два метода для вставки: Вставить (в определенную позицию) и Добавить (в конец списка). В Массиве все элементы являются упорядоченными.

Структура – это некое неупорядоченное множество. Именно поэтому для Структуры существует только метод вставки.

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

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

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

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

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

Например: НашаСтруктура = Новый Структура (“Код,Имя”, 133, “Вася”);

Через запятую перечисляются сначала имена Ключей, а потом, соответственно, в той же последовательности значения параметров.

Для добавления в Структуру нового значения существует метод Вставить , который вставляет новую пару (Ключ и Значение).

Например: НашаСтруктура.Вставить(“ЧленовСемьи”,3);

Для Структуры характерен еще один метод, который используется достаточно часто. Это метод Свойство .

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

Если существует такой элемент, то система вернет значение Истина, в противном случае – Ложь.

Например, выражение НашаСтруктура.Свойство (“ЧленовСемьи”) будет равно значению Истина. Этот метод применяется достаточно часто при анализе Структуры.

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

Например: Сообщить(НашаСтруктура[“ЧленовСемьи”]);

Однако следует не забывать, что Структура – это не упорядоченное множество объектов, именно поэтому обращение по индексу 0, 1, 2 недопустимо.

Универсальная коллекция Список значений

СписокЗначений представляет собой линейный список элементов любого типа данных.

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

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

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

Третья колонка – само хранимое значение, т.е. это любой тип данных, причем в разных строках он может быть различным.

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

СписокЗначений – это тот объект, с которым может визуально работать пользователь. Т.е. СписокЗначений можно вывести на форму.

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

Найдем СписокЗначений в ситакс-помощнике. Конструктор СпискаЗначений не параметризованный (нельзя задать какие-то значения по умолчанию).

Есть такие методы, как:

  • Вставить(,) ;
  • Добавить(,);
  • Количество();
  • Индекс().

Есть и специальные методы, например, ВыгрузитьЗначения() . При этом создается Массив, в который копируется список значений. Например:

МассивЭлементов = СписокТиповЦен.ВызрузитьЗначения();

Существует и обратный метод:
СписокТиповЦен.ЗагрузитьЗначения(МассивЭлементов);

Существуют методы поиска:
НайтиПоЗначению(); НайтиПоИдентификатору().

Есть метод копирования:
КопияСписка = СписокТиповЦен.Скопировать();
Данный метод предназначен для того, чтобы сделать какую-то модификацию с копией.

Существуют методы:
СортироватьПоЗначению();
СортироватьПоПредставлению().

Методы ВыбратьЭлемент(,) и ОтметитьЭлементы () вызывают модальное диалоговое окно, которое останавливает выполнение алгоритма, пока пользователь не закроет данное окно.

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

Пример кода, вызываемого из модуля Управляемого приложения:

Отображение данного кода в пользовательском режиме (модальное диалоговое окно).

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

Создаем новую команду ЗапонитьПодарки , переносим на форму и определяем для нее обработчик действия.

В пользовательском режиме, при нажатии в форме обработки кнопки Заполнить подарки, появится заполненный список.

При желании список можно редактировать: какие-то элементы добавить, какие-то – удалить.

Универсальная коллекция Соответствие

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

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

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

Конструктор Соответствия, в отличии от Структуры, не содержит возможности указания параметров.

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

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

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

Например: НашеСоответствие = Новый Соответствие;
Соответствие = 999;

Т.е. если элемент в коллекции не присутствовал, то с помощью оператора присваивания он будет добавлен, а если присутствовал, то будет обновлен.

Это является отличием от Структуры.

Универсальная коллекция Таблица значений

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

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

Отличия ТаблицыЗначений от двухмерного Массива:

  • это объект, с которым может работать пользователь (таблицу значений можно вывести на экран, пользователь может ее заполнять, в дальнейшем введенные данные можно читать);
  • построение индексов для быстрого поиска;
  • клонирование, заполнение определенным значением всей колонки, выгрузка все колонки в массив.

ТаблицаЗначений используется как некий буфер хранения информации. ТаблицаЗначений возвращается и принимается как параметр многими методами системы. К Таблице значений возможно построить запрос.

Итак, ТаблицаЗначений состоит из набора строк и набора колонок. И строки, и колонки представляют собой коллекции.

Т.е. внутри коллекции ТаблицаЗначений есть еще две коллекции. Обратимся к синтакс-помощнику и найдем ТаблицуЗначений .

Поддерживаемые типы данных: сама ТаблицаЗначений , которая состоит из строк. Каждая строка представлена типом данных СтрокаТаблицыЗначений , у которой есть свои свойства и свои методы. Имеется КоллекцияКолонок ТаблицыЗначений также обладает определенными свойствами.

Важный момент! Процедура, которая формирует ТаблицуЗначений , должна компилироваться & НаСервере.

Прежде, чем начать работать с ТаблицейЗначений , необходимо определить, какие в ней будут содержаться колонки (т.е. создать их). Синтаксис:

Добавить(,)
(необязательный)
Тип: Строка.
(необязательный)
Тип: ОписаниеТипов
(необязательный)
Тип: Строка.
(необязательный)
Тип: Число.

Например:

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

В описании ТаблицыЗначений в качестве элементов коллекции выступают именно СтрокиТаблицыЗначений .

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

Чтобы добавить новую строку в таблицу нужно использовать метод либо Добавить() , либо Вставить() . Во втором случае следует указать, на какую позицию нужно выставлять требуемую строку.

Чтобы присвоить значение колонке, мы через точку обращаемся по имени колонки или по индексу (с помощью квадратных скобок).

Для заполнения ТаблицыЗначений могут использоваться следующие методы:

Очистить() – для удаления всех строк из ТаблицыЗначений .

ЗаполнитьЗначения(,) – позволяет заполнить все колонки, либо выбранные колонки одним значением.
ЗагрузитьКолонку(,) – загружает колонку из массива.
ВыгрузитьКолонку() – выгружает колонку в массив.

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

Скопировать(,) – позволяет на основании существующей таблицы создать новую ТаблицуЗначений , при этом указывать не все строки и все колонки, а только некоторые из них. Возвращаемое значение – ТаблицаЗначений .

Можно скопировать структуру ТаблицыЗначений . Для этого существует соответствующий метод СкопироватьКолонки() . Мы получим пустую ТаблицуЗначений с требуемой структурой.

В ТаблицеЗначений существует метод Итог() . Можно указать ту колонку, в которой нужно просуммировать числовые величины. Применительно к ранее показанному коду в Табло можно рассчитать значение: ТЗ.Итог(“Сумма”) .

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

Применительно к ранее показанному коду в Табло можно рассчитать значение: ТЗ.Свернуть(“ДеньНедели”,“Сумма”).

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

Чтобы отобразить ТаблицуЗначений на экране, создадим реквизит формы и присвоим ему тип данных ТаблицаЗначений .

После чего полученную таблицу следует вывести на форму.

В модуле формы в конце ранее составленного алгоритма (в Процедуре СозданиеТаблицыЗначений) следует дописать:
ЗначениеВДанныеФормы(ТЗ, Таблица);

Универсальная коллекция Дерево значений

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

Тоже может быть отражено на экране. Дерево значений в явном виде состоит из коллекции строк и коллекции колонок. В дереве существуют такие два свойства как Строки и Колонки.

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

Создадим соответствующую команду Дерево и ее процедуру обработки.

Создадим в котором одна родительская строка и две подчиненные.

Создадим реквизит формы ДерЗн (тип данных – ДеревоЗначений).

Для этого реквизита создадим колонки Год и Месяц.

Переместим соответствующий элемент ДерЗн на форму.

В конце Процедуры ДеревоНаСервере() допишем:

ЗначениеВДанныеФормы(ДеревоЗн, ДерЗн);

Проверим, что получилось в пользовательском режиме.

С помощью кнопки Добавить можно добавлять новые строки. Они могут также образовывать иерархию.

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

На этом мы завершаем наше первое знакомство с универсальными коллекциями.

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

Применение массивов в 1С помогает упорядочить используемые в работе элементы.

Это программный набор элементов. Он служит для:

  • Отбора значений.
  • Сортировки. Каждой позиции в массиве присваивается индекс. Это облегчает поиск. И вы можете сослаться на объект, написав его номер.
  • Объединения и сохранения записей.
  • Разделения групп, создания подстрок.
  • Массив - сам по себе объект. К нему будет привязана переменная. Можно обратиться к отдельным его частям или использовать его целиком в процедурах. Например, можно объединить группу значений «Сотрудники отдела N» и внести туда имена и фамилии работников.

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

Создание

Работа с массивами 1С начинается с их создания. Нужно «место действия» - поле, в котором вы будете вводить код.

  1. Откройте «Конфигуратор» («Конфигурация»).
  2. Кликните правой кнопкой мыши по пункту «Обработка».
  3. Выберите «Добавить».
  4. Появится подменю «Обработка1». Выделите его. Информация о нём отобразится в рабочей области.
  5. На вкладке «Основные» введите «Имя». Скажем, «ТестовыйМассив».
  6. Откройте раздел «Формы».
  7. Нажмите на значок в виде лупы.
  8. Отметьте опцию «Форма обработки».
  9. Щёлкните на «Готово».
  10. Откроется окно с тремя фреймами. В правом верхнем перейдите в закладку «Команды».
  11. Иконка в виде плюса, чтобы добавить позицию.
  12. Появится пункт «Команда1». Выделите его.
  13. В поле «Имя» введите название. К примеру, «ТестовыеЗначения». Скопируйте его в «Заголовок».
  14. В строке «Действие» нажмите на лупу.
  15. Пункт «Создать на клиенте» и «OK».
  16. Вот и модуль, в котором можно вводить код.

Чтобы выводить промежуточный результат, создайте «кнопку». Зачем она нужна в массиве - вы поймёте чуть позже.

  1. Перейдите на вкладку «Формы». Она внизу.
  2. Щёлкните правой кнопкой мыши на «Командная панель».
  3. «Добавить - Кнопка».
  4. Придумайте ей любое название. Или можете оставить то, которое выдано по умолчанию.
  5. В поле «Имя команды» нажмите на пиктограмму в виде многоточия.
  6. Выберите «ТестовыеЗначения». Если назвали команду по-другому, там будет иной заголовок.

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

  1. Откройте закладку «Модуль».
  2. Текст, который идёт после двух косых чёрточек (два слеша - «//») можно удалить. Он выглядит примерно так «// Вставить содержимое обработчика». Это пояснения. Их пишут программисты, чтобы не запутаться в коде.
  3. Свой текст пишите между операторами «Процедура» и «КонецПроцедуры».
  4. Теперь создайте набор значений . Придумайте переменную, которая будет условно его обозначать. Допустим, «ПервыйМассив».
  5. Её надо связать с объектом. Для этого введите команду «ПервыйМассив = Новый массив ()». Это коллекция, в которой может быть неограниченное количество элементов. Если у вас фиксированный размер, укажите его после команды в скобках «Новый массив (5)». Соответственно, двумерная коллекция будет выглядеть «Новый массив (7, 5)». Можно создавать многомерные наборы.
  6. При вводе могут появиться подсказки, которые предлагают подходящие операторы.
  7. Слова различаются по цвету. У переменных одна расцветка, у функций - другая.
  8. После каждой команды ставьте точку с запятой «;». И для удобства начинайте с нового абзаца.
  9. С пустым множеством ничего сделать нельзя. Ни упорядочить, ни вывести, ни разложить строку в массив в 1С. Поэтому надо вставить в него элементы.
  10. Введите «ПервыйМассив.Добавить(Значение1);». Потом «ПервыйМассив.Добавить(Значение2);» и так далее.
  11. Объекты нумеруются с нуля. То есть переменной «Значение1» будет присвоен индекс «0». Можете сами заполнять коллекцию со «Значение0», чтобы не перепутать.

Для чего всё это? И зачем та загадочная «кнопка»? Попробуем запустить простенькую функцию.

  1. Под коллекцией напишите команду «Сообщить (ПервыйМассив);» В квадратных скобках указан индекс элемента. То есть адрес нашего «Значение0».
  2. Отформатируйте модуль. Это проверка на наличие ошибок. В больших блоках можно что-то недоделать по невнимательности: не поставить точку с запятой, не закрыть скобку, неправильно написать переменную. Компилятор на это укажет.
  3. Нажмите на кнопку в виде знака «Плей» (треугольник в круге), чтобы запустить написанную вами программу.
  4. Кликните на «Сервис» и выберите вашу кнопку.
  5. Нажмите её.
  6. Появится надпись «Значение0». Это и есть результат выполнения функции.

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

Функции

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

Как превратить массив 1С в строку:

ТестМассив = Новый Массив(4);
ТестМассив = Это;
ТестМассив = Делается;
ТестМассив = Так;
СтрокаТест = ЗначениеВСтрокуВнутр(ТестМассив);
Сообщить(СтрокаТест);

Выводите на «Кнопку» и получаете фразу. Это может быть частью большого модуля - в таком случае оператор «Сообщить» не нужен.

Чтобы в 1С разложить строку в массив подстрок, нужен разделитель. Условная метка, после которой текст будет делиться. Допустим, есть слово «Протокол». И мы поставим разделитель «О». Введите команду «ТестМассив = РазложитьСтрокуВМассив(Протокол, «О») ;» Получится отдельно «Пр», «Т», «К» и «Л». Разделитель стёрт. А слово разделено на несколько подстрок.

Вот как это можно применить на практике. У вас есть массив с ФИО сотрудников. И вам нужно, чтобы при выборе позиции автоматически заполнялись поля «Фамилия», «Имя» и «Отчество». Для этого ФИО надо разбить на три составляющих. В качестве разделителя используйте «пробел».

Обычно для этого используется сложный модуль: цикл с большим количеством операторов. Циклические блоки с условием строятся по принципу «Если (условие), тогда (действие1), иначе (действие2)». Вначале программа проверяет, выполняется ли условие. Если да, то она запускает первую функцию. Если нет - вторую.

Цикл проверит каждый символ в строке. Если там нет разделителя, он продолжает дальше. Если там есть разделитель, он добавляет значение в набор подстрок. Там могут использоваться и другие операторы: к примеру, «СокрЛП» - сокращение определённых знаков справа и слева от строки.

Каждый модуль надо «заканчивать», чтобы утилита прекратила выполнение процедуры. На цикле с «Если» этот оператор - «КонецЕсли». На цикле без условий - «КонецЦикла». Каждую функцию надо отдельно завершать.

Поиск и сортировка

В коллекциях может находиться огромное количество данных. Надо научиться их искать и сортировать.

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

МассивТест = Новый Массив(3);
МассивТест = «Телефон»;
МассивТест = «Ноутбук»;
МассивТест = «Компьютер»;
Индекс = МассивТест.Найти(«Телефон»);
Если Индекс ‹› Неопределено Тогда
Сообщить («Поиск завершён» + МассивТест[Индекс]);

И не забудьте поставить «завершающий оператор».

Коллекция подана для примера. Мы создали набор из трёх значений. И сделали небольшой цикл. Если утилита не найдёт подходящий элемент, она выдаст сообщение «Неопределено». Если отыщет, покажет результат.

Сортировка массива 1С просто незаменима при работе с большим объёмом данных. В них же надо как-то ориентироваться. Лучше расставить их в определённом порядке. Допустим, есть у вас коллекция «ВашМассив». Чтобы привести её «в порядок»

ТестСписок = Новый СписокЗначений;
ТестСписок.ЗагрузитьЗначения(ВашМассив);
ТестСписок.СортироватьПоЗначению(НаправлениеСортировки.Возр);
ВашМассив = ТестСписок.ВыгрузитьЗначения();

Вместо «Возр» можете поставить «Убыв». Также результат можно выгрузить в таблицу значений:

ТестоваяТаблица = Новый ТаблицаЗначений;
ТестоваяТаблица.Колонки.Добавить(«Колонка»);
ТестоваяТаблица.ЗагрузитьКолонку(ВашМассив, «Колонка»);
ТестоваяТаблица.Сортировать(«Колонка Убыв»);
ВашМассив = ТестоваяТаблица.ВыгрузитьКолонку(«Колонка»)

Существуют и сложные методы сортировки: «Пузырьковая», «Быстрая», «Шейкер», «Рекурсия». У них многоуровневые и длинные алгоритмы.

Таблицы и списки

Информацию можно переправлять между разными видами коллекций. Чтобы перенести в 1С массив в таблицу значений:

МассивТелеф = Новый Массив;
МассивТелеф.Добавить(«Смартфон»);
МассивТелеф.Добавить(«Планшет»);
МассивТелеф.Добавить(«Телефон»);
ТаблицаТест = Новый ТаблицаЗначений;
ТаблицаТест.Колонки.Добавить(«Мобильники»);
ТаблицаТест.Добавить();
ТаблицаТест.Добавить();
ТаблицаТест.Добавить();
ТаблицаТест.ЗагрузитьКолонку(МассивТелеф, «Мобильники»);
Для Каждого Строка Из ТаблицаТест Цикл
Сообщить(Строка.Мобильники);

Не забудьте поставить в конце оператор завершения цикла.

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

НовСписок = Новый СписокЗначений();
НовСписок.ЗагрузитьЗначения(ВашМассив);

В программировании одну проблему можно решить разными способами. И 1С - не исключение. Линейные алгоритмы, циклы, циклы с условием, циклы со счётчиком. Вариантов много. Чтобы ориентироваться в массиве, нужны некоторые навыки работы в 1С.

Массив 1С – это простой набор значений. В один массив 1С можно добавить значения разных типов. После добавления наличие в массиве 1С значения можно проверить встроенным поиском.

Массив 1С часто используется:
А) Для отборов
Б) Для сохранения списка значений, чтобы далее использовать его, например, передать как параметр в функцию/процедуру.

Работа с массивами 1С

Создадим массив 1С из 2 значений:
Массив = Новый Массив(); //массив без фиксированного кол-ва значений

Массив.Добавить(ГСЧ.СлучайноеЧисло(0, 1000));
Массив.Добавить(ГСЧ.СлучайноеЧисло(0, 1000));

//цикл прохода каждого значения массива 1С, сколько бы их ни было

Сообщить(Знч);
КонецЦикла;

Создадим массив 1С из 10 значений:
Массив = Новый Массив(10); //массив с фиксированным кол-вом значений
ГСЧ = Новый ГенераторСлучайныхЧисел(); //будем заполнять случайными числами

//индекс массива начинается с нуля, а не с единицы
//10 шт - это от 0 до 9
Для Сч = 0 по 9 Цикл
//обращение к массиву ИмяМассива[Индекс]
Массив[Сч] = ГСЧ.СлучайноеЧисло(0, 1000); //случайное число от 0 до 1000
КонецЦикла;

//цикл прохода каждого значения массива, сколько бы их ни было
Для каждого Знч из Массив Цикл
Сообщить(Знч);
КонецЦикла;

//обратите внимание - 10 значений массива, это значит что их по умолчанию 10 шт и каждое значение равно НЕОПРЕДЕЛЕНО, пока мы не установили другое
//это не значит, что мы не можем добавить еще одно значение, 11е, с помощью ИмяМассива.Добавить();

Многомерный массив

Создадим многомерный массив 1С 2х2. Многомерный массив 1С, значит каждая ячейка массива 1С содержит не значение, а тоже массив 1С.

Многомерный массив 1С не обязательно должен быть фиксированным. Сделаем многомерный массив 1С 2х2 без указания фиксированного количества значений:

Создание массива 1С с нуля

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

Например – строка версии программы выглядит следующим образом «11.0.9.5» — четыре числа, разделенные точками. Мы можем перевести версию в «компьютерный» формат – массив из четырех числовых значений. Тогда далее мы можем сравнивать версии друг с другом:

Получение готового массива 1С с данными

Массив 1С можно получить из списка значений с помощью метода спСписок.ВыгрузитьЗначения() и из таблицы значений с помощью метода тТаблица.ВыгрузитьКолонку().

В примере ниже мы делаем запрос – выбираем все ссылки документов из базы данных.

  • РезультатЗапроса = Запрос.Выполнить() //выполняет запрос
  • тзРезультат = РезультатЗапроса.Выгрузить() //выгружает результат в таблицу значений
  • мМассивСсылок = тзРезультат.ВыгрузитьКолонку("ИмяКолонки") //выгружает колонку таблицы в массив

Получение массива 1С из других объектов и использование в качестве отбора в запросе

Когда на форме расположен список документов (или таблица значений) – пользователь может выделить курсором одну строку. Также можно разрешить выделять несколько строк одновременно. Чтобы выделить несколько строк (если не форме это разрешено) нужно зажать клавишу CTRL или SHIFT.

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

Мы можем программно получить список выделенных строк:

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

Обращение к массиву 1С выделенных строк будет выглядеть как:
Элементы.ИмяРеквизитаФормы. ВыделенныеСтроки


Close