Как получить информацию о цене и сумме номенклатуры в заказах клиентов в 1С:УНФ 1.6

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке отчетов в конфигурации 1С:Управление нашей фирмой (УНФ) версии 1.6 программисты часто сталкиваются с неожиданной архитектурной особенностью: привычные регистры накопления, связанные с заказами, не содержат информации о стоимости товаров. В этой статье мы подробно разберем, почему так происходит, где на самом деле хранятся цены и как правильно составить запрос для получения полной информации по заказам клиентов.

Анализ структуры регистров 1С:УНФ 1.6

Для начала давайте проанализируем, почему стандартные отчеты и запросы к регистрам накопления не дают нужного результата. В 1С:УНФ за работу с заказами отвечает регистр накопления ЗаказыПокупателей. Если мы изучим его структуру, то увидим, что он является остаточным и содержит только количественные показатели. Это сделано для оптимизации: система отслеживает только «хвосты» — то есть то, сколько товара осталось отгрузить по конкретному заказу.

Рассмотрим другие регистры, которые могут показаться подходящими на первый взгляд:

  1. Регистр «Запасы и затраты»: Здесь действительно есть поле «Сумма». Однако, как справедливо отмечено в обсуждении, этот регистр фиксирует себестоимость запасов, а не цену продажи, зафиксированную в заказе. Использование этого регистра для отчета о продажах приведет к получению недостоверных данных о выручке.
  2. Регистр «Продажи»: Этот регистр содержит и количество, и сумму, и даже себестоимость. Но есть критическое ограничение: данные в него попадают только в момент проведения документа РасходнаяНакладная или АктВыполненныхРабот. Если заказ клиента еще не отгружен (не исполнен), в регистре «Продажи» информации о нем просто не будет.
  3. Регистр сведений «Цены номенклатуры»: В нем хранятся только установленные прайс-листы. Поскольку в конкретном заказе менеджер может назначить индивидуальную скидку или изменить цену вручную, данные из этого регистра не будут соответствовать реальности конкретной сделки.

Проанализировав ситуацию, мы приходим к единственно верному выводу: суммовые показатели заказа (цена, сумма, сумма НДС) хранятся только внутри самого документа.

Решение проблемы: Обращение к табличным частям

Поскольку агрегированного регистра со стоимостью заказов «в пути» в системе не предусмотрено, нам необходимо строить отчет на основании данных табличных частей документов. Основным источником данных будет выступать табличная часть Запасы документа ЗаказПокупателя.

Рассмотрим пошагово, как спроектировать такой запрос, чтобы он был производительным и точным. Мы будем использовать Схему компоновки данных (СКД), так как это стандарт для разработки отчетов в 1С.

Шаг 1: Получение данных из документа

Первым делом мы должны выбрать все проведенные заказы и развернуть их табличную часть. Нам понадобятся следующие поля: Номенклатура, Количество, Цена, Сумма и ссылка на сам Документ.

Посмотрим на пример базового запроса:


ВЫБРАТЬ
    ЗаказПокупателяЗапасы.Ссылка КАК Заказ,
    ЗаказПокупателяЗапасы.Ссылка.Дата КАК ДатаЗаказа,
    ЗаказПокупателяЗапасы.Ссылка.Контрагент КАК Контрагент,
    ЗаказПокупателяЗапасы.Номенклатура КАК Номенклатура,
    ЗаказПокупателяЗапасы.Количество КАК КоличествоВЗаказе,
    ЗаказПокупателяЗапасы.Цена КАК Цена,
    ЗаказПокупателяЗапасы.Сумма КАК Сумма
ИЗ
    Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы
ГДЕ
    ЗаказПокупателяЗапасы.Ссылка.Проведен = ИСТИНА
    И ЗаказПокупателяЗапасы.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода

Шаг 2: Получение оперативных остатков по заказам

Если ваша задача — вывести информацию только по тем заказам, которые еще не полностью отгружены, нам нужно соединить данные документа с виртуальной таблицей остатков регистра накопления ЗаказыПокупателей. Это позволит нам понять, какая часть заказа уже закрыта накладными, а какая еще ожидает выполнения.

Проанализируем структуру соединения:


ВЫБРАТЬ
    ЗаказЗапасы.Ссылка КАК Заказ,
    ЗаказЗапасы.Номенклатура КАК Номенклатура,
    ЗаказЗапасы.Количество КАК КоличествоПоЗаказу,
    ЗаказЗапасы.Цена КАК Цена,
    ЗаказЗапасы.Сумма КАК СуммаПоЗаказу,
    ЕСТЬNULL(ЗаказыОстатки.КоличествоОстаток, 0) КАК ОстатокКОтгрузке
ИЗ
    Документ.ЗаказПокупателя.Запасы КАК ЗаказЗапасы
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Остатки(&Период, ) КАК ЗаказыОстатки
    ПО ЗаказЗапасы.Ссылка = ЗаказыОстатки.ЗаказПокупателя
        И ЗаказЗапасы.Номенклатура = ЗаказыОстатки.Номенклатура
ГДЕ
    ЗаказЗапасы.Ссылка.Проведен

Важный момент: При использовании левого соединения с таблицей остатков, мы получаем возможность фильтровать отчет. Например, если ОстатокКОтгрузке = 0, значит, данная позиция заказа полностью отгружена.

Нюансы работы с валютами и скидками

При построении серьезного управленческого отчета в УНФ 1.6 нельзя забывать о валюте документа. Заказы могут оформляться в долларах или евро, в то время как учет ведется в рублях. В табличной части Запасы цена и сумма указаны в валюте документа.

Для корректного отображения данных в единой валюте (валюте управленческого учета), нам потребуется умножать полученные суммы на коэффициент курса, который хранится в шапке документа ЗаказПокупателя (реквизиты Курс и Кратность).

Выясним причину, почему это важно: если просто просуммировать колонку Сумма из разных документов, где один в рублях, а другой в тенге, результат будет лишен смысла. Всегда проверяйте реквизит ВалютаДокумента.

Особенности использования СКД для данного отчета

Работая в обучающем стиле, отметим, что для пользователя удобнее всего видеть агрегированные данные. В настройках СКД рекомендуется:

Если вы хотите вычислить сумму остатка к отгрузке в денежном выражении, используйте вычисляемое поле в СКД:

СуммаОстатка = Цена * ОстатокКОтгрузке

Заключение

Мы рассмотрели технические причины отсутствия цен в регистрах заказов УНФ 1.6 и нашли эффективное решение. Помните, что архитектура УНФ нацелена на высокую скорость работы с остатками, поэтому суммовые данные по плановым операциям (заказам) не дублируются в регистрах накопления без необходимости.

Резюмируем наши действия:

  1. Игнорируем регистр ЗаказыПокупателей для получения сумм.
  2. Обращаемся к табличной части Запасы документа ЗаказПокупателя.
  3. При необходимости соединяем ТЧ с остатками регистра ЗаказыПокупателей для анализа выполнения.
  4. Учитываем валюту и статус проведения документа.

Такой подход гарантирует получение точных данных, идентичных тем, что пользователь видит в экранной форме заказа.

← На главную