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

 +9 

   

Распечатать

1С 8.3 : Найти строку в табличной части документа

Для поиска необходимого значения воспользуемся функцией НайтиСтроки().

Код 1C v 8.2 УП

 &НаСервере
Процедура НайтиТовар(СправочникНоменклатураСсылка)

Перем Отбор, НайденноеЗначение, Сч;

Отбор = Новый Структура();
Отбор.Вставить("Номенклатура", СправочникНоменклатураСсылка);
НайденноеЗначение = Объект["ТЧНоменклатура"].НайтиСтроки(Отбор);

Если НайденноеЗначение.Количество() > 0 Тогда

Сч = 1;
Пока НайденноеЗначение.Количество() >= Сч Цикл
Сообщить(НайденноеЗначение[0].Наименование);
Сч = Сч + 1;
КонецЦикла;

КонецЕсли;

КонецПроцедуры


Код 1C v 8.х

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

// Необходимо найти МассивСтрок, состоящий из строк табличной части документа по 2 значениям.
СтруктураДляПоиска = Новый Структура;
структураДляПоиска.Вставить("Артикул",Артикул);
структураДляПоиска.Вставить("КодПартии",СтруктураПараметров.КодПартии);

МассивСтрок = ДокументДляДополнения.Товары.НайтиСтроки(структураДляПоиска);


Выгружаем колонку

Код 1C v 7.x

 ВыгрузитьТабличнуюЧасть("Товар")

Далее через НайтиЗначение ищем необходимую строку

Для поиска необходимого значения воспользуемся функцией НайтиСтроки().

Код 1C v 8.2 УП

 &НаСервере
      
Процедура НайтиТовар(СправочникНоменклатураСсылка)

Перем Отбор, НайденноеЗначение, Сч;

Отбор = Новый Структура();
Отбор.Вставить("Номенклатура", СправочникНоменклатураСсылка);
НайденноеЗначение = Объект["ТЧНоменклатура"].НайтиСтроки(Отбор);

Если НайденноеЗначение.Количество() > 0 Тогда

Сч = 1;
Пока НайденноеЗначение.Количество() >= Сч Цикл
Сообщить(НайденноеЗначение[0].Наименование);
Сч = Сч + 1;
КонецЦикла;

КонецЕсли;

КонецПроцедуры


Код 1C v 8.х

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

// Необходимо найти МассивСтрок, состоящий из строк табличной части документа по 2 значениям.
СтруктураДляПоиска = Новый Структура;
структураДляПоиска.Вставить("Артикул",Артикул);
структураДляПоиска.Вставить("КодПартии",СтруктураПараметров.КодПартии);

МассивСтрок = ДокументДляДополнения.Товары.НайтиСтроки(структураДляПоиска);


Купон на ОЗОН за покупку программ 1С


Выгружаем колонку

Код 1C v 7.x

 ВыгрузитьТабличнуюЧасть("Товар")

Далее через НайтиЗначение ищем необходимую строку

Информация взята с сайта http://helpf.pro

Подпишитесь на нашу рассылку новостей

Хотите узнать больше по этому вопросу?

Подпишитесь на нашу рассылку новостей

Подписаться

Чтобы задать вопрос или предложить тему статьи, нажмите на кнопку ниже:

Предложить статью

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

Метод Найти

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

Таблица.Найти(<Значение>, <Колонки>)

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

Рассмотрим простой пример. У нас есть таблица значений с колонками: Номенклатура, Количество, Цена, Сумма. Найдем строку, содержащую значение 2 в колонке Количество или в колонке Цена.

Значение = 2;	
СписокКолонок = "Количество, Цена";
	
СтрокаТаблицы = ТаблицаТоваров.Найти(Значение, СписокКолонок);
	
Если Не СтрокаТаблицы = Неопределено Тогда
    Сообщить(СтрокаТаблицы.Номенклатура);	
КонецЕсли;

После поиска, обязательно делаем проверку на Неопределено. Иначе, в случае не найденной строки, можно получить ошибку.

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

Метод НайтиСтроки

Метод НайтиСтроки предназначен для поиска всех строк таблицы значений, соответствующих указанному отбору. Синтаксис метода:

Таблица.НайтиСтроки(<ПараметрыОтбора>)

Параметры отбора — это структура, где ключ — имя колонки таблицы, а значение — значение, по которому будет осуществляться поиск в данной колонке. Поиск элементов осуществляется только на «равно». Данный метод возвращает массив найденных строк таблицы, либо пустой массив, если по данным условиям ничего не найдено.

Пример 2. Пусть у нас есть Таблица значений содержащаяся в переменной Таблица, у которой есть колонки Наименование и Код.

Отбор = Новый Структура;
Отбор.Вставить("Наименование", "Сапоги");
Отбор.Вставить("Код", "000000111");

