Подскажите пожалуйста как изменить доступность определенной ячейки в табличной части документе в управляемой форме
---
Условное оформление создается один раз, при создании на сервере. Если вы не можете формализовать условие, по которому должна ограничиваться доступность, то воспользуйтесь советом из другой темы – ограничивать доступность в событии таблицы ПередНачаломИзменения.
```1c
    &НаКлиенте
    Процедура ТоварыПередНачаломИзменения(Элемент, Отказ)

    Если Элемент.ТекущийЭлемент.Имя = "ТоварыЦена" Тогда
    СтрокаТабличнойЧасти = Элемент.ТекущиеДанные;

    Отказ = Не ПроверитьВозможностьРедактированияНаСервере(СтрокаТабличнойЧасти.Номенклатура);
    КонецЕсли;

    КонецПроцедуры
```
---
Нужно создать колонку в ТЧ Товары только как реквизит формы (не в метаданных), например, "РазрешеноРедактировать". При открытии формы заполнить ее в соответствии с логикой вашей процедуры ПроверитьВозможностьРедактированияНаСервере. При изменении колонки Номенклатура, также пересчитывать значение колонки "РазрешеноРедактировать".
А при создании на сервере настроить условное оформление от этой колонки примерно как (6).
---
При активации ячейки регулировать доступность колонок?
---
если выполняется условие то убирать доступность определенной ячейки в этой строке
---
нет, сразу колонки
---
Элементы.ИмТаблицыИмяКолонки.Доступность = Ложь
---
Давай для начала заглянешь в СП, и посмотришь - есть ли такое свойство (Доступность) у ячейки табличного документа?
---
есть
---
ну тогда как-то так:

```1c
    Если ТвоеУсловие = ЧемуТоТам Тогда
    Элементы.ТоварыТвояЯчейка.Доступность = Ложь;
    КонецЕсли;
```
---
привет мне нужно отключать доступность у конкретной ячейки а не по всему столбцу
---
Попробуйте через условное оформление:
```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

    ОтборУО = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ОтборУО.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Таблица.МожноРедактировать");
    ОтборУО.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ОтборУО.ПравоеЗначение = Ложь;

    ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТаблицаРеквизит1");

    ЭлементУО.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь);

    КонецПроцедуры
```
---
вот я тут уже че то пытался :

```1c
    &НаСервере
    Процедура ТоварыНоменклатураПриИзмененииНаСервере(Номенклатура)

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

    ОтборУО = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ОтборУО.ЛевоеЗначение = Номенклатура.Артикул;
    ОтборУО.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ОтборУО.ПравоеЗначение = "БТК01";

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

    ЭлементУО.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь);

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

    &НаКлиенте
    Процедура ТоварыНоменклатураПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные;
    ТоварыНоменклатураПриИзмененииНаСервере(СтрокаТабличнойЧасти.Номенклатура);
    КонецПроцедуры
```

