Как правильно добавить дополнительные поля в отчет СКД и настроить подсчет данных

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

Работа с Системой компоновки данных (СКД) в 1С — это не только написание запросов, но и тонкая настройка механизмов отображения, ресурсов и вычисляемых полей. Часто разработчики сталкиваются с ситуацией, когда поле добавлено в набор данных, но упорно не выводится в отчет, или же данные в нем отображаются некорректно. Разберем подробно, как решить эти проблемы на примере отчета по дисконтным картам (схожим образом выполняется обработка данных продаж) в «1С:Розница 3.0».

Почему добавленное поле не отображается в отчете

Если вы добавили поле в текст запроса на вкладке Наборы данных, настроили его в Выбранных полях, но при запуске отчета колонка отсутствует, проанализируем основные технические причины этого явления:

  1. Кэширование настроек в режиме пользователя. Это самая частая причина. Если отчет ранее открывался, 1С сохраняет его настройки (состав колонок, отборы) в системных хранилищах. Чтобы увидеть изменения, необходимо зайти в отчет и нажать кнопку «Еще» — «Установить стандартные настройки». Только после этого СКД обновит структуру колонок в соответствии с вашей новой схемой.
  2. Обновление дополнительных отчетов. Если вы работаете с внешним отчетом (таким как анализ закупок и продаж товаров), подключенным через справочник «Дополнительные отчеты и обработки», простого сохранения файла недостаточно. Нужно обязательно зайти в карточку отчета в базе и обновить его из измененного файла .erf. При использовании команды «Файл — Открыть» изменения подхватываются сразу, но настройки колонок всё равно могут требовать сброса к стандартным.
  3. Флаг «Автозаполнение». На вкладке Наборы данных есть важная опция Автозаполнение. Если она снята, то поля, добавленные в текст запроса вручную, не появятся в списке доступных полей компоновки автоматически. Проверьте, чтобы нужные поля были явно указаны в верхнем списке полей набора данных.
  4. Ограничение доступности. У каждого поля в СКД есть параметры «Ограничение доступности». Если установлена галочка в колонке Поле, пользователь не сможет выбрать его в настройках, и оно не будет выведено в результат.

Корректная обработка пустых значений и типов данных

При работе с дисконтными картами мы часто сталкиваемся с проверкой на наличие карты в документе. Разберем типичные ошибки сравнения типов. В языке запросов 1С нельзя сравнивать ссылку на справочник с пустой строкой "". Это приведет к ошибке или неверному результату.

Рассмотрим правильный способ проверки на пустую ссылку в запросе:


ВЫБОР
    КОГДА ДокументЧекККМ.ДисконтнаяКарта = ЗНАЧЕНИЕ(Справочник.ДисконтныеКарты.ПустаяСсылка)
        ТОГДА 0
    ИНАЧЕ 1
КОНЕЦ КАК ЕстьДисконтнаяКарта

Важно помнить, что если вы используете ЛЕВОЕ СОЕДИНЕНИЕ, то в случае отсутствия записи в правой таблице, поле будет содержать NULL. В СКД работа с NULL имеет свои особенности: если одна из колонок, по которой идет группировка, содержит NULL, СКД может игнорировать такие строки при расчете ресурсов.

Проанализируем ситуацию с использованием функции ЕСТЬNULL. Рекомендуется всегда «обмазывать» поля, участвующие в расчетах, этой функцией:


ЕСТЬNULL(ДокументЧекККМ.ДисконтнаяКарта, ЗНАЧЕНИЕ(Справочник.ДисконтныеКарты.ПустаяСсылка))

Настройка ресурсов для подсчета количества карт

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

  1. Перейдем на вкладку Ресурсы.
  2. Выберем наше поле ДисконтнаяКарта.
  3. В колонке Выражение вместо стандартного Сумма(ДисконтнаяКарта) укажем Количество(Различные ДисконтнаяКарта).

Использование модификатора Различные критически важно. Если один и тот же покупатель совершил два чека по одной карте, обычная функция Количество вернет цифру 2, а Количество(Различные ...) — 1. Это позволит получить реальное число уникальных карт за период.

Особенности работы с регистрами и документами

Рассмотрим сложный пример запроса, когда данные берутся из регистра накопления «Продажи», но нам нужно вытащить реквизит из документа-регистратора (Чек ККМ). Соединение виртуальных таблиц оборотов с физическими таблицами документов — ресурсоемкая операция. Посмотрим на пример оптимизированной логики:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ПродажиОбороты.Регистратор КАК Регистратор,
    ПродажиОбороты.Документ КАК Документ,
    ВЫБОР
        КОГДА ПродажиОбороты.Регистратор ССЫЛКА Документ.ЧекККМ
            ТОГДА ВЫРАЗИТЬ(ПродажиОбороты.Регистратор КАК Документ.ЧекККМ).ДисконтнаяКарта
        ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ДисконтныеКарты.ПустаяСсылка)
    КОНЕЦ КАК ДисконтнаяКарта
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты

В данном примере мы используем оператор ВЫРАЗИТЬ, что позволяет платформе более эффективно работать с типами данных и обращаться к полям объекта-регистратора.

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

Практические советы по отладке

Выясним причину, если данные всё равно не выводятся, с помощью следующих инструментов:

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

← На главную