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