- Поиск в коллекциях значений
- Таблица значений в 1С 8.3
- Создание таблицы значений
- Типы колонок таблицы значений
- Работа с колонками таблицы значений
- Изменение значений в существующих строках
- Перебор строк таблицы значений
- Удаление строк
- Примеры программирования с таблицей значений в системе 1С:Предприятие 8
- Отбор по типу значения в таблице значений
- Как в цикле отобрать только одну строку из таблицы значений?
- Как проверить наличие колонки в строке таблицы значений?
- Поиск в таблице значений по двум и более полям
- Почему возникает ошибка «Тип не может быть выбран в запросе» при выполнении запроса к таблице значений?
- Как получить номер строки таблицы значений?
- Как правильно удалить строки из ТаблицыЗначений в 1С8?
- Помогите найти колонку табличного поля по ее имени.
- ТаблицаЗначений и Колонки
Поиск в коллекциях значений
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. При двух и более операциях поиска в объекте ТаблицаЗначений с большим количеством строк (*) рекомендуется:
- Индексировать колонки, по которым выполняется поиск;
- Но только те из них, которые обладают хорошей селективностью (т.е. каждому значению этой колонки должно соответствовать небольшое количество строк). В противном случае, индексирование не даст эффекта, либо он будет отрицательным (потрачено лишнее время на индексирование).
* Примечание: следует ориентироваться на 1000 строк и более, а также учитывать не только размер таблицы, в которой выполняется поиск, но и сколько раз он выполняется. Например, даже если таблица относительно небольшая в 100 строк, но поиск по ней выполняется 100 раз, ее тоже имеет смысл индексировать. В то же время, нет смысла индексировать таблицу из-за только одной единственной операции поиска.
2. Для поиска значений предусмотрены два метода объекта ТаблицаЗначений :
При поиске значения в одной колонке таблицы значений оба метода одинаково эффективно используют индекс, если он был задан (см. п.1).
Однако при поиске значения сразу по нескольким (или по всем) колонкам необходимо учитывать следующие ограничения.
2.1. Не следует использовать метод Найти для поиска по нескольким колонкам в таблицах значений с большим количеством строк, даже если проиндексированы все колонки, обладающие хорошей селективностью. Это ограничение вызвано тем, что метод Найти выполняет поиск с применением индекса только по одному полю.
Например:
ТЗ.Индексы.Добавить(«Колонка1»);
ТЗ.Индексы.Добавить(«Колонка2»);
. = ТЗ.Найти(«найдется все», «Колонка1, Колонка2»); // Индекс НЕ используется!
В этом примере, несмотря на наличие индекса для колонок Колонка1 и Колонка2 , поиск все равно будет выполняться перебором всех строк в таблице значений (что очень ресурсоемко на больших объемах данных).
2.2. При использовании метода НайтиСтроки в таблицах значений с большим количеством строк следует обеспечить, чтобы список полей индекса был точно таким же, как он задан в структуре поиска (порядок полей не важен). В противном случае, индекс не будет задействован, и поиск будет выполняться перебором всех строк в таблице значений (что очень ресурсоемко на больших объемах данных).
Например:
ТЗ.Индексы.Добавить(«Колонка1»); // Индекс1
ТЗ.Индексы.Добавить(«Колонка2»); // Индекс2
. = ТЗ.НайтиСтроки(Новый Структура(«Колонка1, Колонка2 «, «Ищу1″,»Ищу2»)); // Индекс НЕ используется!
. = ТЗ.НайтиСтроки(Новый Структура(«Колонка1», «Ищу1») ); // OK — используется Индекс1
. = ТЗ.НайтиСтроки(Новый Структура(«Колонка2», «Ищу2») ); // OK — используется Индекс2
. = ТЗ.НайтиСтроки(Новый Структура(«Колонка1, Колонка2», «Ищу1″,»Ищу2»)); // OK — индекс используется
. = ТЗ.НайтиСтроки(Новый Структура(«Колонка2, Колонка1», «Ищу2″,»Ищу1»)); // OK — индекс используется
. = ТЗ.НайтиСтроки(Новый Структура(«Колонка1», «Ищу1») ); // Индекс НЕ используется!
. = ТЗ.НайтиСтроки(Новый Структура(«Колонка2», «Ищу2») ); // Индекс НЕ используется!
2.3. Аналогичное ограничение действует и для метода Скопировать таблицы значений при вызове с параметром ПараметрыОтбора ( Структура ).
3. В тех случаях, когда для таблицы значений применяется сортировка по колонкам, содержащим ссылочные значения, необходимо учитывать, что при этом для каждой из этих колонок для всех строк таблицы значений системой будет выполнено обращение к информационной базе за представлением этой ссылки.
- В тех случаях, когда требуется сортировка по наименованию – сразу, на этапе заполнения, добавлять в таблицу дополнительные колонки с представлениями, и сортировку выполнять уже по ним. Если, конечно, это не вызовет аналогичных многократных обращений к информационной базе;
- В остальных случаях – сортировать «по ссылке», а не по представлению. Для этого в методе Сортировать следует использовать объект СравнениеЗначений :
ОбъектСравнения = Новый СравнениеЗначений;
ТаблицаДокументов.Сортировать(«Дата,Ссылка», ОбъектСравнения);
Особенно это важно для таблиц с большим количеством (несколько сотен и тысяч) строк, в алгоритмах критических ко времени исполнения.
3.1. При поиске в объекте Массив с большим количеством элементов(*) следует отказаться от массива в пользу:
- объекта Соответствие , если не важен порядок элементов;
- индексированной ТаблицаЗначений , если порядок элементов значим.
Это обусловлено тем, что в указанных случаях поиск занимает в большинстве случаев константное время, а в массиве поиск выполняется перебором и поэтому пропорционален количеству элементов.
* Примечание: следует ориентироваться на 1000 элементов и более, а также учитывать не только размер массива, но и сколько раз выполняется поиск. Например, если поиск выполняется многократно, в частности, в цикле, то эта рекомендация также действительна для массивов меньшего размера (до 1000 элементов). Особого внимания требуют универсальные механизмы, которые могут применяться на сколь угодно больших объемах данных.
3.2. При необходимости обеспечить уникальность элементов в большом массиве следует однократно в конце алгоритма вызвать функцию СвернутьМассив или процедуру ДополнитьМассив с параметром ТолькоУникальныеЗначения = Истина (модуль ОбщегоНазначения Библиотеки стандартных подсистем).
4. Аналогичный недостаток существует и у объекта ДеревоЗначений , в котором не предусмотрено индексов и поиск выполняется перебором (как в массиве). В указанных выше случаях объект ДеревоЗначений следует заменять индексированным объектом ТаблицаЗначений .
Источник
Таблица значений в 1С 8.3
Таблица значений — это универсальная коллекция 1С, которая предназначена для хранения данных в табличном виде. Таблица значений хранит ссылки на объекты СтрокаТаблицыЗначений. Помимо строк у таблицы есть колонки. Таблицу значений нельзя создать на клиенте и нельзя передавать между клиентом и сервером.
Создание таблицы значений
Для создания таблицы значений используются конструктор:
В данной таблице не будет ни одной колонки и добавление в нее строк бессмысленно. Для добавления колонок нужно использовать свойство Колонки таблицы значений:
Теперь в таблицу можно добавить несколько строк. Добавление строк выполняется методом Добавить. Данный метод вернет строку таблицу значений. К именам колонок таблицы значений можно обращаться как к свойствам строки:
Типы колонок таблицы значений
В таблицу было добавлено 2 колонки. Тип не был определен и поэтому в эту колонку можно поместить любой тип данных, тип будет определяться в зависимости от типа данных значения в колонке. В примере выше тип колонки Товар — строка, а колонки Цена — число. Если добавить еще одну строку с другим типом, то тип колонки станет составным:
Тип можно указать при добавлении новой колонки, тогда в нее можно будет помещать значения только данного типа, для всех остальных значений будет выполняться преобразование типа:
Работа с колонками таблицы значений
Для проверки наличия необходимой колонки в таблице можно выполнить поиск в коллекции колонок. Если такой колонки нет, то метод Найти вернет Неопределено:
Колонку можно переименовать. При этом, значения в данной колонке сохранятся. Изменить тип колонки нельзя.
Колонки можно удалять, соответственно будут удалены и все значения в данной колонке:
Изменение значений в существующих строках
К строкам таблицы значений можно обращаться через оператор индексации [ ]. Индексация строк начинается с нуля, чтобы изменить значение в первой строке нужно использовать индекс 0:
Перебор строк таблицы значений
Перебрать все строки таблицы значений можно с помощью циклов Для Каждого и Для. При необходимости на каждой итерации цикла можно изменить значения колонок строки.
Удаление строк
Удалить строку из таблицы можно методом Удалить. Параметром можно передать индекс строки или саму строку. Для удаления всех строк таблицы можно воспользоваться методом Очистить.
Иногда нужно удалить несколько строк из таблицы по условию. Например, все строки, где цена меньше 100. На первый взгляд это можно сделать так:
Однако после удаления линейка осталась в таблице, хотя ее цена равна 80. Почему так произошло? При удалении строки, таблица как бы сжимается. То есть на первой итерации цикла мы получили первую строку с диваном, его цена больше 100, поэтому строка осталась. Получаем вторую строку с ручкой за 50. Так как цена меньше 100, строка была удалена. И после удаления все строки сдвинулись, третья строка переместилась на вторую позицию, четвертая на третью и т.д. На следующей итерации мы получаем третью строку, а там уже кресло за 2000. Линейка была пропущена, цикл даже не проверял ее цену.
Поэтому правильно удалять строки с конца таблицы. При удалении строки цикл может несколько раз пройти по одной строке, но точно не пропустит ни одну строку:
Источник
Примеры программирования с таблицей значений в системе 1С:Предприятие 8
Доброго времени суток, уважаемые читатели! На этом сайте уже были описаны примеры работы с таблицей значений. Например, было написано как объединить две таблицы значений. Сегодня я поделюсь ещё некоторыми примерами программирования с таблицей значений в системе 1С:Предприятие 8.
Отбор по типу значения в таблице значений
Иногда нужно выбрать строки из таблицы значений по типу значения колонки или поля. То есть, если в таблице существует колонка «Субконто», в котором хранятся значения любого типа, например типа «СправочникСсылка.Номенклатура» и «СправочникСсылка.ОсновныеСредства». Но нам нужны только те строки, в которых типом значения колонки «Субконто» является тип «СправочникСсылка.ОсновныеСредства». Следующий пример покажет, как нам это осуществить:
В результате получим строки из таблицы значений с типом значения «ОсновныеСредства» колонки «Субконто»:
Как в цикле отобрать только одну строку из таблицы значений?
Часто бывает, что нужно пройтись по строкам таблицы значений в которой встречаются строки, например, с одинаковым значением номенклатуры. И при всём этом, например, в середине цикла нужно пропускать строки таблицы значений с одинаковой номенклатурой. Чтобы это получилось можно воспользоваться списком значений.
Как проверить наличие колонки в строке таблицы значений?
Самый простой вариант сделать это — использовать конструкцию «Попытка Исключение», например, попытаться получить значение в строке в указанной колонке и если возникнет исключение, то это значит, что колонки нет. Можно написать следующую функцию:
Однако использование конструкции «Попытка Исключение» не является хорошим тоном в программировании на 1С
(это вызывает трудности отладки и крушение внутри транзакций). Поэтому предлагаю другой путь:
В нашем примере переменная «СтрокаТЗ» является объектом типа «СтрокаТаблицыЗначений», у которого есть метод «Владелец()». Владельцем строки является «ТаблицаЗначений», которая имеет свойство «Колонки» с типом «КоллекцияКолонокТаблицыЗначений». Таким образом мы получаем объект типа «КоллекцияКолонокТаблицыЗначений», который содержит метод «Найти()». С помощью этого метода мы можем найти колонки таблицы значений по имени. Если указанная колонка есть, то возвращается колонка с типом «КолонкаТаблицыЗначений», но если отсутствует, то возвращается значение «Неопределено». Поэтому в нашем случае будет выведено следующее сообщение:
Поиск в таблице значений по двум и более полям
Рассмотрим первый способ — через объекты встроенного языка системы 1С:Предприятие:
В результате по первому способу, через объекты встроенного языка, получим:
Рассмотрим второй способ — через пакетные запросы системы 1С:Предприятие. Здесь воспользуемся таблицой значений, которую мы создали ранее, в первом способе:
В результате по второму способу, через запросы, получим:
Оба способа помогут нам найти строки в таблице значений по двум полям. Но как вы уже догадались можно добавить поиск по трём, четырём и более полям.
Почему возникает ошибка «Тип не может быть выбран в запросе» при выполнении запроса к таблице значений?
Если не задать тип значения колонки при её создании как описано в подзаголовке Поиск в таблице значений по двум и более полям, а написать так:
То тогда при выполнении запроса будет выведена ошибка:
Поэтому, чтобы избежать этой ошибки нужно писать так:
Как получить номер строки таблицы значений?
Нужно использовать метод таблицы значений «Индекс» (IndexOf), которая получает индекс строки в коллекции строк таблицы значений:
Как правильно удалить строки из ТаблицыЗначений в 1С8?
Предположим, нужно удалить все строки из таблицы значений, которые содержат букву «G» во второй колонке.
Подобная процедура для правильного удаления строк текстового файла описана здесь.
Источник
Помогите найти колонку табличного поля по ее имени.
Заполнил колонки ТП реквизитами документа, теперь перебираю метаданные.реквизиты этого документа и хочу заполнить эти колонки строками с данными из документа. не могу сообразить как найти нужную колонку которая бы соответствовала текущему реквизиту документа.
Процедура Документ()
Выборка= БазаИсточник.Документы.РеализацияТоваровУслуг.Выбрать(ДатаНач,ДатаКон);
МедаданОле= БазаИсточник.Метаданные.Документы.РеализацияТоваровУслуг;
ТабОбщая = Новый ТаблицаЗначений;
ТабОбщаяТЧ = Новый ТаблицаЗначений;
метадан = Метаданные.Документы.РеализацияТоваровУслуг;
// вывести реквизиты
Для Каждого РеквДок из метадан.Реквизиты Цикл
ТабОбщая.Колонки.Добавить(РеквДок.Имя, Новый ОписаниеТипов(«Строка»));
КонецЦикла;
// вывести ТЧ
Для Каждого РеквДокТЧ из метадан.ТабличныеЧасти Цикл
ТабОбщаяТЧ.Колонки.Добавить(РеквДокТЧ.Имя, Новый ОписаниеТипов(«Строка»));
КонецЦикла;
Пока Выборка.Следующий() Цикл
Для Каждого РеквДок из МедаданОле.Реквизиты Цикл
//ТУТ ЗАПУТАЛСЯ+++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++
ТекКолонка = ТабОбщая.Колонки.Найти(РеквДок);
НоваяСтрока = ТабОбщая.Добавить();
НоваяСтрока.ТекущаяКолонка = Выборка.РеквДок;
//ТУТ ЗАПУТАЛСЯ+++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++
КонецЦикла;
КонецЦикла;
ТпДоки = ТабОбщая;
ТпДокиТЧ = ТабОбщаяТЧ;
ЭлементыФормы.ТпДоки.СоздатьКолонки();
ЭлементыФормы.ТпДокиТЧ.СоздатьКолонки();
Источник
ТаблицаЗначений и Колонки
Подскажите пожалуйста, почему если у меня на форме есть ТЗ , и я хочу получить количество колонок программно, то это не срабатывает, хотя остальные методы работы с ТЗ вроде как работают 🙂
вот эта строчка не срабатывает:
Кол = ТрудозатратыСотрудника.Колонки.Количество();
а вот эти прекрасно работают :
Для Каждого СтрокаТЗ Из ТрудозатратыСотрудника Цикл
ЧтоЭто=СтрокаТЗ.ТипРабот;
Сообщить(Строка(СтрокаТЗ.ТипРабот));
КонецЦикла;
Так сработает, если на форме табличное поле с типом значения ТаблицаЗначений
Таблица заполняется в модуле формы:
(12)
У вас на форме есть два одноимённых объекта «ТрудозатратыСотрудника»
Первый объект формы — это реквизит формы типа «ДанныеФормыКоллекция». Его назначение — хранить данные. К нему обращаются так: ЭтаФорма.ТрудозатратыСотрудника или просто ТрудозатратыСотрудника. Для этого типа нет возможности обратиться к колонкам. Возможно, это сделано потому, что это универсальный тип, который не обязательно относится к таблице (т.е. колонок может и не быть). Можно использовать функцию ДанныеФормыВЗначение, чтобы из этого объекта получить объект типа ТаблицаЗначений — у такого объекта уже есть возможность обращаться к колонкам.
Второй объект формы — это элемент формы типа «ТаблицаФормы». Его назначение — отображать данные. К нему обращаются так: Элементы.ТрудозатратыСотрудника. У него есть свойство «ПодчиненныеЭлементы», которое содержит коллекцию колонок и групп колонок для отображения на форме.
Источник