Как найти индекс строки таблицы значений

Возвращает индекс строки таблицы значений

Синтаксис

Метод Индекс() имеет следующий синтаксис:

Число Индекс(СтрокаТаблицыЗначений)

А также альтернативный англоязычный синтаксис:

number IndexOf(ValueTableString)

Параметры

Описание параметров метода Индекс():

Имя параметра* Тип Описание
Строка СтрокаТаблицыЗначений Строка таблицы значений, для которой нужно определить индекс.
*Жирным шрифтом выделены обязательные параметры

Возвращаемое значение

Число — Индекс указанной строки таблицы значений.

Описание

Метод Индекс() возвращает индекс указанной строки в коллекции строк таблицы значений. Если строка не найдена, возвращается -1.

Доступность

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).

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

Пример кода с использованием метода Индекс():

//создаем таблицу товаров
тз = Новый ТаблицаЗначений;
тз.Колонки.Добавить("НомерСтроки");
тз.Колонки.Добавить("Код");
тз.Колонки.Добавить("Наименование");
тз.Колонки.Добавить("Тип");

//добавляем товары и услуги
НоваяСтрока = тз.Добавить();
НоваяСтрока.Код = "001";
НоваяСтрока.Наименование = "Стул деревянный";
НоваяСтрока.Тип = "Товар";

НоваяСтрока = тз.Добавить();
НоваяСтрока.Код = "002";
НоваяСтрока.Наименование = "Стол деревянный";
НоваяСтрока.Тип = "Товар";

НоваяСтрока = тз.Добавить();
НоваяСтрока.Код = "101";
НоваяСтрока.Наименование = "Сборка стола";
НоваяСтрока.Тип = "Услуга";

//пронумеруем строки
Для Каждого СтрокаТЗ Из тз Цикл
	СтрокаТЗ.НомерСтроки = тз.Индекс(СтрокаТЗ) + 1;
КонецЦикла;

Читайте также:

  1. ТаблицаЗначений.Получить()
  2. ТаблицаЗначений.Удалить()

Поделиться страницей в соц.сетях

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 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 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

Книга «Основы разработки в 1С: Такси»

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

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 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;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

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

ПОДПИСКА

Понравилась статья? Поделить с друзьями:
  • Как найти режим турбо в опере
  • Как найти женщину на одну ночь бесплатно
  • Как найти видовременную форму глагола
  • Как найти длину высоты треугольника на координате
  • Как найти решение в чистых стратегиях