НайденныеСтроки = Таблица.НайтиСтроки(Отбор);

Для Каждого СтрокаТаблицы из НайденныеСтроки Цикл
    //Ваш код для обработки найденной строки таблицы значений
КонецЦикла;

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

Другие способы найти строки таблицы значений

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

Пример 3. Воспользуемся таблицей из самого первого примера. Обработаем строки, цена в которых находится в интервале от 100 до 1000.

Для Каждого СтрокаТаблицы Из ТаблицаТоваров Цикл
		
    Если СтрокаТаблицы.Цена >= 100
        И СтрокаТаблицы.Цена <= 1000 Тогда
			
	//Код по обработке найденной строки
			
    КонецЕсли;
		
КонецЦикла;

Пример 4. Сделаем тоже самое при помощи запроса.

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТаблицаТоваров", ТаблицаТоваров);

Запрос.Текст = 
"ВЫБРАТЬ
|    ТаблицаТоваров.Номенклатура КАК Номенклатура,
|    ТаблицаТоваров.Количество КАК Количество,
|    ТаблицаТоваров.Цена КАК Цена
|ПОМЕСТИТЬ ТаблицаТоваров
|ИЗ
|    &ТаблицаТоваров КАК ТаблицаТоваров
|;
|/////////////////////////////////////////////////
|ВЫБРАТЬ
|    ТаблицаТоваров.Номенклатура КАК Номенклатура,
|    ТаблицаТоваров.Количество КАК Количество,
|    ТаблицаТоваров.Цена КАК Цена
|ИЗ
|    ТаблицаТоваров КАК ТаблицаТоваров
|ГДЕ
|    ТаблицаТоваров.Цена МЕЖДУ 100 И 1000";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    //Код по обработке найденной строки
КонецЦикла;

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


Осуществляет поиск строки таблицы по значению.

Синтаксис

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

СтрокаТаблицыЗначений Найти(Значение, [Колонки=""])

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

ValueTableString Find(Value, [Columns=""])

Параметры

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

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

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

СтрокаТаблицыЗначений — строка, в которой содержится искомое значение
Неопределено — если значение не найдено

Описание

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

Внимание! Метод находит только первую строку с указанным значением. Чтобы найти все строки, воспользуйтесь методом ТаблицаЗначений.НайтиСтроки()

Доступность

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

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

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

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

//добавляем товары и цены
НоваяСтрока = тз.Добавить();
НоваяСтрока.Код = "001";
НоваяСтрока.Наименование = "Стул деревянный";
НоваяСтрока.Количество = 2;
НоваяСтрока.Цена = 2000;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;

НоваяСтрока = тз.Добавить();
НоваяСтрока.Код = "001";
НоваяСтрока.Наименование = "Стол деревянный";
НоваяСтрока.Количество = 1;
НоваяСтрока.Цена = 8000;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;

//выводим итоговую информацию
найдСтрока = тз.Найти("Стол деревянный", "Наименование");
Если НЕ найдСтрока = Неопределено Тогда
	Сообщить("Найден товар: " + найдСтрока.Наименование + " на сумму " + найдСтрока.Сумма);
КонецЕсли

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

Программная работа с таблицей значений

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

Поиск значения по ссылке в табличной части документа.

Автор Амал, 19 июл 2017, 07:24

0 Пользователей и 1 гость просматривают эту тему.

Всем хорошего дня.

Подскажите пожалуйста, как найти значение в ТЧ документа по ссылке?

Для Каждого Строка ИЗ Товары Цикл //обращаюсь к ТЧ документа

НЗ = Товары.Найти("Стул", "Товар"); //колонка называется "товар"

//Если Строка.Товар = "Стул" Тогда
// Сообщить("Верно");
//Иначе
// Сообщить("НЕ Найдено");
//КонецЕсли;

сообщить(НЗ);
КонецЦикла;

Программа сообщает НЗ: “ДокументТабличнаяЧастьСтрока.Реализация.Товары”. Но мне надо, чтобы программа нашла в ТЧ документа “Стул”. Есть справочник “Товары”. Как правильно написать код?


ЦитироватьТабличная часть (Tabular section)
Найти (Find)
Синтаксис:

Найти(<Значение>, <Колонки>)
Параметры:

<Значение> (обязательный)

Тип: Произвольный.
Искомое значение.
<Колонки> (необязательный)

Тип: Строка.
Список имен колонок, в которых будет осуществляться поиск, разделенных запятыми.
Если параметр не указан, поиск осуществляется по всей табличной части.
Значение по умолчанию: Пустая строка
Возвращаемое значение:

Тип: Строка табличной части, Неопределено.
Строка, которая содержит искомое значение. Если значение не найдено, то возвращается значение Неопределено.
Описание:

Осуществляет поиск значения в указанных колонках табличной части.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Примечание:

Метод эффективно использовать для поиска уникальных значений.
Пример:

