При разработке отчетов в 1С:Управление торговлей 11.4 часто возникает задача реализовать сложную логику отображения данных в одной колонке. Например, когда необходимо вывести номер Таможенной декларации на импорт, если она оформлена, а если ее нет — данные УПД (входящий номер и дату документа поступления). В рамках этой статьи мы разберем, как правильно настроить схему компоновки данных (СКД), избежать типичных ошибок при сравнении значений и корректно связать таблицы документов.
Прежде чем приступать к написанию запроса, проанализируем, где хранятся нужные нам сведения. В конфигурации 1С:Управление торговлей 11.4 данные распределены следующим образом:
НомерВходящегоДокумента и ДатаВходящегоДокумента. Именно эти данные зачастую подразумеваются под "номером УПД", если документ пришел в бумажном виде.НомерДекларации.Важно помнить, что связь между этими объектами реализуется через Левое соединение. Если использовать внутреннее соединение, то при отсутствии таможенной декларации документ приобретения просто не попадет в отчет.
Самый производительный способ — реализовать логику на уровне языка запросов. Рассмотрим пример правильного написания условия. Основная ошибка начинающих разработчиков заключается в попытке сравнить ссылку на документ или поле номера с пустой строкой "". В 1С для ссылочных типов правильнее проверять на NULL или на пустую ссылку.
Проанализируем пример кода для набора данных:
ВЫБРАТЬ
ПриобретениеТоваровУслуг.Ссылка КАК ДокументПоступления,
ВЫБОР
КОГДА ТаможеннаяДекларацияИмпорт.Ссылка ЕСТЬ NULL
ТОГДА ПриобретениеТоваровУслуг.НомерВходящегоДокумента + " от " + ФОРМАТ(ПриобретениеТоваровУслуг.ДатаВходящегоДокумента, "ДЛФ=D")
ИНАЧЕ ТаможеннаяДекларацияИмпорт.Номер
КОНЕЦ КАК НомерПриходногоДокумента
ИЗ
Документ.ПриобретениеТоваровУслуг КАК ПриобретениеТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ТаможеннаяДекларацияИмпорт КАК ТаможеннаяДекларацияИмпорт
ПО ТаможеннаяДекларацияИмпорт.ДокументОснование = ПриобретениеТоваровУслуг.Ссылка
Важный нюанс: Обратите внимание на условие ЕСТЬ NULL. Оно сработает только в том случае, если в результате левого соединения запись в таблице таможенных деклараций не была найдена. Если же вы проверяете само строковое поле номера, используйте сравнение с пустой строкой, но помните о пробелах.
Иногда логика формирования номера слишком сложна для простого запроса (например, нужно обрезать префиксы, форматировать дату или проверять дополнительные условия). В этом случае мы воспользуемся механизмом Вычисляемых полей СКД и внешними функциями.
Шаг 1. Создадим функцию в общем модуле. Модуль должен иметь флаг "Сервер" и "Вызов сервера". Разберем пример функции, которая анализирует переданные значения:
Функция ВычислитьНомерДату(НомерГТД, НомерВходящий, ДатаВходящая) Экспорт
// Проверяем, заполнена ли информация по таможне
Если ЗначениеЗаполнено(НомерГТД) Тогда
Возврат НомерГТД;
КонецЕсли;
// Если таможни нет, формируем строку из данных УПД
Если ЗначениеЗаполнено(НомерВходящий) Тогда
Возврат СокрЛП(НомерВходящий) + " от " + Формат(ДатаВходящая, "ДФ=dd.MM.yyyy");
КонецЕсли;
Возврат "Номер не указан";
КонецФункции
Шаг 2. В схеме компоновки данных переходим на закладку "Вычисляемые поля". Добавляем новое поле НомерДокументаДляОтчета и в колонке "Выражение" прописываем вызов нашей функции:
ИмяВашегоОбщегоМодуля.ВычислитьНомерДату(НомерДекларации, НомерВходящегоДокумента, ДатаВходящегоДокумента)
Рассмотрим ситуации, из-за которых отчет может выводить пустые значения или работать некорректно:
"Расчет" = "расчет") результат может зависеть от настроек базы данных (SQL), но в коде 1С это разные строки. Всегда используйте единообразный регистр или функцию ВРЕГ() / НРЕГ().ТаможеннаяДекларацияИмпорт.Номер <> "". Для ссылок используйте ТаможеннаяДекларацияИмпорт.Ссылка <> ЗНАЧЕНИЕ(Документ.ТаможеннаяДекларацияИмпорт.ПустаяСсылка).МАКСИМУМ(Ссылка) по документу-основанию.Для того чтобы номера в отчете выглядели "красиво" (без лишних нулей и префиксов организации), рекомендуем использовать возможности типовой конфигурации УТ 11.4. В запросе или вычисляемом поле можно обратиться к функции:
ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(НомерДокумента)
Это позволит привести системный номер вида "УТ00-000123" к читаемому виду "123".
Подведем итог: для корректного вывода данных в отчете СКД важно правильно выбрать тип соединения таблиц (всегда ЛЕВОЕ от главного документа к подчиненному) и грамотно составить условие ВЫБОР. Использование функций общих модулей делает отчет более гибким в настройке и позволяет реализовать любую логику представления данных, недоступную в обычном языке запросов.