Как программно получить данные из динамического списка 1С

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

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

Использование свойства ТекущиеДанные для получения значения строки

Самый простой и распространенный способ получить данные строки, на которой в данный момент установлен курсор, — это обращение к свойству ТекущиеДанные элемента формы. Рассмотрим ситуацию, когда у нас есть список справочника на форме и нам нужно получить ссылку на текущий элемент. Важно помнить, что это свойство доступно только на клиенте.

Разберем пример кода, который выполняется при нажатии кнопки на форме:


&НаКлиенте
Процедура ПолучитьДанныеСтроки(Команда)
    
    // Получаем структуру данных текущей строки
    ДанныеСтроки = Элементы.Список.ТекущиеДанные;
    
    // Обязательно проверяем на Неопределено, если список пуст
    Если ДанныеСтроки <> Неопределено Тогда
        СсылкаНаОбъект = ДанныеСтроки.Ссылка;
        Сообщить("Выбран объект: " + Строка(СсылкаНаОбъект));
        
        // Мы также можем обратиться к любой колонке, которая есть в списке
        Наименование = ДанныеСтроки.Наименование;
        Сообщить("Наименование: " + Наименование);
    КонецЕсли;
    
КонецПроцедуры

Проанализируем этот код. Свойство ТекущиеДанные возвращает объект типа ДанныеФормыСтруктура. Особенность заключается в том, что в этой структуре доступны только те поля, которые включены в состав колонок. Если штатных средств недостаточно, разработчикам часто помогает добавление реквизитов и элементов формы на управляемые формы программным способом для расширения состава доступных данных.

Работа с множественным выделением через ВыделенныеСтроки

Часто пользователю требуется выполнить действие не с одной строкой, а сразу с несколькими. Для этого в динамическом списке должно быть разрешено множественное выделение. Чтобы получить список всех выбранных строк, мы используем свойство ВыделенныеСтроки. Такое взаимодействие становится еще удобнее, если в интерфейсе реализован флажок в динамическом списке в 1С 8.3.

Посмотрим на пример обработки массива выделенных строк:


&НаКлиенте
Процедура ОбработатьВыделенные(Команда)
    
    // Свойство возвращает массив идентификаторов строк
    МассивСтрок = Элементы.Список.ВыделенныеСтроки;
    
    Если МассивСтрок.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    Для Каждого Идентификатор Из МассивСтрок Цикл
        // Для получения данных конкретной строки по идентификатору
        // используем метод ДанныеСтроки() самого элемента списка
        ДанныеСтроки = Элементы.Список.ДанныеСтроки(Идентификатор);
        
        Если ДанныеСтроки <> Неопределено Тогда
            ОбработатьЭлементНаСервере(ДанныеСтроки.Ссылка);
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Выясним причину, по которой мы используем ДанныеСтроки(Идентификатор). Свойство ВыделенныеСтроки содержит только уникальные идентификаторы. Метод ДанныеСтроки() позволяет получить доступ к полям записи без обращения к серверной базе данных, если эти данные уже кэшированы в списке на клиенте.

Особенности получения данных на сервере

Важно понимать, что объект Элементы на сервере не предоставляет доступа к свойству ТекущиеДанные. Это логично, так как понятие "текущая строка" существует только в интерфейсе пользователя на стороне клиента. Если вам необходимо выполнить сложную логику на сервере, основываясь на выборе пользователя, данные нужно передавать с клиента в качестве параметров.

Рассмотрим правильный алгоритм взаимодействия:

  1. На клиенте получаем ссылку из ТекущиеДанные.
  2. Передаем эту ссылку в серверную процедуру или функцию.
  3. На сервере получаем полноценный объект или выполняем запрос к базе данных.

Пример реализации такой связки:


&НаСервере
Процедура ВыполнитьДействиеНаСервере(СсылкаНаОбъект)
    // Здесь мы уже работаем с полноценной ссылкой
    ОбъектСсылка = СсылкаНаОбъект.ПолучитьОбъект();
    // Логика изменения объекта...
    ОбъектСсылка.Записать();
КонецПроцедуры

&НаКлиенте
Процедура КомандаВыполнить(Команда)
    Данные = Элементы.Список.ТекущиеДанные;
    Если Данные <> Неопределено Тогда
        ВыполнитьДействиеНаСервере(Данные.Ссылка);
    КонецЕсли;
КонецПроцедуры

Типичные ошибки и способы их решения

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

Чтобы избежать аварийного завершения программы, всегда используйте проверку Если Данные <> Неопределено Тогда. Для анализа состояния элементов «на лету» в процессе тестирования полезно использовать редактор форм в режиме предприятия, который позволяет просматривать свойства элементов прямо в интерфейсе.

Оптимизация: свойство "Использовать всегда"

Если в коде вам нужно получить значение поля, которое не отображается в таблице, 1С может не включить это поле в структуру ТекущиеДанные. Чтобы гарантированно иметь доступ к данным, выполните следующие шаги:

  1. Откройте форму в конфигураторе.
  2. Найдите нужное поле в дереве реквизитов формы.
  3. В свойствах поля установите флаг Использовать всегда.

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

Подводя итог, можно сказать, что работа с данными строк динамического списка требует четкого понимания контекста выполнения кода. Используя механизмы программного изменения форм для управления элементами и правильно применяя ТекущиеДанные, вы обеспечите стабильную работу вашего решения.

← На главную