допустим если я выбрал "Ботинки" то не могу именно у него в ТЧ менять цену а у номенклатуры "Штаны" могу менять
---
Условное оформление создается один раз, при создании на сервере. Если вы не можете формализовать условие, по которому должна ограничиваться доступность, то воспользуйтесь советом из другой темы – ограничивать доступность в событии таблицы ПередНачаломИзменения.
```1c
    &НаКлиенте
    Процедура ТоварыПередНачаломИзменения(Элемент, Отказ)

    Если Элемент.ТекущийЭлемент.Имя = "ТоварыЦена" Тогда
    СтрокаТабличнойЧасти = Элемент.ТекущиеДанные;

    Отказ = Не ПроверитьВозможностьРедактированияНаСервере(СтрокаТабличнойЧасти.Номенклатура);
    КонецЕсли;

    КонецПроцедуры
```
---
подскажите пожалуйста как это сделать
---
СПАСИБО!
---
все работает но тут такая проблема если я попытаюсь изменить количество а потом сразу наведусь на цену то ее снова можно изменить :((
---
Да, есть такое. Я бы всё таки остановился на условном оформлении. Покажите какой у вас код получился в ПередНачаломИзменения.
---
```1c
    &НаКлиенте
    Процедура Расш3_ЗапасыПередНачаломИзмененияПеред(Элемент, Отказ)

    Если Элемент.ТекущийЭлемент.Имя = "ЗапасыЦена" или Элемент.ТекущийЭлемент.Имя = "ЗапасыСумма" или Элемент.ТекущийЭлемент.Имя = "ЗапасыСуммаНДС" Тогда
    СтрокаТабличнойЧасти = Элемент.ТекущиеДанные;
    Отказ = Не ПроверитьВозможностьРедактированияНаСервере(СтрокаТабличнойЧасти.Номенклатура);
    КонецЕсли;

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

    &НаСервере
    Функция ПроверитьВозможностьРедактированияНаСервере(Номенклатура)

    Если Номенклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Запас Тогда
    Если Номенклатура.Родитель.Наименование = "Эффекты" Тогда
    Возврат Истина;
    Иначе
    Возврат Ложь;
    КонецЕсли;
    ИначеЕсли Номенклатура.ТипНоменклатуры <> Перечисления.ТипыНоменклатуры.Запас Тогда
    Возврат Истина;
    КонецЕсли;

    КонецФункции
```
---
Нужно создать колонку в ТЧ Товары только как реквизит формы (не в метаданных), например, "РазрешеноРедактировать". При открытии формы заполнить ее в соответствии с логикой вашей процедуры ПроверитьВозможностьРедактированияНаСервере. При изменении колонки Номенклатура, также пересчитывать значение колонки "РазрешеноРедактировать".
А при создании на сервере настроить условное оформление от этой колонки примерно как (6).
---
хорошо сейчас попробую. только еще хотел спросить насчет УО че то он у меня не работает. что не так вроде сравниваю Артикул

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    ЭлементУО = УсловноеОформление.Элементы.Добавить();
    ы = Объект.Товары;
    ОтборУО = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ОтборУО.ЛевоеЗначение = ы[0].Номенклатура.Артикул;
    ОтборУО.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ОтборУО.ПравоеЗначение = "БТК01";

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

    ЭлементУО.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь);

    КонецПроцедуры
```
---
ОтборУО.ЛевоеЗначение = ы[0].Номенклатура.Артикул; Так не сработает. В отборах условного оформления нельзя использовать подчиненные реквизиты. Ну и синтаксис неправильный – в качестве левого значения, если мы проверяем реквизит, нужно указывать поле компоновки данных, созданное на основе пути к данным, например:

```1c
    ОтборУО.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура");
```
 Но, повторюсь, для подчиненных реквизитов это не сработает.
---
ну тогда я не могу использовать УО. у меня реквизиты подчинённые
---
Так создайте свою колонку - реквизит формы, заполняйте ее в соответствии со своей логикой, а УО уже пусть опирается на эту колонку, как написано в (18).
---
ща попробую
---
в демо сделал осталось в унф перенести)
---
а че в расширении УО не работает что ли ?
---
я дурак. все заработало
---
Бывает.
---
Так добавь реквизит Артикул в таблицу и будет тебе счастье. Даже программировать не придётся.
---
это в базе где Артикул

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

    Если Элемент.ТекущийЭлемент.Имя = "ТоварыЦена" Тогда
    СтрокаТабличнойЧасти = Элемент.ТекущиеДанные;

    Отказ = Не ПроверитьВозможностьРедактированияНаСервере(СтрокаТабличнойЧасти.Номенклатура);
    КонецЕсли;

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

    &НаСервере
    Функция ПроверитьВозможностьРедактированияНаСервере(Номенклатура)

    Если Номенклатура.Артикул = "БТК01" Тогда

    Возврат Ложь;
    Иначе
    Возврат Истина;

    КонецЕсли;

    КонецФункции
```