Имя: Пароль:
1C
 
Сохранение соединения ADODB.Connection
0 АЛьФ
 
12.05.26
14:49
Из базы v8 настроено общение с v7 через прямые запросы. Можно где-то сохранить соединение, чтобы инициализировать его один раз при старте и дальше пользовать? В v7 это решалось просто - глобальная переменная. Как это решить в v8?
1 zenik
 
12.05.26
14:52
Процедура ДобавитьСоединениеВПараметрыСеанса( ИнформационнаяБаза, Соединение )
    
    АдресХранилища = ПоместитьВоВременноеХранилище( Новый Структура("COMОбъект", Соединение), Новый УникальныйИдентификатор() );
    
    СоответствиеИБ = ПараметрыСеанса.COMОбъекты.Получить();
    СоответствиеИБ.Вставить( ИнформационнаяБаза, АдресХранилища );
    
    ПараметрыСеанса.COMОбъекты = Новый ХранилищеЗначения( СоответствиеИБ );
    
КонецПроцедуры

Функция ПолучитьСоединениеИзПараметровСеанса( ИнформационнаяБаза )
    
    // COMОбъекты = ХранилищеЗначения - Соответствие - Структура - COMОбъект
    
    СоответствиеИБ = ПараметрыСеанса.COMОбъекты.Получить();
    АдресХранилища = СоответствиеИБ[ИнформационнаяБаза];
    
    Если АдресХранилища = Неопределено Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    Структура = ПолучитьИзВременногоХранилища( АдресХранилища );
    Если Структура = Неопределено Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    Возврат Структура.COMОбъект;
    
КонецФункции
2 АЛьФ
 
12.05.26
14:56
2(1) Спасибо.
3 Garykom
 
гуру
12.05.26
14:57
(1) Хак со временным хранилищем ненадежен
4 Garykom
 
гуру
12.05.26
15:01
(0) На сервере легко и просто в целом никак
Не считая глючного хака (1) через временное хранилище
Более правильно через длительное фоновое, которое в цикле с паузой постоянно крутится
А обмен с этим длительным фоновым как раз через временные хранилища возможен или иными способами

На клиенте легко
5 Garykom
 
гуру
12.05.26
15:03
Представь что у тебя кластер серверов 1С
На одном ты поднял COMОбъект
А если вызов от клиента пришел на другой сервер 1С?
6 Garykom
 
гуру
12.05.26
15:10
Имхо правильный (на текущем уровне технологий) способ держать одно или пул соединений из 1С это использовать нечто внешнее
Например микросервис, который поднимает и держит нужный COM/OLE
А 1С с ним работает через http
7 Garykom
 
гуру
12.05.26
15:13
(6)+ В этом случае сразу решается и проблема кросс-платформенности
Когда сервер 1С крутится под Linux
А этот отдельный микросервис можно запускать на Windows
8 АЛьФ
 
12.05.26
15:13
2(4) В чем глючность?
2(5) У меня нет кластера.
9 АЛьФ
 
12.05.26
15:14
2(6)(7) У меня частная задача в жестких условиях окружения. Мне на фиг не сдалось все вот это решение проблем, которые у меня в принципе не возникнут.
10 АЛьФ
 
12.05.26
15:14
2(1) Все получилось. Еще раз спасибо.
11 Garykom
 
гуру
12.05.26
15:19
(8)
21.3.3. Получение данных из временного хранилища
При записи объекта в информационную базу может понадобиться извлечь данные из временного хранилища и поместить их, например, в реквизит объекта информационной базы. Для этого существует специальный метод – ПолучитьИзВременногоХранилища(). Этот метод извлекает данные из временного хранилища и возвращает их в качестве результата выполнения. Для получения данных необходимо указать адрес во временном хранилище. Этот адрес возвращают методы помещения данных во временное хранилище в случае их успешного выполнения (см. предыдущие разделы).

Внимание! При получении на сервере значения из временного хранилища следует учитывать то, что оно получается по ссылке. В действительности, ссылка эта указывает на значение, которое хранится в кеше. В течение 20 минут, с момента помещения в хранилище или же с момента последнего обращения, значение сохранится в кеше, а затем записывается на диск и из кеша удаляется. При следующем обращении значение загружается с диска и снова помещается в кеш.

После десериализации и восстановления значения из временного хранилища ссылки не восстанавливаются. Значение в кеше восстанавливается с диска. Но после сериализации/десериализации восстановить ссылки на другие объекты внутри значения невозможно.

