1с проверить видимость элемента
Сегодня мы поработаем с формой и научимся на ней прятать элементы - устанавливать видимость их (Рисунок 1).
На рисунке 1 изображена форма элемента, на которой есть элементы на форме в отображении списка - это синий прямоугольник, а на самой форме их нет - это жёлтый прямоугольник. То есть они есть, но они там не отображаются.
Это называется пользовательская видимость.
Делается она следующим образом: выделяется элемент на форме, открывается палитра свойств этого элемента и на свойстве "Видимость" снять галочку (Рисунок 2).
Снять/поставить галочку - это значит, что будет виден элемент или не будет виден. А если сказать иначе, то это Истина - галочка стоит и элемент виден, Ложь - галочка снята и элемент не виден.
Сохраните все изменения и увидите, что в пользовательском режиме они у вас теперь не будут отображаться, однако есть интересный момент: для поля "Наименование" установлено свойство "Проверка заполнения со значением Выдавать ошибку". Это свойство означает, что это поле обязательно должно быть заполнено и платформа выдаст ошибку, если оно будет пусто и не даст записать в базу. Запустите и нажмите кнопку "Записать и закрыть" и получите уведомление (Рисунок 3).
Как же так получается, что поля на форме нет, но платформа предупреждает нас, что это поле не заполнено?
Все дело в том, что поле есть на форме, но он просто невидимый для пользователя, но платформа его воспринимает полноценно. Это необходимо учитывать. Поэтому и называется - пользовательская видимость.
А теперь мы попробуем сделать так, чтобы поле появлялось и исчезало в зависимости от какого-либо условия.
Проще всего это сделать с полем, у которого отображение будет в виде галочки. То есть если галочка будет стоять, то поле будет видно, а иначе поле будет спрятано. Давайте попробуем сделать это. Для этого необходимо добавить на форму еще один реквизит с типом "Булево" (Рисунок 3).
После этого необходимо перейти на форму и переместить его на форму (Рисунок 4).
Обратите внимание на рисунок 4, у поля "Видимость" галочка не стоит, а значит по умолчанию стоит значение Ложь!
Теперь необходимо прописать процедуру. Чтобы прописать, необходимо понять как это будет работать!
А работать это будет следующим образом: как только мы меняем значение поля "Показать/Скрыть", так сразу исчезает/появляется поле "Число". Все происходит именно в таком порядке. Чтобы это работало у платформы есть специальные события, а в данном случае нужно событие "ПриИзменении".
ПриИзменении - это событие означает то, что как только вы начинаете менять значение поля, то есть ставить галочку или убирать ее, так сразу начинает меняться и значение поля. А если не трогать, то ничего и не будет происходить, именно поэтому событие и называется, при изменении чего-то в этом поле.
Создадим на форме группу (папку) и поместим в нее элемент, который будем прятать (убирать видимость) - поле "Число" (Рисунок 5).
Выделим поле "Показать/Скрыть" и найдем свойство и оно же событие "ПриИзменении" (Рисунок 5).
Нажмем на значок увеличительного стекла и создадим процедуру на клиенте (Рисунок 6).
В создавшейся процедуре убираем закомментированную строку и вместо нее прописываем нашу (Рисунок 7).
Этот код означает следующее:
1. Если - начало условия;
2. Объект.ПоказатьСкрыть - обращение к элементу формы;
3. Объект.ПоказатьСкрыть = Истина - само условие;
4. Элементы.Группа1 - обращение в элементу "Группа1";
5. Видимость - пользовательская видимость;
6. Элементы.Группа1.Видимость = Истина - папка с находящимися в ней элементами будет видна;
7. Элементы.Группа1.Видимость = Ложь- папка с находящимися в ней элементами будет не видна. КонецЕсли - окончание выполнения условия.
Запустите пользовательский режим и проверьте изменения. Как только поставите галочку, ничего не изменится. Снимете галочку, поле "Число" исчезнет, а как поставите галочку, так сразу же оно и появится.
Так и только так работает это событие - при изменении значения, то есть ставишь галочку или убираешь, начинает срабатывать событие и выполняться условие.
На этом статья урока подходит к концу. Попробуйте выполнить все действия, которые описаны в этом уроке. Если что-то не получается, то вы всегда сможете написать вопрос о том, что вам непонятно или вернуться к предыдущим урокам и посмотреть их - ссылки внизу!
Ссылка для вступления телеграм-канал - t.me.Apiscourses
Подписаться в группу ВКонтакте
Прошлые уроки:
На этом все. Жду Вас на следующем занятии.
P.S. Подписывайтесь на мой канал :-)
программирование программирование 1с 1с предприятие обучение онлайн обучение 1с
Так вот, как программно проверить выводится ли этот элемент в данный момент на форму или нет?
Не посылайте гуглить, был уже там, аналогичные вопросы есть, с ответами не сложилось, хотя возможно плохо гуглил.
Заранее спасибо за помощь.
(1) так показывает видимость элемента согласно конфигуратору, но не учитывает настройки пользователя сделанные через "все действия - изменить форму"
(6) Не у меня точно не глюки.
В отдадке имеем:
Элементы.СодержаниеТекст.видимость = Истина
Но при этом в пользовательских настройках формы с него галочка снята, ну и на форме соответственно он не отражается.
Проверил - то же самое. Отключил отображение элемента формы через "Все действия" - "Изменить форму", добавил команду проверки и всякий раз получаю "Истина". ЧЯДНТ?
В результате гугления, экспериментов и размышления вяснилось следующее:
Видимость и пользовательская видимость - различные вещи. Если изменить значение видимости на "Ложь" программно, элемент не будет виден и нельзя будет управлять его видимостью через "Все действия". Через "Все действия" пользователь управляет пользовательской видимостью элемента, программного доступа к которой попросту нет. Ибо нефиг. Типа, менять поведение формы в зависимости от пользовательской видимости элементов методически неправильно.
Кроме того, в паре мест встретил высказывания типа "Не трогайте программно видимость элементов, это приводит к полной перерисовке формы на сервере и росту трафика".
Без комментариев.
(9) Картина грустная.
У меня необходимость проверки была вызвана тем, что бы в зависимости от видимости элемента знать нужно заполнять его значение или нет. Ну тут речь идет об одном элементе.
Когда то у меня была в клиентах аптека, и у них в списке выбора номенклатуры (обычное приложение) была расчетная колонка остатка, при объемах немалой аптеки, расчет иногда занимал прилично времени, поэтому кассиры как правило убирали колонку, а в коде стояла проверка, если колонки нет, то и не рассчитываем.
Как быть в подобных ситуациях в управляемом приложении.
Добавь реквизит и проверяй его, в зависимости и делай что нужно, зачем к элементам формы привязываться?
(11) ну наверное затем, что реквизит такой не нужен, а значение это расчетное. И показывать его нужно только в том случае, если он отражается на форме, в противном случае - нет смысла делать этого не нужно.
Иногда при разработке встречается такая проблема: размещённый на форме элемент не отображается в режиме 1С:Предприятия. Хотя, по задумке и всем представлениям его должно быть видно. Что же делать с «чудесным исчезновением?». Причин подобного поведения множество. Составил для себя чек-лист, покрывающий большинство подобных ситуаций.
Достаточно просто методично проверить каждый пункт — и «беглец» отыщется.
Подробный чек-лист
Видимость элемента
Первое, что, собственно, приходит на ум — свойство Видимость самого элемента. Для надёжности можно вызвать отладчик и убедиться, что оно включено в нужный момент.
Видимость родителей
Следующая возможность — проверка видимости у родительских групп. Если не отображается группа — не отображается и сам элемент. Также открываем отладчик и по свойству Родитель проверяем отображение вышестоящих групп.
Путь к данным
В управляемом интерфейсе многие элементы формы должны быть привязаны к реквизитам формы. Данные отдельно — интерфейс отдельно. Случается, что такая связь пропадает (например, при изменении метаданных, или при программном формировании элементов). Проверяем свойство ПутьКДанным — должен быть путь к актуальному реквизиту формы.
Цвет фона
Сам элемент может быть размещён на форме, но визуально сливается с её фоном. Не пытайтесь разглядеть белое на белом — не выйдет 🙂 Проверяем свойство ЦветФона у самого элемента и у родительской группы или формы.
Отображение заголовка
Похожая на предыдущий пункт ситуация. Элемент на форме выведен и отображается, но визуальной информации не несёт. Актуально для надписей, групп и полей ввода. Проверяем свойство ОтображатьЗаголовок или ПоложениеЗаголовка , чтобы убедиться, что заголовок показывается. А также само свойство Заголовок, чтобы убедиться, что в текст есть.
Пользовательская видимость
Платформа 1С:Предприятие позволяет скрывать элементы формы для выбранных ролей пользователя. Настраивается это визуально в конфигураторе. Убеждаемся, что флажки для пользователя с рассматриваемой ролью установлены.
Пользовательские настройки формы
Формы в 1С версий 8.2 и 8.3 не зря называют управляемыми. Пользователь в режиме 1С:Предприятие может настраивать вид форм (в том числе перемещая и скрывая ненужные для него элементы). Чтобы вернуть отображение в исходное состояние необходимо вызвать команду «Установить стандартные настройки». Меню «Ещё» формы.
Функциональные опции
Также, в технологическую платформу включён механизм функциональных опций. Использование механизма даёт возможность разделить функциональность конфигурации, убрав незадействованные блоки в режиме 1С:Предприятия. В том числе на функциональную опцию может быть «подвешен» и реквизит формы. Тогда все связанные с ним элементы не будут отображаться на форме. В режиме конфигуратора проверяем состав функциональных опций.
Доступность реквизита из прав
Гибкая система ролей и даже RLS позволяет настроить использование отдельных реквизитов объекта конфигурации. Когда такое использование запрещено ролью, реквизит не будет прочитан из базы данных, а связанные с ним элементы не будут отображаться. Как правило, для роли ПолныеПрава в типовых конфигурациях доступна вся функциональность решения. Поэтому этой ролью можно воспользоваться, чтобы быстро диагностировать данный пункт.
СписокВыбора для переключателя
У элементов вида «Поле переключателя» всегда должен быть заполнен список выбора. Даже если элемент связан с перечислением. Проверяем свойство СписокВыбора и при необходимости вызываем команду Заполнить — тогда значения будут получены из перечисления.
Выбранная страница
Есть зависимые элементы у группы
Это кажется очевидным, но всё же стоит проверить: когда речь идёт об элементе Группа, у него должен отображаться хотя бы один подчинённый элемент.
Пользовательский кеш
И, наконец, универсальный источник всевозможных «странностей» платформы: пользовательский кеш. Возможно, после его очистки, проблема исчезнет сама собой. Сделать это можно, например, с помощью StartManager.
Коротко перечисленные выше пункты:
- Видимость элемента
- Видимость родителей
- Путь к данным
- Цвет фона
- Отображение заголовка
- Пользовательская видимость
- Пользовательские настройки формы
- Функциональные опции
- Доступность реквизита из прав
- СписокВыбора для переключателя
- Выбранная страница, если элемент внутри страницы
- Есть зависимые элементы у группы
- Пользовательский кеш
Похожие записи:
1с, How to, Кодинг
Не могу сделать видимость группы в форме 1с вот так получается с предопределенными данными из справочника.
А по наименованию не могу. Вот так не работает:
Подскажите как написать условие что бы элементы группы стали видны.
Открываем синтакс-помощник, переходим по разделам:
Прикладные объекты - Справочники - СправочникМенеджер. - Методы - НайтиПоНаименованию
Параметры:
(обязательный)
Тип: Строка.
Строка, содержащая искомое наименование.
(необязательный)
Тип: Булево.
Определяет режим поиска по полному соответствию.
Поиск будет успешным, если строка поиска: в случае значения параметра Ложь - будет соответствовать левой части наименования; в случае значения параметра Истина - будет полностью совпадать с наименованием (за исключением "хвостовых" пробелов в наименовании).
Значение по умолчанию: Ложь.
(необязательный)
Тип: СправочникСсылка..
Родитель, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
(необязательный)
Тип: СправочникСсылка..
Владелец, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
Возвращаемое значение:
Тип: СправочникСсылка.; Неопределено.
Ссылка на найденный элемент справочника.
Если не существует ни одного элемента с требуемым наименованием, то будет возвращена пустая ссылка.
Если для справочника наименование не задано (длина = 0) и поиск выполняется по полному соответствию, то будет возвращено Неопределено.
Описание:
Осуществляет поиск элемента по его наименованию.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:
Если существует несколько элементов с указанным наименованием, то будет найден только один из них.
В результате диалога, произошедшего в последние выходные января 2020 года, который был посвящен одной из проблем в Selenium, где кто-то сказал мне «почему ты просто не сделаешь так…» в ответ на объяснение проблемы, я решил написать серию статей, объясняющих команды в Selenium WebDriver и почему мы в итоге пришли к дизайну, который имеем сегодня.
Я буду повторять это в каждом эпизоде этой серии — много, иногда до безумия много размышлений и продумывания было вложено в работу каждой мельчайшей детали Selenium.
В этом эпизоде мы рассмотрим значительную часть механизмов, заложенных в isDisplayed() . Эти же механизмы используются в командах взаимодействия, поэтому будет полезно понять, как они работают, и как другие команды могут их использовать. С технической точки зрения это моя любимая команда (из-за того как она работает).
Почему нас может волновать, “отображено” ли что-либо?
Итак, давайте начнем с понимания того, почему нас в принципе может волновать отображается элемент или нет.
Во-первых, одним из самых главных юзкейсов Selenium является тестирование взаимодействия пользователя со страницей. Веб-страницы задумывались для отображения информации и, к сожалению, не обязательно предполагали интерактивность. Когда мы перешли к более интерактивному вебу, нам понадобился инструмент, который мог бы проверить по крайней мере хотя бы видимость элемента на странице.
Есть два основных случая, в которых мы проверяем видимость элемента: когда мы вызываем element.is_displayed() для просмотра элемента и когда мы делаем взаимодействия.
Когда дело доходит до взаимодействий, Selenium имеет два типа команд. Методы из WebElement работают в духе «сделай то, что я подразумеваю»: selenium пытается сделать то, что по сути должно произойти, когда вы type (набираете текст) или click (кликаете). Методы, связанные с Actions , представляют стиль «сделай, как я сказал» — эти команды будут делать именно то, что вы им сказали, не пытаясь интерпретировать то, что вы на самом деле пытаетесь сделать.
Как это работает?
Прежде всего, мы должны понимать, что element.is_displayed() должен работать без необходимости прокрутки страницы. Это важно, так как мы не хотим перемещать страницу без необходимости.
Здесь нам нужно взглянуть на сам элемент. Мы смотрим на CSS элемента.
Во-первых, давайте посмотрим, является ли элемент частью дерева доступности (accessibility tree). Мы не смотрим в само дерево доступности, мы просто проверяем наличие некоторых сценариев и их влияние на расположение элементов на странице. Мы не смотрим в дерево доступности, поскольку это может быть чрезвычайно трудоемкой операцией для браузера.
Простой сценарий, который сюда подойдет — когда у элемента есть display: none , как показано ниже.
Это приведет к тому, что ничего не будет добавлено дерево доступа и не повлияет на расположение элементов.
Далее нам нужно посмотреть, сможем ли мы совершить прокрутку до элемента, если это необходимо. Мы просто проверим наличие такой возможности, поскольку мы не хотим скролить на самом деле. Это важно для элементов, которые были перемещены в другое место на странице. Это означает, что мы не всегда можем рассчитывать на просмотр дерева DOM. Я обсуждал это в предыдущем посте в 2013 году.
Далее нам нужно сделать несколько проверок для таких элементов, как , , и . Элементы и являются «скрытыми», пока вы на них не кликнули, мы предполагаем, что они видимы… ну, в основном.
Затем мы переходим к проверке размера элемента. Для элементов с размером 0 мы говорим, что они не видны. Мы также проверяем их opacity. Если opacity равна 0, мы не считаем элемент видимым.
После того, как мы выполнили эти тесты, нам нужно рекурсивно пройти DOM и повторить все тесты, пока мы не достигнем documentElement .
Зачем рекурсия?
К сожалению, из-за CSS мы не всегда знаем, на каком уровне DOM. Нам нужно проверить каждый узел на обратном пути. Это означает, что isDisplayed может быть немного медленным, но он дает нам хорошую оценку видимости элемента.
Разве мы не можем просто взять спросить браузер, видим ли элемент?
К сожалению, нет. Браузеры, выбирая, что следует рендерить, создают списки отображения, а затем отправляют их в менеджер окон (window manager), чтобы он выполнил всю тяжелую работу. В прошлом браузеры никогда не беспокоились о том, насколько эффективно генерируется список отображения. Менеджер окон попытается сделать список отображения более эффективным, а затем отобразить его. Замечательно!
Теперь, касательно списков отображения — они всего лишь говорят оконному менеджеру, что визуализировать в области просмотра. Область просмотра (viewport) — это собственно видимая область страницы в браузере. Мы хотим, чтобы isDisplayed() сообщал нам, будет ли отображаться элемент.
Мы также можем столкнуться с частично скрытыми элементами. Как мы узнаем, является ли элемент действительно видимым или видна только его небольшая часть? Здесь мы могли бы использовать некоторые веб-API, такие как document.elementFromPoint(x, y) ;. Опять же, это скажет нам только об элементах, которые находятся в области просмотра, и даже тогда есть случаи, когда один элемент может накрывать другой, но клики проходят по «скрытому элементу».
Об этом я рассказываю подробнее в своем выступлении на Selenium Conf London 2016. Вы можете посмотреть это видео, если вам интересно.
К сожалению, никто не хочет раскрывать подробности того, как это работает в браузере, поэтому до сих пор нам приходится полагаться на свой способ выполнения этих вычислений.
Для дальнейшего чтения
Обычно я бы поместил здесь ссылку на спецификацию WebDriver для этой команды, но вы можете прочитать приложение, которое специфицирует драйверам, какую конечную точку добавлять.
Вы также можете спуститься в кроличью нору и посмотреть код, который выполняет всю эту работу.
Эпизод 4 — Поиск элементов
В этом эпизоде мы рассмотрим, как работает findElement . В первую очередь нам нужно уметь находить элементы, прежде чем мы сможем взаимодействовать с ними.
Найти элемент легко, верно?
Ну да, если бы люди разрабатывали свои приложения с оглядкой в первую очередь на тестируемость, отодвинув все остальное на второй план. К сожалению, мы живем в мире, где большую часть времени люди думают о качестве, а о тестировании — как о чем-то второстепенном.
Во всяком случае… давайте посмотрим, как мы можем их искать.
Типы поиска
Эта часть достаточно проста, Selenium предлагает те же методы поиска, которые вы можете найти при взаимодействии с DOM посредством JavaScript. Если мы можем искать элементы с помощью document.querySelectorAll(aQuery); тогда они будут доступны для поиска через find_element или find_elements . Они доступны из объекта WebDriver или WebElement . Если вы делаете element.find_element(. ) , это эквивалентно element.querySelectorAll(aQuery) , который устанавливает начальную точку или корень для поиска по этому элементу.
Ниже приведен пример использования find_element :
Мы также можем искать элементы на странице по XPATH.
Мы можем сделать следующее
Мы также можем искать ссылки на основе видимого текста. Видимый текст использует алгоритм isDisplayed , чтобы понять, что пользователи могут и не могут прочитать. Selenium соберет все теги на странице, получит видимый текст, а затем найдет первый элемент, содержащий этот текст.
Что происходит, когда он находит элемент?
Когда мы в состоянии найти элемент, мы отслеживаем его в карте (Map). Карта будет содержать представление элемента, используя uuid. Карта позволяет нам искать элементы, когда мы возвращаем их из теста Selenium, и проверять, действительно ли эти элементы подключены к DOM. Если элемент не подключен к DOM и вы пытаетесь использовать его, вы получите StaleElementReferenceException .
а когда он не находит элемент или элементы
Есть 2 вещи, которые могут произойти.
Если искать только один элемент, вы получите исключение:
Если вы ищете более 1 элемента, вы получите пустой список:
Скоро в Selenium: Относительные локаторы
Они позволят вам искать элементы на странице по их относительному положению к другому элементу. Например, вы можете найти элемент выше и левее от другого элемента.
Для дальнейшего чтения
Вы можете детальнее углубиться в тему почитав раздел о получении элементов в спецификации WebDriver.
Эпизод 5 — Клик
В этом эпизоде мы рассмотрим, что происходит при клике. В целях простоты мы будем рассматривать только работу, выполняемую с помощью element.click() .
У вас есть элемент, по которому вы хотите кликнуть, что теперь?
Итак, вы нашли элемент, и вам нужно кликнуть по нему. Selenium предпримет следующие шаги, прежде чем он отработает клик.
Проверка, находится ли еще элемент на странице
Когда мы находили элемент, браузер возвратил представление этого элемента. Все последующие вызовы этого элемента должны быть проверены на факт того, что элемент все еще находится на странице. Если это не так, вы получите исключение StaleElementReferenceException .
Проверка видимость элемента
Как только мы убедились, что элемент все еще находится на странице, нам нужно убедиться, что элемент отображается. Это важно, так как мы не ожидаем, что пользователь нажмет на элемент, который не виден. Так как пользователь никогда там не кликнет, мы должны убедиться, что Selenium тоже не будет этого делать. Если он не отображается, вы получите исключение ElementNotVisibleException .
Прокрутка к элементу
Далее, нам нужно убедиться, что мы можем совершить прокрутку к элементу. Для правильного запуска всех событий элемент нам понадобится в области просмотра. Если элемент не находится в области просмотра после попытки прокрутки к нему, браузер возвратит исключение ElementNotInteractableException .
Проверка, является ли элемент интерактивным
Теперь браузер проверит, является ли элемент, который будет получать клики в области, о которой мы говорим, тем же самым элементом, который мы передали. Если окажется, что это не тот элемент, браузер сгенерирует исключение ElementClickInterceptedException .
Выключение некоторых событий
Теперь мы готовы запустить некоторые события. У нас есть специальный кейс для < option>, чтобы убедиться, что это родительский элемент, который получает события.
Затем мы вычисляем центр элемента и начинаем отправлять события. Вы можете прочитать, какие события мы отправляем в спецификации WebDriver.
А как насчет навигации?
Нам нужно указать браузеру следить за навигацией, происходящей в результате клика. Если клик вызывает навигацию, мы применяем ту же логику, как если бы мы сами осуществляли навигацию.
Для дальнейшего чтения
Вы можете прочитать спецификацию WebDriver для более подробной информации.
Читайте также: