Добрый день!

Столкнулся с такой проблемой. На форме есть две табличные части, допустим ТЧ1 и ТЧ2. ТЧ2 находится в группе "ГруппаЭлементовТЧ2" формы, плюс еще несколько реквизитов. Группа нужна чтобы изменять доступность подчиненных элементов.

Я обработчике ТЧ1 ПриАктивизацииЯчейки происходит анализ ячеки, допустим если ячейка 1 то доступность "ГруппаЭлементовТЧ2" = Ложь, если ячейка 2,3,4 и т.д. то доступность "ГруппаЭлементовТЧ2" = Истина.

При открытие формы все нормально, при выборе любой ячейки кроме 1-ой происходит цикличный вызов процедуры ПриАктивизацииЯчейки ТЧ1.

Отладка показала что платформа после первого вызова процедуры перекидывает фокус на первую ячейку и вызывает процедуру ПриАктивизацииЯчейки, т.к. форкус поменялся в процедуре меняется доступность группы. Далее опять фокус возвращается на текущую ячейку и происходит вызов процедуру ПриАктивизацииЯчейки доступность группы меняется и цикл повторяется.

Подскажите как быть, как это вылечить?

П.С. До этого не создавал группу, а просто менял свойство ТолькоПросмотр ТЧ2 и получал антологичный цикл, далее методом тыка обнаружил что если менять свойство Доступность то цикла не происходит. С группой такое не работает.
---
где я советовал ТолькоПросмотр? ТолькоПросмотр и Доступность используют серверный вызов для ТЧ.
Я советовал Сворачиваемую группу, или Переключение Страниц. Они не вызывают сервер.
По поводу "Обработчик не помог":

```1c
    &НаКлиенте
    Перем ДоступностьГруппы;

    &НаКлиенте
    Процедура ТЧ1ПриАктивизацииЯчейки(Элемент)
    Если Элемент.ТекущийЭлемент.Имя = "ТЧ1Яч1" Тогда
    ДоступностьГруппы = Истина;
    Иначе
    ДоступностьГруппы = Ложь;
    КонецЕсли;

    ПодключитьОбработчикОжидания("УстановитьДоступность", 0.1, Истина);
    КонецПроцедуры

    &НаКлиенте
    Процедура УстановитьДоступность() Экспорт
    Элементы.Группа1.Доступность = ДоступностьГруппы;
    КонецПроцедуры
```
---
самая идея такого решения не из лучших.
При каждом смене режима Доступность будет серверный вызов.
От того и такие эффекты. Форма будет каждый перестраиваться/перерисовываться.

Можно обойти зацикливание через ПодключитьОбработчикОжидания, в котором менять режим доступности.

Но лучше подумать о другом варианте решения. Скажем о сворачиваемости группы, или переключения страниц.
---
Да я рад использовать ТолькоПросмотр, но цикл все равно будет. Обработчик не помог пробовал, происходит вызов ПриАктивизацииЯчейки со всеми последствиями.

И тогда вопрос в продолжение, почему при смене доступности только таблицы такого не происходит?
---
где я советовал ТолькоПросмотр? ТолькоПросмотр и Доступность используют серверный вызов для ТЧ.
Я советовал Сворачиваемую группу, или Переключение Страниц. Они не вызывают сервер.
По поводу "Обработчик не помог":

```1c
    &НаКлиенте
    Перем ДоступностьГруппы;

    &НаКлиенте
    Процедура ТЧ1ПриАктивизацииЯчейки(Элемент)
    Если Элемент.ТекущийЭлемент.Имя = "ТЧ1Яч1" Тогда
    ДоступностьГруппы = Истина;
    Иначе
    ДоступностьГруппы = Ложь;
    КонецЕсли;

    ПодключитьОбработчикОжидания("УстановитьДоступность", 0.1, Истина);
    КонецПроцедуры

    &НаКлиенте
    Процедура УстановитьДоступность() Экспорт
    Элементы.Группа1.Доступность = ДоступностьГруппы;
    КонецПроцедуры
```
---
Я использовал почти такой же код, только таймаут был 1 секунда и доступность когда выбрана первая ячейка был в процедуре, а когда остальные в обработчике ожидания. После изменение доступности группы платформа вызывает процедуру ТЧ1ПриАктивизацииЯчейки, два раза, вначале там первая ячейка таблицы, а потом текущая ту которую выбрал пользователь.
---
все верно. Вызывает. Но ОбработчикОжидания будет выполнен только один раз с последним вызовом.
---
Хорошо сейчас попробую такой вариант. Но насчет сворачиваемости группы не понял. У меня есть группа в которой кнопка, реквизит число и табличная часть, как все это свернуть? Что касаемо страницы тоже непонятно чем они мне помогут. У меня две ТЧ, вторая это свойства ячеек первой. Т.е. пользователь выбирает ячейку первой и во второй задает свойства, как это реализовать удобно для пользователя на страницах не совсем себе представляю.
---
Не совсем так, на самом деле вызывает два раза, первый раз после захода в процедуру ПриАктивизацииЯчейки (т.е. когда пользователь кликнул на ячейке), потом когда платформа устанавливает фокус на первой ячейчке и отработки процедуры ПриАктивизацииЯчейки обработчик ожидания не срабатывает, а когда платформа устанавливает опять фокус в выбранную ячейку обработчик срабатывает второй раз. Я думаю что это баг платформы, процедура ПриАктивизацииЯчейки не должна срабатывать при обновлении отображения элементов, а костыль в виде обработчика ожидания, ну это костыль. Плюс команда Этаформа.ОбновитьОтображениеДанных(Элементы.ГруппаТЧ2) не вызывает такое поведение с переключением фокуса.
---
В общем в такой реализации работает, но не совсем понял почему. Обработчик же будет каждый раз срабатывать и менять доступность элементов группы, что в свою очередь будет вызывать процедуру ПриАктивизацииЯчейки, которая опять вызовет обработчик ожидания, по идее должен быть цикл, но цикл в какой-то момент прерывается, непонятно почему.
---
А нельзя сохранять номер текущей колонки в в переменную/реквизит формы, проверять в начале процедуры изменилась ли текущая колонка и устанавливать текущую ячейку в конце?
---
То что вы предлагаете не сработает, т.к. фокус по идеии должен вернуться в текущую ячейку. Т.е. смена фокуса происходит в момент обновления отображения группы, а потом он возвращается. Это вообще похоже на баг платформы, или я чет недопонимаю.

Я уже тут тоже думаю замутить с ТекущаяУниверсальнаяДатаВМиллисекундах, но это все как-то костыльно. Все же непонятно почему фокус прыгает когда я меняю доступность элементов формы.