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