Почему в СКД при программном получении списка значений у элементов не установлена пометка и как это исправить

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

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

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

Разберем механику работы параметров СКД

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

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

  1. Берет исходный полный список доступных значений.
  2. Создает новый экземпляр списка значений.
  3. Копирует в этот новый экземпляр только те элементы, которые были отмечены пользователем.
  4. Передает этот сокращенный список в значение параметра.

Таким образом, само наличие элемента в результирующем списке уже означает, что он был выбран. Свойство Отметка (или Пометка) при этом сбрасывается или игнорируется, так как оно больше не несет функциональной нагрузки. Рассмотрим подробнее, как получить эти данные правильно.

Правильное получение настроек через КомпоновщикНастроек

Одной из частых ошибок является прямое обращение к свойству КомпоновщикНастроек.Настройки. Посмотрим на разницу между методами доступа к данным. В объекте КомпоновщикНастроекКомпоновкиДанных есть три основные коллекции настроек:

  1. Настройки — это настройки, заданные в схеме (в конфигураторе) или измененные программно в «основном» слое.
  2. ПользовательскиеНастройки — это те изменения, которые внес пользователь в режиме «Предприятие» (фильтры, параметры, выбранные поля).
  3. ФиксированныеНастройки — настройки, которые нельзя изменить через интерфейс.

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


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Получаем результирующие настройки (слияние основных и пользовательских)
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Ищем наш параметр по имени
    ПараметрСтатус = Настройки.ПараметрыДанных.Элементы.Найти("СтатусПродукции");
    
    Если ПараметрСтатус <> Неопределено И ПараметрСтатус.Использование Тогда
        СписокВыбранныхСтатусов = ПараметрСтатус.Значение;
        
        // Проанализируем содержимое списка
        Для Каждого ЭлементСписка Из СписокВыбранныхСтатусов Цикл
            // Здесь ЭлементСписка.Пометка всегда будет Ложь, 
            // но сам элемент ПРИСУТСТВУЕТ, значит он ВЫБРАН пользователем.
            Сообщить("Выбран статус: " + ЭлементСписка.Значение);
        КонецЦикла;
    КонецЕсли;
    
    // Дальнейшая логика формирования внешнего набора данных...
    
КонецПроцедуры

Почему метод ПолучитьНастройки() критически важен?

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

Метод ПолучитьНастройки() возвращает объект НастройкиКомпоновкиДанных, в котором все идентификаторы пользовательских настроек уже сопоставлены и значения подставлены в соответствующие элементы. Это избавляет нас от необходимости вручную искать элементы в коллекции ПользовательскиеНастройки по ИдентификаторуПользовательскойНастройки.

Нюансы работы с пустым списком и флагом использования

При работе с внешними наборами данных важно учитывать, как интерпретировать отсутствие выбранных элементов. Посмотрим на возможные сценарии:

Рассмотрим пример кода, который учитывает эти нюансы при подготовке данных для внешнего источника:


Настройки = КомпоновщикНастроек.ПолучитьНастройки();
Параметр = Настройки.ПараметрыДанных.Элементы.Найти("СтатусПродукции");

МассивСтатусов = Новый Массив;
ФильтроватьПоСтатусу = Ложь;

Если Параметр <> Неопределено И Параметр.Использование Тогда
    ФильтроватьПоСтатусу = Истина;
    Для Каждого Элт Из Параметр.Значение Цикл
        МассивСтатусов.Добавить(Элт.Значение);
    КонецЦикла;
КонецЕсли;

// При формировании запроса для внешнего набора:
Если ФильтроватьПоСтатусу Тогда
    // Если список был пуст, МассивСтатусов будет пустым, и запрос вернет пустоту - это корректно
    Запрос.Текст = Запрос.Текст + " ГДЕ Статус В (&МассивСтатусов)";
    Запрос.УстановитьПараметр("МассивСтатусов", МассивСтатусов);
КонецЕсли;

Подведем итоги

Подводя итог нашему анализу, зафиксируем основные правила работы со списками в параметрах СКД:

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

Соблюдение этих правил позволит избежать логических ошибок при формировании сложных отчетов и обеспечит корректную работу программных фильтров во внешних наборах данных.

← На главную