Как в СКД установить список значений для выбора в поле отбора и почему при этом могут пропадать данные из колонки отчета?

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

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

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

Проанализируем все возможные варианты решения этой задачи — от простых настроек в конфигураторе до гибкого программного управления поведением компоновщика.

Разберем детально каждый из этих сценариев.

Суть проблемы: почему пропадают значения из колонки отчета?

Рассмотрим стандартную ситуацию, с которой сталкиваются многие разработчики. Пытаясь решить задачу «в лоб», мы открываем вкладку «Наборы данных» в схеме компоновки, находим нужное нам поле и в колонке «Доступные значения» жестко прописываем наш список строк: «Заказ», «Закупка», «Перемещение».

На первый взгляд, задача решена: при настройке отбора пользователь теперь видит аккуратный список и выбирает значения из него. Однако сразу после этого мы можем обнаружить неприятный побочный эффект: в самой таблице сформированного отчета колонка «Реестр» внезапно становится абсолютно пустой, хотя отборы по-прежнему отрабатывают корректно. Выясним, почему так происходит.

Дело в том, что когда мы заполняем свойство «Доступные значения» в описании поля СКД на первой вкладке, платформа 1С включает режим строгой валидации выводимых данных:

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

Для того чтобы избежать подобного поведения и гарантировать стабильный вывод данных в отчет, рассмотрим правильный интерактивный способ настройки без использования жестких ограничений.

Вариант 1. Интерактивная настройка через «Параметры редактирования» (Рекомендуемый способ без кода)

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

Проанализируем пошагово, как это настроить:

  1. Откроем отчет в конфигураторе и перейдем на вкладку «Наборы данных».
  2. В таблице полей найдем наше целевое поле (например, Реестр).
  3. Найдем колонку «Параметры редактирования» для этого поля и нажмем кнопку выбора (с тремя точками).
  4. В открывшемся окне найдем свойство «Список выбора» и установим для него флажок использования.
  5. Нажмем на кнопку выбора в строке «Список выбора» и заполним таблицу значений нашими строками:
    • Значение: "Заказ", Представление: "Заказ"
    • Значение: "Закупка", Представление: "Закупка"
    • Значение: "Перемещение", Представление: "Перемещение"
  6. Сохраним настройки схемы и запустим отчет.

Теперь при добавлении поля в отбор пользователь получит удобный выпадающий список для выбора, но в самом отчете данные в колонке будут отображаться без искажений, даже если они не идеально соответствуют элементам списка.

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

Часто жестко прописывать список выбора в конфигураторе неудобно или невозможно. Например, если список вариантов должен формироваться динамически на основе данных информационной базы или прав текущего пользователя. В таком случае мы можем установить доступные значения программно.

Рассмотрим наиболее корректный программный метод, который воздействует только на интерфейс настроек отбора конкретного сеанса отчета. Этот код мы разместим в модуле формы отчета, например, в обработчике события ПриСозданииНаСервере.

Посмотрим на пример реализации:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Инициализируем список значений, который мы хотим предложить пользователю
    СписокВыбора = Новый СписокЗначений;
    СписокВыбора.Добавить("Заказ", "Документ заказ");
    СписокВыбора.Добавить("Закупка", "Документ закупки");
    СписокВыбора.Добавить("Перемещение", "Перемещение товаров");

    // Обращаемся к доступным полям отбора компоновщика настроек нашего отчета
    ДоступныеПоляОтбора = КомпоновщикНастроек.Настройки.Отбор.ДоступныеПоляОтбора;
    
    // Пытаемся найти нужное нам поле по его пути к данным
    ПолеОтбора = ДоступныеПоляОтбора.Элементы.Найти("Реестр");
    
    Если ПолеОтбора <> Неопределено Тогда
        // Устанавливаем сформированный список как доступные значения выбора
        ПолеОтбора.ДоступныеЗначения = СписокВыбора;
    КонецЕсли;

КонецПроцедуры

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

Вариант 3. Программная модификация Схемы компоновки данных напрямую

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

Обычно этот код размещают в модуле объекта отчета в предопределенной процедуре ПриКомпоновкеРезультата.

Разберем данный пример кода:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    // Находим набор данных в нашей схеме
    НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Найти("НаборДанных1");
    
    Если НаборДанных <> Неопределено Тогда
        
        // Пытаемся найти поле внутри набора данных
        ПолеРеестр = НаборДанных.Поля.Найти("Реестр");
        
        Если ПолеРеестр <> Неопределено Тогда
            
            // Формируем список допустимых значений
            СписокВыбора = Новый СписокЗначений;
            СписокВыбора.Добавить("Заказ");
            СписокВыбора.Добавить("Закупка");
            СписокВыбора.Добавить("Перемещение");
            
            // Записываем список в настройки поля схемы
            ПолеРеестр.УстановитьДоступныеЗначения(СписокВыбора);
            
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

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

Сравнительный анализ методов: когда какой использовать?

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

  1. Интерактивный список выбора (Параметры редактирования): Идеально подходит для статических списков строковых констант. Настраивается за 1 минуту в конфигураторе, не требует написания кода, гарантирует 100% сохранение вывода данных в колонках отчета.
  2. Программный список выбора (ДоступныеПоляОтбора): Лучший выбор для динамических списков, зависящих от условий базы данных (например, список доступных складов для текущего пользователя). Безопасен для отображения колонок.
  3. Доступные значения на уровне Схемы (УстановитьДоступныеЗначения): Рекомендуется использовать преимущественно для ссылочных типов (справочники, документы, перечисления) или когда требуется максимально жесткий контроль вводимых пользователем данных на уровне бизнес-логики отчета.

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

← На главную