К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как запретить редактирование ячейки в 1С

Как запретить редактирование ячейки в 1С: настройка формы, код в модуле, права доступа и блокировка по условию. Пошаговые инструкции с примерами кода.

Запрет редактирования ячейки в 1С — типовая задача, которая возникает при настройке документов, справочников и табличных частей. Пользователь не должен менять цену после утверждения счёта, менеджер — исправлять количество в проведённой накладной, а оператор — редактировать ключевые реквизиты справочника. В зависимости от ситуации применяются разные механизмы: свойство «ТолькоПросмотр» элемента формы, условное оформление, обработчики событий, права доступа и функциональные опции.

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

Ниже разобраны все рабочие способы: от простой настройки в конфигураторе до программной блокировки по условию и запрета через роли. Примеры кода приведены для управляемых форм (тонкий клиент), как наиболее распространённого сценария в современных конфигурациях.

Способ 1. Свойство «ТолькоПросмотр» в конфигураторе

Самый простой вариант — установить запрет на этапе разработки формы. Откройте конфигуратор, найдите нужный объект (документ, справочник), перейдите на вкладку «Формы» и откройте основную форму. В дереве элементов выберите поле или колонку табличной части, которую нужно заблокировать.

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

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

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

Способ 2. Программный запрет через код формы

Когда блокировка зависит от условия, свойство устанавливается кодом в модуле формы. Типовое место для этого — обработчик ПриСозданииНаСервере или ПриОткрытии. Пример для документа, где поле «Комментарий» нельзя редактировать после проведения:

&НаКлиенте

Процедура ПриОткрытии(Отказ)

Если Объект.Проведен Тогда

Элементы.Комментарий.ТолькоПросмотр = Истина;

Элементы.Товары.ТолькоПросмотр = Истина;

КонецЕсли;

КонецПроцедуры

Для блокировки отдельной колонки табличной части обращайтесь к элементу колонки по имени:

Элементы.ТоварыЦена.ТолькоПросмотр = Истина;

Обратите внимание на разницу контекстов. В &НаСервере доступ к элементам формы тоже возможен, но если условие зависит от данных объекта, удобнее ставить блокировку в ПриСозданииНаСервере — тогда форма откроется уже с нужным состоянием, без визуального «мигания» доступности.

Способ 3. Блокировка отдельной ячейки строки табличной части

Частая задача: в одних строках таблицы ячейку редактировать можно, в других — нельзя. Например, цену нельзя менять только для товаров из определённой группы. Свойство элемента формы тут не поможет, потому что оно действует на колонку целиком. Решение — обработчик события таблицы ПередНачаломИзменения:

&НаКлиенте

Процедура ТоварыПередНачаломИзменения(Элемент, Отказ)

ТекущиеДанные = Элементы.Товары.ТекущиеДанные;

Если ТекущиеДанные <> Неопределено

И ТекущиеДанные.ЦенаУтверждена Тогда

Отказ = Истина;

ПоказатьПредупреждение(, "Цена утверждена и не редактируется");

КонецЕсли;

КонецПроцедуры

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

Ещё один вариант для частичной блокировки — обработчик ПриНачалеРедактирования с проверкой имени текущей колонки через Элементы.Товары.ТекущийЭлемент.Имя. Это позволяет запретить редактирование конкретной колонки в конкретной строке, оставив остальные доступными.

Порядок действий для блокировки по условию
  1. 1
    Определите условие: статус документа, роль пользователя, значение реквизита
  2. 2
    Откройте модуль формы объекта в конфигураторе
  3. 3
    Создайте обработчик ПриСозданииНаСервере или ПриОткрытии
  4. 4
    Установите Элементы.<ИмяПоля>.ТолькоПросмотр = Истина при выполнении условия
  5. 5
    Для отдельных строк таблицы добавьте обработчик ПередНачаломИзменения с Отказ = Истина
  6. 6
    Обновите конфигурацию базы данных и проверьте поведение под тестовым пользователем

Способ 4. Запрет через права доступа (роли)

Настройки формы защищают только от редактирования «в лоб» через конкретную форму. Пользователь с достаточными правами может изменить данные через групповую обработку, обмен или другую форму. Для надёжной защиты используются роли.

В конфигураторе откройте нужную роль, найдите объект (документ, справочник) и настройте права: снимите флажок «Изменение», оставив «Чтение» и «Просмотр». Пользователь с такой ролью сможет открыть документ и посмотреть данные, но не сможет их сохранить — платформа сама заблокирует запись.

Для более тонкой настройки применяется механизм RLS (ограничение доступа на уровне записей) — например, разрешить менеджеру редактировать только свои документы. Шаблон ограничения пишется на языке запросов в свойствах права «Изменение» роли.

Способ 5. Защита в модуле объекта и подписки на события

Дополнительный рубеж защиты — проверка при записи. Даже если где-то форма осталась открытой для редактирования, объект не даст сохранить недопустимые изменения. Используется обработчик ПередЗаписью в модуле объекта:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

Если Не ЭтоНовый() И Проведен

И Не РольДоступна("ПолныеПрава") Тогда

// сравнение с данными из базы

Если Ссылка.ЦенаДоговора <> ЦенаДоговора Тогда

