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

Содержание

Постановка задачи и две логики отбора

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

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

Отборы динамического списка и настройки формы представляют собой отдельный механизм, не равный программному поиску по коллекции строк. Если задача решается в коде, определите объект, критерий отбора и способ проверки. До выбора метода сформулируйте условие обычным языком и подготовьте небольшой тестовый набор.

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

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

Таблица значений существует отдельно от объекта. Ее можно создать в коде, заполнить строками и использовать для сверки или отладки. У такой коллекции может быть другой набор возможностей, поэтому примеры для табличной части объекта не всегда подходят для таблицы значений. В типовых конфигурациях часть механизмов может быть расширена или переопределена.

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

Перебор строк и индекс через соответствие

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

Если проверок много, можно один раз пройти по набору значений и построить соответствие, где ключом будет значение реквизита, а значением флаг наличия, одна строка или массив строк. Проход по табличной части сводится к получению кандидатов по ключу. Индекс избавляет от полного перебора значений на каждой строке, но требует памяти.

При построении индекса нужно решить, что хранить и допустимы ли дубликаты. Если достаточно понять, есть ли совпадение, подойдет флаг. Если нужны сами строки, храните строку или массив строк. Сравнивайте ключи с учетом типа, не сводя ссылки, строки, числа и даты к строковому представлению.

Запросный вариант

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

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

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

Типы, пустые значения и сравнение ссылок

Ссылочные значения сравниваются как ссылки, а не как пользовательское представление или строка. Пустая ссылка, Неопределено и NULL в запросе являются разными сущностями, для них нужно отдельно определить, должны ли они попадать в отбор. Если правило не задано, результат может оказаться неожиданным.

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

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

Проверка результата и чек-лист

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

  • Проверить коллекцию: табличная часть объекта или таблица значений.
  • Сверить логику: любое значение из списка или совпадение по нескольким реквизитам.
  • Проверить типы и пустые варианты, включая пустую ссылку и Неопределено.
  • Убедиться, что пустая коллекция обрабатывается по заданному правилу.
  • Сверить количество строк и отсутствие потерянных или лишних дублей.
  • Повторить прогон и сверить результат с простым перебором.

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

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