НайденнаяСтрока = Состав.Найти(ТекТовар, "Номенклатура");
Если НайденнаяСтрока = Неопределено Тогда
    Текст = "ru = ""Товар не найден!"";"
     + " en = ""Article not found!""";
    Предупреждение(НСтр(Текст));
Иначе
    Количество = НайденнаяСтрока.Количество;
КонецЕсли;

Во-первых неясно зачем вы делаете это в цикле. Во-вторых вы ищите значение с типом Строка в колонке с типом СправочникСсылка.

Стул = Справочники.Товары.НайтиПоНаименованию("Стул");
НЗ = Товары.Найти(Стул, "Товар");

Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению … рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.


Цитата: Golickoff от 19 июл 2017, 07:31
Во-первых неясно зачем вы делаете это в цикле.

Я только учусь, поэтому решил: чтобы найти значение в ТЧ, нужно пробежаться циклом. Пусть это ошибка. Но так проходит обучение и единственное место у кого я могу узнать верность моих действий – это форумы.

Цитата: Golickoff от 19 июл 2017, 07:31
Во-вторых вы ищите значение с типом Строка в колонке с типом СправочникСсылка.

Спасибо. Сейчас попробую ваш вариант.

Добавлено: 19 июл 2017, 07:48


Цитата: Golickoff от 19 июл 2017, 07:31Стул = Справочники.Товары.НайтиПоНаименованию("Стул");
НЗ = Товары.Найти(Стул, "Товар");

Попробовал ваш вариант. Вывел сообщить(НЗ) – результат просто “-”


Конструкция типа “Для Каждого ЧтоТоТам Из ЧегоТоТам Цикл” подразумевает обращение к реквизиту ЧтоТоТам внутри этого цикла, иначе весь цикл почти всегда теряет смысл. Какой тип значения у колонки Товар?

Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению … рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.


Цитата: Golickoff от 19 июл 2017, 08:18
Конструкция типа “Для Каждого ЧтоТоТам Из ЧегоТоТам Цикл” подразумевает обращение к реквизиту ЧтоТоТам внутри этого цикла, иначе весь цикл почти всегда теряет смысл. Какой тип значения у колонки Товар?

Строка


Значит заголовок темы неправильный. Объясняйте что хотите получить и каким образом. ТабличнаяЧасть.Найти возвращает строку, в которой найдено значение. Если из строки нужно достать стул, вот код

НЗ = Товары.Найти("Стул", "Товар");
Стул = НЗ.Товар;
Сообщить(Стул);
Но для того чтобы найти стул нужно указать что такое стул. Можно сразу указать и не заморачиваться с поиском.

Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению … рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.


Цитата: Golickoff от 19 июл 2017, 09:08
Значит заголовок темы неправильный. Объясняйте что хотите получить и каким образом.

Мне программист так сказал сделать (он всегда занят и только кидает вводные ничего не объясняя): Найти значение по ссылке. Поэтому я и создал тему с таким названием.

Цитата: Golickoff от 19 июл 2017, 09:08
Но для того чтобы найти стул нужно указать что такое стул. Можно сразу указать и не заморачиваться с поиском.

Так мне же надо именно найти это значение (стул) в ТЧ. Я написал следующий код:

НЗ = Товары.Найти("Стул", "Товар");
//Стул = НЗ.Товар

Если НЗ = "Стул" Тогда
Сообщить("Верно");
Иначе
Сообщить("НЕ Найдено");
КонецЕсли;

сообщить(НЗ);

И программа выдаёт условие “иначе”, хотя в ТЧ выбран “стул”. А в содержание НЗ(сообщить(НЗ) – “ДокументТабличнаяЧастьСтрока.Реализация.Товары”


Если НЗ = "Стул" Поменяйте на

Если НЗ.Товар = "Стул"

Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению … рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.


Цитата: Golickoff от 19 июл 2017, 10:33
Если НЗ = "Стул" Поменяйте на Если НЗ.Товар = "Стул"

Я создал совершенно пустую базу (для обучения). Создал один документ и пару справочников. В модуле объекта (Процедура “ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)”) пытаюсь реализовать поиск значения в ТЧ документа. Поменял, как вы написали и условие срабатывает верно, но когда выбираю другое наименование товара, либо оставляю поле пустым и нажимаю “Записать”, программа виснет, не выдавая никакого сообщения. В чём может быть причина?


Возможно, замкнулся какой-то цикл, посмотрите отладчиком что происходит при зависании. Всё же я хочу чтобы вы понимали, что вы ищите стул методом “вот у меня в руках стул, найдите мне его” и вам находят точно такой же стул, который вы используете вместо того который был у вас в руках, хотя он точно такой же и вы могли сразу присесть на тот стул что был у вас в руках и не тратить время на поиск точно такого же стула.

Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению … рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.


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