Как составить запрос в 1С:Розница для получения номенклатуры, цен и штрихкодов?

Программист 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

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

Этап 1: Базовое построение запроса

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

Рассмотрим структуру запроса, в котором мы соединяем справочник Номенклатура с регистрами сведений:


ВЫБРАТЬ
    Номенклатура.Наименование КАК Наименование,
    Номенклатура.Родитель КАК ГруппаНоменклатуры,
    ЕСТЬNULL(Штрихкоды.Штрихкод, "") КАК Штрихкод,
    ЕСТЬNULL(Цены.Цена, 0) КАК Цена
ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды 
        ПО Штрихкоды.Владелец = Номенклатура.Ссылка
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены 
        ПО Цены.Номенклатура = Номенклатура.Ссылка
ГДЕ
    Номенклатура.Родитель В ИЕРАРХИИ (&Родитель)

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

Этап 2: Устранение ошибки «Неоднозначное поле»

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

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


ВЫБРАТЬ
    СпрНоменклатура.Наименование КАК Наименование,
    СпрНоменклатура.Родитель КАК Группа
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура

Если вы переименовали таблицу в разделе ИЗ ... КАК ..., убедитесь, что во всем остальном тексте запроса вы используете именно этот псевдоним.

Этап 3: Оптимизация производительности запроса

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

  1. Использование временных таблиц (ВТ): Вместо того чтобы соединять все сразу, сначала отберите нужную номенклатуру, поместите её во временную таблицу через конструкцию ПОМЕСТИТЬ ВТ_Номенклатура, а затем соединяйте эту таблицу с регистрами.
  2. Отбор в параметрах виртуальных таблиц: Виртуальные таблицы (например, СрезПоследних) должны содержать отборы в своих скобках. Это ограничивает объем данных, которые система считывает с диска. Например: РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ВидЦены = &ВидЦены).
  3. Индексация: Убедитесь, что соединения происходят по полям, которые являются индексированными (ссылки, измерения регистров). Избегайте вычислений внутри условия ПО.

Пример профессионального подхода к запросу

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


// Сначала получаем остатки
ВЫБРАТЬ
    ТоварыНаСкладах.Номенклатура,
    ТоварыНаСкладах.КоличествоОстаток
ПОМЕСТИТЬ ВТ_Остатки
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладах;

// Затем соединяем их с регистрами сведений
ВЫБРАТЬ
    ВТ_Остатки.Номенклатура,
    Штрихкоды.Штрихкод
ИЗ
    ВТ_Остатки КАК ВТ_Остатки
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды 
        ПО Штрихкоды.Владелец = ВТ_Остатки.Номенклатура

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

← На главную