gifts2017

Синхронизация с сервером 1С во внешнем соединении

Опубликовал Олег Веселов (sml) в раздел Обмен - Обмен с другими системами

Позволяет установить время удаленного SQL-сервера на компьютере при выполнении обмена через Внешнее соединение

Предыстория:

Возникла необходимость в синхронизации времени перед обменом в локальной базе с удаленным Сервером 1С базы центрального офиса. Исследования методов 1С: ТекущаяДата() и ТекущаяУниверсальнаяДата() выявили, что они выполняются на локальном компьютере, а не на удаленном сервере 1С, куда подключается внешнее соединение. Кроме того, в серверном модуле, где выполняется процедура обмена, недоступны методы 1С: ВыполнитьКомандуСистемы

Решение:

Для получения времени сервера 1С пришлось использовать прямое подключение к серверу SQL (сервер 1С запущен на том же компьютере), а для изменения времени локальной базы использован vbscript. На SQL-сервере надо предварительно создать пользователя GetTime с правами Public (и для базы Master дать роль DBReader).

Текст 1С 8.Х:

con = New COMОбъект("ADODB.Connection");
con.Provider="SQLOLEDB";
con.ConnectionString = "Driver={Microsoft OLE DB Provider};" +
"Data Source=PR-SQL-08;" +
"Initial Catalog=Master;" +
//"Integrated Security=false;" +
//"DataTypeCompatibility=80;" +
"User ID=GetTime; PassWord=******;";
con.Open();

recset = New COMОбъект("ADODB.Recordset");
recset =  con.Execute("SELECT GETDate() as tm");
ВремяТут = ТекущаяДата();
recset.MoveFirst();
// получаем время на Скуле
ВремяЦО=recset.fields("tm").value;
con.Close();
con = Неопределено;
Если ВремяТут-ВремяЦО>3 или ВремяЦО-ВремяТут>3 Тогда
    Scr = NEW COMОбъект("WScript.Shell");
    mtm = ТекущаяДата()-(ВремяТут-ВремяЦО);
    time = "cmd /C""time "+час(mtm)+":"+Минута(mtm)+":"+Секунда(mtm)+"""";
    рр=Scr.Run("" + time + "",0,True);
    Scr = Неопределено;
КонецЕсли;

Скачать файлы

Наименование Файл Версия Размер
Синхронизация.txt 14
.txt 1,08Kb
27.09.11
14
.txt 1,08Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Антон Чарушкин (hulio) 28.09.11 08:54
Для получения времени сервера 1С

достаточно было сделать такую функцию:
// Возвращает текущую дату сервера
 //
 Функция ТекущаяДатаСервера() Экспорт
 
 	Возврат ТекущаяДата();
 
 КонецФункции // ТекущаяДатаСервера()
...Показать Скрыть


Главное, поместить эту функцию в серверный модуль :)
candy; DoReMi; pumbaE; +3 Ответить 2
2. Евгений Сосна (pumbaE) 28.09.11 13:07
В типовых уже давно добавили проверку разницы времени клиента и сервера. Можно было бы и посмотреть. Как в типовой сделано общий модуль "ПроверкаРазницыВремени", процедура такая же как и в (1).
3. Олег Веселов (sml) 29.09.11 12:02
(1),(2)
а вы попробуйте то же самое при подключении к Серверу через Внешнее соединение
4. Евген (evg300183) 29.09.11 14:55
Спасибо! То что нужно! Работает на ура!
5. Евгений Сосна (pumbaE) 30.09.11 15:35
(3) Попробовал, работает.

Вызываю данную функцию по внешнему соединению.
Функция ВремяСервера() Экспорт
	Возврат Строка(ПроверкаРазницыВремени.ТекущаяДатаСервера());
КонецФункции

Возврат
Клиент 30.09.2011 14:31:42
Сервер 30.09.2011 14:30:43