Автоматическое обновление конфигурации в узлах РИБ

При поднятии РИБ одна из существенных проблем – как автоматически обновлять конфигурацию на периферийных узлах? Научить простых пользователей заходить в конфигуратор довольно проблематично. Предлагаю довольно простое, на мой взгляд решение с минимальными доработками в конфигурацию.

Информирование

Имеет смысл информировать пользователей о том, что с обменами пришло обновление конфигурации.

Для этого в модуле приложения достаточно вставить периодически вызываемую функцию вида:

 

Функция ПостояннаяПроверкаРедкая() Экспорт
//Раз в 5 минут
Если ПланыОбмена.ГлавныйУзел() <> НеопределеноТогда
Если КонфигурацияИзменена() Тогда
ксПредупреждение("Конфигурация базы данных изменена, чтобы не образовался простой в обменах, обновите конфигурацию или свяжитесь с поддержкой 1с!" + Символы.ПС +
"Для обновления конфигурации на точке достаточно перезайти в 1С под Администратор1, при этом будет выдан запрос на обновление. " + ТекущаяДата());
КонецЕсли;
КонецЕсли;
КонецФункции

 

Когда придут изменения, будет выдано окошко вида:

Обновление

Само обновление выполняется в функции ОбновитьКонфигурациюБазыДанных. Ее можно вставить при начале работы приложения или добавить в пункт меню интерфейса. Когда пользователь увидит предупреждение, он сможет выполнить обновление, когда ему будет удобно:

Функция ОбновитьКонфигурациюБазыДанных() Экспорт
//Если конфигурация изменена, тогда нужно выполнить ее обновление...
флКонфигурацияИзменена = КонфигурацияИзменена();
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();//File="C:1cv8Base".
ЭтоФайловая = Найти(СтрокаСоединения, "File="); //Заменить потом на типовую функцию.

Если флКонфигурацияИзменена И ЭтоФайловая Тогда
//Смотрим, чтобы в базе никого не сидело

~ПовторнаяПопыткаОбновления:

флОбновлять = истина;
Если ксВопрос(
"Внимание! Пришли изменения конфигурации. " + Символы.ПС +
"Рекомендуется их принять." + Символы.ПС +
"Закройте все остальные 1С на всех компьютерах точки и нажмите ""ДА"" для Обновления." + Символы.ПС +
"Если после нажатия ""ДА"" выскочит красное окно ошибки, закройте его (кнопка ""Закрыть"")." + Символы.ПС +
"Если вы хотите продолжать работу без обновления (не рекомендуется) нажмите ""НЕТ""." + Символы.ПС +
"Если вы не обновляете конфигурацию, обязательно сделайте это позже в ближайшее время."+ Символы.ПС +
"ОБНОВИТЬ КОНФИГУРАЦИЮ?", РежимДиалогаВопрос.ДаНет,,КодВозвратаДиалога.Да) = КодВозвратаДиалога.Нет Тогда
флОбновлять = ложь;
КонецЕсли;

Если флОбновлять Тогда

Попытка
УстановитьМонопольныйРежим(Истина);
Исключение
ксПредупреждение("Кто-то еще работает в базе, не могу захватить базу монопольно, обновить не получается, попробуйте еще раз! " + Символы.ПС + ОписаниеОшибки());
Перейти ~ПовторнаяПопыткаОбновления;
КонецПопытки;

//Создаем и запускаем скрипт на обновление базы
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();//File="C:1cv8Base".
СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "File=", "F");
СтрокаСоединения = СтрЗаменить(СтрокаСоединения, ";", "");

КаталогПрограммы = КаталогПрограммы();
ИмяФайлаПрограммы = КаталогПрограммы + "1cv8.exe";
КоманднаяСтрокаОбновления = """" + ИмяФайлаПрограммы + """ config /Visible /NАвтообмен /P"""" /UpdateDBCfg /" +СтрокаСоединения;
//КоманднаяСтрокаЗапуска = """" + ИмяФайлаПрограммы + """ enterprise /NКассир /" +СтрокаСоединения;

//Запускаем только несколько раз, должно помочь
ТекстСкрипта = "";
Для Инд = 1 по 10 Цикл //10 попыток обновить конфигурацию
ТекстСкрипта = ТекстСкрипта + КоманднаяСтрокаОбновления + Символы.ПС;
ТекстСкрипта = ТекстСкрипта + "if not errorlevel 1 goto pend " + Символы.ПС;
КонецЦикла;

ТекстСкрипта = ТекстСкрипта + "
|:pend";

