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

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

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

Автор: BeLuY 14.06.21, 14:03

Добрый день. В управляемом приложении необходимо сделать автоматическое открытие формы при запуске программы в зависимости от наличия определенной роли. Форму необходимо открыть модально. Знаю, что в обычном приложении это можно сделать в Модуле обычного приложения, в процедуре ПриНачалеРаботыСистемы(), но в управляемом так не работает:

    Если РольДоступна("Роль") Тогда        
        Форма = ПолучитьФорму("Обработка.НоваяОбработка.Форма");        
        Рез = Форма.ОткрытьМодально();        
        
        // Если не удалось
        Если Рез = Ложь Тогда
            // Закрываем программу
            ЗавершитьРаботуСистемы(Ложь);
        КонецЕсли;    
    КонецЕсли;

Это не работает, потому как:
  1. Ругается на глобальный метод РольДоступна(), так как он доступен только на сервере
  2. Модально открыть не получается - выводит ошибку "Использование модальных окон в данном режиме запрещено!"

Опыта работы с управляемыми формами очень мало, но я понимаю, что метод РольДоступна() доступен на сервере, а ПолучитьФорму() на клиенте, и они должны быть, как минимум в разных процедурах (или не всегда? =)), но код я взял из обычного приложения (почти весь) и привел для примера.

Зачем это нужно: Есть мобильное устройство, если заходить в программу с него под пользователем, у которого указана определенная роль, необходимо на весь экран запустить определенную форму с несколькими кнопками, адаптированную под экран мобильного устройства. Так у меня сейчас работает в обычном приложении.

Так вот, как можно решить данный вопрос? Как и где в управляемом приложении описать процедуру проверки доступности роли и модальное открытие окна? Или может мой способ в корне неверный и есть другой, более правильный механизм?

Спасибо)

Конфигурация: BAS Роздрібна торгівля

Автор: BeLuY 14.06.21, 15:22

Хм, в настройке конфигурации, в разделе "Совместимость" нашел параметр Режим использования модальности, значение которого установил как Использовать - теперь форма стала открываться модально

Автор: logist 14.06.21, 20:56

Цитата(BeLuY @ 14.06.21, 15:03) *
Как и где в управляемом приложении описать процедуру проверки доступности роли

В глобальном модуле, вызов проверки в ПриНачалеРаботыСистемы

Цитата(BeLuY @ 14.06.21, 15:03) *
и модальное открытие окна?

И сразу там же открыть окно со свойством "Блокировать весь интерфейс"

Цитата(BeLuY @ 14.06.21, 16:22) *
теперь форма стала открываться модально

Это несколько через Ж, такие свойства существуют для обратной совместимости

Автор: BeLuY 15.06.21, 10:11

Повторюсь, знаний работы в управляемом режиме очень мало...

Цитата(logist @ 14.06.21, 21:56) *
В глобальном модуле, вызов проверки в ПриНачалеРаботыСистемы

Насколько я понимаю, модуль управляемого приложения работает лишь на стороне клиента, а процедура РольДоступна() работает на сервере. Если я напишу такой код:
Процедура ПриНачалеРаботыСистемы()    
    ...
    ОткрытьФормуНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОткрытьФормуНаСервере()
    Если РольДоступна("Роль") Тогда
    ...
КонецПроцедуры

пишет, что процедура ОткрытьФормуНаСервере() не найдена. Если данную процедуру вынести в отдельный глобальный модуль - ничего не меняется... Каким образом можно выполнить проверку, как вызвать данную процедуру на стороне сервера?

Автор: sava1 15.06.21, 10:18

Форму открыть на сервере - для кого ?

чтобы получить доступность роли - Вызывайте процедуру, компилируемую на Сервере, которая возвращает Булево

типа

вызов

локРольДоступна = получитьРольНаСервере()

&НаСервере
Функция получитьРольНаСервере()
    Возврат РольДоступна(......);
КонецФункции

Автор: BeLuY 15.06.21, 12:34

Цитата(sava1 @ 15.06.21, 11:18) *
Форму открыть на сервере - для кого ?

Не совсем корректно обозвал процедуру, потому как форма должна открываться на клиенте, а роль проверятся на сервере crazy.gif

Цитата(sava1 @ 15.06.21, 11:18) *
чтобы получить доступность роли - Вызывайте процедуру, компилируемую на Сервере, которая возвращает Булево

В этом случае получаю ошибку "Процедура или функция с указанным именем не определена"



Из модуля управляемого приложения не выполняются серверные методы, видимо, не тот модуль я ковыряю wacko.gif

Автор: sava1 15.06.21, 12:48

в общих модулях, экспортная

вооще-то в БСП есть функция РолиДоступны(

Автор: BeLuY 15.06.21, 12:58

Цитата(sava1 @ 15.06.21, 13:48) *
в общих модулях, экспортная



Цитата(sava1 @ 15.06.21, 13:48) *
вооще-то в БСП есть функция РолиДоступны(



На клиенте тоже не работает

Автор: BeLuY 15.06.21, 14:24

UPD:

Цитата(sava1 @ 15.06.21, 13:48) *
в общих модулях, экспортная


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



Неудобно, что нельзя редактировать старые сообщения...


Цитата(logist @ 14.06.21, 21:56) *
И сразу там же открыть окно со свойством "Блокировать весь интерфейс"

А можно как-то открыть форму, чтобы она была развернута на весь экран? В обычных формах был режим рабочего стола, а как в управляемых?

Автор: logist 15.06.21, 19:18

Цитата(BeLuY @ 15.06.21, 15:24) *
а как в управляемых?

Если 1с ничего не придумала за последние пару лет - то никак. Есть библиотеки разные, например WindowEx, но они все как правило работают с какими-то косяками.

p.s. вместо ПолучитьФорму().Открыть() лучше использовать ОткрытьФорму()

Автор: BeLuY 16.06.21, 11:00

Цитата(logist @ 15.06.21, 20:18) *
Если 1с ничего не придумала за последние пару лет - то никак. Есть библиотеки разные, например WindowEx, но они все как правило работают с какими-то косяками.

Сделал так, не знаю насколько это правильно, но пока работает:

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Разворачиваем форму "на весь экран"
    Попытка
        WSHShell = Новый COMОбъект("WScript.Shell");
        WSHShell.SendKeys("% ");
        WSHShell.SendKeys("{UP}{UP}{ENTER}");
    Исключение КонецПопытки;
КонецПроцедуры

Цитата(logist @ 15.06.21, 20:18) *
вместо ПолучитьФорму().Открыть() лучше использовать ОткрытьФорму()

Спасибо, исправил)

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