В разработке на платформе 1С часто возникает задача: получить программный доступ к тем самым данным, которые пользователь видит в текущий момент в динамическом списке. Это необходимо для групповой обработки помеченных строк, формирования специфических отчетов или передачи массива ссылок в фоновое задание. Однако стандартные механизмы получения настроек часто преподносят сюрприз — нужные поля (особенно поле Ссылка) просто не попадают в результат. Рассмотрим, почему это происходит и как правильно решить проблему несколькими способами.
Проанализируем стандартный подход, который часто используют разработчики для выгрузки динамического списка через компоновку данных. Процедура обычно выглядит следующим образом:
&НаСервере
Функция Получить_ТЗ_Из_ДинамическогоСписка()
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
// Пытаемся принудительно добавить поле Ссылка в выбранные поля
ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
ВыбранноеПоле.Использование = Истина;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТЗ = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТЗ);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат ТЗ;
КонецФункции
Несмотря на то, что мы программно добавляем поле Ссылка в настройки, в итоговой таблице значений эта колонка может отсутствовать или быть пустой. Выясним причину: метод ПолучитьИсполняемыеНастройкиКомпоновкиДанных() возвращает настройки, которые 1С оптимизирует для отображения на экране. Если поле Ссылка не выведено в таблицу формы как видимая колонка, платформа исключает его из запроса для экономии ресурсов сервера и трафика. Даже принудительное добавление поля в ВыбранныеПоля после получения настроек часто игнорируется, так как исполняемая схема уже «заточена» под конкретный визуальный состав.
Рассмотрим самый быстрый и надежный способ, подтвержденный практикой. Чтобы заставить платформу включить поле в состав данных, необходимо выполнить два шага:
Ссылка в таблицу формы (элемент управления «Таблица», связанный с динамическим списком). Для этого поля в свойствах снимем галочку Видимость, чтобы оно не мешало пользователю.Ссылка установим флажок Использовать всегда.Проанализируем результат: теперь, когда поле физически присутствует в элементах формы, метод ПолучитьИсполняемыеНастройки... начнет «видеть» его и включать в результирующий макет компоновки. Этот метод хорош тем, что он автоматически учитывает все пользовательские фильтры, группировки и, что немаловажно, строку поиска (Полнотекстовый поиск).
Если мы хотим избежать изменения интерфейса формы, разберем альтернативный путь. Мы можем обратиться не к визуальному элементу, а напрямую к объекту динамического списка. Посмотрим на этот метод подробнее:
Настройки = Список.КомпоновщикНастроек.ПолучитьНастройки();
// Здесь мы работаем с полными настройками, которые еще не прошли через фильтр оптимизации формы
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
// Добавляем нужные поля и выполняем компоновку
Нужно учитывать, что в этом случае нам придется самостоятельно объединять настройки из КомпоновщикНастроек.Настройки и КомпоновщикНастроек.ПользовательскиеНастройки, чтобы получить актуальную картину с учетом того, что нажал пользователь. Этот способ более сложен в реализации, но он дает максимальный контроль над составом полей.
Проанализируем ситуацию с точки зрения стабильности системы. Динамический список предназначен для порционного отображения данных (по 20-50 строк). Когда мы вызываем ПроцессорВывода.Вывести(ПроцессорКомпоновки), мы заставляем платформу:
Важно: Если в списке сотни тысяч записей, а пользователь не установил жесткий фильтр, попытка выгрузки приведет к зависанию сеанса или ошибке нехватки памяти (Out of Memory). Всегда проверяйте количество записей перед выгрузкой или устанавливайте лимит через Настройки.ПараметрыВывода.
Также отметим влияние свойства Основная таблица. Если в динамическом списке указана основная таблица, платформа более лояльно относится к полю Ссылка, так как оно необходимо для системных функций (навигация, контекстное меню). Если же используется произвольный запрос без основной таблицы, поле Ссылка становится «рядовым», и за его наличие в выборке нужно бороться более тщательно, используя настройки Использовать всегда.
Выяснив эти причины и применив метод с невидимой колонкой, мы сможем гарантированно получать полные данные из динамических списков любой сложности.