//ТекстСкрипта = ТекстСкрипта + КоманднаяСтрока + Символы.ПС;
//ИмяФайлаСкрипта = КаталогВременныхФайлов() + "update_1s_counter_sap.cmd";
ИмяФайлаСкрипта = КаталогВременныхФайлов() + "run.bat";
Ф = Новый ТекстовыйДокумент();
Ф.УстановитьТекст(ТекстСкрипта);
Ф.Записать(ИмяФайлаСкрипта, КодировкаТекста.OEM);

Попытка
ЗапуститьПриложение(ИмяФайлаСкрипта,,ложь);
Исключение
ксПредупреждение("Произошла ошибка запуска скрипта обновления: " + ИмяФайлаСкрипта + " Ошибка: " + ОписаниеОшибки());
Перейти ~ПовторнаяПопыткаОбновления;
КонецПопытки;

//Завершаем работу 1С
ЗавершитьРаботуСистемы(истина);
КонецЕсли;
КонецЕсли;
КонецФункции

 

Суть работы алгоритма обновления – сначала проверяется, что все пользователи вышли из 1С, потом закрывается текущий сеанс, формируется командный файл run.bat со скриптом обновления конфигуратора и вызывается 10 раз. Процесс вызова конфигуратора в режиме обновления визуализируется, чтобы пользователи полностью могли контролировать и осознавать процесс.

 

Информационное сообщение с инструкцией пользователю по обновлению имеет вид:

Если не получилось заблокировать 1С, выдается сообщение вида:

