Открывашка ячеек таблиц

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

Данное расширение конфигурации предназначено для режима совместимости платформы 8.3.8 и выше.

Оно содержит невидимую общую команду с сочетанием клавиш ALT+Q. Эта команда позволяет открыть форму объекта по ссылке из текущей ячейки любой таблицы в почти любой управляемой форме.

Благодаря недокументированной особенности (скорее всего ошибке) платформы глобальная непараметризованная команда формы по горячей клавише срабатывает во всех формах, открытых без блокирования других форм. Поэтому

  1. Команда не будет работать в формах, открытых в режиме блокирования владельца.
  2. Возможно в будущем эта особенность поведения платформы будет устранена.

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

Как подключить расширение конфигурации?

  1. В режиме предприятия откройте "Все функции/Стандартные/Управление расширениями конфигурации"
  2. Нажмите "Добавить" и выберите скаченный файл расширения (*.cfe)
  3. Нажмите "Перезапустить"
  4. Теперь все новые сеансы в этой базе будут использовать это расширение.

Так как расширение состоит только из одной команды, то его легко сделать самостоятельно используя код модуля команды

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

ПараметрКоманды = ПолучитьСсылкуТекущейЯчейки();
Если Не ЗначениеЗаполнено(ПараметрКоманды) Тогда
Возврат;
КонецЕсли;
ПоказатьЗначение(, ПараметрКоманды);

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

&НаКлиенте
Функция ПолучитьСсылкуТекущейЯчейки()

ТекущееОкно = АктивноеОкно();
Если ТипЗнч(ТекущееОкно) = Тип("ОкноКлиентскогоПриложения") Тогда
ТекущаяФорма = ТекущееОкно.ПолучитьСодержимое();
Если ТипЗнч(ТекущаяФорма) = Тип("УправляемаяФорма") Тогда
Если ТипЗнч(ТекущаяФорма.ТекущийЭлемент) = Тип("ТаблицаФормы") Тогда
ДанныеСтроки = ТекущаяФорма.ТекущийЭлемент.ТекущиеДанные;
ТекущееПоле = ТекущаяФорма.ТекущийЭлемент.ТекущийЭлемент;
ЗначениеПоля = Неопределено;
ПолноеИмяПоля = ТекущееПоле.Имя;
ПутьКДанным = НайтиПутьКДаннымПоля(ДанныеСтроки, ПолноеИмяПоля, ЗначениеПоля);
ДлинаИмениДочернегоРеквизита = 0;
Пока Не ЗначениеЗаполнено(ПутьКДанным) И ДлинаИмениДочернегоРеквизита < СтрДлина(ПолноеИмяПоля) Цикл
ДлинаИмениДочернегоРеквизита = ДлинаИмениДочернегоРеквизита + 1;
Если "_" <> Сред(ПолноеИмяПоля, СтрДлина(ПолноеИмяПоля) - ДлинаИмениДочернегоРеквизита + 1, 1) Тогда
Продолжить;
КонецЕсли;
ИмяРеквизита = Лев(ПолноеИмяПоля, СтрДлина(ПолноеИмяПоля) - ДлинаИмениДочернегоРеквизита - 1);
ИмяДочернегоРеквизита = Прав(ПолноеИмяПоля, ДлинаИмениДочернегоРеквизита);
ПутьКДанным = НайтиПутьКДаннымПоля(ДанныеСтроки, ИмяРеквизита, ЗначениеПоля);
Если ЗначениеЗаполнено(ПутьКДанным) Тогда
Попытка
ЗначениеПоля = ЗначениеПоля[ИмяДочернегоРеквизита];
Исключение
ПутьКДанным = Неопределено;
КонецПопытки;
КонецЕсли;
КонецЦикла;
Если Не ЗначениеЗаполнено(ПутьКДанным) Тогда
Возврат Неопределено;
КонецЕсли;
Попытка
Пустышка = ЗначениеПоля.УникальныйИдентификатор();
Исключение
Возврат Неопределено;
КонецПопытки;
Возврат ЗначениеПоля;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Неопределено;

