пятница, 16 августа 2019 г.

В форме обработки 1С 7.7 не работает команда Активизировать


Проблема: При попытке в коде обработки выполнить команду Активизировать, чтобы вернуть курсор в поле ввода - получаем ошибку "В данной формуле не может быть вызвана эта процедура(функция)"

Решение: Несколько вариантов, например Установить фокус на поле ввода 7.7 или Активизировать поле ввода
Предлагаемый метод - использовать фиктивное закрытие формы. 
Бонус - получаем защиту от случайных нажатий клавиши Esc

Пример:
"РазрешитьЗакрытие" - служебная переменная, анализируемая в процедуре ПриЗакрытии().
"Штрихкод" - имя поля на форме, которое надо активизировать.

При закрытии анализируется переменная "РазрешитьЗакрытие", и в зависимости от её значения -  закрытие отменяется, активизируется требуемое поле и снова таки закрытие отменяется, или же - просто закрываем форму.

Перем РазрешитьЗакрытие;    // флаг используем для разрешения закрытия формы и для обхода ошибки активизации реквизита

Процедура АктивизироватьШтрихКод()    // через фиктивное закрытие формы обойдем ошибку функции Активизировать
    РазрешитьЗакрытие = 2;
    Форма.Закрыть(0);       // вызываем процедуру закрытия
КонецПроцедуры

Процедура ЗакрытьОбработку()        // нажали на кнопку Х - разрешаем закрытие
    РазрешитьЗакрытие = 1;
    Форма.Закрыть(0);       // вызываем процедуру закрытия
КонецПроцедуры

Процедура ПриЗакрытии()
   
    Если РазрешитьЗакрытие=0 Тогда        // простое закрытие запрещаем (страхуемся от случайных закрытий по ESC)
        Сообщить("Закрыть форму можно только по кнопке!");   
        СтатусВозврата(0);    // отменяем закрытие
    ИначеЕсли РазрешитьЗакрытие=1 Тогда    // всё в порядке, это закрытие по кнопке
        //
    ИначеЕсли РазрешитьЗакрытие=2 Тогда    // фиктивное закрытие - для активизации реквизита на форме
        Активизировать("ШтрихКод");       // активизируем наше поле
        СтатусВозврата(0);    // отменяем закрытие
        РазрешитьЗакрытие = 0;    // сбрасывам переменную
        возврат;
   КонецЕсли;
   
КонецПроцедуры