Отказ = Истина;

ВызватьИсключение "Изменение цены договора запрещено";

КонецЕсли;

КонецЕсли;

КонецПроцедуры

Если конфигурация типовая и её нельзя менять, аналогичную проверку реализуют через подписку на событие «ПередЗаписью» нужного вида документов — код размещается в общем модуле, а сама конфигурация остаётся на поддержке. Ещё безопаснее для обновления — расширение конфигурации.

Сравнение способов запрета

Свойство ТолькоПросмотр

Быстро и просто, но действует всегда и только на уровне формы. Подходит для заведомо нередактируемых полей

Код в модуле формы

Гибкая блокировка по условию, но защищает только конкретную форму

Роли и RLS

Надёжная защита на уровне базы, но требует аккуратной настройки и тестирования

Проверка при записи

Последний рубеж: блокирует любые изменения, включая программные. Не даёт визуальной подсказки пользователю

Типичные ошибки и как их избежать

Первая частая ошибка — путать «ТолькоПросмотр» и «Доступность». ТолькоПросмотр оставляет поле активным (из него можно копировать значение, работает фокус), а Доступность = Ложь полностью отключает элемент. Для полей, значения которых пользователь должен копировать, выбирайте ТолькоПросмотр.

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

Третья ошибка — забыть про обходные пути. Блокировка на форме не мешает изменить данные через «Ещё → Изменить выделенные», внешнюю обработку или обмен. Если данные критичны, добавьте проверку при записи или настройте роли.

Типичные ошибки
01
Блокировка только на форме — данные меняются через групповую обработку или обмен
02
Использование Доступность вместо ТолькоПросмотр — пользователь не может скопировать значение
03
Изменение типовой роли напрямую — проблемы при обновлении конфигурации
04
Код блокировки только в ПриОткрытии — форма открывается с доступным полем и «переключается» на глазах у пользователя
05
Отказ в ПередЗаписью без поясняющего сообщения — пользователь не понимает, почему документ не сохраняется

Как проверить, что запрет работает

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

Затем проверьте обходные пути: групповое изменение реквизитов, копирование документа, загрузку через обработку. Если защита реализована только на форме, хотя бы один из этих способов позволит изменить данные — это сигнал добавить проверку при записи или права.

Контрольные точки

Как проверить результат

Поле на форме
Норма

Значение видно, ввод и редактирование недоступны

Тревожный признак

Поле можно изменить или оно вообще скрыто

Ячейка табличной части
Норма

При попытке редактирования появляется пояснение, значение не меняется

Тревожный признак

Блокируется вся колонка, включая строки, где редактирование разрешено

Запись объекта
Норма

При запрещённом изменении запись отклоняется с понятным сообщением

Тревожный признак

Документ сохраняется с изменённым значением

Права пользователя
Норма

Под обычным пользователем изменение невозможно, под полными правами — возможно

Тревожный признак

Запрет не работает ни у кого или не работает только у администратора

Частые вопросы

Как заблокировать ячейку в табличном документе (не в форме)?

Для табличного документа используется свойство области «Защита»: в конфигураторе выделите ячейку и установите Защита = Истина, а затем включите защиту всего документа. Программно: Область.Защита = Истина и ТабДок.Защита = Истина. Без включения защиты документа свойство области не действует.

Можно ли запретить редактирование только для части пользователей без доработки?

Да, если задача сводится к запрету изменения всего объекта — это делается ролями: пользователю назначается роль без права «Изменение» на нужный вид документов. Для блокировки отдельных полей у отдельных пользователей без доработки не обойтись: понадобится код формы с проверкой роли через РольДоступна() или ПользователиИнформационнойБазы.

Почему ТолькоПросмотр не срабатывает у администратора?

Свойство ТолькоПросмотр не зависит от прав — оно работает для всех. Если под администратором поле редактируется, скорее всего, условие в коде не выполняется (например, проверка роли написана наоборот) или блокировка устанавливается в обработчике, который не вызывается. Проверьте логику условия и контекст обработчика.

Как запретить редактирование проведённых документов во всей базе?

Используйте механизм дат запрета изменения данных (в типовых конфигурациях — раздел «Администрирование», настройка дат запрета). Он блокирует изменение документов до указанной даты для выбранных пользователей или групп. Для произвольного условия добавьте проверку в подписку на событие ПередЗаписью.

Чем отличается запрет в расширении от изменения конфигурации?

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

Можно ли заблокировать ячейку по значению другой ячейки той же строки?

Да. В обработчике ПередНачаломИзменения табличной части получите текущие данные строки и проверьте нужное поле: если условие выполняется, установите Отказ = Истина. Для наглядности добавьте условное оформление, подсвечивающее такие ячейки другим цветом.

Итог

Что важно запомнить

Для постоянного запрета достаточно свойства «ТолькоПросмотр» у элемента формы. Для блокировки по условию — код в обработчиках формы, для отдельных ячеек строк — ПередНачаломИзменения с Отказ = Истина. Надёжную защиту данных обеспечивают только роли, даты запрета и проверки при записи; форма — лишь удобный интерфейсный уровень. Изменения в типовых конфигурациях делайте через расширения и всегда проверяйте результат под обычным пользователем.