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

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

Как заблокировать ячейку в табличной части 1С

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

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

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

Ниже разобраны рабочие способы для управляемых форм (1С 8.3), отдельно отмечены отличия для обычных форм и даны примеры кода, которые можно адаптировать под свою конфигурацию.

Способ 1. Статическая блокировка колонки через свойство ТолькоПросмотр

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

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

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

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

Способ 2. Блокировка отдельных ячеек по условию через условное оформление

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

Порядок настройки в конфигураторе: откройте форму, перейдите на закладку «Условное оформление», добавьте элемент. На закладке «Оформление» выберите параметр «Только просмотр» и установите значение «Истина». На закладке «Условие» задайте отбор, например: Реквизит «Объект.Товары.Утверждено» Равно Истина. На закладке «Оформляемые поля» укажите колонку, которую нужно заблокировать.

Тот же результат программно:

ЭлементОформления = УсловноеОформление.Элементы.Добавить();

ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);

Отбор = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Утверждено");

Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

Отбор.ПравоеЗначение = Истина;

Поле = ЭлементОформления.Поля.Элементы.Добавить();

Поле.Поле = Новый ПолеКомпоновкиДанных("ТоварыЦена");

Проверка результата: откройте форму, установите и снимите признак «Утверждено» в строке — ячейка цены должна соответственно блокироваться и разблокироваться без перезапуска формы.

Порядок действий для условной блокировки
  1. 1
    Откройте форму документа в конфигураторе или определите обработчик ПриСозданииНаСервере
  2. 2
    Добавьте элемент условного оформления с параметром ТолькоПросмотр = Истина
  3. 3
    Задайте отбор по реквизиту строки табличной части
  4. 4
    Укажите оформляемое поле — колонку таблицы
  5. 5
    Проверьте на тестовом документе: ячейка блокируется только в строках, подходящих под условие

Способ 3. Программный запрет через обработчики событий таблицы

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

&НаКлиенте

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

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

Если ТекущиеДанные <> Неопределено И ТекущиеДанные.Утверждено Тогда

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

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

КонецЕсли;

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

Такой способ блокирует редактирование всей строки. Если нужно запретить изменение только конкретной колонки, проверяйте имя текущего элемента: Элементы.Товары.ТекущийЭлемент.Имя — и отменяйте редактирование только для целевой колонки. Минус подхода: пользователь получает предупреждение вместо визуально «серой» ячейки, что менее удобно.

Комбинировать оба подхода — условное оформление для визуальной блокировки и обработчик для надёжной отмены — считается хорошей практикой: интерфейс подсказывает, что ячейка недоступна, а код страхует от обходных путей.

Маршрут решения

Как выбрать способ блокировки

Колонка не редактируется никогда и никемУстановите ТолькоПросмотр у элемента формы в конфигураторе
Блокировка зависит от данных строки (статус, признак, тип номенклатуры)Используйте условное оформление формы с параметром ТолькоПросмотр
Нужно показать пользователю пояснение, почему редактирование запрещеноДобавьте обработчик ПередНачаломИзменения с Отказ = Истина и текстом причины
Запрет должен действовать при любом способе изменения, включая обмены и обработкиРеализуйте проверку в модуле объекта или настройте права доступа / RLS

Блокировка по правам пользователей и после проведения

Частая бизнес-задача — запретить редактирование табличной части после проведения документа или для конкретной роли. Для проведённых документов типовое решение — проверять свойство Объект.Проведен в обработчике ПриОткрытии или ПриЧтенииНаСервере и устанавливать ТолькоПросмотр для всей таблицы:

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

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

КонецЕсли;

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

Не забывайте про дату запрета редактирования — штатный механизм БСП, который уже блокирует изменение документов в закрытых периодах. Если он настроен, дополнительная блокировка ячеек для старых документов может быть избыточной.

Особенности для обычных форм и табличных полей

В обычных формах (режим 8.2, некоторые старые конфигурации) механика ближе к классической: у колонки табличного поля есть свойство ТолькоПросмотр, а для построчной блокировки используется обработчик ПриПолученииДанных или ПриВыводеСтроки, где можно управлять оформлением ячеек через объект ОформлениеСтроки. Там доступно прямое обращение к ячейке: ОформлениеСтроки.Ячейки.Цена.ТолькоПросмотр = Истина;.

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

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

Проверка результата и отладка

После внедрения блокировки пройдите контрольный сценарий под пользователем с целевыми правами, а не под полными правами. Проверьте: ячейка не переходит в режим редактирования при двойном клике; вставка из буфера (Ctrl+V) не срабатывает; кнопки подбора и «Изменить» в командной панели таблицы не открывают редактирование заблокированных данных; при программном пересчёте (например, при изменении ставки НДС) заблокированные значения не затираются неожиданно.

Если условное оформление не срабатывает, типовые причины: неверно указан путь к данным в отборе (для табличной части нужен полный путь вида Объект.Товары.Поле); не заполнена закладка «Оформляемые поля»; конфликт с другим элементом условного оформления, стоящим выше в списке и переопределяющим параметр.

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

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

Двойной клик по заблокированной ячейке
Норма

Режим редактирования не открывается

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

Ячейка доступна для ввода — проверьте отбор условного оформления

Вставка значения из буфера обмена
Норма

Значение не вставляется

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

Значение вставляется — добавьте Отказ в обработчике ПриИзменении

Поведение при изменении условия в строке
Норма

Ячейка блокируется и разблокируется динамически

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

Блокировка применяется только после переоткрытия формы — условное оформление настроено неверно

Проведение и запись документа
Норма

Документ записывается без ошибок, заблокированные данные корректны

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

Ошибки проверки заполнения из-за конфликта блокировки с обязательными полями

Часто задаваемые вопросы

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

В управляемой форме напрямую обратиться к отдельной ячейке нельзя. Задача решается условным оформлением: задаётся отбор по данным конкретной строки (например, по уникальному признаку), а оформляемым полем указывается нужная колонка. В результате блокируется именно «пересечение» строки и колонки, что функционально равно блокировке ячейки.

Чем отличается ТолькоПросмотр от Доступность?

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

Как запретить добавление и удаление строк в табличной части?

Установите у таблицы формы свойства ИзменятьСоставСтрок = Ложь (или используйте обработчики ПередНачаломДобавления и ПередУдаления с Отказ = Истина). Дополнительно скройте кнопки «Добавить» и «Подбор» из командной панели таблицы, чтобы не вводить пользователя в заблуждение.

Блокировка через условное оформление работает в тонком и веб-клиенте?

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

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

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

Итог

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

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