Как получить ссылку на выделенный элемент справочника при нажатии кнопки в 1С?

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

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

Важно понимать базовый принцип взаимодействия интерфейса и программного кода: кнопка сама по себе не «передает» ссылку в процедуру автоматически, если это не параметризуемая команда. В общем случае при нажатии на кнопку вызывается обработчик клиентской команды, который считывает текущее состояние элементов формы, извлекает ссылку на выделенный объект и передает ее в логику обработки.

Способ 1. Получение ссылки через свойство ТекущиеДанные

Рассмотрим классический вариант для управляемых форм. У таблицы формы (элемента, отображающего динамический список справочника или табличную часть) есть свойство ТекущиеДанные. Оно возвращает структуру данных той строки, на которой в данный момент установлен курсор.

Разберем пример обработчика команды на клиенте:


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

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

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

Способ 2. Получение ссылки через свойство ТекущаяСтрока

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

Посмотрим на пример кода с использованием ТекущаяСтрока:


&НаКлиенте
Процедура ОбработатьВыделеннуюЗапись(Команда)
    СсылкаНаЭлемент = Элементы.Список.ТекущаяСтрока;
    
    Если ЗначениеЗаполнено(СсылкаНаЭлемент) Тогда
        ВыполнитьОперациюНаСервере(СсылкаНаЭлемент);
    Иначе
        ПоказатьПредупреждение(, "Пожалуйста, выделите элемент справочника.");
    КонецЕсли;
КонецПроцедуры

Этот способ компактнее, так как исключает промежуточное чтение структуры данных строки, но требует проверки заполненности через функцию ЗначениеЗаполнено.

Способ 3. Работа с множественным выделением строк

Проанализируем ситуацию, когда в таблице списка включен режим множественного выделения (свойство РежимВыделения = ВыделениеНесколькихСтрок), и пользователь может выделить сразу несколько записей с помощью клавиш Shift или Ctrl.

Свойства ТекущиеДанные и ТекущаяСтрока вернут только одну строку, на которой находится фокус. Чтобы обработать все выделенные строки, воспользуемся коллекцией ВыделенныеСтроки:


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

&НаСервереБезКонтекста
Процедура ГрупповаяОбработкаНаСервере(МассивСсылок)
    Для Каждого СсылкаЭлемента Из МассивСсылок Цикл
        // Обработка каждого элемента из переданного массива
    КонецЦикла;
КонецПроцедуры

Способ 4. Использование параметризуемых команд

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

  1. Создаем общую команду или команду формы.
  2. В свойствах команды устанавливаем свойство Тип параметра команды, выбрав соответствующую ссылку на справочник (например, СправочникСсылка.Номенклатура).
  3. Размещаем команду в командной панели динамического списка.
  4. В обработчике команды первый параметр ПараметрКоманды будет автоматически содержать ссылку на выбранный элемент или массив ссылок при множественном выделении.

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    // В ПараметрКоманды автоматически передана ссылка на выбранный элемент
    Если ЗначениеЗаполнено(ПараметрКоманды) Тогда
        ОбработатьДанныеНаСервере(ПараметрКоманды);
    КонецЕсли;
КонецПроцедуры

Особенности работы в обычном приложении

Если разработка ведется на обычных (неуправляемых) формах, обращение к визуальным элементам осуществляется через коллекцию ЭлементыФормы:


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

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

← На главную