При разработке внешних отчетов для «1С:Бухгалтерия 3.0» (БП 3.0) начинающие программисты часто сталкиваются с дилеммой: как правильно построить запрос к документам, чтобы получить детальную информацию по товарам, сохранив при этом возможность фильтрации по специфическим реквизитам, таким как Номенклатурная группа. В этой статье мы подробно разберем, как оптимизировать запрос, правильно обратиться к данным табличной части и настроить гибкие отборы в системе компоновки данных (СКД).
Рассмотрим типичную ошибку при проектировании запроса. Часто разработчики пытаются выбрать данные напрямую из таблицы документов, например, Документ.РеализацияТоваровУслуг. При таком подходе табличная часть «Товары» попадает в результат запроса как вложенная таблица значений. Это крайне неудобно для вывода в отчет и накладывает ограничения на фильтрацию.
Правильный подход — строить запрос, обращаясь непосредственно к табличной части документа. Это позволит нам получить плоскую таблицу, где каждая строка — это отдельная позиция товара с его ценой, количеством и ссылкой на родительский документ. Проанализируем пример корректного выбора источника:
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Ссылка КАК Документ,
РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
РеализацияТоваровУслугТовары.Количество КАК Количество,
РеализацияТоваровУслугТовары.Цена КАК Цена
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
Такая структура гораздо нагляднее и проще в обработке механизмом СКД.
Когда мы выбираем данные из табличной части, у нас возникает вопрос: как вытащить реквизиты, принадлежащие всему документу в целом? В 1С это решается обращением через точку от поля Ссылка. Рассмотрим подробнее, как добавить в нашу выборку контрагента и номер документа:
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Ссылка.Номер КАК Номер,
РеализацияТоваровУслугТовары.Ссылка.Дата КАК Дата,
РеализацияТоваровУслугТовары.Ссылка.Контрагент КАК Контрагент,
РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
РеализацияТоваровУслугТовары.Количество КАК Количество
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Ссылка.Проведен = ИСТИНА
Важное замечание: Каждое обращение через точку (например, Ссылка.Контрагент) создает неявное левое соединение в SQL-запросе. Для небольших отчетов это допустимо, но при работе с огромными массивами данных (десятки тысяч документов) рекомендуется использовать явное соединение с таблицей документа для повышения производительности.
Теперь перейдем к основной задаче: как ограничить выборку конкретной номенклатурной группой. Здесь важно не путать два понятия:
Номенклатура. Для отбора по ним используется оператор В ИЕРАРХИИ.Выясним, как прописать условие в запросе, если нам нужно отобрать товары, принадлежащие определенной группе видов деятельности (Номенклатурной группе):
ГДЕ
РеализацияТоваровУслугТовары.Номенклатура.НоменклатурнаяГруппа = &НоменклатурнаяГруппа
В данном случае &НоменклатурнаяГруппа — это параметр запроса, который мы можем передать программно или через настройки СКД.
Для того чтобы сделать отчет максимально гибким, профессионалы используют специальные конструкции СКД — фигурные скобки {}. Рассмотрим ситуацию: если вы просто напишете ГДЕ в тексте запроса, параметр станет обязательным. Если пользователь не укажет группу, отчет выдаст ошибку или пустой результат.
Проанализируем пример использования расширения СКД:
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Ссылка.Номер КАК Номер,
РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
РеализацияТоваровУслугТовары.Количество КАК Количество
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
{ГДЕ
(РеализацияТоваровУслугТовары.Номенклатура.НоменклатурнаяГруппа = &НоменклатурнаяГруппа)}
Что это дает? Если на вкладке «Настройки» в СКД пользователь установит флажок отбора по номенклатурной группе, система сама добавит условие в итоговый SQL-запрос. Если флажок снят — условие игнорируется, и отчет выводит все данные. Это наиболее правильный метод разработки отчетов на базе СКД.
Если же вы используете обычный запрос (не в СКД), то параметр необходимо установить в коде модуля. Разберем по шагам, как это выглядит в языке 1С:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
| РеализацияТоваровУслугТовары.Номенклатура.НоменклатурнаяГруппа = &Группа";
// Установка значения параметра (например, выбор конкретной группы по наименованию)
НужнаяГруппа = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию("Продукция");
Запрос.УстановитьПараметр("Группа", НужнаяГруппа);
РезультатЗапроса = Запрос.Выполнить();
Посмотрим на ситуацию шире. В конфигурации «Бухгалтерия предприятия 3.0» данные о продажах фиксируются не только в документах, но и в регистрах. Если ваша задача — получить итоговые суммы выручки и себестоимости в разрезе номенклатурных групп, зачастую правильнее обращаться к Регистру бухгалтерии (Хозрасчетный) или специализированным регистрам накопления.
Например, выручка отражается на счете 90.01. Номенклатурная группа там выступает в качестве одного из Субконто. Запрос к виртуальной таблице Обороты регистра бухгалтерии будет работать в разы быстрее, чем перебор всех документов РеализацияТоваровУслуг за несколько лет.
Подведем итог: для простого внешнего отчета по документам используйте выборку из табличной части .Товары, обращайтесь к реквизитам шапки через Ссылка.НаименованиеРеквизита и не забывайте использовать фигурные скобки в тексте запроса СКД для обеспечения гибкости настроек пользователя.