Меню

1с таблица значений поиск несколько значений поля



Программирование в 1С для всех

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

Поиск в таблице значений 1С 8.3

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

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

Метод Найти таблицы значений 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С в месте с моей книги «Программировать в 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

Источник

Программирование 1С 8.х для начинающих

  • Вы здесь:
  • Главная
  • Статьи
  • Конфигурация
  • Таблица значений
  • Поиск в таблице значений 1С

Конфигурация

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

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

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

Для поиска в таблице значений существует два специальных метода:

1. Найти

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

Чтобы так не мучиться существует следующий метод, который позволяет находить массив подходящих строк:

2. НайтиСтроки

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

Читайте также:  Эпидермис кожи человека состоит из следующих слоев

Чем ещё хорош этот метод, так это то, что он может искать сразу по нескольким колонкам таблицы значений одновременно:

Единственный минус, как видно, нельзя применять другие виды сравнения кроме как «равно»

Источник

1с таблица значений поиск несколько значений поля

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

Метод Найти

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Работа с таблицей значений в 1С 8.3

Таблица значений — специальный объект в программировании 1С 8.3, который позволяет хранить промежуточные значения в виде двумерного массива со строками и колонками. Таблицы значений можно использовать как источник данных в запросе.

Таблицу значений, как любую коллекцию, можно обойти циклом. Например:

Получить нужную строку можно по индексу, например:

Индексы в 1С начинается с 0 (нуля).

Рассмотрим основные свойства и методы этого объекта на примерах.

Создание и использование таблиц значений 1С в примерах

Создать таблицу можно следующим образом:

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

Крайне рекомендую указывать кроме первого еще и второй параметр — тип данных. Он поможет избежать некоторых ошибок.

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания — попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>

После создания колонок добавим несколько новых строк и заполним колонки:

Добавим еще одну колонку:

Которую мы можем заполнить одинаковыми значениями двумя способами — перебором таблицы или функцией ЗаполнитьЗначения:

Сообщим пользователю название первой в списке программы (индекс таблицы значений в 1С начинается с «0»:

Скопировать строку таблицы значений 1С, для примера — первую:

Поиск в таблице значений 1С с ценой «17400» с помощью структуры:

Сортировка программ в таблице по цене:

Количество строк в таблице:

Выгрузить колонку таблицы значений в массив 1С:

Чтобы удалить строку в таблице значений, нужно передать саму строку или индекс в метод «Удалить». Два варианта:

Полностью скопировать таблицу значений 1С можно так:

Просуммировать итог по колонке таблицы значений:

Свернуть таблицу можно так:

При этом в таблице останутся только различные значения из колонки «ВерсияПлатформы» с суммированными полями «Цена».

Ну и напоследок очистим строки таблицы значений 1С 8.3 полностью:

И удалим все колонки:

Если Вы начинаете изучать 1С программирование, рекомендуем наш курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):

Читайте также:  Виды и размеры трубной резьбы характеристики нормы стандарты

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Источник

Поиск в коллекциях значений

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1. При двух и более операциях поиска в объекте ТаблицаЗначений с большим количеством строк (*) рекомендуется:

  • Индексировать колонки, по которым выполняется поиск;
  • Но только те из них, которые обладают хорошей селективностью (т.е. каждому значению этой колонки должно соответствовать небольшое количество строк). В противном случае, индексирование не даст эффекта, либо он будет отрицательным (потрачено лишнее время на индексирование).

* Примечание: следует ориентироваться на 1000 строк и более, а также учитывать не только размер таблицы, в которой выполняется поиск, но и сколько раз он выполняется. Например, даже если таблица относительно небольшая в 100 строк, но поиск по ней выполняется 100 раз, ее тоже имеет смысл индексировать. В то же время, нет смысла индексировать таблицу из-за только одной единственной операции поиска.

2. Для поиска значений предусмотрены два метода объекта ТаблицаЗначений :

  • Найти
  • НайтиСтроки

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

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

ТЗ.Индексы.Добавить(«Колонка1»);
ТЗ.Индексы.Добавить(«Колонка2»);
. = ТЗ.Найти(«найдется все», «Колонка1, Колонка2»); // Индекс НЕ используется!

В этом примере, несмотря на наличие индекса для колонок Колонка1 и Колонка2 , поиск все равно будет выполняться перебором всех строк в таблице значений (что очень ресурсоемко на больших объемах данных).

2.2. При использовании метода НайтиСтроки в таблицах значений с большим количеством строк следует обеспечить, чтобы список полей индекса был точно таким же, как он задан в структуре поиска (порядок полей не важен). В противном случае, индекс не будет задействован, и поиск будет выполняться перебором всех строк в таблице значений (что очень ресурсоемко на больших объемах данных).
Например:

ТЗ.Индексы.Добавить(«Колонка1»); // Индекс1
ТЗ.Индексы.Добавить(«Колонка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. Аналогичный недостаток существует и у объекта ДеревоЗначений , в котором не предусмотрено индексов и поиск выполняется перебором (как в массиве). В указанных выше случаях объект ДеревоЗначений следует заменять индексированным объектом ТаблицаЗначений .

Источник