Страницы: 1
RSS
Ошибка "Интерактивные операции недоступны"
 
Здравствуйте.
Начал переделывать обработку обычных форм на управляемые при попытке выполнить появляется ошибка "Интерактивные операции недоступны".  Причем если базу запустить в режиме обычного приложение то все отрабатывает штатно.
подскажите в чем может быть ошибка?  
 
Цитата
подскажите в чем может быть ошибка?
Обычно такая ошибка бывает, когда из модуля на сервере пытаются обратиться к процедуре на клиенте.
Можете показать код, как вы пытаетесь сделать ?  
 
Здравствуйте.
Коллеги может кто может подсказать по данной ошибке ("Интерактивные операции недоступны").
Опять появилась данная проблема.  
 
Добрый день.
Опять не приложили фрагмент кода, где возникает ошибка. Поэтому я попробую предположить, почеиму возникает ошибка.
Как я писал выше, ошибка может возникать если мы на сервере вызываем интерактивные процедуры. Например, если на сервере мы вызываем процедуру "ПолучитьФорму".

Пример
Код
&НаКлиенте
Процедура СотрудникФизЛицоПриИзменении(Элемент)
    СотрудникФизЛицоПриИзмененииНаСервере();
КонецПроцедуры
 
&НаСервере
Процедура СотрудникФизЛицоПриИзмененииНаСервере()
   Если ТипСотрудника = Перечисления.ТипыСовместителей.Сотрудник Тогда    
          Форма=ПолучитьФорму("Справочник.Сотрудники.ФормаВыбора",ЭтаФорма);
          Форма.Открыть();
   Иначе
      Форма=ПолучитьФорму("Справочник.ФизическиеЛица.ФормаВыбора",ЭтаФорма);
      Форма.Открыть();
   КонецЕсли;
КонецПроцедуры
Процедура "ПолучитьФорму" мы можем вызывать только на клиенте, потому что интерактивные операции на сервере не доступны. Поэтому процедуру "ПолучитьФорму" надо перенести в процедуру вызываемую на клиенте.


Почему это работает в толстом клиенте?
Толстый клиент это наследие предыдущих версий платформ 7.7, 8.0, 8.1, 8.2, тогда не было разделение на клиентский и серверный код, все процедуры формы выполнялись на клиентской машине. Поэтому, если в толстом клиенте на сервере мы выполним код:
Код
#Если НаСервере Тогда
        Сообщить("НаСервере");
    #КонецЕсли
    #Если Сервер  Тогда
        Сообщить("Сервер");
    #КонецЕсли
    #Если НаКлиенте Тогда
        Сообщить("НаКлиенте");
    #КонецЕсли
    #Если Клиент  Тогда
        Сообщить("Клиент");
    #КонецЕсли
То получим
Код
НаСервере
Сервер
Клиент
Что означает, что в толстом клиенте на сервере доступны оба контекста.  
Изменено: Федоров Максим Михайлович - 14.10.2023 10:18:17
 
Цитата
Поэтому процедуру "ПолучитьФорму" надо перенести в процедуру вызываемую на клиенте.
Перенес как вы посоветовали процедуру на клиента.
В толстом клиенте все отлично работает, если подключаться тонким клиентом то выходит ошибка при запуске.
Ошибка
Код
Переменная не определена (Перечисления)
   Если ТипСправочника = <<?>>Перечисления.ЮрФизЛицо.ЮрЛицо Тогда    
Код моей обработки, где возникает ошибка
Код
&НаКлиенте
Процедура КонтрагентНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
   
   СтандартнаяОбработка = Ложь;
   
   Если ТипСправочника = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда    
      Форма=ПолучитьФорму("Справочник.Контрагенты.ФормаВыбора",ЭтаФорма);
      Форма.Открыть();
   Иначе
      Форма=ПолучитьФорму("Справочник.ФизическиеЛица.ФормаВыбора",ЭтаФорма);
      Форма.Открыть();
   КонецЕсли;
   
КонецПроцедуры
 
Цитата
Переменная не определена (Перечисления)    Если ТипСправочника = <<?>>Перечисления.ЮрФизЛицо.ЮрЛицо Тогда    

Обращаться к перечислениям на клиенте через перечисление точка нельзя, это можно только на сервере. На клиенте на обращаться через функцию ПредопределенноеЗначение

В данном случае год должен выглядеть
Код
&НаКлиенте
Процедура КонтрагентНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

Если ТипСправочника = ПредопределенноеЗначение("Перечисление.ЮрФизЛицо.ЮрЛицо") Тогда    
Форма=ПолучитьФорму("Справочник.Контрагенты.ФормаВыбора",ЭтаФорма);
Форма.Открыть();
Иначе
Форма=ПолучитьФорму("Справочник.ФизическиеЛица.ФормаВыбора",ЭтаФорма);
Форма.Открыть();
КонецЕсли;

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

Функция ПредопределенноеЗначение возвращает ссылку на предопределенный элемент. Т.к. идет вызов сервера, то надо с осторожностью относиться к данному методу.
Если в модуле на клиенте идет сравнение с несколькими значениями перечислений то имеет смысл переместить код на сторону сервера.

Вариант кода, если не использовать ПредопределенноеЗначение
Код
&НаКлиенте
Процедура КонтрагентНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

Если ЭтоЮрЛицо(ТипСправочника) Тогда    
Форма=ПолучитьФорму("Справочник.Контрагенты.ФормаВыбора",ЭтаФорма);
Форма.Открыть();
Иначе
Форма=ПолучитьФорму("Справочник.ФизическиеЛица.ФормаВыбора",ЭтаФорма);
Форма.Открыть();
КонецЕсли;

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

&НаСервереБезКонтекста
Функция  ЭтоЮрЛицо(ТипСправочника)

Возврат ТипСправочника = Перечисления.ЮрФизЛицо.ЮрЛицо; 

КонецФункции 
 
Цитата
Если ТипСправочника = ПредопределенноеЗначение("Перечисление.ЮрФизЛицо.ЮрЛицо") Тогда    
Форма=ПолучитьФорму("Справочник.Контрагенты.ФормаВыбора",ЭтаФорма);
Форма.Открыть();
Иначе Форма=ПолучитьФорму("Справочник.ФизическиеЛица.ФормаВыбора",ЭтаФорма);
Форма.Открыть();
КонецЕсли;
Переделал на ПредопределенноеЗначение и все заработало.
Спасибо за помощь.  
Страницы: 1