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