Как найти колонку в таблице значений 1с

См. также Таблица значений в языке 1С 8 (в примерах)

Таб = Новый ТаблицаЗначений;
Таб.Колонки.Добавить("Фрукт");
Таб.Колонки.Добавить("Цвет");
Таб.Колонки.Добавить("Вкус");

Если Таб.Колонки.Найти("Цвет") <> Неопределено Тогда
    Сообщить("Колонка Цвет существует.");
КонецЕсли;

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

Владимир Милькин

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

Нажмите одну из кнопок, чтобы поделиться:

Выполняет поиск колонки таблицы значений по имени.

Синтаксис

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

КолонкаТаблицыЗначений Найти(ИмяКолонки)

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

ValueTableColumn Find(ColumnName)

Параметры

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

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

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

КолонкаТаблицыЗначений или Неопределено

Описание

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

Доступность

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

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

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

Колонка = тз.Колонки.Найти("Комментарий");
Если НЕ Колонка = Неопределено Тогда
	тз.Колонки.Удалить(Колонка);
КонецЕсли;

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

  1. Таблица значений 1с. Описание и примеры использования

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

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

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

Разберем оба этих метода на примере.

Метод Найти таблицы значений 1С 8.3

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

Данная функция имеет следующий синтаксис:

Найти(Значение, Колонки)

Где:

Значение – то значение, которое мы ищем в таблице.

Колонки – колонки таблицы значений, по которым осуществляется поиск (необязательный параметр, можно осуществлять поиск по всем колонкам таблицы значений).

Работа этого метода показана на следующем примере:

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«ФИО»);
ТЗ.Колонки.Добавить(«ДатаРождения»);
//первая строка
НСтр = ТЗ.Добавить();
НСтр.ФИО = «Иванов И.И»;
НСтр.ДатаРождения = Дата(1981,1,15);
//вторая строка
НСтр = ТЗ.Добавить();
НСтр.ФИО = «Петров П.С»;
НСтр.ДатаРождения = Дата(1984,5,25);
//третья строка
НСтр = ТЗ.Добавить();
НСтр.ФИО = «Тарасов К.В»;
НСтр.ДатаРождения = Дата(1987,6,11);
//первая строка
стрТарасов = ТЗ.Найти(«Тарасов К.В»,«ФИО»);

Если мы посмотрим на значение переменной стрТарасов в отладке, то увидим ссылку на конкретную строку таблицы значений.

Метод найти таблицы значений 1С

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

Метод найти таблицы значений 1С

Если же мы сделаем поиск по второй колонке, то результат будет Неопределено.

Неопределено в результате метода найти таблицы значений

Такой же результат Неопределено  будет и при поиске несуществующего значения.

Неопределено в результате метода найти таблицы значений

Метод НайтиСтроки таблицы значений 1С 8.3

Если метод Найти возвращает конкретную строку таблицы значений, то метод НайтиСтроки, возвращает массив строк, которые соответствуют нужному условию. Данный метод имеет следующий синтаксис

НайтиСтроки(СтруктураПоиска)

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

Переделаем предыдущую таблицу значений:

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Фамилия»);
ТЗ.Колонки.Добавить(«Имя»);
ТЗ.Колонки.Добавить(«ДатаРождения»);
//первая строка
НСтр = ТЗ.Добавить();
НСтр.Фамилия = «Иванов»;
НСтр.Имя = «Петр»;
НСтр.ДатаРождения = Дата(1981,1,15);
//вторая строка
НСтр = ТЗ.Добавить();
НСтр.Фамилия = «Иванов»;
НСтр.Имя = «Алексей»;
НСтр.ДатаРождения = Дата(1981,1,25);
//третья строка
НСтр = ТЗ.Добавить();
НСтр.Фамилия = «Григорьев»;
НСтр.Имя = «Петр»;
НСтр.ДатаРождения = Дата(1987,6,11);

Теперь найдем все строки таблицы значений, где встречается имя Петр

МассивСтрок = ТЗ.НайтиСтроки(Новый Структура(«Имя»,«Петр»));

Посмотрим на результат.

Метод НайтиСтроки таблицы значений 1С

Или найдем всех Петров, родившихся 11.06.1987 года.

ПараметрыПоиска = Новый Структура(«Имя,ДатаРождения»,«Петр»,Дата(1987,6,11));
МассивСтрок = ТЗ.НайтиСтроки(ПараметрыПоиска);

В этот раз найденных строк будет меньше.

Метод НайтиСтроки таблицы значений 1С

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

Метод НайтиСтроки возвращает пустой массив

Причем обратите внимание, в массиве содержится ссылка на строку таблицы значений. Это значит, что если Вы измените строку в массиве, то также изменится строка в таблице значений.

Скопировать таблицу значений 1С

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

Метод СкопироватьКолонки таблицы значений 1С 8.3

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

СкопироватьКолонки(СписокКолонок)

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

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Фамилия»);
ТЗ.Колонки.Добавить(«Имя»);
ТЗ.Колонки.Добавить(«ДатаРождения»);
//новые таблицы
НовТЗ1 = ТЗ.СкопироватьКолонки();
НовТЗ2 = ТЗ.СкопироватьКолонки(«Фамилия,Имя»);

