Синхронизация с сервером 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 не будет опубликован. Обязательные поля помечены *