Получение COM-объекта 1С из самой 1С и передача его в ТС
Подскажите можно ли как-то из самого запущенного 1С 7.7 запустить объект Террасофт и передать в него самого себя как COM-объект в Террасофт, чтобы Террасофт уже со своей стороны с помощью разработанной компанией Террасофт утилиты синхронизации использовал его для синхронизации.
То есть я хочу решить проблему с тем, что на каждом отдельном компьютере нужно будет запускать две отдельные сущности под каждым из пользователей, продублировав в базе 1С все активных пользователей.
Может кто сталкивался с этим, как можно сделать так, чтобы не запускать 2 клиента 1С на компьютере?
Нравится
- Пока вижу только 1 теоретический реальный способ: написать на 1С 7.7 скрипт ert. В нем получаем сервис скрипта terrasoft, того скрипта, в котором содержатся собственно функции синхронизаци. Во все функции terrasoft, которые участвуют в синхронизации и создают в себе 1С объекты, добавить парамеры, через которые эти объекты передать. Из ert вызвать функцию синронизации terrasoft скрипта. Единственно, перед реализацие, нужно проверить, будут ли доступны свойства\методы нужных 1С-объектов в скриптах terrasft, которе передались из 1С.
Тоесть, синхронизации будет инициироваться с клиента 1С, а не с terrasoft.
- в версии 8.* такой проблемы нет.
- возможности получения доступа к объектам уже запущенного процесса 1С поидее не должно быть, с этим нужно отдельно разбираться
Чтобы из terrasoft делать синхронизацию, используются COM-объекты 1C. Из этих объектов к 1С-ке нужно так же подключаться, как и обычные пользователи подключаются через 1С клиент.
1С именно 7.7 версии не позволяет подключиться одновременно под одним пользователем дважды.
В 1с 8.* судя по всему это убрали.
Поэтому для 7ми нужно придумывать всякие ухищрения.
- или синхронизация происходит вконце какого-то промежутка времени (конец дня например) под одним пользователем.
- если все-таки необходимо чаще выполнять синхронизацию, и еще под разными пользователями, То здесь пока придумали только дублирование пользователей. Можно и под одним, но тогда 1С клиент нужно закрывать, пока происходит синхронизация в terrasoft.
- можно пробовать способ описаный мною выше. Но для этого нужно проверить - возможна ли передача 1С объектов в функции terrasoft (тоесть инициирует синхронизацию 1С, а не terrasoft), и если получится - сделать ряд програмных доработок.
Спасибо Алексей за хорошие советы, в дальнейшем планируется запускать синхронизацию периодически, проверяя наличие сделанных изменений после последней синхронизации (проверяться будет спецальная таблица в Террасофт и 1С, в которую будут заноситься записи об произошедших изменениях в различных таблицах, которые нужно синхронизировать).
На данный момент синхронизация работает таким образом, что на каждом компьютере пользователя должна стоять и 1С и Террасофт. Грубо говоря, при сохранении записи в Террасофт сразу же происходит обновление этой записи в 1С путем запуска экспорта. Аналогично, при добавлении/изменении записи в 1С происходит вызов функции импорта через запуск Террасофт, который в свою очередь запускает 1С. Для того, чтобы внесенные в 1С изменения из Террасофт заносились под конкретным пользователем, скорее всего нужно продублировать каждого пользователя, работающего в 1С. Таким образом можно на одном компьютере запустить две 1С под основным пользователем и продублированным, который служит для синхронизации ТС и 1С.
Думается мне что дублирование пользователей не очень правильная вещь: 1. Пользователи начнут путаться под каким им нужно запускать 1С а под каким запускается синхронизация с Террасофт 2. Каждая дополнительная 1С в семерке приведет к более "медленной" работе самой конфигурации 1С.
Что мешает сделать всего одного пользователя и под ним постоянно работающую 1С? Объекты созданные в террасофте будут переносится в 1С но автором прописываться будет пользователь 1С - сопоставленный пользователю создавшему объект в Террасофт.
"vpetunin" написал:Что мешает сделать всего одного пользователя и под ним постоянно работающую 1С?
Можно и так. Можно даже автоматизировать запуск синхронизации под этим пользователем. Для этого нужно решить по какому условию будет определяться необходимость запуска синхронизации (например по дате изменения записи). Выполнять эту проверку по таймеру, например каждые 1-5 минут. И если появились записи, для которых условие сработало (например: дата изменения записи выше даты последней синхронизации) - запустить синхронизацию. Это можно реализовать в виде отдельной утилиты, которая будет запускаться 1 раз:
tsclient /wnd=wnd_1CAutoSynchro
А еще лучше использовать TSJobManagerService.
Единственно что каждая измененная запись не сразу будет появляться в 1С. Тогда можно реализовать какой-то способ передачи сообщений между пользователем (котором нужно синхронизовать только что созданную запись) и утилитой синхронизации. А эта утилита, как и в предыдущем случае, где-то в единственном экземпляре запущенна и подключена к 1С под одним пользователем. Утилита, при получении сообщения от пользователя (в сообщении можно уточнить что конкретно пользователь хочет синхронизировать) выполняет нужную синхронизацию.
На счет авторства записей как обстоят дела, сейчас сказать не могу, нужно разбираться.