В примере выше, в таблице НовТЗ1 будет тот же набор колонок, что и в таблице ТЗ, а в таблице НовТЗ2 будут только колонки Фамилия и Имя.

Метод Скопировать таблицы значений 1С 8.3

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

Скопировать(Строки,Колонки)

Где:

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

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

Второй вариант синтаксиса

Скопировать(ПараметрыОтбора, Колонки).

Где:

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

Рассмотрим примеры с обоими вариантами параметров.  Будем использовать ту же таблицу, что и в предыдущих примерах, но отберем только те строки, у которых год рождения 1981.

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Фамилия»);
ТЗ.Колонки.Добавить(«Имя»);
ТЗ.Колонки.Добавить(«ДатаРождения»);
//первая строка
НСтр = ТЗ.Добавить();
НСтр.Фамилия = «Иванов»;
НСтр.Имя = «Петр»;
НСтр.ДатаРождения = Дата(1981,1,15);
//вторая строка
НСтр = ТЗ.Добавить();
НСтр.Фамилия = «Иванов»;
НСтр.Имя = «Алексей»;
НСтр.ДатаРождения = Дата(1981,1,25);
//третья строка
НСтр = ТЗ.Добавить();
НСтр.Фамилия = «Григорьев»;
НСтр.Имя = «Петр»;
НСтр.ДатаРождения = Дата(1987,6,11);
//формируем новый массив
МассивДляОтбора = Новый Массив;
Для Каждого
стрТЗ из ТЗ Цикл
Если
Год(стрТЗ.ДатаРождения) = 1981 Тогда
МассивДляОтбора.Добавить(стрТЗ);
КонецЕсли;
КонецЦикла;
//новая таблица значений
НовТЗ = ТЗ.Скопировать(МассивДляОтбора,«Имя,ДатаРождения»);

Посмотрим на результат работы этой функции

Метод Скопировать таблицы значений 1С

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

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Фамилия»);
ТЗ.Колонки.Добавить(«Имя»);
ТЗ.Колонки.Добавить(«ДатаРождения»);
//первая строка
НСтр = ТЗ.Добавить();
НСтр.Фамилия = «Иванов»;
НСтр.Имя = «Петр»;
НСтр.ДатаРождения = Дата(1981,1,15);
//вторая строка
НСтр = ТЗ.Добавить();
НСтр.Фамилия = «Иванов»;
НСтр.Имя = «Алексей»;
НСтр.ДатаРождения = Дата(1981,1,25);
//третья строка
НСтр = ТЗ.Добавить();
НСтр.Фамилия = «Григорьев»;
НСтр.Имя = «Петр»;
НСтр.ДатаРождения = Дата(1987,6,11);
//отбор
ПараметрыОтбора = Новый Структура(«Имя,ДатаРождения»,«Петр»,Дата(1981,1,15));
//новая таблица значений
НовТЗ = ТЗ.Скопировать(ПараметрыОтбора,«Имя,Фамилия»);

В этот раз будет следующий результат.

Метод Скопировать таблицы значений 1С

Методы таблиц значений 1С 8.3. Часть 2. Сортировка, итоги и свертка.

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

Более подробно и основательно работа с таблицей значений в дается в моей книге:

Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

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

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

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

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

Промо-код на скидку в 15% — 48PVXHeYu

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

Доброго времени суток, уважаемые читатели! На этом сайте уже были описаны примеры работы с таблицей значений. Например, было написано как объединить две таблицы значений. Сегодня я поделюсь ещё некоторыми примерами программирования с таблицей значений в системе 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;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

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

ПОДПИСКА

Ключевые слова: колонка,таблица значений,метаданные

Иногда хочется знать есть ли в строке объекта определенная колонка.

Самый простой вариант сделать это – использовать конструкцию “Попытка Исключение”, например, попытаться получить значение в строке в указанной колонке и если возникнет исключение – колонки нет:

Попытка
    Тмп=СтрокаТаблицыЗначений[НужноеИмяКолонки];
    флЕстьКолонка=Истина;
Исключение
    флЕстьКолонка=Ложь;
КонецПопытки;

Примечание. Это одно из применений универсального Книга знаний: Метод Рупора

Однако использование попытка исключение не является хорошим тоном в программировании на 1С (это вызывает трудности отладки и крушение внутри транзакций). Поищем другие пути.

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

Функция ЕстьРеквизитСтрокиТабличнойЧасти(СтрокаТаблицыЗначений, НужноеИмяКолонки) Экспорт
    МД=Метаданные.НайтиПоТипу(ТипЗнч(СтрокаТаблицыЗначений));
    Если МД.Реквизиты.Найти(НужноеИмяКолонки)=Неопределено Тогда
        Возврат ложь;
    Иначе
        Возврат истина;
    КонецЕсли;
КонецФункции

А для таблиц значений Тюшкин Андрей предложил такой, немного изощренный, способ:

УИД = Новый УникальныйИдентификатор(); 
ВременнаяСтруктура = Новый Структура(НужноеИмяКолонки, УИД); 
ЗаполнитьЗначенияСвойств(ВременнаяСтруктура, СтрокаТаблицыЗначений, НужноеИмяКолонки); 
флЕстьКолонка=ВременнеяСтруктура[НужноеИмяКолонки] <> УИД;

Добавить комментарий