Наследование свойств элементов, или Как пользователь может сломать вашу форму

12.01.21

Разработка - Механизмы платформы 1С

В 1С можно установить свойства ТолькоПросмотр, Доступность и Видимость не только на элементы формы, но и на группы элементов. Но стоит ли так делать? Оказывается, пользователь может обойти запреты, которые установлены на папку. Об этом подробнее в видео.

Данная статья — текстовый вариант свежего ролика по теме

 

ТолькоПросмотр, Доступность, Видимость. Даже самый маленький разработчик 1С сразу понимает, что это, скорее всего, свойства элементов формы. Свойства, которые часто управляются программно. И как же удобно, что можно установить значение свойства сразу на группу, тем самым распространив его на все подчиненные элементы. Это будет легче, чем в коде указывать множество установок свойств элементов, а результат такой же.

Или же нет? Однажды я засомневался в истинности этого утверждения.

 

А как он это сделал?

— Говорит, что просто изменил поле.

— В конфигураторе вижу, что колонка недоступна.

— Я под своим пользователем менять не могу. А он может.

 

Довольно обычный диалог, свидетелем которого, думаю, становились многие. А может и участником. Ведь работа программиста состоит не только в написании кода, но и в исправлении ошибок, которые этот код породил.

И вполне обыденно, что программист Вася допустил ошибку. Присвоил свойство или не тому элементу, или не в тот момент, или потом где-то перезатёр это свойство. А всплывает такая ситуация только у пользователя, потому что он случайно наткнулся на волшебную комбинацию действий, после которых ошибка воспроизводится. Ничего не обычного — это разработка.

 

— Может у тебя где-то свойство перезатирается?

— Да его программно-то и не устанавливаю нигде. Оно на самой форме установлено.

 

И вот тут становится уже интереснее. Как оказалось, на форме действительно нигде не изменялось свойство поля. И поле было недоступно пользователю. Но не совсем.

Для имитирования этой ситуации, создадим простую обработку. В форму добавим реквизит "ТаблицаДанных". Пусть в этой таблице будет две доступные и две недоступные пользователю колонки. Так их и назовём.

 

 

Создадим элементы формы и разнесём доступные и недоступные колонки по двум группам.

 

Хорошо. А теперь, собственно, снимем доступность с папки "Недоступные колонки"

 

Открываем теперь эту обработку. Добавим новую строчку, заполним доступные колонки и проверим, что нельзя изменить недоступные.

 

На первый взгляд всё хорошо. Но может ли пользователь без каких-либо сложных действий обойти запрет? Оказывается, что может. Для этого воспользуемся волшебной кнопкой в командной панели формы. "Изменить форму".

 

А теперь вынесём недоступную колонку за пределы своей папки. Пусть она лежит отдельно.

 

Да, именно так. Теперь свойства папки не влияют на эту колонку. А это значит, что мы можем изменить её содержимое.

 

Да, именно так ведёт себя платформа. Пока элемент находится в группе, то к нему применяются правила этой самой группы. Проверим теперь свойство ТолькоПросмотр. Изменим группу в конфигураторе, сохранимся и переоткроем обработку.

 

Как удобно, что 1С сохраняет пользовательские настройки формы и наше "недоступное" поле сразу при открытии становится доступным =)

Теперь сделаем то же самое и с вторым нашим полем.

 

Верно - ТолькоПросмотр ведёт себя точно так же.

 

И это работает не только с установленными "вручную" свойствами, но и заданными программно. И не только с группами, но и со страницами и даже подменю.

Добавим кнопку на форму и поместим её в группу с отключенной доступностью.

 

Сохранимся и откроем обработку. Да, кнопка "серая".

 

Повторим тот же фокус - вынесём кнопку из группы:

 

Поздравляю - мы получили доступ к закрытому для нас функционалу!

 

Вы можете написать в комментариях, мол, "Криворукий разработчик сам виноват. Никто же так формы не делает". И тут ради интереса я залез в типовые конфигурации. Поэтому скажу — делают. Это нормальная практика, когда свойство устанавливают целой группе, а не элементам. И раньше я бы не подумал, что в этом есть что-то плохое.

 

