Имя: Пароль:
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, тратить время на изменение технологии доступа он не будет, от слова совсем.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший