Версия для печати темы (https://pro1c.org.ua/index.php?s=e0d1842dd258a48ec2361a9649293be5&showtopic=21268)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование управляемых форм 1С 8.2 _ Видимость элементов командной панели в управляемых формах

Автор: azamatnadyrkulov 19.12.14, 14:46

Здравствуйте уважаемые формучане!
Проблема заключается в следующем, есть форма списка (журнал документа) в котором имеется кнопка в командной панели, необходимо изменять ее видимость в зависимости от состояния выделенного документа журнала. Состояние документов журнала хранится в регистре сведений. Все это в принципе реализовано, но имеется неприятная штука. Так как при изменении видимости кнопки "Статусы" форма обращается на сервер и соответственно перерисовывается что вызывает центрирование динамического списка документов на выделенной строке и от этого этот список "скачет". Как решить данную задачу без "скачков"

Пытался найти способ отключения автоцентрирования выделенной строки динамического списка, но так и не нашел.

azamatnadyrkulov,
код выложу чуть позже

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

&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)

    ВыполнитьОбработкуСтроки(Элементы.Список.ТекущаяСтрока, ЭтаФорма);

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


Процедура ВыполнитьОбработкуСтроки
&НаКлиенте
Процедура ВыполнитьОбработкуСтроки(Ссылка, Форма, ИмяГруппыСтатусов = "ФормаУправлениеСтатусами") Экспорт
    ТипОбъекта = ПолучитьТипОбъекта(Форма.ИмяФормы);
    Если ТипОбъекта = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    СуществуютСтатусыПоТипуОбъекта     = УправлениеСтатусамиПроцессов.СуществуютСтатусыПоТипуОбъекта(ТипОбъекта);
    ГруппаСтатусов                     = Форма.КоманднаяПанель.ПодчиненныеЭлементы.Найти(ИмяГруппыСтатусов);
    Попытка
        ТекущийСтатус     = УправлениеСтатусамиПроцессов.ПолучитьТекущийСтатус(Ссылка);
        ТекущееСостояние= УправлениеСтатусамиПроцессов.ПолучитьТекущееСостояние(Ссылка);
        Если ТекущееСостояние = "Отменено" Тогда
            НаборПрав                     = Новый Структура("Редактирование,Завершить,Отменить,Отложить,ШагНазад", Ложь, Ложь, Ложь, Ложь, Ложь);
            ГруппаСтатусов.Видимость     = Ложь;
        Иначе
            НаборПрав                     = УправлениеСтатусамиПроцессов.ПолучитьНаборПрав(ТекущийСтатус);
            ГруппаСтатусов.Видимость     = Истина;
        КонецЕсли;
        
        Попытка
            ГруппаСтатусов.ПодчиненныеЭлементы.ФормаОбработкаИзменениеСтатусаЗавершить.Видимость     = НаборПрав.Завершить;
            ГруппаСтатусов.ПодчиненныеЭлементы.ФормаОбработкаИзменениеСтатусаОтложить.Видимость     = НаборПрав.Отложить;
            ГруппаСтатусов.ПодчиненныеЭлементы.ФормаОбработкаИзменениеСтатусаОтменить.Видимость     = НаборПрав.Отменить;
            ГруппаСтатусов.ПодчиненныеЭлементы.ФормаОбработкаИзменениеСтатусаШагНазад.Видимость     = НаборПрав.ШагНазад;
        Исключение
            Попытка
                ГруппаСтатусов.ПодчиненныеЭлементы.ФормаУправлениеСтатусами1.ПодчиненныеЭлементы.ФормаОбработкаИзменениеСтатусаЗавершить.Видимость     = НаборПрав.Завершить;
                ГруппаСтатусов.ПодчиненныеЭлементы.ФормаУправлениеСтатусами1.ПодчиненныеЭлементы.ФормаОбработкаИзменениеСтатусаОтложить.Видимость     = НаборПрав.Отложить;
                ГруппаСтатусов.ПодчиненныеЭлементы.ФормаУправлениеСтатусами1.ПодчиненныеЭлементы.ФормаОбработкаИзменениеСтатусаОтменить.Видимость     = НаборПрав.Отменить;
                ГруппаСтатусов.ПодчиненныеЭлементы.ФормаУправлениеСтатусами1.ПодчиненныеЭлементы.ФормаОбработкаИзменениеСтатусаШагНазад.Видимость     = НаборПрав.ШагНазад;
            Исключение
            
            КонецПопытки;    
            
        КонецПопытки;    
    Исключение
        
    КонецПопытки;
КонецПроцедуры

Автор: logist 19.12.14, 15:02

Какой тип возвращает ПолучитьТипОбъекта() ? Если саму форму на сервер не гоняете, то список не должен перепозиционироваться.
А вообще, раз статусы хранятся в регистре сведений, то я бы изменил сам запрос списка, получал бы нужный статус уже в список и при нажатии на строку устанавливал необходимую видимость, вместо вызова непонятных пяти сторонних процедур. У Вас судя по коду слишком "мудрено" сделано, использование попыток (еще и вложенных) там где это, по логике, не нужно, наталкивает на эту мысль.

Автор: azamatnadyrkulov 19.12.14, 15:42

Получитьтипобъекта() возвращает строку типа документ.искомыйдокумент

Получитьтипобъекта() возвращает строку типа документ.искомыйдокумент

В том то и проблема что изменение видимости сама обращается на сервер

Автор: sava1 19.12.14, 16:00

для прочтения
http://pro1c.org.ua/redirect.php?http://1clancer.ru/article/optimalnoe_izmenenie_vidimosti_elementov_na_upravlyaemoj_forme_1105

Автор: logist 19.12.14, 16:01

Цитата(azamatnadyrkulov @ 19.12.14, 15:42) *
В том то и проблема что изменение видимости сама обращается на сервер

Ну, так перепишите все это, что бы все было в запросе списка, и тогда не надо будет обращаться к серверу даже в самой форме.

Автор: azamatnadyrkulov 19.12.14, 16:47

Цитата(sava1 @ 19.12.14, 20:00) http://pro1c.org.ua/index.php?act=findpost&pid=94503


Большое спасибо это уже читал там метод вкладок страниц

Цитата(logist @ 19.12.14, 20:01) *
Ну, так перепишите все это, что бы все было в запросе списка, и тогда не надо будет обращаться к серверу даже в самой форме.


можете подробнее объяснить что значит чтобы все былов запросе
динамический список не имеет запроса он обращается на прямую к документу

Автор: Petre 19.12.14, 17:06

Цитата(azamatnadyrkulov @ 19.12.14, 16:47) *
динамический список не имеет запроса он обращается на прямую к документу

Динамический список построен на СКД и использует либо дефолтовый запрос при указании объекта, либо произвольный запрос.

Автор: azamatnadyrkulov 19.12.14, 17:15

Цитата(Petre @ 19.12.14, 21:06) *
Динамический список построен на СКД и использует либо дефолтовый запрос при указании объекта, либо произвольный запрос.


спасибо буду знать
но все же как изменять видимость кнопки не обращаясь на сервер
если использовать элементы.моякнопка.видимость - срабатывает перерисовка

даже если я получу статус в списке запросом
мне ведь нужно менять видимость кнопки которая находится на командной панели в зависимости от статуса выделенной строки

Автор: Petre 19.12.14, 17:27

Цитата(azamatnadyrkulov @ 19.12.14, 17:15) *
но все же как изменять видимость кнопки не обращаясь на сервер

Обратиться к фирме 1с и попросить ее убрать обращение на сервер при изменении свойства "видимость".

Попробуйте "доступность". В СП по поводу изменения этого свойства у кнопки ничего не сказано на счет обращения на сервер.

Автор: azamatnadyrkulov 19.12.14, 17:29

Цитата(Petre @ 19.12.14, 21:27) *
Попробуйте "доступность". В СП по поводу изменения этого свойства у кнопки ничего не сказано на счет обращения на сервер.


большое спасибо пробовал но почему то сервер вызывается даже при изменении доступности, хоть и про доступность пишут что она не должна вызывать сервер

Автор: Petre 19.12.14, 17:31

Значит просто не дописали СП. Увы.

Автор: azamatnadyrkulov 19.12.14, 17:37

Ребята выручайте уже 3 день ищу ответ на данный вопрос. может я подхожу не стой стороны к проблеме так как опыт не такой уж и большой в 1С

может что - то еще рассказать о форме в которой я пытаюсь сделать эту видимость

Автор: logist 19.12.14, 19:36

Цитата(azamatnadyrkulov @ 19.12.14, 17:15) *
даже если я получу статус в списке запросом
мне ведь нужно менять видимость кнопки которая находится на командной панели в зависимости от статуса выделенной строки

Если Вы получите статус в запросе динамического списка, то он у вас будет как бы колонкой этого списка (не видимой) и когда происходит ПриАктивизацииСтроки то это значение находится в строке списка
Элементы.Список.ТекущиеДанные.ИмяМоейКолонкиКотороеСодержитСтатус
Судя по запросу выше, таких колонок у вас должно быть 5, 4 на каждое право и одна на ТекущийСтатус, соответственно дальше вы пишите в этом же событии примерно такой код
ТекущаяСтрока = Элементы.Список.ТекущиеДанные;
Если ТекущаяСтрока  <> Неопределено Тогда
  ГруппаСтатусов.ПодчиненныеЭлементы.ФормаОбработкаИзменениеСтатусаЗавершить.Видимость = ТекущаяСтрока.ИмяМоейКолонкиКотороеСодержитСтатус;
  // и дальше еще строки для каждой кнопки/группы
КонецЕсли

Запрос формируете таким образом, что он в ИмяМоейКолонкиКотороеСодержитСтатус помещал нужный вам вариант булево.

Автор: azamatnadyrkulov 20.12.14, 12:35

Цитата(logist @ 19.12.14, 23:36) *
Если Вы получите статус в запросе динамического списка, то он у вас будет как бы колонкой этого списка (не видимой) и когда происходит ПриАктивизацииСтроки то это значение находится в строке списка
Элементы.Список.ТекущиеДанные.ИмяМоейКолонкиКотороеСодержитСтатус
Судя по запросу выше, таких колонок у вас должно быть 5, 4 на каждое право и одна на ТекущийСтатус, соответственно дальше вы пишите в этом же событии примерно такой код
ТекущаяСтрока = Элементы.Список.ТекущиеДанные;
Если ТекущаяСтрока  <> Неопределено Тогда
  ГруппаСтатусов.ПодчиненныеЭлементы.ФормаОбработкаИзменениеСтатусаЗавершить.Видимость = ТекущаяСтрока.ИмяМоейКолонкиКотороеСодержитСтатус;
  // и дальше еще строки для каждой кнопки/группы
КонецЕсли

Запрос формируете таким образом, что он в ИмяМоейКолонкиКотороеСодержитСтатус помещал нужный вам вариант булево.


спасибо буду пробовать, извините за пробел были дела

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua