Имя: Пароль:
1C
1С v8
Как работать с методами, недоступными на web-клиенте?
0 Crush
 
30.05.18
17:13
Всем привет!
В глобальном модуле держу процедуры и функции, доступные на клиенте и на сервере, что б проще вызывать.
Например функция глобального контекста ПрочитатьJSON() используется в одной из процедур глобального модуля. В веб-клиенте эта функция недоступна и загрузка 1С валится с ошибкой.


&НаСервере
Функция jsonЗначениеВстрокуНаСервере(зн) Экспорт
    зп = Новый ЗаписьJSON;
    зп.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет));
    ЗаписатьJSON(зп, зн);
    Возврат зп.Закрыть();    
КонецФункции

Функция jsonЗначениеВстроку(зн) Экспорт
    #Если ВебКлиент тогда
        Возврат jsonЗначениеВстрокуНаСервере(зн);
    #Иначе
    зп = Новый ЗаписьJSON;
    зп.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет));
    ЗаписатьJSON(зп, зн);
    Возврат зп.Закрыть();    
    #КонецЕсли
КонецФункции

Конструкции такого типа лепить везде не хочется. Может есть какой способ попроще?
1 hhhh
 
30.05.18
17:21
(0) "В глобальном модуле держу процедуры и функции, доступные на клиенте и на сервере"

выкинь это своё ноу-хау, и сразу всё устаканится.
2 Crush
 
30.05.18
17:29
(1) А поподробнее?
Есть метод платформы ЗаписатьJSON(). Он доступен на клиенте. Но недоступен в веб-клиенте.
Для веб-клиента писать отдельный код? Или всегда дёргать сервер, когда нужно выполнить ЗаписатьJSON()?

Я не знаю как правильно это организовать, потому и спрашиваю. Два раза держать одну процедуру - ерунда получатся. Дёргать сервер с клиента без надобности - тоже фигня какая то..
3 Crush
 
30.05.18
17:54
Нашел статью, с такими же извращениями, что и у меня:( неужели нет человеческих решений?

http://pro1c.org.ua/index.php?showtopic=31919

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

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

&НаСервереБезКонтекста
Функция СериализоватьВJSONНаСервере(СериализуемыйОбъект)
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    НастройкиСериализации = Новый НастройкиСериализацииJSON();
    НастройкиСериализации.СериализовыватьМассивыКакОбъекты = Ложь;
    ЗаписатьJSON(ЗаписьJSON, СериализуемыйОбъект);
    // ЗаписатьJSON(ЗаписьJSON, СериализуемыйОбъект, НастройкиСериализации, "ПреобразованиеВJSON", ЭтотОбъект);
    //
    // ЭтотОбъект недоступнен в безконтекстном вызове, поэтому нужно либо поместтить эту функцию в общий модуль,
    // либо изменить директиву компиляции в &НаСервере
    СтрокаJSON = ЗаписьJSON.Закрыть();
        
    Возврат СтрокаJSON;

КонецФункции
4 hhhh
 
30.05.18
17:59
(2) ну, сервер с клиента дергается миллионы раз. До фанатизма не доходите. Это обычная ситуация.
5 Crush
 
30.05.18
18:40
Мда.. Пришел к выводу, что для работы с json и с сериализатором xdto в веб-клиенте нужно будет писать отдельные процедуры с вызовом сервера. Глядишь в дальнейшем получится их заменить на клиентские (с использованием javascript), но когда это будет..?:) пока сервер подёргаю:)

Спасибо!