КонецФункции

&НаКлиенте
Функция НайтиПутьКДаннымПоля(Знач ДанныеСтроки, Знач ПолноеИмяПоля, ЗначениеПоля)

ДлинаСтроки = СтрДлина(ПолноеИмяПоля);
ПутьКДанным = "";
Пока ДлинаСтроки > 0 Цикл
ПроверяемоеИмя = Прав(ПолноеИмяПоля, ДлинаСтроки);
ДлинаСтроки = ДлинаСтроки - 1;
Попытка
ЗначениеПоля = ДанныеСтроки[ПроверяемоеИмя];
ПутьКДанным = ПроверяемоеИмя;
Прервать;
Исключение
Продолжить;
КонецПопытки;
КонецЦикла;
Возврат ПутьКДанным;

КонецФункции

Лицензия — BSD (бесплатно для коммерческого использования)

31 Comments

  1. triviumfan

    А почему не сделать серверный вызов и получить путь к данным элемента формы?

    Reply
  2. json

    (1) из клиентского кода, расположенного вне самой формы, нельзя обратиться к контексту этой формы на сервере.

    Другими словами, чтобы выполнить то, что вы предлагаете, серверный код должен располагаться в модуле самой формы

    Reply
  3. MVK80

    ТекущаяФорма = ТекущееОкно.ПолучитьСодержимое();

    ПолучитьСодержимое() — не нашел в синтаксис-помощнике (платформы 8.3.13 и 8.3.14). Это тоже что-то недокументированное для поддержки старых версий (раньше было, сейчас нет)?

    Reply
  4. tormozit

    (3) Да. В одной из последних версий платформы этот метод заменили на свойство Содержимое. Кстати где ты взял 8.3.14? Ее еще не публиковали.

    Reply
  5. MVK80

    (4), работаю во франче, а они походу первые должны тестировать новые версии платформ и выявлять баги,

    Так что я лично ничего не качал, у нас установили её :).

    Reply
  6. nvv1970

    (5) вероятно какой-то очень особенный франч, на котором тренируются ))

    Наверно проект на тестовой платформе ведете?

    Reply
  7. Cyberhawk

    Вместо

    Попытка
    ЗначениеПоля = ДанныеСтроки[ПроверяемоеИмя];
    ПутьКДанным = ПроверяемоеИмя;
    Прервать;

    можно сделать без попытки:

         ИмяПоляДляЗонда = ПроверяемоеИмя;
    СтароеЗначение = «» + Новый УникальныйИдентификатор;
    Зонд = Новый Структура(ИмяПоляДляЗонда, СтароеЗначение);
    ЗаполнитьЗначенияСвойств(Зонд, ДанныеСтроки);
    НовоеЗначение = Зонд[ИмяПоляДляЗонда];
    Если НовоеЗначение <> СтароеЗначение Тогда
    ПутьКДанным = ПроверяемоеИмя;
    Прервать;
    КонецЕсли;
    

    Показать

    Reply
  8. tormozit

    (7) Согласен, что без попытки будет красивее. Также голый вариант без попытки упрощает отладку в случае использования фичи «Остановка по ошибке». Но в представленном мной коде в целом есть и другая попытка, где такой прием не поможет. Поэтому остается только увеличение красоты. Однако на другой чаше весов лежит лаконичность, т.к. публикация не про правильный код, а про удобную возможность для пользователя. Как мне кажется они в данном случае чащи весов почти уравновешены.

    Reply
  9. Cyberhawk

    (8) Не спорю: с попыткой код более краток и, наверное, даже более понятен разработчику (особенно не умудренному опытом).

    А какой попытки нельзя избежать — там, где вызывается метод УникальныйИдентификатор? А зачем оно надо?

    Reply
  10. tormozit

    (9) Вызов метода УникальныйИдентификатор в попытке нужен, чтобы проверить, что значение является ссылкой.

    Reply
  11. asg.aleks

    (7)

    ДанныеСтроки — это всегда ДанныеФормыЭлементКоллекции, значит можно еще проще:

    Если ДанныеСтроки.Свойство(ПроверяемоеИмя) Тогда
    ЗначениеПоля = ДанныеСтроки[ПроверяемоеИмя];
    ПутьКДанным = ПроверяемоеИмя;
    Прервать;
    КонецЕсли;
    
    Reply
  12. Cyberhawk

    (10) А что плохого будет, если это не проверять?

    Reply
  13. tormozit

    (11) Откроется значение не ссылочного типа в маленьком окошке по центру экрана с блокированием других окон.

    Reply
  14. asg.aleks

    (13)

    Это, наверное, все же к (12)… Или я чего-то не понял.

    Reply
  15. tormozit

    (14) Да. Но исправить уже не могу.

    Reply
  16. Cyberhawk

    (13) Ну. «Открывашка ячеек таблиц» вроде это и должна делать, не?

    Reply
  17. tormozit

    (16) Лично меня открытие других типов раздражает, т.к. пользы от этого я не вижу. Есть идеи для более точного названия в 3-4 слова?

    Reply
  18. Cyberhawk

    (17)

    1. Польза для пустых ячеек видится: при открытии ячейки показывать, Нулл это или Неопределено или ПустаяСсылка (и какого типа)

    2. «Открывашка ссылок в таблицах форм«?

    Reply
  19. tormozit

    (18) Управляемые формы не поддерживают значение Null. Это не инструмент разработчика, а фича для обычного пользователя. Поэтому Неопределено/ПустаяСсылка ему не интересны и будут только раздражать.

    Reply
  20. tormozit

    (18)

    «Открывашка ссылок в таблицах форм»

    в таблица могут отображаться в каждой строке свой объект (строка связана с ссылкой), который тоже может открываться, но это расширение не делает.

    Reply
  21. Cyberhawk

    (19) Мне кажется, что от того, что ничего вообще не будет происходить при нажатии на горячую клавишу, раздражения будет больше

    Reply
  22. Cyberhawk

    (20) Ну тогда «Открывашка ссылок в ячейках таблиц» или «Открывашка ссылок в ячейках таблиц форм»

    Reply
  23. tormozit

    (21) Я пробовал. Мне так не показалось. Ты пробовал?

    Reply
  24. Cyberhawk

    (23) Нет, поставил мысленный эксперимент. Ведь раз пользователь нажимает что-то, то он ожидает, что это к чему-то приведет. Кому понравится, когда на осознанное нажатие горячей клавиши от программы нет в ответ никакой реакции?

    Также отсутствие реакции на горячую клавишу может вызывать раздражение (из-за непонимания) в тех ячейках, где вместо ссылки выведена строка (например, представление ссылки как обход ограничений прав). Если бы твоя открывашка открывала любые значения, пользователь бы сразу понял, что там в ячейке «сидит» строка, а не ссылка. А так он остается один на один с проблемой.

    Reply
  25. tormozit

    (24) Думаю ты преувеличиваешь проблему. Коллеги пользуются этой фичей и все не жаловались на такое.

    Reply
  26. saandreev

    Есть такой способ (чисто платформенный) — становимся в ячейку, нажимаем ctrl+F (в некоторых случаях alt+F) и ctrl+shift+f4. И не нужны никакие доработки и расширения.

    Reply
  27. tormozit

    (26) Способ через диалог поиска годный. Но поиск может быть выключен и сочетание не везде одинаковое, поэтому требуется 2-3 нажатия сочетаний клавиш, что уже не так удобно.

    Reply
  28. saandreev

    (27) согласен, тут по потребностям, мне не так часто требуется открывать что-то из ячеек таблицы, поэтому платформенные сочетания меня полностью устраивают

    Reply
  29. TreeDogNight

    Очень полезная штуковина! А есть какие-нибудь варианты, чтобы нечто подобное реализовать в обычных формах?

    Reply
  30. tormozit

    (29) Универсально — нет. Придется искать способ добавлять кнопку в каждую форму.

    Reply
  31. TreeDogNight

    (30) Это очень прискорбно…

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *