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

1. user798107 22.07.17 08:24 Сейчас в теме
Всем хорошего дня.

Обучаюсь программированию. Разбираю метод "НайтиСтроки". Написал следующий код:

ТекТовар = Справочники.Номенклатура.НайтиПоНаименованию("Стул высокий");
	ПараметрыОтбора = Новый Структура;
	ПараметрыОтбора.Вставить("Товар", ТекТовар);
	НЗ = Товары.НайтиСтроки(ПараметрыОтбора);
	
	//НЗ = Товары.Найти(ТекТовар, "Товар");
	
	Если НЗ <> Неопределено Тогда
		
		Сообщить("Верно");
	Иначе
		Сообщить("Нет");
	КонецЕсли;
	
Показать


В этом случае всегда срабатывает "тогда", какое бы значение не стояло в колонке "товар". Отладчиком смотрю "НЗ" является "массивом", а значит эта переменная не содержит значение "стул высокий". Получается этим методом нельзя найти значение в колонке и есть только метод "найти" для этого?
+
По теме из базы знаний
Найденные решения
12. starik-2005 3036 22.07.17 10:54 Сейчас в теме
(11)
В чём причина?
Причина в том, что программировать Вы не умеете. Но это решается. В качестве примера того, как надо (а тут миллион вариантов), можно привести следующее:
  Нашли = Ложь;
  Для каждого Ст ИЗ Товары.НайтиСтроки(Новый Структура("Товар", "Стул")) Цикл
    Сообщить("Верно");
    Нашли = Истина;
  КонецЦикла;
  Если НЕ Нашли Тогда Сообщить("Нет") КонецЕсли;
Михаська; +1
5. lefthander 22.07.17 10:01 Сейчас в теме
(1)НЗ по определению не может быть Неопределено. так как возвращается массив строк. Он может содержать строки а может и не содержать. Правильная проверка
Если НЗ.КоличествоСтрок() > 0 тогда
+
8. Alex_E 2353 22.07.17 10:09 Сейчас в теме
(6) В (5) правильная проверка, НЗ всегда массив, или пустой (НЗ.Количество() = 0) или там есть строки
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. alxarz 31 22.07.17 08:34 Сейчас в теме
(1)
какое бы значение не стояло в колонке "товар". Отладчиком смотрю "НЗ" является "массивом", а значит эта переменная не содержит значение "стул высокий". Получается этим методом нельзя найти значение в колонке и есть только метод "найти" для этого?

описание вроде как отвечает на все поставленные вопросы, или я что-то не понимаю?

НайтиСтроки (FindRows)
Синтаксис:

НайтиСтроки(<ПараметрыОтбора>)
Параметры:

<ПараметрыОтбора> (обязательный)

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

Тип: Массив.
Массив строк таблицы значений, соответствующих условиям поиска.
Замечание! Массив хранит ссылки на строки таблицы значений, то есть при изменении строки в таблице, значение в массиве тоже будет измененным.
Описание:

Осуществляет поиск строк таблицы значений, отвечающих заданным условиям поиска.
Показать
+
3. user798107 22.07.17 08:46 Сейчас в теме
(2) Когда "вычисляю значение" "ПараметрыОтбора", в отладчике , то там находится значение "Стул высокий", но почему тогда программа его не определяет? И срабатывает при любом значении в колонке "товар" - условие "тогда". Получается метод "НайтиСтроки" нужен только для того, чтобы пробежаться циклом по массиву?
+
5. lefthander 22.07.17 10:01 Сейчас в теме
(1)НЗ по определению не может быть Неопределено. так как возвращается массив строк. Он может содержать строки а может и не содержать. Правильная проверка
Если НЗ.КоличествоСтрок() > 0 тогда
+
7. user798107 22.07.17 10:08 Сейчас в теме
(5) Спасибо. Теперь всё понятно.
+
9. user798107 22.07.17 10:20 Сейчас в теме
(5) Такого метода "КоличествоСтрок" - нет, только "Количество".
+
15. lefthander 25.07.17 09:30 Сейчас в теме
(9)Да, конечно, понадеялся на память и не проверил.
+
4. Alex_E 2353 22.07.17 09:41 Сейчас в теме
Найти строки нужно для того, чтобы получить ВСЕ строки с переданным отбором, будете вы "бегать" по массиву циклом, или что-то ещё - решать Вам... Просто возвращается массив (пустой, если по отбору ничего не найдено) строк, в которых выполнено условие, что имеется ввиду под
срабатывает при любом значении в колонке "товар" - условие "тогда"
непонятно. В Вашем случае отбираются все строки, в которых в колонке "товар" есть ссылка на элемент номенклатуры с наименованием "Стул высокий".
+
6. user798107 22.07.17 10:06 Сейчас в теме
(4) Спасибо. Значит для метода "НайтиСтроки" не правильно писать такое условие?

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