Для примера возьмём демо-базу свеженького релиза УТ 11.4.11.104.

Откроем документ "Выданная доверенность" со статусом "Выдана".

 

Как мы видим, данные заблокированы. Нажмём же "Изменить форму" и вынесем поле "Действует до" отдельно

 

Ну вот - мы можем его редактировать. Изменим дату и проведём документ. Ура, мы сделали своё грязное дело.

 

И самое "приятное", что теперь в каждом документе поле будет доступно. Потому что платформа сохранила пользовательские настройки формы. И, если пользователь без злого умысла "перенёс" куда-то поле или кнопку (просто потому что ему так показалось удобнее), то он может и не догадываться, что это самое поле не должно быть доступно. Он просто открывает форму. Видит, что поле или кнопка доступны. И нажимает.

Возьмём ещё один похожий пример. На этот раз документ "Чек ККМ на возврат". Откроем документ, у которого заблокирован номер и дата. И вытянем их тем же методом из шапки:

 

Всё, теперь мы можем изменить номер и дату документа. Поздравляю!

 

На самом деле, поздравлять-то и не с чем. Скорее всего, мы своими экспериментами можем сломать какой-то функционал. Потому что разработчик не просто так делал кнопку или поле в данный момент недоступным. И колонки запрещал редактировать не потому что он "бяка". Он мог даже не знать об этой особенности. Прямо как разработчик Вася, с ситуации которого и началась эта статья. Он просто сгруппировал недоступные колонки в группу, а потом разом сделал их недоступными к изменению.

 

— И как теперь это будем поправлять?

— У меня есть пара вариантов

 

Да, если вы один из тех разработчиков, который хочет быть на все 146% уверенным, что ваш инструмент никто не сломает, то:

 

Устанавливайте запрет на сами элементы, а не только группы

Так вы точно будете знать, что поле будет в нужный момент недоступно.

Если же в группе много элементов, их состав периодически меняется, и не хочется писать кучу кода, то есть второй вариант.

 

Задайте свойство группы "РазрешитьИзменениеСостава": Нет

Тогда пользователь не сможет вытащить элемент из неё.

Вы можете подумать, что это произойдёт только с какими-то гипотетическими злыми пользователями, которые специально разыскивают дыры в программе, чтобы при их помощи создавать проблемы разработчикам. Но, как я уже говорил выше, это возможно по вине "случайности". Какой-то особо умелый пользователь перенёс колонку таблицы так, как ему показалось удобнее. Перенёс кнопку из подменю на основную командную панель, потому что ему лень искать её каждый раз. И так далее. А в результате — код разработчика сломан. Так что лучше уж обезопасить себя. Хотя бы в особо важных случаях.

И напоследок, покажу ещё один интересный пример в УТ. Ещё раз перейдём в форму списка "Доверенность выданная". И откроем документ с типом "На получение ДС". Как видно на скрине, у такого документа не отображается табличная часть "Товары".

 

Теперь откроем документ с другим типом. Табличная часть на отдельной странице.

 

Перейдём в "Изменить форму" и вынесём таблицу за пределы всех групп и страниц.

 

Хорошо, а теперь закроем форму и вернёмся к прошлому документу без табличной части. Теперь табличная часть видна и её можно редактировать:

 

 

Как вы могли догадаться, всё по той причине, что разработчики скрывают не табличную часть, а всю страницу целиком. 

Таким образом пользователь может сломать ТолькоПросмотр, Доступность и Видимость элементов. А может и что-то ещё...

 

Понравилась статья? 

Не будьте равнодушными! Поставьте лайк плюс, оставьте комментарий. Ещё много в 1С неизведанного!

В этом видео я наглядно показываю всё то, что говорится в статье: Наследование свойств элементов, или Как пользователь может сломать вашу форму

И переходите к другим публикациям:

 

ТолькоПросмотр Доступность Видимость УФ Взлом Ошибка Группа Страница Кнопка Элемент

См. также

Сервисы интеграции без Шины и интеграции

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    2524    dsdred    16    

57

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    5786    dsdred    53    

