Как в управляемых формах 1С сделать колонку таблицы только для чтения, сохранив кнопку открытия ссылки?

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

В практике разработки на платформе 1С:Предприятие 8.3 часто возникает задача: необходимо запретить пользователю изменять значение в колонке таблицы (выбирать другое значение или очищать поле), но при этом оставить возможность быстрого перехода к объекту (открытия карточки по ссылке). В обычных формах свойство ТолькоПросмотр работало достаточно гибко, однако в управляемом интерфейсе установка этого флага зачастую полностью блокирует интерактивность элемента, включая кнопку с "лупой".

Разберем подробно все существующие способы решения этой задачи — от простых манипуляций свойствами в конфигураторе до программных методов и использования особенностей контролов Taxi.

Метод 1. Тонкая настройка свойств «Поля ввода»

Многие разработчики по привычке устанавливают флаг ТолькоПросмотр для элемента формы. Это ошибка, если мы хотим оставить кнопку открытия. Вместо этого проанализируем комбинацию свойств, которая позволяет имитировать режим чтения, оставляя доступной кнопку открытия. Настроим колонку следующим образом:

  1. Установим свойство ТолькоПросмотр в значение Ложь. Это критически важно, чтобы элемент оставался активным для платформы.
  2. Установим КнопкаВыбора в значение Нет. Это скроет кнопку с тремя точками.
  3. Установим КнопкаОчистки в значение Нет.
  4. Установим КнопкаОткрытия в значение Да (или Авто, если тип данных — ссылочный).
  5. Установим РедактированиеТекста в значение Ложь. Это не даст пользователю вводить символы с клавиатуры.

Однако у этого метода есть «подводные камни». Рассмотрим ситуацию: опытный пользователь может нажать Shift+F4 (очистка) или F4 (выбор), и платформа выполнит действие, несмотря на отсутствие кнопок. Чтобы полностью исключить возможность изменения, необходимо также зайти в свойства контекстного меню колонки и снять флаг Автозаполнение. Это уберет команду «Очистить» из меню правой кнопки мыши.

Метод 2. Использование типа «Поле надписи» с гиперссылкой

Этот способ считается наиболее «чистым» и современным для управляемого интерфейса. Мы меняем саму сущность элемента управления в ячейке таблицы.

Выясним, как это реализовать:

  1. В дереве элементов формы выберем нужную колонку.
  2. Изменим свойство Вид с Поле ввода на Поле надписи.
  3. В свойствах поля установим флаг Гиперссылка.

Проанализируем преимущества: Поле надписи по определению не предназначено для редактирования. В нем нет кнопок выбора или очистки. При включенной гиперссылке текст в ячейке становится синим (согласно стилю оформления), и при клике по нему стандартно открывается форма объекта ссылки. Это избавляет нас от необходимости писать какой-либо код и бороться с горячими клавишами.

Метод 3. Программный перехват события «НачалоВыбора»

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

Для этого в обработчике события НачалоВыбора для колонки таблицы мы принудительно устанавливаем отказ от стандартной обработки. Рассмотрим пример кода:


&НаКлиенте
Процедура МояТаблицаНоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    // Блокируем открытие окна выбора
    СтандартнаяОбработка = Ложь;
КонецПроцедуры

При такой настройке кнопка выбора может быть видима, но нажатие на нее ничего не даст. При этом кнопка открытия (лупа) продолжит работать в штатном режиме, так как она вызывает другое событие — Открытие, которое мы не блокируем.

Метод 4. Универсальная программная настройка (Серверный метод)

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


&НаСервере
Процедура СделатьТолькоПросмотрПолеНаСервере(Поле)
    Если НЕ Поле.Вид = ВидПоляФормы.ПолеВвода Тогда
        Возврат;
    КонецЕсли;

    // Отключаем все кнопки, кроме открытия
    Поле.КнопкаВыпадающегоСписка = Ложь;
    Поле.КнопкаВыбора            = Ложь;
    Поле.КнопкаОчистки           = Ложь;
    Поле.КнопкаРегулирования     = Ложь;
    Поле.КнопкаСоздания          = Ложь;
    
    // Принудительно включаем кнопку открытия
    Поле.КнопкаОткрытия          = Истина;
    
    // Запрещаем ввод текста
    Поле.РедактированиеТекста    = Ложь;
    Поле.БыстрыйВыбор            = Ложь;
    
    // Отключаем историю, чтобы не всплывали подсказки
    Поле.ИсторияВыбораПриВводе   = ИсторияВыбораПриВводе.НеИспользовать;
    
    // Назначаем обработчик, который заблокирует F4
    Поле.УстановитьДействие("НачалоВыбора", "НачалоВыбораОтказ");
КонецПроцедуры

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

Метод 5. Обработка события «Выбор» самой таблицы

Иногда лучшим решением является полный отказ от кнопок в ячейках. Это делает интерфейс менее загроможденным (особенно в тяжелых табличных частях). Мы устанавливаем для всей колонки ТолькоПросмотр = Истина. Кнопки исчезают, но мы даем пользователю возможность открывать ссылки двойным кликом.

Разберем реализацию через событие Выбор (Selection) таблицы:

  1. У колонки устанавливаем свойство ТолькоПросмотр в Истина.
  2. Создаем обработчик события таблицы Выбор.
  3. В коде используем метод ПоказатьЗначение().

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

Такой подход считается эталонным для списков документов в типовых конфигурациях (например, 1С:ERP или 1С:УТ 11). Он обеспечивает привычное поведение: двойной клик открывает объект, а случайное изменение данных невозможно.

Нюансы платформы 8.3.10 и выше

Проанализируем поведение последних релизов платформы. Начиная с версии 8.3.10, логика отрисовки кнопок стала более строгой. Если вы используете Условное оформление формы для установки свойства Только просмотр, платформа может автоматически скрывать кнопку открытия. В таких случаях рекомендуется использовать Метод 2 (Гиперссылка) или Метод 5 (Обработка Выбора), так как они работают стабильно вне зависимости от динамических настроек оформления.

Важный момент по безопасности данных: Помните, что все вышеперечисленные способы — это настройки интерфейса. Если вам нужно гарантировать, что пользователь не изменит данные (например, через групповую обработку или внешние обработки), используйте ограничение прав доступа на уровне ролей или подписку на событие ПередЗаписью для проверки модификации конкретных полей.

Подведем итог: если вам нужно быстрое решение без кода — выбирайте Поле надписи с гиперссылкой. Если нужно сохранить стиль Поля ввода — используйте комбинацию свойств из Метода 1 с обязательным отключением автозаполнения контекстного меню.

← На главную