+9
Найти строку в табличной части документа
Для поиска необходимого значения воспользуемся функцией НайтиСтроки().
Код 1C v 8.2 УП
&НаСервере
Процедура НайтиТовар(СправочникНоменклатураСсылка)
Перем Отбор, НайденноеЗначение, Сч;
Отбор = Новый Структура();
Отбор.Вставить("Номенклатура", СправочникНоменклатураСсылка);
НайденноеЗначение = Объект["ТЧНоменклатура"].НайтиСтроки(Отбор);
Если НайденноеЗначение.Количество() > 0 Тогда
Сч = 1;
Пока НайденноеЗначение.Количество() >= Сч Цикл
Сообщить(НайденноеЗначение[0].Наименование);
Сч = Сч + 1;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Код 1C v 8.х
// найти строку в ТЧ Документа
Отбор = Новый Структура();
Отбор.Вставить("Номенклатура", СправочникНоменклатураСсылка);
НайденноеЗначение = ТЧНоменклатура.НайтиСтроки(Отбор);
// Необходимо найти МассивСтрок, состоящий из строк табличной части документа по 2 значениям.
СтруктураДляПоиска = Новый Структура;
структураДляПоиска.Вставить("Артикул",Артикул);
структураДляПоиска.Вставить("КодПартии",СтруктураПараметров.КодПартии);
МассивСтрок = ДокументДляДополнения.Товары.НайтиСтроки(структураДляПоиска);
Выгружаем колонку
Код 1C v 7.x
ВыгрузитьТабличнуюЧасть("Товар")
Далее через НайтиЗначение ищем необходимую строку
Найти строку в табличной части документа для изменения не очень частая задача из-за этого не всегда можно вспомнить с ходу, как это реализовать в 1с. В этой заметке разберем пару примерок по поиску строк в табличной части и дальнейшей работы с ними.
Найти строку по заданным параметрам
Для решения задачи поиска строк в ТЧ будем использовать функцию НайтиСтроки.
Синтаксис: НайтиСтроки(<ПараметрыОтбора>)
Параметры: <ПараметрыОтбора> (обязательный)
Тип: Структура. Задает условия поиска: ключ структуры определяет имя колонки, по которой будет осуществляться поиск, а значение структуры – искомое значение.
Возвращаемое значение: Массив из строк табличной части, соответствующих заданному условию поиска.
Замечание! Массив хранит ссылки на строки табличной части, то есть при изменении строки в табличной части, значение в массиве тоже будет изменено.
Описание: Осуществляет поиск строк табличной части, соответствующих заданному условию поиска.
Первый вариант, который встречается в работе найти строки с определенным значением в колонке.
Найти все строки ТЧ с определенным значением задачи.
- Создадим структуру отбор и установим значение задачи
- Применим функцию НайтиСтроки к нужной табличной части
- В переменной МассивНайденныхСтрок будут ссылки на строки таблицы которые содержат нужную нам задачу
Отбор = Новый Структура("Задача",ДокументСсылкаЗадача); МассивНайденныхСтрок = ТЧПодзадачи.НайтиСтроки(Отбор);
Бывает когда нужно найти строку в табличной части документа по нескольким параметрам, разберем такой пример.
Найти все строки ТЧ с определенным значением номенклатуры и количества
- Создаем структуру для отбора
- Устанавливаем два параметра поиска (если параметров больше устанавливаем столько, сколько надо)
- Ищем в таблице нужные строки
- Получаем переменную МассивНайденныхСтрок с нужными данными
Отбор = Новый Структура; Отбор.Вставить("Номенклатура",СправочникНоменклатураСсылка); Отбор.Вставить("Количество",ИскомоеКоличество); МассивНайденныхСтрок = РеализацияТовароУслуг.Товары.НайтиСтроки(Отбор);
В примере номер три реализуем процедуру которая сообщит все цены номенклатуры в определенном документе.
Реализовать процедуру которая сообщит цену на товар в поступлениях, реализациях и счетах на выбор пользователя.
Порядок действий будет похож на прошлые два примера:
- Создаем отбор и устанавливаем значения поиска
- Ищем в табличной части
- Сообщаем все цены которые нашли
&НаСервере Процедура НайтиЦеныНаТовар(Документ,СправочникНоменклатураСсылка) Отбор = Новый Структура("Номенклатура", СправочникНоменклатураСсылка); МассивНайденныхСтрок = Документ["Товары"].НайтиСтроки(Отбор); Для Каждого ЭлМас Из МассивНайденныхСтрок Цикл Сообщить(ЭлМас.Цена); КонецЦикла; КонецПроцедуры
В 1с существует метод Найти(), это устаревший метод для его не стоит использовать.
Дополнительные материалы по теме:
- Заметки и учебные примеры по программированию у меня на сайте ищите – тут
- Интересная статья про НайтиСтроки – тут
Содержание:
1. Когда возникает необходимость проверить наличие реквизита 1С?
2. Как можно получить метаданные объекта 1С?
1. Когда возникает необходимость проверить наличие реквизита 1С
Потребность проверки наличия реквизита обычно возникает при написании общих, универсальных процедур или функций, к примеру, когда необходимо выполнить ряд однообразных действий, проверить заполнение перед проведением, при этом реквизитный состав обрабатываемых объектов метаданных отличается незначительно (например, в документе, отражающем продажу товара, есть реквизит Склад, а в документе, отражающем перемещение товара – реквизиты Склад-отправитель и Склад-получатель).
В ряде типовых конфигураций 1С предлагается стандартная функция проверки наличия реквизита в объекте (расположена в модуле “ОбщегоНазначения”)
Функция ЕстьРеквизитОбъекта(ИмяРеквизита, МетаданныеОбъекта) Экспорт
Возврат НЕ (МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено);
КонецФункции
2. Как можно получить метаданные объекта 1С
Однако написать свою функцию также не представляет труда. В первую очередь необходимо получить метаданные объекта 1С одним из способов:
через функцию Метаданные() объекта
пример синтаксиса: СправочникСсылка.Метаданные()
ДокументСсылка.Метаданные()
через свойство глобального контекста Метаданные
пример синтаксиса: Метаданные.Справочники.[ИмяСправочника]
Метаданные.Документы.[ИмяДокумента]
Далее через свойство “Реквизиты” использовать функцию Найти(). В случае, если реквизит не найден, возвращается значение Неопределено.
Пример 1
Метаданные = Контрагент.Метаданные();
Если Метаданные.Реквизиты.Найти(«Ответственный») = Неопределено Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
Пример 2
Функция ПолучитьОрганизацию(Контрагент, Пользователь)
Если Метаданные.Справочники.Контрагенты.Реквизиты.Найти(«Организация») <> Неопределено Тогда
Возврат Контрагент.Организация;
Иначе
Возврат Пользователь.Организация;
КонецЕсли;
КонецФункции
Описанный алгоритм подходит для случаев проверки наличия реквизита шапки. Но что делать, когда возникает необходимость определить, существует ли реквизит в табличной части 1С (справочника или документа)? Для этого используется следующая конструкция:
Метаданные.Справочники.<ИмяСправочника>.ТабличныеЧасти.Реквизиты.Найти(<ИмяОбъектаПоиска>).
При обработке таблиц значений также возможно выполнить проверку существования колонки – в этом случае применяется метод Свойство(), с помощью которого, помимо основной функции – получения значения элемента по указанному имени, можно проверить, имеется ли указанного свойство.
Пример синтаксиса:
Если НЕ ТекущаяСтрока.Свойство(«Исключить») ИЛИ НЕ ТекущаяСтрока.Исключить Тогда
ЗаполнитьЗначенияСвойств(ТаблицаЗагрузки.Добавить(); ТекущаяСтрока);
КонецЕсли;
Специалист компании ООО «Кодерлайн»
Кондренко Анна Сергеевна
Поиск по табличной части справочника |
Я |
16.06.10 – 09:53
Есть строка, которая содержит наименование элемента табличной части спраовчника.
Как найти этот элемент?
Сам элемент справочника я нашел:
Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(Фамилия, Ложь, ГруппаКонтрагентов);
А вот как теперь найти реквизит табличной части Сведения по его наименованию?
1 – 16.06.10 – 09:55
запросом
2 – 16.06.10 – 09:55
поиск в ТЧ элемента/документа можно выполнить с помощью “Найти”. А так же можно запросом воспользоваться
3 – 16.06.10 – 09:56
(1) и (2) Есть пример?
4 – 16.06.10 – 10:18
Контрагент = Контрагент.Ссылка.Получитьобъект();
//ТабЧасть = Контрагент.ЗатратыНаСвязь;
ТабЧасть = Контрагент.ЗатратыНаСвязь;
НомерСтрокиКонтрагента = ТабЧасть.Найти(НомерАбонента);
Если НомерСтрокиКонтрагента=0 Тогда
// Нет такого номера, создадим
НоваяСтрока = Контрагент.ЗатратыНаСвязь.Добавить();
НоваяСтрока.НомерАбонента = НомерАбонента;
НоваяСтрока.ТарифныйПлан = ТарифныйПлан;
НоваяСтрока.Лимит = Лимит;
Контрагент.Записать();
КонецЕсли;
Не работает.
5 – 16.06.10 – 10:27
А не работает, потому что Найти возвращает Неопределено!
Правильно:
НомерСтрокиКонтрагента = ТабЧасть.Найти(НомерАбонента);
Если НомерСтрокиКонтрагента=Неопределено Тогда
// Нет такого номера, создадим
6 – 16.06.10 – 10:30
(5) а тебе не приходило в голову глянуть в синтакс-помощнике, как правильно обратиться к методу Найти() ??
7 – 16.06.10 – 11:10
(6) А что, помогает?
8 – 16.06.10 – 11:11
(6) Если про результат – то привычка семерочная.
9 – 16.06.10 – 11:11
(7) да, но не всем
10 – 16.06.10 – 18:21
Сделал запросом:
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| Контрагенты.ЗатратыНаСвязь.(
| Ссылка,
| НомерСтроки,
| НомерАбонента,
| СвойЧужой,
| ДополнительныйТариф,
| ТарифныйПлан,
| Лимит
| )
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ЗатратыНаСвязь.НомерАбонента = &НомерАбонента”;
Запрос.УстановитьПараметр(“НомерАбонента”, НомерАбонента);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
Контрагент = Выборка.Контрагент;
СвойЧужой = Выборка.СвойЧужой; // Вот тут и спотыкается – поле объекта не обнаружено, говорит…
ДополнительныйТариф = Выборка.ДополнительныйТариф;
ТарифныйПлан = Выборка.ТарифныйПлан;
Лимит = Выборка.Лимит;
Иначе
Сообщить(“Не найден контрагент по номеру “+НомерАбонента+” на сумму “+Начислено);
Продолжить;
КонецЕсли;
Vladal
11 – 16.06.10 – 18:29
(9) и (6) Ответ был дан в духе вопроса.
Я же не спросил, давайте пиписками меряться, кто больше знает, потому и посыл к синтакс-помощнику был неуместен.
Поиск значения по ссылке в табличной части документа.
Автор Амал, 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: Не следует пытаться привлечь внимание к своему сообщению … рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.