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