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