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

Позволяет установить время удаленного 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 = Неопределено;
КонецЕсли;

5 Comments

  1. hulio
    Для получения времени сервера 1С

    достаточно было сделать такую функцию:

    // Возвращает текущую дату сервера
    //
    Функция ТекущаяДатаСервера() Экспорт
    
    Возврат ТекущаяДата();
    
    КонецФункции // ТекущаяДатаСервера()

    Главное, поместить эту функцию в серверный модуль 🙂

    Reply ↓
  2. pumbaE

    В типовых уже давно добавили проверку разницы времени клиента и сервера. Можно было бы и посмотреть. Как в типовой сделано общий модуль «ПроверкаРазницыВремени», процедура такая же как и в (1).

    Reply ↓
  3. sml

    (1),(2)

    а вы попробуйте то же самое при подключении к Серверу через Внешнее соединение

    Reply ↓
  4. evg300183

    Спасибо! То что нужно! Работает на ура!

    Reply ↓
  5. pumbaE

    (3) Попробовал, работает.

    Вызываю данную функцию по внешнему соединению.

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

    Возврат

    Клиент 30.09.2011 14:31:42
    Сервер 30.09.2011 14:30:43
    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *