Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 18:40

Как хранить стейт на сервере или красиво нормально жить на клиенте?

Автор ivana, 13 ноя 2017, 00:18

0 Пользователей и 1 гость просматривают эту тему.

ivana

Думал, как назвать тему - ничего лучше не придумал  Начну сначала. Написал я Лисп. Очередной. После Хаселя и Джавы (скатился) На 1С8.2 (лицензионная версия для обучения, купленная на свои деньги - все честно. 8.3 альтернативной нету). Стримил процесс на Ю-туб, если кому интересно - дам ссылку. Почему на 1С - чтобы показать, что на чем угодно можно написать, и чтобы в группе, которая по моим стримам будет писать свои реализации, не было никому повода для копипасты - никто из них не выбрал 1С в качестве языка реализации

Сначала сделал внешнюю обработку - все работает отлично. Кроме того, что в поле ввода, где набирать код, не подсвечиваются ключевые слова и парные скобки. Ну а вы сами понимаете, писать на Лиспе (и стримить это на Ю-туб в реалтайме) без подсветки парных скобок - это.... непросто, скажем так  Ладно, 2 дня гуглежа - и влепил на форму HTML-поле, и даже подключил к нему подсветку всего чего надо через Codemirror. Все хорошо - но не работают стрелки (Карл!) Бэкспейс фурычит, мышкой можно ткнуться куда угодно... Но иметь редактор кода без стрелок... Причем, народ по всему инету плачется про это, и дажи вкрячивает свои перехватчики клавиатуры (!) для того, чтобы все работало...

Но я решил пойти другим путем. Еще 2 дня гуглежа - и написал вэб-гуй, который дергает мое вэб-сервис на 1С. Все отлично, но функция вэб-сервиса исполняется на сервере. Перенес весь код на сервер - а там у переменных время жизни - на момент вызова. То есть, не запоминаются они между вызовами, каждый вызов с чистого листа. А мне надо стейт немалый хранить. Стейт несложный - Соответствия да Структуры. Почитал гугл - можно завести константу типа Хранилище значений и сериализовывать туда мой стейт каждый раз. Думаете, Структуры и Соответствия сериализуются, как написано? Фигвам, товарищи  У меня там содержатся циклические ссылки (так надо), и ихний сериализатор просто закрывает сеанс по ошибке стековерфлоу - видимо тупо пытается бегать в рекурсиях по циклическому графу пока стек не кончится...

В общем, сейчас у меня это работает так (слабонервным не читать ;)) с вэб-интерфейса, где я красиво и красочно набираю текст с подсветками, идет запрос к вэб-сервису. Вэб-сервис выставляет флаг - Константу и начинает в цикле ждать, пока Константа ответа не будет выставлена (кстати, метода sleep в !С тоже нет, приходится использовать костыли). При этом на клиенте открыта внешняя обработка, в которой обработчик ожидания каждую секунду проверяет - не выставлена ли Константа, что надо вычислять  Если да - то запускает вычисление и выставляет Константу - результат. Вэб-сервис наконец-то дожидается результата, и с легким сердцем отправляет его на мой вэб-интерфейс, где он показывается

В общем, хочу спросить уважаемых специалистов - можно ли организовать весь процесс как-то элегантнее?  Либо как на клиенте красиво код редактировать, либо как на сервере хранить стейт с циклическим графом. Ну или еще что подскажете, что я не увидел.

MuI_I_Ika

Цитата: ivana от 13 ноя 2017, 00:18Ну а вы сами понимаете, писать на Лиспе (и стримить это на Ю-туб в реалтайме) без подсветки парных скобок - это.... непросто

1cнику это понять трудно.

Цитата: ivana от 13 ноя 2017, 00:18можно ли организовать весь процесс как-то элегантнее?

Наверное можно, только нихрена не понятно чем вы там занимаетесь и зачем нужна константа.

Возможно просто все вызовы происходят в рамках одной формы и вам достаточно использовать реквизит формы.

ivana

Цитата: MuI_I_Ika от 13 ноя 2017, 10:30только нихрена не понятно чем вы там занимаетесь