81

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    5779    YA_418728146    25    

67

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6908    dsdred    36    

113

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18987    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12654    human_new    27    

76

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    9324    YA_418728146    6    

143

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6502    sebekerga    54    

95
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Senator_I 170 12.01.21 15:29 Сейчас в теме
"Лайк" статье поставил (не люблю видео смотреть), тестировать разработки станет веселее! )))
2. MVK80 12.01.21 19:49 Сейчас в теме
(0) Прикольно, особенно с таблицей формы в выданной доверенности! Ушел писать процедуру в общем модуле которая рекурсивно свойства потомков ставит такие же как и у родителя в рамках двух исследованных свойств: ТолькоПросмотр и Доступность. :) Не будем жестоки к пользователю (не ставим РазрешитьИзменениеСостава в Ложь). Пусть пользователь извращается как хочет с расположением нередактируемых элементов на форме. А случае если предполагается управлением свойства Видимость надо устанавливать РазрешитьИзменениеСостава в Ложь изначально наверное.
mrChOP93; +1 Ответить
3. MVK80 12.01.21 20:23 Сейчас в теме
(2), хотя это не спасет если пользователь в момент доступности полей перенесет их в другую группу. Получается что только РазрешитьИзменениеСостава поставкой в Ложь изначально поможет. Либо явно назначать свойства всем полям входящим в группу.
mrChOP93; shard; +2 Ответить
24. Hatson 529 19.01.21 09:19 Сейчас в теме
(2)
Пусть пользователь извращается как хочет с расположением нередактируемых элементов на форме


Я считаю, что 1С вообще зря сделали такую возможность и вот почему:

Как они себе представляют работу поддержки крупных инф систем? Как должны выглядеть внутренние инструкции и регламенты по пользованию различных форм документов и обработок, если каждый пользователь перекроил всё под себя и зачастую не сознательно, а по случайности??
Да, там есть кнопка "вернуть всё как было" - тогда тем более зачем нужны все эти свистелки и перделки с элементами формы, если всё равно рано, или поздно придется всё вернуть в исходное состояние??
Известно, что чем жестче ограничения, тем стройнее и масштабнее система и легче и эффективнее её сопровождение и разработка.
mrChOP93; +1 Ответить
25. MVK80 19.01.21 09:25 Сейчас в теме
(24), ну я думаю опытный пользователь разберется и так. Если он под себя все настроил значит он понимает функционал и сделал себе удобней для работы. Как, пример, вынес какие-то команды из еще в видимую часть формы, если часто ими пользуется. А неопытный начнет с первого пункта инструкции, где будет написано как все вернуть к настройкам по умолчанию. Типа будет текст "если вы не видите какого-то элемента или кнопочки о которой говорится в инструкции, не спешите звонить в поддержку, начните со сброса настроек формы к значениям по умолчанию.

Представляете, что будет, если за каждым вариантом отчета или изменению формы по минимуму пользователь начнет обращаться к программистам?
4. muskul 13.01.21 04:58 Сейчас в теме
Надо запомнить. Иногда нужно поломать функционал 1с со своими запретами там где не надо
nekit_rdx; YanTsys; +2 Ответить
10. rovenko.n 13.01.21 10:56 Сейчас в теме
(4)А потом ошибки исправлять, там, где они появились?
nekit_rdx; enter_123; +2 Ответить
5. mikl79 118 13.01.21 07:04 Сейчас в теме
спасибо, стоит задуматься на будущее при написании кода
6. Dragonim 139 13.01.21 07:40 Сейчас в теме
Описанное поведение очень логично, но не очевидно. За статью большое спасибо.
Merkalov; mrChOP93; nekit_rdx; Дмитрий74Чел; shard; Stylo; rovenko.n; Drivingblind; +8 Ответить
7. DmitryUfa 13.01.21 07:46 Сейчас в теме
Спасибо! Буду иметь ввиду.
8. anosin 29 13.01.21 09:37 Сейчас в теме
поправят в следующем релизе платфомы? ;)
9. paybaseme 14 13.01.21 10:06 Сейчас в теме
Спасибо за статью, очень полезная информация!
11. ixijixi 1794 13.01.21 11:25 Сейчас в теме
Спасибо за неочевидную информацию. Не баг, а фича) Придется делать так в некоторых случаях
	ГруппаФормы = Элементы.НедоступнаяГруппа;
	Для Каждого Элемент Из ГруппаФормы.ПодчиненныеЭлементы Цикл
		Элемент.Доступность = ГруппаФормы.Доступность;
	КонецЦикла;
