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