В процессе разработки отчетов или обработок в 1С:Розница часто возникает необходимость объединить данные из нескольких таблиц: справочника номенклатуры, регистра сведений со штрихкодами и регистра сведений с ценами. Разберем, как правильно построить такой запрос, избежать типичных ошибок и сделать код производительным.
Для того чтобы получить связную информацию, нам необходимо использовать механизм ЛЕВОЕ СОЕДИНЕНИЕ. Это позволит нам вывести список всей номенклатуры, даже если для каких-то позиций штрихкод или цена еще не заданы.
Рассмотрим структуру запроса, в котором мы соединяем справочник Номенклатура с регистрами сведений:
ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование,
Номенклатура.Родитель КАК ГруппаНоменклатуры,
ЕСТЬNULL(Штрихкоды.Штрихкод, "") КАК Штрихкод,
ЕСТЬNULL(Цены.Цена, 0) КАК Цена
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
ПО Штрихкоды.Владелец = Номенклатура.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены
ПО Цены.Номенклатура = Номенклатура.Ссылка
ГДЕ
Номенклатура.Родитель В ИЕРАРХИИ (&Родитель)
Обратите внимание на использование функции ЕСТЬNULL. Она необходима для того, чтобы вместо значения NULL (которое возникает при отсутствии записей в регистрах) мы получали пустую строку или ноль. Это значительно упрощает последующую обработку данных в коде.
Одной из частых проблем при написании запросов является ошибка «Неоднозначное поле». Она возникает, когда в запросе задействовано несколько таблиц, содержащих одинаковые имена полей (например, Наименование или Родитель), и система не понимает, к какой именно таблице вы обращаетесь.
Как исправить: используйте псевдонимы таблиц. Вместо обращения просто к Номенклатура, давайте каждой таблице уникальный алиас:
ВЫБРАТЬ
СпрНоменклатура.Наименование КАК Наименование,
СпрНоменклатура.Родитель КАК Группа
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
Если вы переименовали таблицу в разделе ИЗ ... КАК ..., убедитесь, что во всем остальном тексте запроса вы используете именно этот псевдоним.
Если ваш запрос выполняется слишком долго, проблема обычно кроется в способе соединения таблиц или отсутствии отборов в виртуальных таблицах. Для работы с большими данными следуйте этим рекомендациям:
ПОМЕСТИТЬ ВТ_Номенклатура, а затем соединяйте эту таблицу с регистрами.СрезПоследних) должны содержать отборы в своих скобках. Это ограничивает объем данных, которые система считывает с диска. Например: РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ВидЦены = &ВидЦены).ПО.Для сложной выборки с остатками и штрихкодами, используйте временные таблицы для изоляции логики:
// Сначала получаем остатки
ВЫБРАТЬ
ТоварыНаСкладах.Номенклатура,
ТоварыНаСкладах.КоличествоОстаток
ПОМЕСТИТЬ ВТ_Остатки
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладах;
// Затем соединяем их с регистрами сведений
ВЫБРАТЬ
ВТ_Остатки.Номенклатура,
Штрихкоды.Штрихкод
ИЗ
ВТ_Остатки КАК ВТ_Остатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
ПО Штрихкоды.Владелец = ВТ_Остатки.Номенклатура
Применяя эти методы, вы добьетесь максимальной скорости работы ваших отчетов и обработок. Постоянная практика написания запросов через консоль запросов 1С позволит вам быстро освоить структуру базы данных и принципы построения эффективного кода.