В особых случаях еще и рекурсивно. Возникает правда вариант, что юзер перенесет в недоступную группу элемент из другой группы, и тогда уже он станет недоступным) Вопросы, вопросы))
12. zqzq 23 13.01.21 11:45 Сейчас в теме
(11)
Элемент.Доступность = ГруппаФормы.Доступность;

Если у группы доступность=истина, а у элемента нет, опять будет проблема :)
13. SlavaKron 13.01.21 12:18 Сейчас в теме
Был бы счастлив, если бы у меня были такие пользователи, которые смогли бы до этого догадаться.
nekit_rdx; DrAku1a; m_gin; +3 Ответить
14. Kolunya 6 13.01.21 13:03 Сейчас в теме
Мы своим юзерам скрываем "Изменить форму" .. и много чего еще... ))
ибо пытливый ум от скуки может породить намного больше проблем...
15. Stylo 13.01.21 13:19 Сейчас в теме
И это мы узнаЁм только в январе 2021 года. Вот так поворот. Спасибо за статью!
nekit_rdx; +1 Ответить
18. SiAl 76 13.01.21 14:50 Сейчас в теме
(15)
поворот. Спасибо за статью!

Я лично никогда не использовал эти настройк у групп элементов, потому что сразу было понятно, что юзер по умолчанию может изменить форму и состав элементов формы в интерфейсе "Такси". Поэтому только настройик самих элементов, благо можно устанавливать настройки сразу у нескольких элементов, выбрав их через зажатый Control.
16. dabu-dabu 290 13.01.21 13:48 Сейчас в теме
Всегда считал, что возможность пользователю самостоятельно себе изменить форму - это зло
bulpi; Serega-artem; +2 Ответить
19. SiAl 76 13.01.21 14:51 Сейчас в теме
(16)
зователю самостоятельно себе изменить

Нет, это благо. Зло - это ограниченный шаблонами разум недоразработчиков.
KoC_one; SlavaKron; YanTsys; +3 2 Ответить
26. Melkiy 15.06.22 14:12 Сейчас в теме
(19) Согласен. Иначе для чего делали УФ и Такси? Сидели бы на простых и все. Скрывать изменение формы нельзя, но нужно себя обезопасить, убирать доступность у критичных элементов
17. user1503726 13.01.21 13:57 Сейчас в теме
А на этот функционал (изменение управляемых форм) есть возможность назначать пользовательские права? Как часть роли (хотя их и так много).
20. Sander80 82 14.01.21 22:55 Сейчас в теме
(17) сохранение настроек, или как-то так, в глобальном разделе ролей
21. shard 279 15.01.21 00:30 Сейчас в теме
"можно сделать защиту от дурака, но только от неизобретательного"...
ixijixi; nekit_rdx; KoC_one; zqzq; bulpi; +5 Ответить
22. bulpi 215 15.01.21 14:33 Сейчас в теме
Проще всего на самой форме в конфигураторе снять флажок "Разрешить изменять форму". Ибо не фиг.
23. TerveRus 18.01.21 08:54 Сейчас в теме
На практике таких умных пользователей не бывает)
Им бы СКД отчет научиться как-то настраивать, а уж в "Изменить форму" они никогда не лезут)
Но лайк за полезную информацию)
27. Melkiy 15.06.22 15:11 Сейчас в теме
А меня еще интересует такой вот момент, почему в свойствах элементов форм, если ставишь ТолькоПросмотр = ИСТИНА, по умолчанию не протсавляется признак Доступность = ИСТИНА? Ведь если Доступность = Ложь, то смысл ТолькоПросмотр пропадает
Оставьте свое сообщение