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