Потому что всегда (при любом значение (Стул, Стол и т.п.)) в колонке "Товар" срабатывает "тогда", т.е. сообщается "Верно".
+
8. Alex_E 2353 22.07.17 10:09 Сейчас в теме
(6) В (5) правильная проверка, НЗ всегда массив, или пустой (НЗ.Количество() = 0) или там есть строки
+
10. starik-2005 3036 22.07.17 10:21 Сейчас в теме
Лично я предпочитаю делать так:
  Для каждого Ст ИЗ ТЗ.НайтиСтроки(Новый Структура("Поле", Значение)) Цикл
    // что мне надо сделать с найденной строкой
  КонецЦикла;
+
11. user798107 22.07.17 10:45 Сейчас в теме
(10) Сделал тип "строка" у колонки "Товар". И написал следующее условие:

Отбор = Новый Структура;
	Отбор.Вставить("Товар", "Стул");
	НЗ = Товары.НайтиСтроки(Отбор);
		//НЗ = Товары.НайтиСтроки("Товар", "Стул");
		Для Каждого Стр ИЗ НЗ Цикл
	Если НЗ.Количество() > 0 Тогда
		Сообщить("Верно");
	Иначе
		Сообщить("Нет");
	КонецЕсли;
КонецЦикла;
Показать


В этом случае, когда прописываю в колонке "Товар" - Стул, то выскакивает сообщение "Верно", но если оставляю пустым, либо пишу другое слово - ничего не происходит, т.е. не срабатывает "иначе". В чём причина?
+
12. starik-2005 3036 22.07.17 10:54 Сейчас в теме
(11)
В чём причина?
Причина в том, что программировать Вы не умеете. Но это решается. В качестве примера того, как надо (а тут миллион вариантов), можно привести следующее:
  Нашли = Ложь;
  Для каждого Ст ИЗ Товары.НайтиСтроки(Новый Структура("Товар", "Стул")) Цикл
    Сообщить("Верно");
    Нашли = Истина;
  КонецЦикла;
  Если НЕ Нашли Тогда Сообщить("Нет") КонецЕсли;
Михаська; +1
14. user798107 22.07.17 13:30 Сейчас в теме
(12) Спасибо за ваш вариант. Я никогда раньше не программировал. 1С это мой первый язык, которому я обучаюсь. Поэтому конечно совершаю ошибки. Думал цикл нужен, чтобы значение перебрать в колонке и найти верное. Конечно метод "Найти" в поиске значения практичнее и правильнее.
+
13. Alex_E 2353 22.07.17 10:55 Сейчас в теме
Зачем тут
Для Каждого Стр ИЗ НЗ Цикл
???? Вы не понимаете, что делаете? В этом цикле идет перебор строк массива. Коли потом пишем "Если", цикл не нужен
starik-2005; +1
16. platon_ 10 25.07.17 10:57 Сейчас в теме
Тут человеку надо разобраться со коллекциями значений, что и куда.

Заодно подумайте вот над какой задачкой)

Есть ТЗ с большим количеством строк. К ТЗ применена сортировка по нескольким колонкам.
Сохранится ли сортировка в массиве после НайтиСтроки()?
+
17. starik-2005 3036 25.07.17 18:15 Сейчас в теме
(16)
Сохранится ли сортировка в массиве после НайтиСтроки()?
Смотря как строки ищутся. Если простым сканом таблицы, то сохранится. Лично я не в курсе, как может быть иначе, ибо вряд ли 1С знает, что таблица упорядочена.
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот