К статье
Практический материал

Справочники и Данные · 10 мин

Как в 1С сделать выборку по номенклатуре

Как в 1С сделать выборку по номенклатуре: запрос на встроенном языке, отбор в динамическом списке, СКД и консоль запросов. Примеры кода, проверка результата и типичные ошибки.

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

В пользовательском режиме достаточно отбора в списке справочника или настройки отчёта. Для разработчика основной инструмент — запрос к справочнику «Номенклатура» и связанным таблицам (остатки, цены, характеристики). Ниже разобраны оба подхода с конкретными примерами кода и проверками результата.

Важно понимать различие: выборка из справочника возвращает сами карточки товаров, а выборка остатков или цен — это уже обращение к регистрам, где номенклатура выступает измерением. Смешивание этих задач — частая причина «пустых» результатов.

Выборка в пользовательском режиме без программирования

Если нужно просто найти или отфильтровать товары, откройте справочник «Номенклатура» и используйте строку поиска или кнопку «Найти» (обычно Ctrl+F). Поиск работает по наименованию, артикулу и коду. Для поиска по части строки используйте символ подстановки или режим «по части слова», если он включён в настройках поиска.

Для более сложных условий нажмите «Ещё → Настроить список» (в управляемых формах). Здесь можно добавить отбор по любому реквизиту: вид номенклатуры, родительская группа, ставка НДС, единица измерения. Условия комбинируются по «И», при необходимости доступна группировка условий «ИЛИ».

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

Отбор в списке номенклатуры
  1. 1
    Откройте справочник «Номенклатура»
  2. 2
    Нажмите «Ещё → Настроить список»
  3. 3
    Добавьте элемент отбора: поле, вид сравнения, значение
  4. 4
    Примените настройку и проверьте, что список сократился до ожидаемых позиций
  5. 5
    Сохраните вариант отбора, если он понадобится повторно

Выборка запросом к справочнику «Номенклатура»

Основной способ программной выборки — запрос на встроенном языке. Простейший пример: выбрать все элементы справочника, не помеченные на удаление.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка,

| Номенклатура.Наименование КАК Наименование,

| Номенклатура.Артикул КАК Артикул

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| НЕ Номенклатура.ПометкаУдаления

| И НЕ Номенклатура.ЭтоГруппа";

Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл

// обработка строки выборки

КонецЦикла;

Обратите внимание на два условия, которые часто забывают: ЭтоГруппа отсекает папки, а ПометкаУдаления — устаревшие карточки. Без них в выборку попадут группы и «мусорные» позиции, что исказит обработку. Точное имя справочника и реквизитов зависит от конфигурации: в некоторых решениях артикул называется иначе или хранится в дополнительных реквизитах.

Выборка по условию: артикул, наименование, группа

Для поиска по части наименования используйте оператор ПОДОБНО с параметром и символами %:

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.Наименование ПОДОБНО &Фрагмент";

Запрос.УстановитьПараметр("Фрагмент", "%" + СтрокаПоиска + "%");

Для выборки по группе с учётом вложенных подгрупп используйте условие Родитель В ИЕРАРХИИ(&Группа). Это важно: простое равенство родителю вернёт только элементы первого уровня. Для точного совпадения по артикулу применяйте равенство с параметром — так запрос использует индекс и работает быстро.

Выборка остатков и цен по номенклатуре

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

Запрос.Текст =

"ВЫБРАТЬ

| Остатки.Номенклатура КАК Номенклатура,

| Остатки.КоличествоОстаток КАК Остаток

|ИЗ

| РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК Остатки

|ГДЕ

| Остатки.КоличествоОстаток > 0";

Имя регистра зависит от конфигурации: это может быть «ТоварыНаСкладах», «ОстаткиНоменклатуры» или другой регистр. Уточните состав метаданных в конфигураторе. Для цен используется регистр сведений (например, «ЦеныНоменклатуры») с виртуальной таблицей «СрезПоследних» — она возвращает актуальную цену на дату.

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

bsl
ВЫБРАТЬ Ном.Ссылка, ЕСТЬNULL(Ост.КоличествоОстаток, 0) КАК Остаток ИЗ Справочник.Номенклатура КАК Ном ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Ост ПО Ном.Ссылка = Ост.Номенклатура

Выборка через СКД и консоль запросов

Система компоновки данных (СКД) подходит, когда выборку нужно показать пользователю в виде отчёта с настраиваемыми отборами. Запрос пишется один раз в схеме компоновки, а пользователь сам добавляет отборы по номенклатуре, группе, складу через знакомый интерфейс. Это снимает с разработчика необходимость программировать форму отбора.

Для разовых задач и отладки удобна консоль запросов — внешняя обработка, позволяющая выполнить запрос и сразу увидеть результат таблицей. В некоторых конфигурациях консоль встроена, в других её добавляют отдельно. Сначала отладьте текст запроса в консоли, убедитесь в корректности данных, и только потом переносите его в код модуля.

Динамический список на форме — ещё один вариант: в его свойствах указывается произвольный запрос, а отбор по номенклатуре пользователь задаёт стандартными средствами. Это типовой подход для подбора товаров в документах.

Способы выборки: что выбрать

Отбор в списке (пользовательский режим)

Быстро и без кода; подходит для разового поиска, но не для обработки данных

Запрос в коде

Полный контроль и обработка результата; требует прав на изменение конфигурации или внешней обработки

СКД

Гибкие отчёты с отборами для пользователя; избыточна для простых задач

Консоль запросов

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

Проверка результата и производительность

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

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

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

Контрольные точки

Как проверить результат выборки

Количество строк
Норма

Совпадает с отбором в списке справочника

Тревожный признак

Меньше ожидаемого — проверьте условия по пометке удаления и группам

Параметры запроса
Норма

Все параметры установлены до Выполнить()

Тревожный признак

Ошибка «Параметр не найден» или пустой результат

Поля в выборке
Норма

Все нужные реквизиты выбраны в тексте запроса

Тревожный признак

Обращение через точку к реквизитам в цикле — медленно

Типичные ошибки и ограничения

Наиболее распространённые проблемы при выборке по номенклатуре связаны не с синтаксисом, а с данными и структурой конфигурации. Разберите их до того, как искать «ошибку платформы».

Типичные ошибки
01
Забыто условие НЕ ЭтоГруппа — в выборку попадают папки и ломают дальнейшую обработку
02
Условие Родитель = &Группа вместо В ИЕРАРХИИ — теряются товары из подгрупп
03
Поиск по наименованию без учёта регистра и лишних пробелов — позиция «не находится», хотя существует
04
Внутреннее соединение с остатками скрывает номенклатуру без движений — нужно левое соединение и ЕСТЬNULL
05
Конкатенация строки поиска прямо в текст запроса — ошибки на наименованиях с кавычками

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

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

Итог

Что важно запомнить

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

Частые вопросы

Как выбрать номенклатуру по точному артикулу?

Используйте условие равенства с параметром: ГДЕ Номенклатура.Артикул = &Артикул. Учтите, что артикул может храниться с пробелами или в другом регистре — при необходимости применяйте функции СОКРЛП и ВЫРАЗИТЬ. В некоторых конфигурациях артикул вынесен в дополнительные реквизиты, тогда запрос строится к таблице дополнительных реквизитов справочника.

Почему запрос возвращает пустой результат, хотя товар есть?

Чаще всего причины: не установлен параметр, условие по наименованию не совпадает из-за регистра или пробелов, отбор по родителю без ИЕРАРХИИ не захватывает подгруппы, либо у текущего пользователя нет прав на таблицу. Проверьте запрос в консоли запросов под администратором и сравните с отбором в списке.

Как выбрать номенклатуру вместе с характеристиками?

Если ведётся учёт по характеристикам, присоединяйте справочник «ХарактеристикиНоменклатуры» (имя зависит от конфигурации) по владельцу. Для остатков характеристика обычно является измерением регистра — тогда она доступна прямо в виртуальной таблице остатков.

Чем выборка через НайтиПоНаименованию отличается от запроса?

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

Можно ли сделать выборку по номенклатуре без прав разработчика?

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