получил две таблицы значений и пытаюсь в цикле найти значения одной таблице в другой, пытался через оба метода — Найти() и НайтиСтроки() оба метода выдают неопределенно. таблицу открываю-значение есть. Ниже оба кусочка кода и скрины структуры таблиц.
Код 1C v 8.х Код 1C v 8.х Код 1C v 8.х Код 1C v 8.х Код 1C v 8.х Код 1C v 8.х
Код 1C v 8.х Код 1C v 8.х Код 1C v 8.х Код 1C v 8.х Код 1C v 8.х
Yandex
Возможно, вас также заинтересует
DJ_Serega
10.11.2014 17:37
Ответ № 1
1. Оба метода не могут возвращать «Неопределено».
2. Найти(ЗначениеПоиска, «ИмяКолонки») — возвращает неопределено если не нашло
3. НайтиСтроки(Новый Структура(«ИмяКолонки», Значение)) — всегда возвращает Массив. А вот сколько в массиве будет значений это уже другой вопрос.
4. Типы значений какие?
mik_mihka
10.11.2014 17:45
Ответ № 2
mik_mihka
10.11.2014 17:46
Ответ № 3
в том то и дело, что не находит ничего, хотя в таблицах значения присутствуют.
DJ_Serega
10.11.2014 18:12
Ответ № 4
(3) поиск выполняется по ТОЧНОМУ соответсвию. Пробелы играют роль. На счет регистра букв не знаю, но скорее всего тоже учитываются.
Не может оно не находить если значения есть
mik_mihka
10.11.2014 18:32
Ответ № 5
вот и я не пойму — почему не ищет. А строку с наименованием я с карточки товара беру, а она одна.
mik_mihka
10.11.2014 19:41
Ответ № 6
интересно, что не так?
E_Migachev
10.11.2014 21:24
Ответ № 7
попробуй Если ТекРеализация.Найти(СокрЛП(товар.Номенклатура.Наименование))= неопределено тогда
Wertuoz
11.11.2014 04:47
Ответ № 8
Для эксперемента можно в цикле посмотеть и сравнить . может и выясниться почему не находит. если как говорите стороки то это всегда весело
Wertuoz
11.11.2014 04:54
Ответ № 9
А зачем там колонка написана.. кок будто ты колонку ищешь. должно быть просто вроде ТЗ.Найти()
DJ_Serega
11.11.2014 07:35
Ответ № 10
Он сравнивает НЕПРАВИЛЬНО!
Имхо, нужно прочитать азы программирования или на курсы сходить.
1. ТекР.Колонки.Найти() — это поиск КОЛОНОК а не строк.
2. Что бы найти в строках я писал в (1), но не знал что все так плохо.
В дополнение к (1):
ТекР.Найти(ЗначениеПоиска, «ИмяКолонки») — возвращает неопределено если не нашло
ТекР.НайтиСтроки(Новый Структура(«ИмяКолонки», Значение)) — всегда возвращает Массив. А вот сколько в массиве будет значений это уже другой вопрос.
3. В табличных частях (как сказано в (2)), в колонках Номенклатура тип строка. А значит обратиться к реквизиту номенклатуре НЕЛЬЗЯ.
Тоесть если тип значения ЭлементНоменклатуры будет СправочникСсылка, тогда можно написать ЭлементНоменклатуры.Наименование иначе ничего не получится.
DJ_Serega
11.11.2014 07:36
Ответ № 11
(9) так отож. Даже не вроде, а так и должно быть
mik_mihka
12.11.2014 07:14
Ответ № 12
Колонки я пытался найти в ТЗ, сам текст выше без колонок. Нашел значение убрав «наименование», получается я строку с сылкой сравнивал
mik_mihka
12.11.2014 07:16
Ответ № 13
Спасибо за помощь.
DJ_Serega
12.11.2014 12:03
Ответ № 14
Ну тогда на правах никого закрываю тему
Источник
Поиск в коллекциях значений
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. При двух и более операциях поиска в объекте ТаблицаЗначений с большим количеством строк (*) рекомендуется:
Индексировать колонки, по которым выполняется поиск;
Но только те из них, которые обладают хорошей селективностью (т.е. каждому значению этой колонки должно соответствовать небольшое количество строк). В противном случае, индексирование не даст эффекта, либо он будет отрицательным (потрачено лишнее время на индексирование).
* Примечание: следует ориентироваться на 1000 строк и более, а также учитывать не только размер таблицы, в которой выполняется поиск, но и сколько раз он выполняется. Например, даже если таблица относительно небольшая в 100 строк, но поиск по ней выполняется 100 раз, ее тоже имеет смысл индексировать. В то же время, нет смысла индексировать таблицу из-за только одной единственной операции поиска.
2. Для поиска значений предусмотрены два метода объекта ТаблицаЗначений :
При поиске значения в одной колонке таблицы значений оба метода одинаково эффективно используют индекс, если он был задан (см. п.1). Однако при поиске значения сразу по нескольким (или по всем) колонкам необходимо учитывать следующие ограничения.
2.1. Не следует использовать метод Найти для поиска по нескольким колонкам в таблицах значений с большим количеством строк, даже если проиндексированы все колонки, обладающие хорошей селективностью. Это ограничение вызвано тем, что метод Найти выполняет поиск с применением индекса только по одному полю. Например:
ТЗ.Индексы.Добавить(«Колонка1»); ТЗ.Индексы.Добавить(«Колонка2»); . = ТЗ.Найти(«найдется все», «Колонка1, Колонка2»); // Индекс НЕ используется!
В этом примере, несмотря на наличие индекса для колонок Колонка1 и Колонка2 , поиск все равно будет выполняться перебором всех строк в таблице значений (что очень ресурсоемко на больших объемах данных).
2.2. При использовании метода НайтиСтроки в таблицах значений с большим количеством строк следует обеспечить, чтобы список полей индекса был точно таким же, как он задан в структуре поиска (порядок полей не важен). В противном случае, индекс не будет задействован, и поиск будет выполняться перебором всех строк в таблице значений (что очень ресурсоемко на больших объемах данных). Например:
. = ТЗ.НайтиСтроки(Новый Структура(«Колонка1, Колонка2 «, «Ищу1″,»Ищу2»)); // Индекс НЕ используется! . = ТЗ.НайтиСтроки(Новый Структура(«Колонка1», «Ищу1») ); // OK — используется Индекс1 . = ТЗ.НайтиСтроки(Новый Структура(«Колонка2», «Ищу2») ); // OK — используется Индекс2
. = ТЗ.НайтиСтроки(Новый Структура(«Колонка1, Колонка2», «Ищу1″,»Ищу2»)); // OK — индекс используется . = ТЗ.НайтиСтроки(Новый Структура(«Колонка2, Колонка1», «Ищу2″,»Ищу1»)); // OK — индекс используется . = ТЗ.НайтиСтроки(Новый Структура(«Колонка1», «Ищу1») ); // Индекс НЕ используется! . = ТЗ.НайтиСтроки(Новый Структура(«Колонка2», «Ищу2») ); // Индекс НЕ используется!
2.3. Аналогичное ограничение действует и для метода Скопировать таблицы значений при вызове с параметром ПараметрыОтбора ( Структура ).
3. В тех случаях, когда для таблицы значений применяется сортировка по колонкам, содержащим ссылочные значения, необходимо учитывать, что при этом для каждой из этих колонок для всех строк таблицы значений системой будет выполнено обращение к информационной базе за представлением этой ссылки.
В тех случаях, когда требуется сортировка по наименованию – сразу, на этапе заполнения, добавлять в таблицу дополнительные колонки с представлениями, и сортировку выполнять уже по ним. Если, конечно, это не вызовет аналогичных многократных обращений к информационной базе;
В остальных случаях – сортировать «по ссылке», а не по представлению. Для этого в методе Сортировать следует использовать объект СравнениеЗначений :
ОбъектСравнения = Новый СравнениеЗначений; ТаблицаДокументов.Сортировать(«Дата,Ссылка», ОбъектСравнения);
Особенно это важно для таблиц с большим количеством (несколько сотен и тысяч) строк, в алгоритмах критических ко времени исполнения.
3.1. При поиске в объекте Массив с большим количеством элементов(*) следует отказаться от массива в пользу:
объекта Соответствие , если не важен порядок элементов;
индексированной ТаблицаЗначений , если порядок элементов значим.
Это обусловлено тем, что в указанных случаях поиск занимает в большинстве случаев константное время, а в массиве поиск выполняется перебором и поэтому пропорционален количеству элементов.
* Примечание: следует ориентироваться на 1000 элементов и более, а также учитывать не только размер массива, но и сколько раз выполняется поиск. Например, если поиск выполняется многократно, в частности, в цикле, то эта рекомендация также действительна для массивов меньшего размера (до 1000 элементов). Особого внимания требуют универсальные механизмы, которые могут применяться на сколь угодно больших объемах данных.
3.2. При необходимости обеспечить уникальность элементов в большом массиве следует однократно в конце алгоритма вызвать функцию СвернутьМассив или процедуру ДополнитьМассив с параметром ТолькоУникальныеЗначения = Истина (модуль ОбщегоНазначения Библиотеки стандартных подсистем).
4. Аналогичный недостаток существует и у объекта ДеревоЗначений , в котором не предусмотрено индексов и поиск выполняется перебором (как в массиве). В указанных выше случаях объект ДеревоЗначений следует заменять индексированным объектом ТаблицаЗначений .