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

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

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

Базовая структура запроса к справочнику

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

Для эффективной работы необходимо сразу отбирать только нужные поля. Это снижает нагрузку на сеть и память клиента. Обычно разработчика интересуют ссылочное поле, наименование, артикул и вид номенклатуры. Использование псевдонимов в секции ВЫБРАТЬ делает код более читаемым и упрощает дальнейшую обработку результатов в коде 1С.

⚠️ Внимание: Никогда не используйте конструкцию ВЫБРАТЬ * в промышленной эксплуатации. Выборка всех полей, включая табличные части и служебные реквизиты, может увеличить объем передаваемых данных в десятки раз.

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

ВЫБРАТЬ

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

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

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

Номенклатура.ВидНоменклатуры КАК Вид

ИЗ

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

💡

Используйте псевдонимы таблиц (например, "КАК Номенклатура") даже в простых запросах. Это упрощает масштабирование кода при добавлении соединений (JOIN) в будущем.

Фильтрация данных с использованием параметров

Статические выборки полезны редко, чаще всего требуется динамическая фильтрация. Язык запросов 1С позволяет использовать параметры, значения которых подставляются перед выполнением. Это самый безопасный и производительный способ ограничения выборки. Параметры защищают от SQL-инъекций и позволяют платформе строить оптимальные планы выполнения.

Фильтрация может осуществляться по любым скалярным полям справочника. Наиболее распространенные сценарии включают отбор по виду номенклатуры (например, только "Товары"), по наличию артикула или по признаку ведения учета по характеристикам. Условие ГДЕ поддерживает все стандартные операторы сравнения и логические связки.

При работе со строковыми полями, такими как Наименование или Артикул, часто возникает необходимость поиска по части строки. Для этого используется оператор ПОДОБНО с символами подстановки. Однако стоит помнить, что использование подстановки в начале строки (например, %товар) может отключить использование индексов и замедлить работу базы данных.

ВЫБРАТЬ

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

Номенклатура.Наименование

ИЗ

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

ГДЕ

Номенклатура.ВидНоменклатуры = &ВидНоменклатуры

И Номенклатура.ПометкаУдаления = ЛОЖЬ

И Номенклатура.Артикул ПОДОБНО &МаскаАртикула

📊 Какой метод фильтрации вы используете чаще всего?
Параметры запроса (&Параметр)
Метод ПостроительЗапроса
Фильтрация в коде после выборки
СКД в отчете

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

Работа с иерархией и группами номенклатуры

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

Ключевым оператором здесь является В ИЕРАРХИИ. Он позволяет выбрать все элементы, находящиеся в подчинении у определенной группы, включая саму группу (опционально). Это незаменимый инструмент для формирования отчетов по разделам каталога или ограничения доступа пользователей к определенным веткам номенклатуры.

Оператор Описание действия Пример использования
В ИЕРАРХИИ Выбирает элемент и всех его потомков ГДЕ Ссылка В ИЕРАРХИИ &Группа
В ГРУППЕ Выбирает только непосредственных потомков ГДЕ Родитель = &Группа
ЭТО ГРУППА Фильтрация только папок (не элементов) ГДЕ ЭТО ГРУППА

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

Нюансы работы с В ИЕРАРХИИ

Оператор "В ИЕРАРХИИ" может работать медленнее на очень глубоких деревьях в некоторых СУБД. Если производительность критична, рассмотрите денормализацию данных или использование регистров сведений для хранения пути к группе.

Часто возникает задача отбора элементов, которые не имеют вложенных элементов (листья дерева). Это решается через проверку наличия ссылок на данный элемент в поле Родитель других записей или с использованием специальных условий платформы, в зависимости от версии конфигурации.

Выборка дополнительных реквизитов и свойств

Современные конфигурации 1С активно используют механизм дополнительных реквизитов и сведений (ДР и ДС). Эти данные хранятся не в основных таблицах справочника, а в специальных регистрах сведений или табличных частях. Их получение требует соединения (ЛЕВОЕ СОЕДИНЕНИЕ) с соответствующими виртуальными или физическими таблицами.

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

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

ВЫБРАТЬ

Ном.Ссылка,

Ном.Наименование,

ДР.Значение КАК Цвет

ИЗ

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

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДР

ПО (Ном.Ссылка = ДР.Ссылка И ДР.Имя = "Цвет")

⚠️ Внимание: При выборке дополнительных реквизитов убедитесь, что тип значения соответствует ожидаемому. Поле Значение имеет составной тип, и некорректное приведение типов может вызвать ошибки выполнения или пустые результаты.

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

💡

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

Оптимизация и индексация выборок

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

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

Избегайте применения функций к полям в условии ГДЕ. Выражение вида ГДЕ ЛЕВ(Артикул, 3) = "АБР" не позволит базе данных использовать индекс по полю Артикул, так как функцию нужно применять к каждой строке таблицы. Правильный вариант: ГДЕ Артикул ПОДОБНО "АБР%".

  • 🚀 Используйте точное соответствие (=) вместо ПОДОБНО везде, где это возможно.
  • 🚀 Проверяйте план выполнения запроса через консоль запросов для анализа используемых индексов.
  • 🚀 Избегайте соединения больших таблиц без условий отбора по ключевым полям.

Также стоит упомянуть о блокировках. При выборке данных в режиме предприятия по умолчанию устанавливаются разделяющие блокировки. В редких случаях, когда нужна максимальная скорость чтения "грязных" данных (например, для аналитики в реальном времени), можно использовать режим НЕ ЖДАТЬ БЛОКИРОВКИ ДАННЫХ, но это требует осторожности.

Использование Системы Компоновки Данных (СКД)

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

В СКД выборка настраивается на вкладке "Набор данных". Здесь вы указываете тот же запрос, что и в коде, но добавляете параметры, доступные для изменения пользователем. Поля отбора (Артикул, Группа, Вид) выносятся в пользовательские настройки, что делает отчет универсальным.

☑️ Настройка СКД для номенклатуры

Выполнено: 0 / 4

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

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

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

Для выборки по списку значений (например, массиву артикулов) в запросе используется оператор В. Параметр должен иметь тип СписокЗначений. Пример: ГДЕ Артикул В (&СписокАртикулов). В коде 1С вы заполняете список значениями перед установкой параметра.

Почему выборка работает медленно на большой базе?

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

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

Да, для этого в запросе используется условие ГДЕ ЭТО ГРУППА = ЛОЖЬ. Это позволит отфильтровать все папки иерархии и оставить только конечные элементы номенклатуры.

Как получить историю изменений цен при выборке?

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