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

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

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

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

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

 

Функция ПостояннаяПроверкаРедкая() Экспорт
//Раз в 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 не будет опубликован. Обязательные поля помечены *