При разработке или доработке конфигураций на платформе 1С:Предприятие 7.7 часто возникает необходимость получить данные, которые пользователь выбрал в Таблице Значений (ТЗ). Начинающие программисты нередко сталкиваются с трудностями, пытаясь "напрямую" извлечь значение из элемента интерфейса. Давайте разберем по шагам, как правильно работать с выбранными элементами таблицы значений, какие методы платформы нам в этом помогут и как избежать распространенных ошибок.
Главное правило, которое мы должны запомнить при работе с ТЗ: из таблицы значений выбирается не само значение напрямую, а строка таблицы. Только зная номер строки и нужную колонку, мы можем извлечь искомые данные.
Проанализируем классический метод ПолучитьЗначение. Синтаксис выглядит следующим образом:
Пер = ТЗ.ПолучитьЗначение(НомерСтроки, ИдентификаторИлиНомерКолонки);
Здесь переменная Пер получит данные, хранящиеся на пересечении указанной строки и колонки.
Когда таблица значений размещена на форме, пользователь может выделить любую строку. Нам необходимо программно определить, на какой строке сейчас стоит курсор. Для этого мы применим метод ТекущаяСтрока. Посмотрим на пример кода, который объединяет получение текущей строки и извлечение из нее значения:
Пер = ТЗ.ПолучитьЗначение(ТЗ.ТекущаяСтрока(), "НужнаяКолонка");
Этот способ отлично работает, если мы точно уверены, что пользователь уже выделил какую-то строку. Однако, проанализируем ситуацию, когда таблица пуста или курсор не спозиционирован. В этом случае метод ТекущаяСтрока вернет 0, и наша попытка получить значение приведет к ошибке исполнения. Выясним причину и добавим защиту от "пустого" выбора:
ТекСтр = ТЗ.ТекущаяСтрока();
Если ТекСтр > 0 Тогда
Пер = ТЗ.ПолучитьЗначение(ТекСтр, "НужнаяКолонка");
Сообщить("Выбрано значение: " + Пер);
Иначе
Сообщить("Строка не выбрана! Пожалуйста, укажите позицию в таблице.");
КонецЕсли;
В платформе 1С 7.7 существует более лаконичный способ получить значение из текущей строки, если у колонки задан строковый идентификатор. Вместо громоздкого метода ПолучитьЗначение, мы можем обращаться к данным напрямую через точку. Разберем этот вариант:
// При условии, что текущая строка уже установлена (например, курсор стоит на ней)
Пер = ТЗ.ИмяКолонки;
Этот подход делает код более читаемым и компактным, особенно когда необходимо получить сразу несколько значений из разных колонок выделенной строки.
Иногда таблица значений создается и заполняется программно, в памяти, без вывода на форму. Если нам нужно дать пользователю визуальный выбор, мы воспользуемся методом ВыбратьСтроку. При вызове этого метода система сама откроет стандартное модальное окно с таблицей.
Рассмотрим подробнее, как это реализовать:
ВыбратьСтроку, передавая в него переменную для записи номера выбранной строки и заголовок окна.Пример реализации в коде:
Стр = 0;
Если ТЗ.ВыбратьСтроку(Стр, "Выберите нужное значение для подстановки") = 1 Тогда
// Пользователь дважды кликнул по строке или нажал Enter
ВыбранноеЗначение = ТЗ.ПолучитьЗначение(Стр, "ИдентификаторКолонки");
КонецЕсли;
Если таблица значений полноценно живет на форме обработки или справочника, лучшим тоном программирования является реакция на действия пользователя "в моменте". Когда пользователь кликает дважды по строке, система может сразу же перехватить это событие. Для этого мы применим предопределенную процедуру ПриВыбореСтроки (или пользовательскую, назначенную в свойствах элемента диалога на вкладке "Дополнительно").
Внутри такой процедуры текущая строка уже гарантированно считается выбранной, поэтому мы можем смело считывать данные без дополнительных проверок на позиционирование:
Процедура ПриВыбореСтроки()
// Сработает при двойном клике или нажатии Enter на таблице значений
ВыбранныйКонтрагент = ТЗ.Контрагент;
ВыбраннаяСумма = ТЗ.Сумма;
Сообщить("Вы выбрали: " + ВыбранныйКонтрагент + " на сумму " + ВыбраннаяСумма);
КонецПроцедуры
Подводя итог, мы рассмотрели несколько надежных способов извлечения данных из таблицы значений в 1С 7.7. В зависимости от задачи, вы можете использовать как классическое получение по номеру строки, так и быстрое обращение через точку, не забывая при этом контролировать факт того, что пользователь действительно совершил выбор.