Возможно, мой стартовый пост был несколько неочевиден. Тогда по-простому - есть у меня форма обработки, с 2 текстовыми многострочными полями ввода. В одном я ввожу например 2 + 2, жму кнопку, а в другом выводится 4. Я рад и счастлив. Теперь в первом ввожу
(defn f (l)
      (defn go (l p) cond
            (null? l) 0
            p (go (cdr l) false)
            ( max (+ (car l) (go (cdr l) true)) (go (cdr l) false) ))
      (go l false))

(f '(1 2 3 6 10))

жму кнопку, а во втором выводится 14. И я снова рад и счастлив, но не очень, потому что приходится при вводе текста руками скобки считать и не ошибиться, да и ключевые слова не подсвечиваются. Я меняю тип первого поля на HTML-поле, прикручиваю к нему Codemirror - скобки и ключевые слова подсвечиваются, но стрелки не работают (курсор не перемещается). И тогда начинается поиск альтернативы - я рисую html-страничку, в которой у меня все красиво подсвечивается, и скобки и код, и стрелки работают. Эта страничка вызывает мою вэб-службу в 1С (которую пришлось создать). И у этой службы есть 2 варианта - либо выполнять все расчеты на сервере (но тогда непонятно, где мне помнить мои промежуточные данные между вызовами - в базе не смог добиться чтобы они помнились, Хранилище Значений не сериализует мои структуры и соответствия), либо второй вариант - эта серверная функция лезет к обработке, открытой на клиенте (!) - в стартовом посте написал как, и взаимодействует с ней - что архитектурно достаточно кривое решение, и мне бы хотелось сделать получше.

Надеюсь, теперь понятнее? :)

ilyay

Смотрите функции ПоместитьВоВременноеХранилище() ЗначениеВСтрокуВнутр() и обратные

ivana

Цитата: ilyay от 13 ноя 2017, 13:00Смотрите функции ПоместитьВоВременноеХранилище() ЗначениеВСтрокуВнутр() и обратные

Хорошая рекомендация, попробую. Во всяком случае, ЗначениеВФайл и сериализация в ХранилищеЗначений с моими Структурами и Соответствиями не работают - вылетают со страшной ошибкой стековерфлоу и закрытием приложения. Я подозреваю, потому что сериализация в 1С сделана тупо в лоб, и не умеет циклические ссылки. Например, даже такой банальный вариант
а = Новый Соответствие;
б = Новый Структура ("ц, д", 1, а);
a.Вставить("е", б);
я думаю она не осилит сериализовать, а мой стейт на порядки навороченнее. Но я попробую запихнуть его ВСтроку ВХранилище ВЧтоТамЕщеБывает, хоть и сомневаюсь, что там будет работать.


alex0402

Цитата: ivana от 13 ноя 2017, 14:14со страшной ошибкой стековерфлоу и закрытием приложения.
такая ошибка бывает, когда рекурсивный вызов не завершается. стек переполняется и ву а ля....
Спасибо за Сказать спасибо

ivana

Цитата: alex0402 от 13 ноя 2017, 14:24акая ошибка бывает, когда рекурсивный вызов не завершается. стек переполняется и ву а ля....

Спасибо, Кэп! Напишите это разработчикам 1С, которые декларируют, что их типы Структура и Соответствие являются сериализуемыми, а по факту (во всяком случае, в моей 8.2.19) - нет.

ilyay

Сериализация предполагает полноту содержания. Если две структуры данных будут помещены в третью, которую вы и просериализуете, тогда, возможно, заработает. Потому что в 1С нет указателей.

А вообще, циклические ссылки приводят обычно к утечке памяти.

ivana

Цитата: ilyay от 13 ноя 2017, 14:32Если две структуры данных будут помещены в третью, которую вы и просериализуете, тогда, возможно, заработает.

Надежны мало, но ради эксперимента попробую. Сегодня поздним вечером после работы.

Цитата: ilyay от 13 ноя 2017, 14:32А вообще, циклические ссылки приводят обычно к утечке памяти.

В 1С - возможно. Но я по умолчанию всегда рассчитываю на стандартное предсказуемое поведение системы, в которой разрабатываю.

ilyay

1С рекомендует самостоятельно разрывать такие ссылочные циклы перед выходом из процедуры/функции, иначе сборщик мусора не сможет их удалить. Поведение предсказуемое - зацикленные структуры замусорят память.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск