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

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

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

Анализ исходного кода и причины проблемы

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


&НаСервере
Функция Получить_ТЗ_Из_ДинамическогоСписка()
    Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
    Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();  
    
    // Пытаемся принудительно добавить поле Ссылка в выбранные поля
    ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Ссылка");   
    ВыбранноеПоле.Использование = Истина;
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    
    ТЗ = Новый ТаблицаЗначений;
    ПроцессорВывода.УстановитьОбъект(ТЗ); 
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    Возврат ТЗ;
КонецФункции

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

Решение №1: Добавление невидимой колонки и флаг «Использовать всегда»

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

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

Проанализируем результат: теперь, когда поле физически присутствует в элементах формы, метод ПолучитьИсполняемыеНастройки... начнет «видеть» его и включать в результирующий макет компоновки. Этот метод хорош тем, что он автоматически учитывает все пользовательские фильтры, группировки и, что немаловажно, строку поиска (Полнотекстовый поиск).

Решение №2: Использование Компоновщика настроек (полный запрос)

Если мы хотим избежать изменения интерфейса формы, разберем альтернативный путь. Мы можем обратиться не к визуальному элементу, а напрямую к объекту динамического списка. Посмотрим на этот метод подробнее:


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

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

Важные нюансы и вопросы производительности

Проанализируем ситуацию с точки зрения стабильности системы. Динамический список предназначен для порционного отображения данных (по 20-50 строк). Когда мы вызываем ПроцессорВывода.Вывести(ПроцессорКомпоновки), мы заставляем платформу:

Важно: Если в списке сотни тысяч записей, а пользователь не установил жесткий фильтр, попытка выгрузки приведет к зависанию сеанса или ошибке нехватки памяти (Out of Memory). Всегда проверяйте количество записей перед выгрузкой или устанавливайте лимит через Настройки.ПараметрыВывода.

Также отметим влияние свойства Основная таблица. Если в динамическом списке указана основная таблица, платформа более лояльно относится к полю Ссылка, так как оно необходимо для системных функций (навигация, контекстное меню). Если же используется произвольный запрос без основной таблицы, поле Ссылка становится «рядовым», и за его наличие в выборке нужно бороться более тщательно, используя настройки Использовать всегда.

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

← На главную