Как сделать элемент формы редактируемым в режиме ТолькоПросмотр в 1С 7.7?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

При разработке интерфейсов в платформе «1С:Предприятие 7.7» разработчики часто сталкиваются с задачей: запретить пользователю создание, изменение и удаление элементов в форме списка справочника, но при этом оставить возможность управлять фильтрами, переключателями и отборами (например, выбирать дату остатков, фирму или склад).

Первое очевидное действие — вызвать метод Форма.ТолькоПросмотр(1). Однако этот вызов блокирует абсолютно все поля диалога, включая независимые переменные формы. Попытка принудительно активировать конкретное поле через Форма.ИмяЭлемента.Доступность(1) не дает результата. Разберем особенности работы платформы 1С 7.7 и рассмотрим практические способы решения этой задачи.

Почему не работает метод Доступность(1) при ТолькоПросмотр(1)

В архитектуре платформы 1С 7.7 метод Форма.ТолькоПросмотр(1) имеет глобальный безусловный приоритет. Когда этот режим включен, платформа переводит весь графический контекст окна в состояние «только чтение». Любые попытки точечно вернуть доступность отдельным реквизитам диалога программно игнорируются.

С другой стороны, если просто не включать ТолькоПросмотр(1), в форме списка остаются активными стандартная панель инструментов («Новый», «Изменить», «Удалить») и контекстное меню таблицы. Проанализируем возможные пути обхода этого поведения платформы.

Решение 1. Настройка прав доступа в конфигураторе (рекомендуемый штатный способ)

Наиболее правильный и надежный подход без изменения логики формы списка — корректное разграничение прав на уровне метаданных конфигуратора.

  1. Открываем конфигуратор и переходим к списку ролей (наборов прав).
  2. Находим нужный справочник (например, «Номенклатура»).
  3. Снимаем у роли флаги: «Ввод нового», «Редактирование» и «Удаление», оставив только право «Чтение».

В этом случае платформа 1С 7.7 самостоятельно делает недоступными стандартные кнопки панели инструментов и пункты контекстного меню. Сама форма списка открывается в штатном режиме без вызова ТолькоПросмотр(1), а все независимые поля диалога (отборы, флажки, списки выбора) остаются полностью доступными для пользователя.

Решение 2. Интерактивный ввод значений через диалоговые функции

Если блокировку формы нельзя решить через права доступа и вызов Форма.ТолькоПросмотр(1) необходим, стандартные элементы ввода на форме становятся неактивными. Однако обычные кнопки диалога продолжают нажиматься даже в режиме просмотра.

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


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

Функции ВвестиДату(), ВвестиЧисло(), ВвестиСтроку() и универсальная ВвестиЗначение() открывают стандартные системные модальные окна ввода. Это позволяет пользователю задавать значения фильтра даже при заблокированной форме.

Решение 3. Использование элемента «Текст» с формулой

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

  1. Размещаем элемент диалога «Текст».
  2. В поле «Заголовок» указываем шаблон вывода текущего значения (например, функцию или строковую переменную ПредставлениеФильтра).
  3. В поле «Формула» прописываем имя процедуры обработки клика, например ОбработкаКликаПоТексту().

Посмотрим на реализацию процедуры обработки клика:


Процедура ОбработкаКликаПоТексту()
    Перем ВыбСклад;
    ВыбСклад = ФильтрСклад;
    Если ВвестиЗначение(ВыбСклад, "Выберите склад", "Справочник.Склады") = 1 Тогда
        ФильтрСклад = ВыбСклад;
        Форма.Обновить();
    КонецЕсли;
КонецПроцедуры

Решение 4. Перенос запрета на уровень формы элемента и модуля справочника

Рассмотрим ситуацию, когда требуется оставить список полностью интерактивным, но гарантированно предотвратить изменение самих данных справочника.

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

Затем в модуле формы элемента справочника перехватываем открытие:


Процедура ПриОткрытии()
    Если Выбран() = 1 Тогда
        // Существующий элемент открываем строго на просмотр
        Форма.ТолькоПросмотр(1);
    Иначе
        // Запрещаем создание новых элементов
        Предупреждение("Создание новых позиций номенклатуры запрещено!");
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
КонецПроцедуры

Для полной защиты данных добавим блокировки в модуль самого справочника, чтобы исключить удаление и изменение через контекстное меню или горячие клавиши:


Процедура ПриЗаписи()
    // Запрет сохранения любых изменений
    Предупреждение("Изменение данных запрещено!");
    СтатусВозврата(0);
КонецПроцедуры

Процедура ПриУдалении()
    // Запрет интерактивного и программного удаления
    Предупреждение("Удаление элементов запрещено!");
    СтатусВозврата(0);
КонецПроцедуры

При таком подходе форма списка остается полностью разблокированной: работают все независимые реквизиты диалога, фильтры и отборы, а данные справочника остаются под защитой.

Решение 5. Скрытие панели инструментов и использование внешней компоненты FormEx

Если панель инструментов нужно убрать программно, в процедуре ПриОткрытии() формы списка вызываем:


Процедура ПриОткрытии()
    Форма.ПанельИнструментов(0);
КонецПроцедуры

Однако вызов Форма.ПанельИнструментов(0) не отключает контекстное меню и горячие клавиши списка (Insert, F2, Delete). Для решения этой задачи в среде 1С 7.7 традиционно применяется внешняя компонента FormEx.

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

← На главную