75 Comments

  1. dimk@a

    Здоровское решение. Недавно делал распределенную базу и уже довелось ее обновлять с подключением по удаленке к узлам. При слеюущем обновлении добавлю эту функцию. Спасибо!

    Reply ↓
  2. fixin

    (1) ндык, че мы только не пробовали. оказалось, самый простой вариант такой.

    Reply ↓
  3. baldorc

    Хорошее решение, при случае использую не задумываясь 🙂

    Reply ↓
  4. Kyrales

    Хорошая идея. Можно проверку немного модифицировать:

    Функция ПостояннаяПроверкаРедкая() Экспорт

    //Раз в 5 минут

    Если ПланыОбмена.ГлавныйУзел() <> Неопределено Тогда

    Если КонфигурацияИзменена() Тогда

    Если РольДоступна(«ПолныеПрава») или РольДоступна(«ПравоОбновленияКонфигурации») Тогда

    ОбновитьКонфигурациюБазыДанных();

    иначе

    Предупреждение(«Конфигурация базы данных изменена, чтобы не образовался простой в обменах, обновите конфигурацию!» + Символы.ПС +

    «Для обновления конфигурации на точке достаточно перезайти в 1С под Администратор (или пользователем с администраторскими правами), при этом будет выдан запрос на обновление. » + ТекущаяДата());

    КонецЕсли;

    КонецЕсли;

    КонецЕсли;

    КонецФункции

    Reply ↓
  5. fixin

    (4) можно и автоматом. Но не всегда прокатит автоматика. Если открыто две 1с-ки, то конфа не обновится автоматом, а сообщение о том, что не удалось обновить, будет доставать.

    хотя согласен, можно попытаться обновить, а если не получится монопольный доступ, уже тогда сообщать.

    Но лучше решение об обновлении все же принимать пользователю. Не всегда обновление проходит автоматом, и запускающийся каждые 10 минут конфигуратор будет доставать.

    Reply ↓
  6. WKBAPKA

    поставил плюс т.к. самому было в лом разбираться, в типовых предусмотрено авто. обновление…

    но со стилистикой надо что то делать 🙂

    Функция ПостояннаяПроверкаРедкая()

    после редкая на ум приходит не хорошее слово 🙂

    >Когда придут изменения будет выдано окошко вида

    окошко вида )

    > Закройте все остальные 1С на всех компьютерах точки 🙂

    ну и использовать GoTo признак плохого тона в программировании…

    Reply ↓
  7. zamichnik

    Весьма симпатичная идея, большое спасибо!

    Непременно воспользуюсь 🙂

    Reply ↓
  8. Cyberboy

    А пользователь который делает обмен должен иметь полные права? У меня на РИБ узлах есть пользователь Обновление, при запуске этого пользователя, автоматом запускается обновление с главным узлом и после прохождения обновления сеанс пользователя завершается, у всех остальных пользователей стоит ограничение в правах. Будет при таком методе запускать «Автоматическое обновление конфигурации в узлах РИБ» у пользователя «Обновление»?

    Reply ↓
  9. glek

    Хорошее решение

    Reply ↓
  10. fixin

    (8) есть два права. первое — это право на изменение конфы. без него файл с изменениями конфы не прочитается и дело до «ОбновитьКонфигурацию» даже не дойдет. Проще решить эту пролему, запуская обмен данными в привелигированном модуле, т.к. право на изменение конфы — весьма опасное, его нельзя давать на точках.

    Второе право — это право на обновление конфигурации БД. Его можно дать даже пользователю без пароля, как у меня, «Автообмен».

    Reply ↓
  11. fixin

    (6) не буквоедствуйте.

    Как сделано автообновление в типовых, не помню уже. У меня типовая ут 10.3, автообновления там нет, правда древний релиз.

    Окошко вида — потому что текст там может быть другой, зависит от организации.

    Использовать GoTo можно, нам об этом рассказывали в универе, где я учился на программиста. Альтернатива циклу while true в небольших участках кода — вполне.

    Reply ↓
  12. ak0710

    Ваш способ конечно хорош, у каждого это идея приходит по разному , год или два назад Я настраивал авто обмен в одной фирме у них была типовая ИБ , и не было смысла убирать замок с конфигурации.

    Каждую ночь в головной базе производилась выгрузка планов обмена например в 23.00 (отключались все пользователи , делался бэкап перед этим)

    В базе филиала :

    В 01:00 в базе филиала запускалось чтение плана обмена (перед чтение отключение всех пользователей и бэкап)

    В 01:30 1С с командной строкой /UpdateDBCfg

    В 02:00 повторное чтение и выгрузка

    Обмен с 6ти филиалами работает по сей день, здесь обновление проходило 1 раз ночью .

    Ваш случай очень удобен если обмен проходит по несколько раз в день , а если одного раза достаточно , то не обязательно трогать конфигурацию.

    Reply ↓
  13. fixin

    (12) в моем случае компьютеры на ночь выключаются, т.е. все должно происходить с выгоном пользователей…

    но я думаю, можно и на скриптах написать, чтобы не менять конфу, почему бы нет… 😉

    Reply ↓
  14. ak0710

    (13) Я за то чтобы как можно меньше всего трогать в типовой конфигурации , можно добавить просто еще командную строку с отключением ПК после обмена , каждый сам выберет что ему надо , возможно ваш способ Я тоже когда нибудь использую

    Reply ↓
  15. fixin

    (14) у нас обновление конфы происходит не только ночью, а в любой момент.

    Reply ↓
  16. kiros

    Да, идея очень достойная, мы реализовывали так, если динамическое обновление, то автоматически обновлялось, и стандартная обработка требовала от пользователей перезайти (со счетом до 3-х, т.е. не больше трех раз можно отказаться от пере захода в 1с). А в случае монопольного обновления инициировали блокировку подключения с отсрочкой 5 минут, и опять же стандартными средствами получалось выгнать, после чего спокойно обновлялись и снимали блокировку, как то так 🙂

    Reply ↓
  17. fixin

    (16) ну дык печатайте на ИС и зарабатывайте плюсики. 😉 Я не претендую на идеал, но система рабочая.

    Reply ↓
  18. Программулькин

    Честно сказать — полная какашка!, но минус ставить не буду ибо как вариант имеет права на жизнь.

    Во первых, это же : автоматическое обновление конфигурации!, какие нахрен окошки на «да» и «нет», какое нафиг «не могу захватить монопольно» — бред! У меня если пришли обновления, то всем сообщение о сохранении документов и баста — счётчик тикает, далее всех кидает и обновляет, причём во время обновления хрен кто зайдет.Обновилось, пожалуйста, работайте, вмешательство рук человека 0, особенно юзеров!

    правда минус есть, пришлось внести изменения в конфу: добавлены 4 процедуры 1 константа и 1 форма и 1 роль

    Во вторых, » КаталогПрограммы = КаталогПрограммы();» тоже бред. Обновил платформу и всё, приплыли, файл не найден!

    У меня у юзеров тупо диск вставил запустил батник и всем 15м платформа новенькая легла без всяких там вопросов «могу» «не могу». Похер на антивири и фаерволы, за исключением вистовской попрошайки о том кто запустил файл, и то настраиваешь на низкий уровень и попёр!

    обмен раз в 40 минут, тобишь всегда актуальная база и конфа.

    Reply ↓
  19. fixin

    (18) понты так и сверкают. Так где же ваша замечательная программма? В файловой версии конечно, можно поставить убивцу 1с на все компьютеры точки (2-3 штуки). Но нужно управление этим убивцем, короче задача излишне усложняется. Про КаталогПрограммы я ваш нюанс не понял, как бе. В общем, готов рассмотреть ваш супер-пупер-вариант, когда он тут появится. Пока это только проджэкт, который критиковать невозможно за его отсутствием в мире реальном.

    Reply ↓
  20. Программулькин
    Reply ↓
  21. fixin

    (20) все равно про каталог программы не догнал. разве в 82 он не показывает на каталог, из которого запущен exe-файл?

    Дядя, а если у пользователя запущен отчет или 1С повис, 1с у вас автоматом не выйдет. Это я так, на всякий случай намекаю как бе. Из практики.

    Reply ↓
  22. Программулькин

    (21) «все равно про каталог программы не догнал» —faspalm…Тяжелый случай, делаю последнюю попытку.При обновлении платформы каталог программы меняется, т.е. создается новый.

    «разве в 82 он не показывает на каталог, из которого запущен exe-файл?» именно так! После обновления у вас будет новый каталог, а бантик останется в старом!

    1.Если у юзера повис 1с, то да согласен,ни хрена не выйдет, НО обмен 1 раз в 40 минут, за 40 минут юзер перезапустит свой висяк, и обмен состоится.

    2.Если «отчёт» и любая другая транзакция, то , в этом вся прелесть в отличии от штатной блокировки, она ждет когда закончится «отчёт», и врубает счетчик, и обмен, опять же таки, состоится. Это уже проверено на практике.

    Reply ↓
  23. sa1m0nn

    (11)

    Хорошая идея, спасибо, +2.

    ЗЫ: Но про ГоТо сказали правильно — это моветон (меня реально высаживает :)). Используйте вызов процедуры.

    Reply ↓
  24. fixin

    (22) и что, функция КаталогПрограммы() не вернет этот каталог? А что она вернет? Я по-прежнему не догоняю че-та… Ну даже если вернет базовый каталог, в нем можно замутить поиск EXE-файла, в чем проблема-то.

    Юзверь может и перезапустит, а может и нет, может он ваще ушел домой с работы…

    (23) Гото — не моветон. В умелых руках. Я вам как программист, получивший высшее образование по специальности, говорю.

    Reply ↓
  25. Программулькин

    ыыыы «и что, функция КаталогПрограммы() не вернет этот каталог? А что она вернет? » да все верно, она именно это и сделает. Вот что у тебя получится: текущая платформа 8.2.15.317. Ты туда кидаешь свой бантик. Юзаешь КаталогПрограммы() — результат: все работает. Далее проходит месяц. Устанавливаем платформу новую. И вуаля, Ты уже юзаешь новый каталог программы, а именно: 8.2.15.318, где нет твоего бантика, результат — ошибка.Так понятно?

    Если и так не понятно, то снеси все платформы, установи одну сделай обмен, а затем обнови платформу и увидишь ошибку, если ошибки не будет, тогда ты гений, и тогда обязан поделится как ты такое провернул!

    Далее:

    «Юзверь может и перезапустит, а может и нет, может он ваще ушел домой с работы… » — 90% случаев перезапустит, ибо ему 1с нужна, а вот если зависло и он ушёл домой, это да — косяк. Дык я и говорю, что мое решение далеко от идеала, НО в твоем случае это тоже косяк )), тоже не пройдет обновление :))) у тя есть решение такой проблемы?

    Reply ↓
  26. fixin

    (25) я батник создаю при каждом запуске автоматически из кода программы, а не кидаю туда. Как-то так. Так что никаких проблем у меня с этим не возникнет. Так что у меня косяков нету. Пользователя задолбает напоминалка и он обновится. Проверено на пользователях.

    Reply ↓
  27. fieryfist

    отличная публикация, как раз настраиваю РИБ искал что-то подобное. Подскажите как настроить вызов функции ПостояннаяПроверкаРедкая() каждые пять минут, я сделал это через регламентное задание, но это не удобно т.к. сообщение выдается только пользователю для регламентных заданий, а у нас всегда запущено два сеанса.

    Reply ↓
  28. fixin

    (27) Через ПодключитьОбработчикОжидания

    Reply ↓
  29. Созинов

    Спасибо, возьмем на заметку.

    Reply ↓
  30. sa1m0nn

    (24)

    >> Я вам как программист, получивший высшее образование по специальности, говорю.

    Вы, наверное, один тут программист с высшим образованием 🙂

    Reply ↓
  31. fixin

    (30) без понятия. речь идет о высшем профильном образовании.

    Reply ↓
  32. sa1m0nn

    (31)

    Тысяча извинений за офф…

    Вероятно, я на сантехника учился…

    Да и Эдсгеру Дейкстре, наверно, далеко до Ваших преподавателей…

    http://ru.wikipedia.org/wiki/GOTO

    Тысяча извинений, это всего лишь моё скромное мнение.

    Reply ↓
  33. fixin

    (32) курите раздел «Оправданное применение» по вашей ссылке. Мы изучали GoTo в рамках курса «Структурное программирование». Вы бы еще на BREAK ополчились, это тот же скрытый GoTo. В своем коде я использую Goto вместо цикла Repeat Until, которого нет в 1С, и это его нормальное применение. Оно более наглядно, чем замена на While (true)

    Reply ↓
  34. maria7777777

    Да идея не плохая, но вот пользователям на удаленных точках полные права не могу дать, противоречит корпоративной безопасности…

    Reply ↓
  35. fixin

    (34) а зачем им полные права, не понял?

    Reply ↓
  36. CnupT

    Не совсем понял, как согласуются

    Для обновления конфигурации на точке достаточно перезайти в 1С под Администратор1

    и

    КоманднаяСтрокаОбновления = «»»» + ИмяФайлаПрограммы + «»» config /Visible /NАвтообмен /P»»»» /UpdateDBCfg /» +СтрокаСоединения;

    Т.е. они сначала заходят под Администратор1, потом программа заходит под Автообмен? Зачем так сложно?

    Reply ↓
  37. CnupT

    И еще момент. Как у Вас на точках организован сам процесс периодического обмена?

    Пользователи держат включенными 2 окна 1с, или планировщиком Windows запускается?

    Просто 2 окна крайне неудобно, а раз в NN минут открывающееся и закрывающееся окно

    1С и того хуже.

    Всю голову сломал как бы это покрасивше реализовать. Пока что с помощью v82.Automation

    добился того, чтобы 1С висела себе в памяти без видимых проявлений, но при обновлении

    конфигурации ее же выгружать надо, потом опять как-то загружать…

    Reply ↓
  38. fixin

    (36) Администратор1 — это логин для работы под пользователем. Пароль пустой.

    Автообмен — это пользователь, если зайти под которым, то произойдет автообмен и 1с сразу же выйдет. Сейчас думаю, что можно было бы и без этого обойтись, в принципе. Пароль пустой.

    (37) через обработчик ожидания. запускается периодически проверка, если автообмена давно не было (по истории обмена смотрим), то создаем скрипт, сохраняем его во временный файл, запускаем скрипт, а из скрипта коннектимся к 1с по ком-соединению и выполняем в ком-соединении обмен. Только такой расклад позволяет запустить автообмен полностью в невидимом режиме, чтобы юзверь его не видел. и юзверь может его снять через диспетчер задач, если чё.

    Reply ↓
  39. yoyoman

    А у нас как:

    Около 20 рибов, обмены идут раз в 15-20 минут.

    Cтандартное назначенное задание средствами Windows Server 2003, которое инициирует вход в 1с под пользователем Obmen. В настройках обмена стоит: Выполнять обмен при входе в систему пользователя Obmen.

    Назначенное задание инициирует два таких запуска, один с ключом /UpdateDBCfg, а второй без.

    При динамическом обновлении никаких проблем не возникает, и в течение дня всегда актуальные обмены. Не динамические обновления стараемся делать ночью. Ночью все серваки перезагружаются и активных сеансов 1с не остается. (также можно обычным батником в одну строчку перезапускать службу 1с).

    Если же надо срочно не динамически обновиться средь бела дня, в каталоге обмена валяется psexec.ехе. Через него рассылается сообщение пользователям (через netsend) о предупреждении завершения сеансов 1с. Через psexec же перезапускается служба (или через taskkill убиваются все процессы 1с.ехе) и выполняется вход в 1с с ключом /UpdateDBCfg. Миссия выполнена. Изменений в конфигурации никаких. Все сделано тройкой батников по паре строк в каждом батнике.

    Reply ↓
  40. fixin

    (39) много отличий у нас с вами. я тоже сначала делал батником.

    Но у меня есть нюансы:

    1. Машины работают только днем

    2. Обновления конфы чаще всего тоже приходят днем

    3. Из-за глюков 1с задания, запущенные под фоновым пользователем винды имеют свойство зависать и только перезагрузка спасает, а потом она опять стартует и опять виснет. Поэтому отказался от запуска под фоновым юзверем…

    4. Прописывать в 1С ручками windows-пользователя root на каждой из 40 узлов РИБ как-то стремно. Проще назначить пользователя с авторизацией из 1с, а не винды.

    … и еще много нюансов.

    Как-то так… Так что я понимаю ваш ура-оптимизм, но в реальной жизни все сложнее бывает

    Reply ↓
  41. yoyoman

    1) Можно утром же обновлять, в 9 утра пришли на работу. В 9:01 обновление конфы, в 9:02 все радуются

    2) У нас тоже днем идет в диапазоне 15-20 минут. С одним РИБом, и того каждые 2-3 минуты.

    3) У нас за 4 года крайне редко случаются подобные проблемы, но легко мониторятся и лечатся обычным schtasks (запускаемым в пакетном режиме). Если перезагражать компьютер из-за зависшего назначенного задания — проблемы тогда надо искать в винде, а не в 1с.

    4) В чем стремно? я не совсем понял, пользователь обмена то 1совский. Назначенное задание лишь под этим пользователем инициирует вход.

    Reply ↓
  42. fixin

    (41) ха, наивный чукотский юноша. у клиента 40 магазинов с самым разным временем открытия, к тому же обновления обычно происходят в середине дня, а не в начале и не в конце. Это как бы не проблема, можно предупреждать пользователя сделать обмен, тем же net send, как бы…

    А как у тебя сделан выход из под пользователя obmen, или он так и болтается открытым после автообмена? или ты его насильно прибиваешь?

    В том-то и дело, что разбираться с проблемами виндов на 40 точках не очень охота… Проще запускать невидимо под текущим виндовым пользователем, тогда всегда можно прибить через таски.

    У меня не было задачи не менять конфу, поэтому я все сделал через 1с, в том числе и для того, чтобы не напрягать админов, ручные настройки заданий требуют времени, все задачи запускаются из самой 1с и все в шоколаде. Это возможно, потому что в течении дня 1с обычно открыта…

    По поводу виндового пользователя — я подумал, что obmen у тебя виндовый пользователь, ну да ладно… 😉

    Reply ↓
  43. 1С_Мастер
    Перейти ~ПовторнаяПопыткаОбновления;

    Таки я дико извиняюсь, но при всем уважении к автору, за использование goto надо руки вырывать.

    Reply ↓
  44. fixin

    (43) оператор гото допустимо использовать, но не всегда. там где использовал я — допустимо

    Reply ↓
  45. 1С_Мастер

    (44)А какова необходимость использовать goto там, где без него можно прекрасно обойтись?

    Reply ↓
  46. fixin

    (45) стилистическая необходимость. Т.к. в 1с отсутствует цикл UNTIL, а GOTO смотрится красивее и проще вместо замены цикла UNTIL бесконечным циклом с брик.

    Reply ↓
  47. relanium86

    Никто не пробовал если запускать через скрипт в режиме обновления конфигурации, если есть возможность динамического обновления, если в базе работают пользователи отработает скрипт?

    Reply ↓
  48. sdv88

    а как проверить пройдет ли динамическое обновление или нет?

    Reply ↓
  49. Linx-p

    (48) sdv88, проверить прошло ли обновление можно запустив обмен 😉

    Reply ↓
  50. Muppo

    А есть вариант не с файловым обновлением а серверным с БД?

    Reply ↓
  51. fixin

    (50) Muppo, нету. Сами напишите, несложно.

    Reply ↓
  52. Xershi

    Я так понимаю уже тут спецы определили какой вариант самый лучший, чтобы эту операцию (выполнение обмена на автомате при изменении конфигурации в ЦБ) выполнять на автомате?

    Подскажите лучшее решение?

    А то сегодня ручками все проделал. Не охота каждый день убивать на это 20 минут))

    Reply ↓
  53. fixin

    (52) ну у меня ваще автоматом делается.

    1. отключается главный узел.

    2. через командную строку загружается конфа целиком.

    3. подключается главный узел.

    но это если целиком конфу пихать.

    а так все же описано, берите скрипт и юзайте.

    Reply ↓
  54. Xershi

    (53) об этом и речь. У нас может и 2 раза на день конфа обновиться. А может быть день и не обновляем. Как разработки внедряем.

    Как такой вариант обставить?

    Пока в нашей удаленке пользователи не работают. Но в будущем планируется.

    Ознакомился со статьей, но я так понимаю всю работу делает батник?

    У вас есть более развернутая статья со всеми примерами? А то пока это задача на втором плане, но хотелось бы разобрать вопрос в кратчайшие сроки!

    Reply ↓
  55. fixin

    (54) куда уж развернутее. Если Вы не понимаете смысла этой статьи, боюсь у Вас не хватает понимания механизмов работы РИБ.

    Reply ↓
  56. Xershi

    (55) речь идет об

    run.bat

    В статье нет разбора этого файла. Вот что более развернуто интересует.

    Reply ↓
  57. fixin

    (56) А что run.bat?

    В нем несколько раз запускается обновление конфигурации базы данных, чтобы полученная конфа была принята (10 попыток вроде).

    Командная строка вида:

    config /Visible /NАвтообмен /P»»»» /UpdateDBCfg /» +СтрокаСоединения;

    Reply ↓
  58. Xershi

    (57) а попытки для чего? Конфа же один раз обновляется для чего 10 раз?

    Reply ↓
  59. fixin

    (58) батник запускается после выхода из 1С.

    вообще можно вместо батника юзать скрипт vbs, батник то туповат.

    Повторение потому что 1с медленно освобождает файл базы, поэтому первые 1-2 прогона могут не сработать, файл базы еще заблокирован после выхода из 1с.

    Reply ↓
  60. Xershi

    (59) у меня например 1С работает через компоненту с пауршел. Суть в том что в винде нужно скрипт написать, который отработает определенный сценарий запуска 1С?

    Reply ↓
  61. fixin

    (60) да. хоть пауэршелл, хоть bat, хоть vbs-скрипт, без разницы. Главное чтобы 1с после выхода запустила скрипт.

    Reply ↓
  62. Xershi

    (61) а текст скрипта ты в (57) написал полный?

    Что туда конкретно запихнуть?

    Reply ↓
  63. fixin

    (62) да, там 10 раз запускается 1с с ключом «config /Visible /NАвтообмен /P»»»» /UpdateDBCfg /» +СтрокаСоединения;», для того, чтобы принять изменения конфигурации. Т.е. чтобы обновить конфигу, ключ: UpdateDBCfg

    Reply ↓
  64. Xershi

    (63) посмотрел, как сделан механизм в БП2, сейчас вожусь с адаптацией для любой конфигурации. У нас просто конфа еще с 8.1 и там нет некоторых модулей. А так будет универсальный механизм, скачал подсистему поставил и не паришься!

    Reply ↓
  65. Xershi

    В типовой выполняется такой код:

    //Окончаение завершения работы пользователей
    //Обновление конфигурации ИБ
    Sh = Новый COMОбъект(«WScript.Shell»);
    //Обновим конфигурацию БД
    LineExe = «»»» + v8exe + «»» CONFIG /S» + ServerName + «:» + Формат(KlasterPortNumber,»ЧГ=0″) + «» + InfoBaseName + » /N»»» + InfoBasesAdminName + «»» /P»»» + InfoBasesAdminPass + «»» /WA- /UpdateDBCfg /UC»»» + LockPermissionCode;
    Sh.Run(LineExe, 5, True);
    

    Почему он его с первого раза не обновляет?

    Reply ↓
  66. Xershi
    /Visible

    Добавил ключ видимости, он получается что просто не успевает открыть конфигуратор?

    Reply ↓
  67. Xershi
    //Окончаение завершения работы пользователей
    //Обновление конфигурации ИБ
    Sh = Новый COMОбъект(«WScript.Shell»);
    //Обновим конфигурацию БД
    LineExe = «»»» + v8exe + «»» CONFIG /Visible /S» + ServerName + «:» + Формат(KlasterPortNumber,»ЧГ=0″) + «» + InfoBaseName + » /N»»» + InfoBasesAdminName + «»» /P»»» + InfoBasesAdminPass + «»» /WA- /UpdateDBCfg /UC»»» + LockPermissionCode+»/Out»+»D:BukanovРИБdump.txt»+» -NoTruncate»;
    Sh.Run(LineExe, 0, True);
    

    Добавил /Out»+»D:РИБdump.txt»+» -NoTruncate, как и было в изначальной версии, с файлом не хотел мудрить, тогда операция идет долго и гарантировано обновляет конфигурацию.

    В понедельник поиграюсь еще, но думаю я почти закончил подсистему.

    Reply ↓
  68. fixin

    (67) Поздравляю!

    Reply ↓
  69. Xershi

    (68) кстати подскажи как правильно реализовать такую штуку:

    Если ПланыОбмена.ГлавныйУзел() <> Неопределено Тогда
    
    Если КонфигурацияИзменена() Тогда
    
    ОтключитьОбработчикОжидания(«ПроверкаНаОбновлениеРИБ»);
    
    СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
    Если СтрЧислоВхождений(ВРег(СтрокаСоединения), «FILE=») Тогда
    #Если Клиент Тогда
    Предупреждение(«Конфигурация базы данных изменена, чтобы не образовался простой в обменах, обновите конфигурацию или свяжитесь с поддержкой 1с!» + Символы.ПС +
    «Для обновления конфигурации на точке достаточно перезайти в 1С под Администратором, при этом будет выдан запрос на обновление. » + ТекущаяДата());
    #КонецЕсли
    ОбработкаОбновлениеКонфигурации = Обработки.ОбновлениеКонфигурации.Создать();
    ФормаОбработки = ОбработкаОбновлениеКонфигурации.ПолучитьФорму();
    ФормаОбработки.Открыть();
    Иначе
    МодульРегламентныхЗаданий.ОбновлениеКонфигурации();
    #Если Клиент Тогда
    Предупреждение(«Конфигурация базы данных изменена, чтобы не образовался простой в обменах, завершите работу!» + Символы.ПС +
    «Конфигурация будет обновлена автоматически: » + Строка(ТекущаяДата()+300));
    #КонецЕсли
    КонецЕсли;
    
    КонецЕсли;
    
    Иначе
    
    ОтключитьОбработчикОжидания(«ПроверкаНаОбновлениеРИБ»);
    
    КонецЕсли;

    Показать

    Т.е. в чем вопрос: Как правильно запустить процедуру 1 раз в клиент-серверном варианте?

    Делать проверку заблокирована ли база? Если она уже заблокирована, значит считать что обновление пошло? Но когда я отлаживал, скрипт вылетал в ошибки (криво 1С скрипт написали) и база будет заблокирована и не обновлена.

    Reply ↓
  70. fixin

    (69) запускай в цикле и анализируй ответ.

    Reply ↓
  71. Xershi

    (70) анализ через что делать. Пользователей много, а если что пойдет не так чем восстановить без участия администратора?

    Reply ↓
  72. fixin

    (71) а что там восстанавливать то? можно проанализировать ситуацию и предложить пользователю обновить конфигурацию или выйти, например.

    Reply ↓
  73. sir

    У меня вот что получилось , немного подредактировал процедуру

    запускается в фоновом задании, если конфигурация изменена

    СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
    
    Попытка
    УстановитьМонопольныйРежим(Истина);
    Исключение
    //ЗаписатьВЖурнал(«Обновление ИБ»,»Не удалось установить монопольный режим. «+ ОписаниеОшибки(),Истина);
    КонецПопытки;
    
    КаталогПрограммы  = КаталогПрограммы();
    ИмяФайлаПрограммы = КаталогПрограммы + «1cv8.exe»;
    ИмяФайлаПрограммы = СтрЗаменить(ИмяФайлаПрограммы,»Program Files»,»Program Files (x86)»);
    
    КоманднаяСтрокаОбновления = «»»» + ИмяФайлаПрограммы + «»» DESIGNER /UpdateDBCfg -server /IBConnectionString» +СтрокаСоединения+» /N»+Пользователь+» /P»+Пароль;
    СтрокаСоединения = СтрЗаменить(СтрокаСоединения,»»»»,»»»»»»);
    КомандаЗапускаПриложения  = » /RunEnterprise «»ENTERPRISE /IBConnectionString» +СтрокаСоединения+» /N»+Пользователь+» /P»+Пароль+» /DisableStartupMessages /CUpLoad»» «;
    
    КоманднаяСтрокаОбновления = КоманднаяСтрокаОбновления +  КомандаЗапускаПриложения;
    
    //ЗаписатьВЖурнал(«Обновление ИБ», «КоманднаяСтрокаОбновления  «+КоманднаяСтрокаОбновления);
    
    ТекстСкрипта = «chcp 1251″+Символы.ПС+»taskkill /F /IM 1cv8.exe»+Символы.ПС;
    Для Инд = 1 по 10 Цикл
    ТекстСкрипта = ТекстСкрипта + КоманднаяСтрокаОбновления + Символы.ПС;
    ТекстСкрипта = ТекстСкрипта + «if not errorlevel 1 goto pend » + Символы.ПС;
    КонецЦикла;
    
    ТекстСкрипта = ТекстСкрипта + »
    |:pend»;
    
    ИмяФайлаСкрипта = КаталогВременныхФайлов() + «UpdateDBCfg.bat»;
    ФайлСкрипта = Новый ТекстовыйДокумент();
    ФайлСкрипта.УстановитьТекст(ТекстСкрипта);
    ФайлСкрипта.Записать(ИмяФайлаСкрипта,КодировкаТекста.OEM);
    
    //ЗаписатьВЖурнал(«Обновление ИБ», «ИмяФайлаСкрипта  «+ИмяФайлаСкрипта);
    
    Попытка
    ЗапуститьПриложение(ИмяФайлаСкрипта,,ложь);
    Исключение
    //ЗаписатьВЖурнал(«Обновление ИБ», ОписаниеОшибки(),Истина);
    КонецПопытки;
    
    

    Показать

    Reply ↓
  74. user609516_rrustam11983

    (33) Программисту который использует GoTo нужно забить гвоздь в голову

    Reply ↓
  75. fixin

    (74) скорее програмисту, который не знает чем отличается плохой GOTO от хорошего.

    Reply ↓

Leave a Comment

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