Работа с динамическими списками в управляемом приложении 1С — это одна из наиболее частых задач, с которыми сталкивается разработчик — для этого есть инструменты разработчика для анализа метаданных и запросов. Часто возникает необходимость считать данные из строки, которую выбрал пользователь, чтобы выполнить дальнейшую обработку: открыть связанный отчет, заполнить документ или передать идентификатор объекта в фоновое задание. В этой статье мы изучим несколько приемов построения эффективных интерфейсов, подробно разберем, как извлекать информацию из динамических списков, и выясним, какие методы лучше использовать в различных контекстах выполнения кода.
Самый простой и распространенный способ получить данные строки, на которой в данный момент установлен курсор, — это обращение к свойству ТекущиеДанные элемента формы. Рассмотрим ситуацию, когда у нас есть список справочника на форме и нам нужно получить ссылку на текущий элемент. Важно помнить, что это свойство доступно только на клиенте.
Разберем пример кода, который выполняется при нажатии кнопки на форме:
&НаКлиенте
Процедура ПолучитьДанныеСтроки(Команда)
// Получаем структуру данных текущей строки
ДанныеСтроки = Элементы.Список.ТекущиеДанные;
// Обязательно проверяем на Неопределено, если список пуст
Если ДанныеСтроки <> Неопределено Тогда
СсылкаНаОбъект = ДанныеСтроки.Ссылка;
Сообщить("Выбран объект: " + Строка(СсылкаНаОбъект));
// Мы также можем обратиться к любой колонке, которая есть в списке
Наименование = ДанныеСтроки.Наименование;
Сообщить("Наименование: " + Наименование);
КонецЕсли;
КонецПроцедуры
Проанализируем этот код. Свойство ТекущиеДанные возвращает объект типа ДанныеФормыСтруктура. Особенность заключается в том, что в этой структуре доступны только те поля, которые включены в состав колонок. Если штатных средств недостаточно, разработчикам часто помогает добавление реквизитов и элементов формы на управляемые формы программным способом для расширения состава доступных данных.
Часто пользователю требуется выполнить действие не с одной строкой, а сразу с несколькими. Для этого в динамическом списке должно быть разрешено множественное выделение. Чтобы получить список всех выбранных строк, мы используем свойство ВыделенныеСтроки. Такое взаимодействие становится еще удобнее, если в интерфейсе реализован флажок в динамическом списке в 1С 8.3.
Посмотрим на пример обработки массива выделенных строк:
&НаКлиенте
Процедура ОбработатьВыделенные(Команда)
// Свойство возвращает массив идентификаторов строк
МассивСтрок = Элементы.Список.ВыделенныеСтроки;
Если МассивСтрок.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Для Каждого Идентификатор Из МассивСтрок Цикл
// Для получения данных конкретной строки по идентификатору
// используем метод ДанныеСтроки() самого элемента списка
ДанныеСтроки = Элементы.Список.ДанныеСтроки(Идентификатор);
Если ДанныеСтроки <> Неопределено Тогда
ОбработатьЭлементНаСервере(ДанныеСтроки.Ссылка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Выясним причину, по которой мы используем ДанныеСтроки(Идентификатор). Свойство ВыделенныеСтроки содержит только уникальные идентификаторы. Метод ДанныеСтроки() позволяет получить доступ к полям записи без обращения к серверной базе данных, если эти данные уже кэшированы в списке на клиенте.
Важно понимать, что объект Элементы на сервере не предоставляет доступа к свойству ТекущиеДанные. Это логично, так как понятие "текущая строка" существует только в интерфейсе пользователя на стороне клиента. Если вам необходимо выполнить сложную логику на сервере, основываясь на выборе пользователя, данные нужно передавать с клиента в качестве параметров.
Рассмотрим правильный алгоритм взаимодействия:
ТекущиеДанные.Пример реализации такой связки:
&НаСервере
Процедура ВыполнитьДействиеНаСервере(СсылкаНаОбъект)
// Здесь мы уже работаем с полноценной ссылкой
ОбъектСсылка = СсылкаНаОбъект.ПолучитьОбъект();
// Логика изменения объекта...
ОбъектСсылка.Записать();
КонецПроцедуры
&НаКлиенте
Процедура КомандаВыполнить(Команда)
Данные = Элементы.Список.ТекущиеДанные;
Если Данные <> Неопределено Тогда
ВыполнитьДействиеНаСервере(Данные.Ссылка);
КонецЕсли;
КонецПроцедуры
Разберем ситуацию, когда ТекущиеДанные возвращает Неопределено. Это может происходить в следующих случаях:
Чтобы избежать аварийного завершения программы, всегда используйте проверку Если Данные <> Неопределено Тогда. Для анализа состояния элементов «на лету» в процессе тестирования полезно использовать редактор форм в режиме предприятия, который позволяет просматривать свойства элементов прямо в интерфейсе.
Если в коде вам нужно получить значение поля, которое не отображается в таблице, 1С может не включить это поле в структуру ТекущиеДанные. Чтобы гарантированно иметь доступ к данным, выполните следующие шаги:
Это заставит платформу всегда подгружать данные поля из базы. В более сложных сценариях может потребоваться программное перемещение колонки динамического списка или иная динамическая настройка отображения — есть программное управление поведением динамических списков.
Подводя итог, можно сказать, что работа с данными строк динамического списка требует четкого понимания контекста выполнения кода. Используя механизмы программного изменения форм для управления элементами и правильно применяя ТекущиеДанные, вы обеспечите стабильную работу вашего решения.