https://its.1c.ru/db/v836doc#bookmark:dev:TI000000809
12 Garykom
 
гуру
12.05.26
15:18
(10) Учти, 20 минут с последнего обращения - и оно из кэша падает на диск
Точнее оно туда сразу падает, но пока свежее используется из кэша - COMОбъект еще жив
Как только пропало из кэша - COMОбъект умер
13 Garykom
 
гуру
12.05.26
15:24
(10) А как многозадачность/многопоточность решил?
Ну если к одному твоему COMОбъект а параметрах захотят разные модули параллельно обратиться?
Или у тебя это сразу запрещено?
14 АЛьФ
 
12.05.26
15:27
2(11)(12) Хм... Посмотрим.
2(13) У нас нет фоновых заданий.
15 Garykom
 
гуру
12.05.26
15:31
(14) Не обязательно фоновые
Одну или разные обработки одновременно открыли копии в одном сеансе, где одинаковый код обращения

Или будешь под каждую отдельный параметр сеанса?
16 Garykom
 
гуру
12.05.26
15:33
Имхо почему каждый раз просто заново не создавать COMОбъект
Не совсем понимаю схемы работы что требуется его сохранять между серверными вызовами
17 АЛьФ
 
12.05.26
15:33
2(15) Как в одном сеансе одновременно выполнять разный код без фоновых заданий?
18 АЛьФ
 
12.05.26
15:34
2(16) Установка соединения съедает 80-90% времени всего запроса.
19 Garykom
 
гуру
12.05.26
15:39
(17) По очереди
Одна обработка к 1-й базе v7 соединилась, затем вторая ко 2-й базе v7 тот же объект
И тут первая начинает писать, думая что работает с 1-й а база то 2-я
20 Garykom
 
гуру
12.05.26
15:40
(18) Обычно создали объект, подключились и много нечто делаем, затем отключаемся
Что за схема работы что требуется держать подключение?

Пишешь интерфейс на 8-ке для работы онлайн с базой 77?
Дык я в 77 для такого аля веб-сервис поднимал
21 Garykom
 
гуру
12.05.26
15:48
(20)+ https://github.com/Garykom/http1C77

как и писал выше в (6)
микросервис на Go
https://github.com/Garykom/http1C77/blob/main/main.go

держит COM/OLE с базой 1С 7.7
получает запросы по http
запросы по сути просто код на ЯП 1С 7.7
засовывает его в текстовый файл и запускает на выполнение через внешнюю обработку где #ЗагрузитьИзФайла
результат кода сериализуется во что надо (у меня в TSV) и возвращается через http
22 АЛьФ
 
12.05.26
15:48
2(19) Это решается тем, что запрос закрывается каждый раз. Не возникает ситуация, когда запрос открыт и через это соединение идет второй запрос.
2(20) Обычная схема работы. Как раз каждый раз подключаться - это странно. Поэтому и ищу возможность открыть соединиение один раз и использовать его.
У нас переходный период, поэтому данные идут в обоих направлениях, работа в обоих системах активная идет.
2(21) Слишком ненадежно и запарочно для нашей задачи. Проще оставить как есть.
23 Garykom
 
гуру
12.05.26
15:56
(22) Оно надежней чем из 1С 8 соединяться
И удобней
По сети можно когда 1С 8 и 1С 77 на разных машинах
Единственный минус что сериализация нужна явная в обе стороны самому
24 АЛьФ
 
12.05.26
16:55
2(23) Это если нужна постоянная связь, то может быть. В моем случае это временное решение на переходный период. Разрабатывать отдельно функционал обмена никто не позволит.
У меня есть куча готовых запросов в v7, которые возвращают всякие предподготовленные наборы данных для отчетов и быстрого анализа. Вот эти запросы просто теперь вызываются из v8 и там используются.
Ну, это помимо обмена собственно данными в обе стороны.
25 Garykom
 
гуру
12.05.26
17:10
(24) Так зачем их через ADO то вызывать?
Используй REST API как прокладку между 1С 8 и MS SQL
Или банально через ВИД тогда уж
26 shuhard
 
12.05.26
17:25
(25) у ТС стоит конкретная прикладная задача - ускорить работу через ADODB, тратить время на изменение технологии доступа он не будет, от слова совсем.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан