Имя: Пароль:
1C
1С v8
Видимость на управляемых формах
,
0 umkasort
 
06.06.19
12:14
Добрый день
Есть документ с кучей табличных частей, которые заполняются не все. Поэтому нужно проверить заполнена ли в документе табличная часть и выводить на форму только заполненные. В принципе механизм понятен  для одного элемента, но как это загнать в цикл? То есть перебирать элементы формы в цикле причем только табличные части?
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Элементы.Товары.Видимость=КоличествоСтрокТЧ("Товары")
КонецПроцедуры
&НаСервере

Функция КоличествоСтрокТЧ(ТЧ)
    МетаданныеОбъекта=РеквизитФормыВЗначение("Объект").Метаданные();
    Если МетаданныеОбъекта.ТабличныеЧасти.Найти(ТЧ).Количество() = 0 Тогда
        Возврат Ложь;
    Иначе
        Возврат Истина;
    КонецЕсли;
КонецФункции
1 DrWatson
 
06.06.19
12:20
(0) Этот код работает?
У объекта метаданных ТабличнаяЧасть нет метода Количество. Да и не это, вроде как, требовалось.
2 umkasort
 
06.06.19
12:21
(1) Данный код работает)
3 umkasort
 
06.06.19
12:24
Интересует как на форме выцепить только элементы которые ссылаются на табличную часть документа и как свойство видимость менять параметрически, т.е. Не Элементы.Товары.Видимость а что-то вроде Видимость("Товары")
4 hhhh
 
06.06.19
12:25
(2) просто в задаче нужно проверить заполнена ли табличная часть, а вы проверяете совсем другое, заполнены ли метаданные табличной части.
5 Кац
 
06.06.19
12:28
(0) [То есть перебирать элементы формы в цикле причем только табличные части? ]
да, только так
6 DrWatson
 
06.06.19
12:29
(3)Выцепить элементы - метод ПолучитьРеквизиты(), там уже по типу понять где там таблица.
Менять видимость - Элементы["Товары"].Видимость = Ложь;

(2) У меня выдаёт "Метод объекта не обнаружен (Количество)"
7 Кац
 
06.06.19
12:32
можно и так


массив = новый массив;
массив.добавить("форматовары");
массив.добавить("форматрусы");
массив.добавить("форманоски");

для каждого Имяреквизита из массив цикл
Элементы[Имяреквизита].Видимость=КоличествоСтрокТЧ(Имяреквизита)
конеццикла;

8 umkasort
 
06.06.19
12:41
(4) Мне метаданные и нужны, т.к. проверка происходит при открытии, а документ заполняется автоматически на основании.
(6) Странно вроде нет проблем с работой
(3) Про [ ] не знал, спасибо, только начинаю изучать язык, вторая часть вопроса снята
(7) Вариант остается прежним - вручную перечислить все элементы добавляя их в массив, в принципе это не сложно, но не очень правильно по-моему, изначально хочется писать правильный код, попутно изучая язык.
9 umkasort
 
06.06.19
12:48
(6) Сорри за введение в заблуждение, не работает
10 umkasort
 
06.06.19
12:49
Не метаданные, просто Объект использовать
11 Юрий Лазаренко
 
06.06.19
13:02
(8) Это надо не при открытии на клиенте делать, а при создании на сервере. Изменение видимости дергает сервер, так что нет смысла сначала добраться до клиента и оттуда снова идти на сервер. Меньше серверных вызовов будет.
12 umkasort
 
06.06.19
14:09
В конечном варианте получилось так
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Для каждого Элемент из Элементы цикл
        Если Строка(ТипЗнч(Элемент))= "Таблица формы" Тогда
            Элемент.Видимость=КоличествоСтрокТЧ(Элемент.Имя);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
&НаКлиенте

Функция КоличествоСтрокТЧ(ТЧ)
    Если Объект[ТЧ].Количество() = 0 Тогда
        Возврат Ложь;
    Иначе
        Возврат Истина;
    КонецЕсли;
КонецФункции
13 Юрий Лазаренко
 
06.06.19
14:30
(12) А на форме точно не будет элементов с типом "Таблица формы", но привязанных не к табличной части, а к динамическому списку, дереву значений или еще чему-то?
14 Вафель
 
06.06.19
14:37
найти элемент по данным можно только перебором всех элементов
15 umkasort
 
06.06.19
15:23
(13) Думал об этом. Сейчас нет, но в будущем может стать проблемой, тоже не нравится это, но как иначе пока не знаю сделать
16 Кац
 
07.06.19
08:30
(12) тогда уж лучше так:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Для каждого Элемент из Элементы цикл
        Если Строка(ТипЗнч(Элемент))= "Таблица формы" Тогда
            Элемент.Видимость = Объект[Элемент.Имя].Количество() > 0;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры
17 zwolf
 
07.06.19
09:13
(16)
> Если Строка(ТипЗнч(Элемент))= "Таблица формы" Тогда

На ваше имя успешно оформлена заявка резервирования котла с кипящей смолой. Удачного вам проведения остатка жизни!
18 Кац
 
07.06.19
11:40
(17) вы ошиблись адресом
19 singlych
 
07.06.19
11:52
(16) Если ТипЗнч(Элемент) = Тип("ТаблицаФормы") Тогда
    Элемент.Видимость = ОбщегоНазначенияКлиентСервер.ПолучитьРеквизитФормыПоПути(ЭтотОбъект, Элемент.ПутьКДанным).Количество() > 0;
20 umkasort
 
07.06.19
16:24
(17) Почему-то выдавал ошибку когда так писал, поэтому и пошел через строку
Закон Брукера: Даже маленькая практика стоит большой теории.