Возвращает индекс строки таблицы значений
Синтаксис
Метод Индекс()
имеет следующий синтаксис:
Число Индекс(СтрокаТаблицыЗначений)
А также альтернативный англоязычный синтаксис:
number IndexOf(ValueTableString)
Параметры
Описание параметров метода Индекс()
:
Имя параметра* | Тип | Описание |
---|---|---|
Строка | СтрокаТаблицыЗначений | Строка таблицы значений, для которой нужно определить индекс. |
*Жирным шрифтом выделены обязательные параметры |
Возвращаемое значение
Число
— Индекс указанной строки таблицы значений.
Описание
Метод Индекс()
возвращает индекс указанной строки в коллекции строк таблицы значений. Если строка не найдена, возвращается -1.
Доступность
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Пример использования
Пример кода с использованием метода Индекс()
:
//создаем таблицу товаров тз = Новый ТаблицаЗначений; тз.Колонки.Добавить("НомерСтроки"); тз.Колонки.Добавить("Код"); тз.Колонки.Добавить("Наименование"); тз.Колонки.Добавить("Тип"); //добавляем товары и услуги НоваяСтрока = тз.Добавить(); НоваяСтрока.Код = "001"; НоваяСтрока.Наименование = "Стул деревянный"; НоваяСтрока.Тип = "Товар"; НоваяСтрока = тз.Добавить(); НоваяСтрока.Код = "002"; НоваяСтрока.Наименование = "Стол деревянный"; НоваяСтрока.Тип = "Товар"; НоваяСтрока = тз.Добавить(); НоваяСтрока.Код = "101"; НоваяСтрока.Наименование = "Сборка стола"; НоваяСтрока.Тип = "Услуга"; //пронумеруем строки Для Каждого СтрокаТЗ Из тз Цикл СтрокаТЗ.НомерСтроки = тз.Индекс(СтрокаТЗ) + 1; КонецЦикла;
Читайте также:
- ТаблицаЗначений.Получить()
- ТаблицаЗначений.Удалить()
Поделиться страницей в соц.сетях
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
&НаСервере Процедура ВыполнитьКодНаСервере() /// Как создать таблицу значений в 1с 8.3, 8.2 // с таблицей значений можно работать только на сервере Таб = Новый ТаблицаЗначений; /// Как добавить колонки в таблицу значений в 1с 8.3, 8.2 Таб.Колонки.Добавить("Фрукт"); Таб.Колонки.Добавить("Цвет"); Таб.Колонки.Добавить("Вкус"); /// Как добавить строки в таблицу значений в 1с 8.3, 8.2 Стр = Таб.Добавить(); Стр.Фрукт = "Яблоко"; Стр.Цвет = "Зелёный"; Стр.Вкус = "Кислый"; Стр = Таб.Добавить(); Стр.Фрукт = "Банан"; Стр.Цвет = "Желтый"; Стр.Вкус = "Сладкий"; Стр = Таб.Добавить(); Стр.Фрукт = "Слива"; Стр.Цвет = "Синий"; Стр.Вкус = "Терпкий"; /// Как добавить в таблицу значений колонку с /// описанием типа и заголовка в 1с 8.3, 8.2 ОписаниеВеса = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(12, 3)); Таб.Колонки.Добавить("ВесФрукта", ОписаниеВеса, "Вес фрукта"); Таб[0].ВесФрукта = 100.005; Таб[1].ВесФрукта = 60.010; Таб[2].ВесФрукта = 25.000; /// Как перечислить все строки в таблице значений в 1с 8.3, 8.2 Для Каждого Стр Из Таб Цикл Сообщить(Стр.Фрукт + " " + Стр.Цвет + " " + Стр.Вкус + " " + Стр.ВесФрукта); КонецЦикла; /// Как перечислить все колонки в таблице значений /// в 1с 8.3, 8.2 Для Каждого Колонка Из Таб.Колонки Цикл Сообщить(Колонка.Имя); КонецЦикла; /// Как выгрузить колонку таблицы значений в массив в 1с 8.3, 8.2 // выгрузка названий фруктов в массив МассивФруктов = Таб.ВыгрузитьКолонку("Фрукт"); // ничего не измениться, так как массив не менялся Таб.ЗагрузитьКолонку(МассивФруктов, "Фрукт"); /// Как заполнить значения в колонке для всех строк таблицы /// значений в 1с 8.3, 8.2 // обнулим вес во всех строках Таб.ЗаполнитьЗначения(0, "ВесФрукта"); // выставим новые веса Таб[0].ВесФрукта = 100; Таб[1].ВесФрукта = 60; Таб[2].ВесФрукта = 25; /// Как в таблице значений посчитать итог по колонке в 1с 8.3, 8.2 Сообщить(Таб.Итог("ВесФрукта")); // 185 /// Как найти строку в таблице значений по значению в 1с 8.3, 8.2 // найдём строчку с яблоком и покажем его цвет НайденнаяСтрока = Таб.Найти( "Яблоко" ); Если НайденнаяСтрока <> Неопределено Тогда Сообщить(НайденнаяСтрока.Цвет); // Зелёный КонецЕсли; /// Как найти строку в таблице значений поиском значения /// в определенных колонках в 1с 8.3, 8.2 // будем искать по слову "Кислый" в колонках вкус и цвет НайденнаяСтрока = Таб.Найти("Кислый", "Вкус, Цвет"); Если НайденнаяСтрока <> Неопределено Тогда Сообщить(НайденнаяСтрока.Фрукт); // Яблоко КонецЕсли; // добавим ещё один зелёный фрукт Стр = Таб.Добавить(); Стр.Фрукт = "Киви"; Стр.Цвет = "Зелёный"; Стр.Вкус = "Сладкий"; Стр.ВесФрукта = 30; /// Как искать в таблице значений неуникальные значения /// в 1с 8.3, 8.2 Отбор = Новый Структура; Отбор.Вставить("Цвет", "Зелёный"); Строки = Таб.НайтиСтроки(Отбор); Для Каждого Стр Из Строки Цикл Сообщить(Стр.Фрукт); // Яблоко Киви КонецЦикла; /// Как сдвинуть строку таблицы значений в 1с 8.3, 8.2 // сдвигаем первую строку на одну позицию вперёд Таб.Сдвинуть(0, 1); // и возвращаем обратно Таб.Сдвинуть(1, -1); /// Как создать копию таблицы значений в 1с 8.3, 8.2 // полная копия КопияТаб = Таб.Скопировать(); /// Как создать копию таблицы значений по нужным колонкам /// в 1с 8.3, 8.2 // только две колонки будет Фрукт и Цвет КопияТаб = Таб.СкопироватьКолонки("Фрукт, Цвет"); /// Как создать копию таблицы значений по отбору в 1с 8.3, 8.2 Отбор = Новый Структура; Отбор.Вставить("Фрукт", "Яблоко"); // таблица будет содержать только строчку с яблоком КопияТаб = Таб.Скопировать(Отбор); // таблица будет содержать цвет и вес яблока КопияТаб = Таб.Скопировать(Отбор, "Цвет, ВесФрукта"); /// Как свернуть таблицу значений по колонке в 1с 8.3, 8.2 // свернём по вкусу, просуммируем по весу Таб.Свернуть("Вкус", "ВесФрукта"); /// Как отсортировать таблицу значений по колонке в 1с 8.3, 8.2 Таб.Сортировать("ВесФрукта Возр"); /// Как отсортировать таблицу значений по нескольким колонкам /// в 1с 8.3, 8.2 Таб.Сортировать("ВесФрукта Возр, Вкус Убыв"); /// Как удалить строку из таблицы значений в 1с 8.3, 8.2 // по индексу или по значению Таб.Удалить(0); КонецПроцедуры /// Как программно вывести таблицу значений на /// форму в 1с 8.3, 8.2 // см. примеры использования этой функции ниже // ТабВКоде - таблица значений, созданная программно // ТабРеквизит - имя реквизита формы типа ТаблицаЗначений // ТабНаФорме - имя элемента формы, связанного с ТабРеквизит &НаСервере Процедура ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде, ТабРеквизит, ТабНаФорме) // реквизит ТабРеквизит и соответствующий // ему элемент формы ТабНаФорме уже созданы // нами в визуальном режиме // 1. добавляем колонки из ТабВкоде в реквизит ТабРеквизит НовыеРеквизиты = Новый Массив; Для Каждого Колонка Из ТабВКоде.Колонки Цикл НовыеРеквизиты.Добавить( Новый РеквизитФормы( Колонка.Имя, Колонка.ТипЗначения, ТабРеквизит ) ); КонецЦикла; ИзменитьРеквизиты(НовыеРеквизиты); // 2. добавляем колонки из ТабВКоде в элемент ТабНаФорме Для Каждого Колонка Из ТабВКоде.Колонки Цикл НовыйЭлемент = Элементы.Добавить( ТабРеквизит + "_" + Колонка.Имя, Тип("ПолеФормы"), Элементы[ТабНаФорме] ); НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.ПутьКДанным = ТабРеквизит + "." + Колонка.Имя; КонецЦикла; // 3. наконец, передаём данные из ТабВКоде в ТабРеквизит ЗначениеВРеквизитФормы(ТабВКоде, ТабРеквизит); // готово! КонецПроцедуры &НаСервере Процедура СоздатьТаблицуНаФормеНаСервере() // программно создаём таблицу значений ТабВКоде ТабВКоде = Новый ТаблицаЗначений; ОписаниеСтроки = Новый ОписаниеТипов("Строка"); ОписаниеВеса = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(12, 3)); ТабВКоде.Колонки.Добавить("Фрукт", ОписаниеСтроки, "Имя фрукта"); ТабВКоде.Колонки.Добавить("Цвет", ОписаниеСтроки, "Цвет фрукта"); ТабВКоде.Колонки.Добавить("Вес", ОписаниеВеса, "Вес фрукта"); Стр = ТабВКоде.Добавить(); Стр.Фрукт = "Яблоко"; Стр.Цвет = "Зелёный"; Стр.Вес = 200; Стр = ТабВКоде.Добавить(); Стр.Фрукт = "Банан"; Стр.Цвет = "Желтый"; Стр.Вес = 150; ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде, "ТабРеквизит1", "ТабНаФорме1"); КонецПроцедуры /// Как программно вывести на форму результат запроса /// в виде таблицы значений в 1с 8.3, 8.2 &НаСервере Процедура ВывестиНаФормуРезультатЗапросаНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Товары.Ссылка, | Товары.ВерсияДанных, | Товары.ПометкаУдаления, | Товары.Код, | Товары.Наименование, | Товары.Цвет, | Товары.ЕдиницаИзмерений, | Товары.Предопределенный, | Товары.ИмяПредопределенныхДанных |ИЗ | Справочник.Товары КАК Товары"; РезультатЗапроса = Запрос.Выполнить(); ТабВКоде = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.Прямой); // функция ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме определена выше ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде, "ТабРеквизит2", "ТабНаФорме2"); КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере
Любая таблица значений состоит из колонок, каждая из которых имеет свой тип и уникальное название, а также из строк. Если таблица значений размещена на управляемой форме в виде элемента Таблица, то колонки создаются изначально на этапе разработки, а строки пользователь может создать самостоятельно, нажав на кнопку «Добавить» в командной панели этой таблицы.
Также пользователь может удалять строки или перемещать. Но, гораздо интереснее программная работа со строками таблицы значений.
В платформе 1С 8.2 — 8.3 разработчик имеет возможность добавлять строки таблицы значений непосредственно с помощью языка разработки, работая в конфигураторе 1С.
Для того чтобы создать новую строку таблицы значений, используется метод Добавить, данный метод не имеет параметров и является функцией.
Новая строка таблицы значений создается следующим образом:
НоваяСтрока = ФИО.Добавить();
Как видите, с помощью метода Добавить мы создали переменную НоваяСтрока, тип значения которой Строка таблицы значений. Но, просто создать строку мало, нам еще необходимо записать в нее определенные данные. Как получить доступ к колонкам данной строки?
Осуществить это можно двумя способами:
Первый способ:
НоваяСтрока.Фамилия = «Иванов»;
Второй способ:
НоваяСтрока[1] = «Иван»;
В первом способе мы получаем доступ к колонке как к свойству через точку, во втором — используя оператор квадратные скобки и указывая в них номер индекса колонки. Я предпочитаю первый способ, так как он делает код гораздо лучше читаемым и наглядным.
Допустим, у нас есть некоторая таблица значений ФИО с колонками Фамилия, Имя, Отчество, ФИО и ДатаРождения, то добавить новую строку этой таблицы и заполнить колонки этой строки можно следующим образом.
НоваяСтрока = ФИО.Добавить();
НоваяСтрока.Фамилия = «Иванов»;
НоваяСтрока[1] = «Иван»;
НоваяСтрока.Отчество = «Петрович»;
НоваяСтрока.ДатаРождения = ‘19800209’;
НоваяСтрока.ФИО = НоваяСтрока.Фамилия +» » +
Лев(НоваяСтрока.Имя,1) +«.» +
Лев(НоваяСтрока.Отчество,1) + «.»;
С помощью метода Добавить мы создаем строку, которая вставляется в конец таблицы значений. Для того чтобы поместить строку в нужное место таблицы значений, необходимо использовать метод Вставить. Параметром данного метода является индекс, на который вставляется данная строка.
Добавим с помощью этого метода еще одну строку в таблицу ФИО. И поставим ее на первое место.
НоваяСтрока = ФИО.Вставить(0);
НоваяСтрока.Фамилия = «Петров»;
НоваяСтрока.Имя = «Игорь»;
НоваяСтрока.Отчество = «Андреевич»;
НоваяСтрока.ФИО = НоваяСтрока.Фамилия +» » + Лев(НоваяСтрока.Имя,1) +«.» + Лев(НоваяСтрока.Отчество,1) + «.»;
НоваяСтрока.ДатаРождения = ‘19850909’;
Программный обход строк таблицы значений в 1С
Узнаем как обходить сроки таблицы. Это можно осуществлять с помощью операторов цикла Для каждого…Цикл и Для…Цикл.
Оператор цикла Для каждого…Цикл.
Для Каждого Стр из ФИО цикл
Сообщить(Стр.ФИО + «, дата рождения » +
Формат(Стр.ДатаРождения,«ДЛФ = ДД»));
КонецЦикла;
С помощью этого оператора мы обходим все строки таблицы значений. Переменная Стр принимает значения каждой строки таблицы в порядке обхода. Тип данной переменной — Строка таблицы значений, поэтому мы можем спокойно обращаться к колонкам данной строки, используя точку или квадратные скобки.
Оператор цикла Для…Цикл.
Для н = 0 по ФИО.Количество() — 1 цикл
Сообщить(ФИО[н].ФИО + «, дата рождения » +
Формат(ФИО[н].ДатаРождения,«ДЛФ = ДД»));
КонецЦикла;
В этом цикле нам необходимо получить индексы всех строк, для этого мы осуществляем обход, начиная с нуля и заканчивая значением, которое возвращает метод Количество за минусом единицы.
Когда мы используем квадратные скобки применительно к таблице значений (например, ФИО[н]), то результатом данной операции является строка таблицы с соответствующим индексом.
Индекс строки таблицы значений
Каждая строка имеет свой уникальный индекс. Все индексы идут по порядку и начинаются с 0. Для того, чтобы узнать индекс нужно строки необходимо применить метод Индекс таблицы значений, где в качестве параметра указать нужную строк.
Для Каждого Стр из ФИО цикл
Сообщить(Стр.ФИО + «, дата рождения » +
Формат(Стр.ДатаРождения,«ДЛФ = ДД»));
Инд = ФИО.Индекс(Стр)
КонецЦикла;
В этом коде в переменную Инд будет записываться индекс строки при каждой итерации цикла.
Программное удаление строк таблицы значений
Для программного удаление определенной строки таблицы значений нужно использовать метод Удалить этой таблицы. В качестве параметра указывается или индекс нужной строки или сама строка.
ФИО.Удалить(0)
У новичков основные сложности возникают, когда нужно удалить несколько строк из таблицы значений. Если делать обход таблицы значений циклом, то данное удаление пройдет не совсем корректно. Я в этом случае поступаю так: сохраняю нужные строки в массиве, а потом обхожу этот массив циклом и уже в нем их все удаляю. Получается примерно так:
МассивДляУдаления = Новый Массив;
Для Каждого Стр из ФИО цикл
Если тогда //какое-то условие
МассивДляУдаления.Добавить(Стр);
КонецЕсли
КонецЦикла;
Для Каждого СтрМассива из МассивДляУдаления Цикл
ФИО.Удалить(стрМассива)
КонецЦикла
Таблица значений 1С: работа с колонками
Таблица значений 1С
Более подробно о работе с таблицами значений и другими интересными объектами языка программирования в 1С читайте в моей книге «Программировать в 1С за 11 шагов»
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Вступайте в мои группы:
Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Здания»);
ТЗ.Колонки.Добавить(«Сооружения»);
ТЗ.Колонки.Добавить(«Машины»);
ТЗ.Колонки.Добавить(«Оффис»);
ТЗ.Колонки.Добавить(«Транспорт»);
ТЗ.Колонки.Добавить(«Произв»);
ТЗ.Колонки.Добавить(«Другие»);
С = ТЗ.Добавить();
с.Здания = зв;
с.Сооружения = св;
с.Машины = мв;
с.оффис = ов;
с.транспорт = тв;
с.произв = пв;
с.Другие = дв;
С = ТЗ.Добавить();
с.Здания = зс;
с.Сооружения = сс;
с.Машины = мс;
с.оффис = ос;
с.транспорт = тс;
с.произв = пс;
с.Другие = дс;
С = ТЗ.Добавить();
с.Здания = зо;
с.Сооружения = со;
с.Машины = мо;
с.оффис = оо;
с.транспорт = то;
с.произв = по_;
с.Другие = до;
ТЗ = ТЗ;
хз = 12;
зд = ТЗ.Найти( хз, «Здания , Сооружения , Машины , Оффис , Транспорт , Произв , Другие»);
как по Тз.Найти(….) получить индекс найденной строки?
Доброго времени суток, уважаемые читатели! На этом сайте уже были описаны примеры работы с таблицей значений. Например, было написано как объединить две таблицы значений. Сегодня я поделюсь ещё некоторыми примерами программирования с таблицей значений в системе 1С:Предприятие 8.
- Отбор по типу значения в таблице значений
- Как в цикле отобрать только одну строку из таблицы значений?
- Как проверить наличие колонки в строке таблицы значений?
- Поиск в таблице значений по двум и более полям
- Почему возникает ошибка «Тип не может быть выбран в запросе» при выполнении запроса к таблице значений?
- Как получить номер строки таблицы значений?
- Как правильно удалить строки из ТаблицыЗначений в 1С8?
Отбор по типу значения в таблице значений
Иногда нужно выбрать строки из таблицы значений по типу значения колонки или поля. То есть, если в таблице существует колонка «Субконто», в котором хранятся значения любого типа, например типа «СправочникСсылка.Номенклатура» и «СправочникСсылка.ОсновныеСредства». Но нам нужны только те строки, в которых типом значения колонки «Субконто» является тип «СправочникСсылка.ОсновныеСредства». Следующий пример покажет, как нам это осуществить:
ТаблицаЗначений = Новый ТаблицаЗначений; // Создаём нужные колонки. ТаблицаЗначений.Колонки.Добавить("НомерСтроки"); ТаблицаЗначений.Колонки.Добавить("Субконто"); // Строка № 1. НоваяСтрока = ТаблицаЗначений.Добавить(); НоваяСтрока.НомерСтроки = "1"; НоваяСтрока.Субконто = Справочники.Номенклатура.НайтиПоКоду("1"); // Строка № 2. НоваяСтрока = ТаблицаЗначений.Добавить(); НоваяСтрока["НомерСтроки"] = 2; НоваяСтрока["Субконто"] = Справочники.ОсновныеСредства.НайтиПоКоду("1"); // Строка № 3. НоваяСтрока = ТаблицаЗначений.Добавить(); НоваяСтрока["НомерСтроки"] = 3; НоваяСтрока["Субконто"] = Справочники.ОсновныеСредства.НайтиПоКоду("2"); МассивСтрок = Новый Массив; // Добавим в массив только те строки, в которых типом значения // колонки «Субконто» является тип «СправочникСсылка.ОсновныеСредства» Для каждого СтрокаТЗ ИЗ ТаблицаЗначений Цикл Если СтрокаТЗ.Субконто.Метаданные().Имя = "ОсновныеСредства" Тогда МассивСтрок.Добавить(СтрокаТЗ); КонецЕсли; КонецЦикла; // Теперь создадим таблицу значению по отбору из массива ТаблицаОС = ТаблицаЗначений.Скопировать(МассивСтрок, "НомерСтроки,Субконто"); // Выведем результат в окно служебных сообщений Для каждого СтрокаТЗ ИЗ ТаблицаОС Цикл Сообщить("НомерСтроки - " + СтрокаТЗ.НомерСтроки + "; Субконто - " + СтрокаТЗ.Субконто);
В результате получим строки из таблицы значений с типом значения «ОсновныеСредства» колонки «Субконто»:
НомерСтроки - 2; Субконто - Насосы К50-32-125 НомерСтроки - 3; Субконто - Насосы К65-50-160
Как в цикле отобрать только одну строку из таблицы значений?
Часто бывает, что нужно пройтись по строкам таблицы значений в которой встречаются строки, например, с одинаковым значением номенклатуры. И при всём этом, например, в середине цикла нужно пропускать строки таблицы значений с одинаковой номенклатурой. Чтобы это получилось можно воспользоваться списком значений.
СписокНоменклатуры = Новый СписокЗначений; Для каждого Строка Из ТаблицаРезультатов Цикл // Начало какого-то кода... Если СписокНоменклатуры.НайтиПоЗначению(Строка.Номенклатура) = Неопределено Тогда // Если нет такой номенклатуры добавим в список значений и // продолжим работу дальше... СписокНоменклатуры.Добавить(Строка.Номенклатура); Иначе // Если така номенклатура встречается, то идём на начало цикла Продолжить; КонецЕсли; // Продолжение какого-то кода... КонецЦикла;
Как проверить наличие колонки в строке таблицы значений?
Самый простой вариант сделать это — использовать конструкцию «Попытка Исключение», например, попытаться получить значение в строке в указанной колонке и если возникнет исключение, то это значит, что колонки нет. Можно написать следующую функцию:
Функция ПроверитьНаличиеКолонки(СтрокаТаблицы, ИмяКолонки) Попытка Значение = СтрокаТаблицы[ИмяКолонки]; // Колонка существует Возврат Истина; Исключение // Колонка отсутствует Возврат Ложь; КонецПопытки; КонецФункции
Однако использование конструкции «Попытка Исключение» не является хорошим тоном в программировании на 1С
(это вызывает трудности отладки и крушение внутри транзакций). Поэтому предлагаю другой путь:
НазваниеКолонки = "Субконто"; Если СтрокаТЗ.Владелец().Колонки.Найти(НазваниеКолонки) <> Неопределено Тогда Сообщить("Колонка с названием - " + НазваниеКолонки + " - существует!"); Иначе Сообщить("Колонка с названием - " + НазваниеКолонки + " - не существует!"); КонецЕсли;
В нашем примере переменная «СтрокаТЗ» является объектом типа «СтрокаТаблицыЗначений», у которого есть метод «Владелец()». Владельцем строки является «ТаблицаЗначений», которая имеет свойство «Колонки» с типом «КоллекцияКолонокТаблицыЗначений». Таким образом мы получаем объект типа «КоллекцияКолонокТаблицыЗначений», который содержит метод «Найти()». С помощью этого метода мы можем найти колонки таблицы значений по имени. Если указанная колонка есть, то возвращается колонка с типом «КолонкаТаблицыЗначений», но если отсутствует, то возвращается значение «Неопределено». Поэтому в нашем случае будет выведено следующее сообщение:
Колонка с названием - Субконто - существует!
Поиск в таблице значений по двум и более полям
Рассмотрим первый способ — через объекты встроенного языка системы 1С:Предприятие:
ТаблицаЗначений = Новый ТаблицаЗначений; // Обязательно укажем тип колонки, // чтобы не было ошибки «Тип не может быть выбран в запросе» // при выполнении запроса к таблице значений КС = Новый КвалификаторыСтроки(100); КЧ = Новый КвалификаторыЧисла(3); ОписаниеТиповС = Новый ОписаниеТипов("Строка",, КС); ОписаниеТиповЧ = Новый ОписаниеТипов("Число",, КЧ); // Создаём нужные колонки. ТаблицаЗначений.Колонки.Добавить("Фамилия", ОписаниеТиповС); ТаблицаЗначений.Колонки.Добавить("Возраст", ОписаниеТиповЧ); // Сотрудник № 1. НоваяСтрока = ТаблицаЗначений.Добавить(); НоваяСтрока.Фамилия = "Иванов"; НоваяСтрока.Возраст = 27; // Сотрудник № 2. НоваяСтрока = ТаблицаЗначений.Добавить(); НоваяСтрока["Фамилия"] = "Сидоров"; НоваяСтрока["Возраст"] = 64; // Осуществляем поиск по таблице через объекты Отбор = Новый Структура; Отбор.Вставить("Фамилия", "Иванов"); Отбор.Вставить("Возраст", 27); Строки = ТаблицаЗначений.НайтиСтроки(Отбор); // Возвращает массив Если Строки.Количество() > 0 Тогда Сообщить("*** Первый способ - через объекты встроенного языка ***"); Сообщить("Фамилия: " + Строки[0].Фамилия + " Возраст: " + Строки[0].Возраст); КонецЕсли;
В результате по первому способу, через объекты встроенного языка, получим:
*** Первый способ - через объекты встроенного языка *** Фамилия: Иванов Возраст: 27
Рассмотрим второй способ — через пакетные запросы системы 1С:Предприятие. Здесь воспользуемся таблицой значений, которую мы создали ранее, в первом способе:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТаблицаЗначений.Фамилия, | ТаблицаЗначений.Возраст |ПОМЕСТИТЬ ВТ_ТаблицаЗначений |ИЗ | &ТаблицаЗначений КАК ТаблицаЗначений |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_ТаблицаЗначений.Фамилия, | ВТ_ТаблицаЗначений.Возраст |ИЗ | ВТ_ТаблицаЗначений КАК ВТ_ТаблицаЗначений |ГДЕ | ВТ_ТаблицаЗначений.Фамилия = &Фамилия | И ВТ_ТаблицаЗначений.Возраст = &Возраст"; Запрос.УстановитьПараметр("ТаблицаЗначений", ТаблицаЗначений); Запрос.УстановитьПараметр("Фамилия", "Сидоров"); Запрос.УстановитьПараметр("Возраст", 64); Результат = Запрос.Выполнить().Выгрузить(); // Возвращает таблицу значений Если Результат.Количество() > 0 Тогда Сообщить("*** Второй способ - через запросы ***"); Сообщить("Фамилия: " + Результат[0].Фамилия + " Возраст: " + Результат[0].Возраст); КонецЕсли;
В результате по второму способу, через запросы, получим:
*** Второй способ - через запросы *** Фамилия: Сидоров Возраст: 64
Оба способа помогут нам найти строки в таблице значений по двум полям. Но как вы уже догадались можно добавить поиск по трём, четырём и более полям.
Почему возникает ошибка «Тип не может быть выбран в запросе» при выполнении запроса к таблице значений?
Если не задать тип значения колонки при её создании как описано в подзаголовке Поиск в таблице значений по двум и более полям, а написать так:
ТаблицаЗначений.Колонки.Добавить("Фамилия");
То тогда при выполнении запроса будет выведена ошибка:
Ошибка при вызове метода контекста (Выполнить) Результат = Запрос.Выполнить().Выгрузить(); по причине: {(2, 2)}: Тип не может быть выбран в запросе <<?>>ТаблицаЗначений.Фамилия,
Поэтому, чтобы избежать этой ошибки нужно писать так:
КС = Новый КвалификаторыСтроки(100); ОписаниеТиповС = Новый ОписаниеТипов("Строка",, КС); ТаблицаЗначений.Колонки.Добавить("Фамилия", ОписаниеТиповС);
Как получить номер строки таблицы значений?
Нужно использовать метод таблицы значений «Индекс» (IndexOf), которая получает индекс строки в коллекции строк таблицы значений:
ИдеиРазвития.Колонки.Вставить(0,"Номер",, "№", 1); Для Каждого Строка Из ИдеиРазвития Цикл Строка.Номер = ИдеиРазвития.Индекс(Строка) + 1; КонецЦикла;
Как правильно удалить строки из ТаблицыЗначений в 1С8?
Предположим, нужно удалить все строки из таблицы значений, которые содержат букву «G» во второй колонке.
Процедура УдалитьСтрокиТаблицы(Таб); Сч = 0; Пока Сч < Таб.Количество() Цикл Строка = Таб[Сч]; Если Найти(Строка.Получить(1),"G") > 0 Тогда Таб.Удалить(Строка); Иначе // Благодаря этой переменной мы // не пропускаем строки в таблице значений Сч = Сч + 1; КонецЕсли; КонецЦикла; КонецПроцедуры
Подобная процедура для правильного удаления строк текстового файла описана здесь.