Имя: Пароль:
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, тратить время на изменение технологии доступа он не будет, от слова совсем.
27 eddy_n
 
12.05.26
20:56
(0) У меня настройки на все соединения сидят в независимом РС без измерений с наращиваемым по мере необходимости пулом (игра слов) ресуросов. В таком РС единственная и неповторимая запись, а больше и не нужно.
28 АЛьФ
 
12.05.26
21:13
2(27) В ресурсах РС (регистр сведений?) можно хранить объект СОМ?
29 АЛьФ
 
12.05.26
21:13
2(26) Верно.
30 eddy_n
 
12.05.26
21:28
(28) О чём ты? А если у тебя тупо компонента не зарегена?
31 eddy_n
 
12.05.26
21:30
(30) + Да и работать с неё можно по-разному. Можно на сервере, можно на клиенте. Значит и регистрация будет разной.
32 craxx
 
12.05.26
22:29
(28) Объект COM - это кусок кода в памяти винды. Как ты его собрался где-то хранить? Ты еще объект обработки в регистр положить попытайся)
33 Garykom
 
гуру
12.05.26
23:07
С точки зрения корректного решения задачи можно поступить как в семерке

Запустить клиентский сеанс 1С 8 на сервере аля робота
С глобальной переменной на клиенте в которой будет COMОбъект
С ПодключитьОбработчикОжидания(), в котором любым способом с сервера получаются команды
34 eddy_n
 
13.05.26
06:11
(33) Для тех, кто на бронепоезде - что такое 'аля робота'?
35 АЛьФ
 
13.05.26
09:00
2(30) Какая компонента?
2(31) Какая регистрация?
2(32) Так я об этом и спрашиваю.
2(33) Мою задачу это не решает.
36 eddy_n
 
13.05.26
09:07
(35) COM-объекты живут без динамически подключаемой библиотеки в лице компоненты cntrl.dll?
37 Eiffil123
 
13.05.26
09:29
в параметры сеанса запихнуть не получится? они по идее только на сервере и висят
38 eddy_n
 
13.05.26
09:40
(37) я кстати кое-какие данные туда тоже пихаю. Не относящиеся к Com, но облегчающие жизнь.
39 АЛьФ
 
13.05.26
09:52
2(36) Какое это имеет отношение к теме?
2(37) Напрямую не получается. Было в (1) предложено через временное хранилище, но, как оказалось (11), во временном это дело не живет долго.
40 trad
 
13.05.26
09:58
(39) Так и фиг с ним, что не живет долго. Протухнет - создашь заново
41 АЛьФ
 
13.05.26
10:07
2(40) Теряется весь смысл. У нас не такой активный обмен.
Хотели в динамическом списке выводить статусы документов из семерки. Именно тут и наткнулись на тормоза при соединении. Этот момент проще будет реализовать другим способом.
42 eddy_n
 
13.05.26
11:28
(41) С динамическими списками не шутят ещё со времен 8.2, когда в предопределённые процедуры ПриВыводеСтроки, ПриПолученииДанных (так кажется эти изыски назывались) кое-кто пытался впихнуть невпихуемое.
43 Eiffil123
 
13.05.26
11:30
(41) ужасное конечно решение в динамическом списке тащить что-то из другой базы через ADO или COM. я бы тогда лучше сделал вспомогательный РС, его подцепил к дин.списку.

А обновление РС - уже через рег.задание хоть каждую минуту или по какому-то событию
44 zenik
 
13.05.26
11:38
(41) А база SQL? Тогда можно через ADO напрямую данные читать...
45 Garykom
 
гуру
13.05.26
11:41
(43) Задачу ТС удобно через Внешние Источники Данных решать
Можно и прямо на ДС повесить, но лучше через промежуточный РС
46 Garykom
 
гуру
13.05.26
11:40
(44) Не читатель?
У ТС как раз в медленном создании объекта ADO с подключением и проблема
47 АЛьФ
 
13.05.26
11:42
2(43) Мы так и хотим в итоге сделать, но пока в файловом варианте работает, не хотелось бы рег.задания пытаться использовать. Перейдем на сервер, уберем все это дело в фон.
48 Eiffil123
 
13.05.26
11:42
(45) работал с внешними источниками. Запросы в разы медленнее работают, чем с объектам текущей ИБ. У меня есть подозрение, что выполнение запроса каждый раз открывает новое соединение, за счет этого и тормоза.
Получение статусов придется делать в обработчике "ПриполученииДанныхНаСервере", и при прокрутке дин.списка будут жуткие тормоза за счет этого.
49 Garykom
 
гуру
13.05.26
11:43
(47) Чем регзадания не нравятся?
Да для файловых они не удобны, но для серверных баз это очень даже круто
50 АЛьФ
 
13.05.26
11:43
2(45) Думали над использование внешних источников, но решили, что не стоит заморачиваться (см. мой коммент об использовании готовых прямых запросов SQL).
51 АЛьФ
 
13.05.26
11:44
2(49) Так именно тем, что сейчас работа в V8 идет в файловом варианте.
52 Garykom
 
гуру
13.05.26
11:48
(51) Так перейдите на автономный сервер с файловой базой то
Либо просто через публикацию на веб-сервере работать, с указанием через ключики запуска где можно регламентные выполнять

Или конфа не УФ?
53 eddy_n
 
13.05.26
12:00
(47) У нас на рег. заданиях многое держится. Без них ничего не взлетает.
54 eddy_n
 
13.05.26
12:02
(52) Веб-сервер как оказалось не самое хорошее решения для 20-22 платформ 1с. Пинать его (IIS) приходится периодически.
55 eddy_n
 
13.05.26
12:04
В теории всё легко и просто, а когда дело доходит до конкретной реализации всплывают подводные камни.
56 eddy_n
 
13.05.26
12:07
Спросите, а почему на 20-ой до сих пор? А потому что ни разу не было претензий к демоническому обновлению.
57 АЛьФ
 
13.05.26
12:19
2(52) Конфа УФ. Мы сейчас в процессе перехода на сервер.
58 Garykom
 
гуру
13.05.26
13:34
(54) Не наблюдал особых проблем с Апачем
Оно или сразу работает или нет
59 eddy_n
 
13.05.26
13:53
(58) Не знаю почему, админ не хочет его ставить
60 Garykom
 
гуру
13.05.26
14:00
(59) Странный админ
Апачей можно даже несколько поднять, на разных портах
И параллельно с IIS, мешать не будут друг-другу
61 eddy_n
 
13.05.26
16:51
(60) Я в его монастырь со своим уставом не лезу. Да у меня и без это проблем выше крыши.
62 eddy_n
 
13.05.26
17:03
(61) + Марки марочные в спину дышат
Ошибка? Это не ошибка, это системная функция.