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