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