Почему удваивается розничная сумма в отчете ТОРГ-29 в 1С:Розница и как это исправить?

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

При формировании товарного отчета ТОРГ-29 в конфигурации «1С:Розница 2.2» (включая отраслевые решения, такие как «Розница 8. Аптека») пользователи иногда сталкиваются с некорректным расчетом суммовых показателей. Поле «Сумма по цене продажи» выводится правильно, однако колонка «Розничная сумма» показывается ровно вдвое больше реального значения.

Рассмотрим подробнее причины возникновения этой ошибки и разберем по шагам алгоритм её диагностики и устранения.

Выясним причину ошибки

В отчете ТОРГ-29 вычисление розничной суммы прихода обычно выполняется прямо в тексте запроса путем перемножения цены из регистра сведений на количество поступившего товара из регистра накопления или табличной части документа:


ЕСТЬNULL(ЦеныНоменклатуры.Цена * ТаблицаТоварыОрганизацийМаксимальныйПериод.КоличествоПриход, 0) КАК СуммаПриход

Проанализируем ситуацию: если установленная розничная цена составляет 542 рубля, а приход по регистру равен 1 штуке, но отчет выводит 1084 рубля, проблема заключается не в математических вычислениях платформы, а в повторении строк при формировании выборки или компоновке отчета.

Выделим основные технические причины такого поведения:

  1. Размножение строк при левом соединении таблиц. Если виртуальная таблица СрезПоследних регистра сведений ЦеныНоменклатуры соединяется с таблицей движений товаров без учета всех ключевых измерений (таких как Характеристика, ВидЦены, Упаковка или ОбъектЦенообразования), то на одну запись движения товара приходятся две записи цен. В результате итоговая строка дублируется.
  2. Дублирование записей в регистре сведений. При проведении нескольких документов установки цен с одинаковой датой и идентичным набором измерений срезом последних могут возвращаться две записи, что удваивает итоговые данные при умножении.
  3. Некорректная агрегация ресурсов в СКД. Если поле розничной суммы задано в Системе компоновки данных как ресурс и рассчитывается по нескольким иерархическим группировкам без указания ограничений по полям, итоговая сумма может суммироваться повторно на уровне макета.

Разберем по шагам алгоритм диагностики

Чтобы определить, на каком именно этапе происходит задвоение показателей, выполним отладку:

  1. Проверка запроса в консоли запросов. Откроем конфигуратор, извлечем текст запроса из отчета и выполним его в консоли запросов. Добавим в выборку множители отдельными полями:
    
    ЦеныНоменклатуры.Цена КАК ВыбраннаяЦена,
    ТаблицаТоварыОрганизацийМаксимальныйПериод.КоличествоПриход КАК ВыбранноеКоличество,
    ЕСТЬNULL(ЦеныНоменклатуры.Цена * ТаблицаТоварыОрганизацийМаксимальныйПериод.КоличествоПриход, 0) КАК СуммаПриход
    
    Если консоль запросов возвращает две одинаковые строки по одной и той же операции, проблема находится в связи таблиц или в данных регистра сведений.
  2. Проверка схемы компоновки данных (СКД). Если запрос в консоли выдает ровно одну строку с верной суммой, но в итоговом отчете значение удваивается, перейдем к настройкам СКД. Проверим вкладку Ресурсы, роли полей, вычисляемые поля и параметры макета оформления. Убедимся, что для ресурса СуммаПриход задана корректная формула агрегации Сумма(СуммаПриход).

Способы решения проблемы

1. Уточнение условий соединения в запросе

В тексте запроса при связи с виртуальной таблицей СрезПоследних регистра сведений ЦеныНоменклатуры необходимо явно передавать условие по учетному виду цены и совпадению всех измерений (характеристик и упаковок):


ПО ТаблицаТовары.Номенклатура = ЦеныНоменклатуры.Номенклатура
    И ТаблицаТовары.Характеристика = ЦеныНоменклатуры.Характеристика
    И ЦеныНоменклатуры.ВидЦены = &УчетныйВидЦены

2. Предварительная группировка цен во временную таблицу

Для гарантированного исключения двойных записей из регистра цен сгруппируем срез последних во временную таблицу до соединения с основной таблицей товаров:


ВЫБРАТЬ
    Цены.Номенклатура КАК Номенклатура,
    Цены.Характеристика КАК Характеристика,
    МАКСИМУМ(Цены.Цена) КАК Цена
ПОМЕСТИТЬ ВТ_АктуальныеЦены
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ВидЦены = &УчетныйВидЦены) КАК Цены
СГРУППИРОВАТЬ ПО
    Цены.Номенклатура,
    Цены.Характеристика
;

3. Проведение тестирования и исправления базы

Если удваивание вызвано наличием несегментированных дублей в регистрах после сбоя синхронизации РИБ, выполним процедуру Тестирование и исправление в режиме «Конфигуратор» с включенными опциями Проверка логической целостности и Пересчет итогов.

← На главную