IE 2016

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

Опубликовал fixin в раздел Администрирование - Распределенная БД (УРИБ, УРБД)

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

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

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

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

 

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

 

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

Обновление

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

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

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

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

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

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

            //Создаем и запускаем скрипт на обновление базы
            СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();//File="C:\1cv8\Base".
            СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "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С, выдается сообщение вида:

См. также

Лучшие комментарии

6. WKBAPKA 16.07.2012 08:54
поставил плюс т.к. самому было в лом разбираться, в типовых предусмотрено авто. обновление...
но со стилистикой надо что то делать :)

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

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

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

окошко вида )

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

ну и использовать GoTo признак плохого тона в программировании...
Ответили: (11)
+ 3 [ vlasin; DrAku1a; yansen; ]
# Ответить
33. fixin 24.07.2012 11:33
(32) курите раздел "Оправданное применение" по вашей ссылке. Мы изучали GoTo в рамках курса "Структурное программирование". Вы бы еще на BREAK ополчились, это тот же скрытый GoTo. В своем коде я использую Goto вместо цикла Repeat Until, которого нет в 1С, и это его нормальное применение. Оно более наглядно, чем замена на While (true)
# Ответить
18. Программулькин 17.07.2012 10:12
Честно сказать - полная какашка!, но минус ставить не буду ибо как вариант имеет права на жизнь.

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

Во вторых, " КаталогПрограммы = КаталогПрограммы();" тоже бред. Обновил платформу и всё, приплыли, файл не найден!
У меня у юзеров тупо диск вставил запустил батник и всем 15м платформа новенькая легла без всяких там вопросов "могу" "не могу". Похер на антивири и фаерволы, за исключением вистовской попрошайки о том кто запустил файл, и то настраиваешь на низкий уровень и попёр!

обмен раз в 40 минут, тобишь всегда актуальная база и конфа.
Ответили: (19)
+ 2 [ yoyoman; papami; ]
# Ответить

Комментарии

1. dimk@a 14.07.2012 20:41
Здоровское решение. Недавно делал распределенную базу и уже довелось ее обновлять с подключением по удаленке к узлам. При слеюущем обновлении добавлю эту функцию. Спасибо!
Ответили: (2)
# Ответить
2. fixin 14.07.2012 20:56
(1) ндык, че мы только не пробовали. оказалось, самый простой вариант такой.
# Ответить
3. baldorc 15.07.2012 01:30
Хорошее решение, при случае использую не задумываясь :)
# Ответить
4. Kyrales 15.07.2012 06:15
Хорошая идея. Можно проверку немного модифицировать:

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

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

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

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

КонецФункции
Ответили: (5)
# Ответить
5. fixin 15.07.2012 10:04
(4) можно и автоматом. Но не всегда прокатит автоматика. Если открыто две 1с-ки, то конфа не обновится автоматом, а сообщение о том, что не удалось обновить, будет доставать.
хотя согласен, можно попытаться обновить, а если не получится монопольный доступ, уже тогда сообщать.
Но лучше решение об обновлении все же принимать пользователю. Не всегда обновление проходит автоматом, и запускающийся каждые 10 минут конфигуратор будет доставать.
+ 1 [ freeek; ]
# Ответить
6. WKBAPKA 16.07.2012 08:54
поставил плюс т.к. самому было в лом разбираться, в типовых предусмотрено авто. обновление...
но со стилистикой надо что то делать :)

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

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

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

окошко вида )

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

ну и использовать GoTo признак плохого тона в программировании...
Ответили: (11)
+ 3 [ vlasin; DrAku1a; yansen; ]
# Ответить
7. zamichnik 16.07.2012 09:08
Весьма симпатичная идея, большое спасибо!
Непременно воспользуюсь :)
# Ответить
8. Cyberboy 16.07.2012 10:45
А пользователь который делает обмен должен иметь полные права? У меня на РИБ узлах есть пользователь Обновление, при запуске этого пользователя, автоматом запускается обновление с главным узлом и после прохождения обновления сеанс пользователя завершается, у всех остальных пользователей стоит ограничение в правах. Будет при таком методе запускать "Автоматическое обновление конфигурации в узлах РИБ" у пользователя "Обновление"?
Ответили: (10)
# Ответить
9. glek 16.07.2012 10:48
Хорошее решение
# Ответить
10. fixin 16.07.2012 12:36
(8) есть два права. первое - это право на изменение конфы. без него файл с изменениями конфы не прочитается и дело до "ОбновитьКонфигурацию" даже не дойдет. Проще решить эту пролему, запуская обмен данными в привелигированном модуле, т.к. право на изменение конфы - весьма опасное, его нельзя давать на точках.

Второе право - это право на обновление конфигурации БД. Его можно дать даже пользователю без пароля, как у меня, "Автообмен".
# Ответить
11. fixin 16.07.2012 12:39
(6) не буквоедствуйте.
Как сделано автообновление в типовых, не помню уже. У меня типовая ут 10.3, автообновления там нет, правда древний релиз.
Окошко вида - потому что текст там может быть другой, зависит от организации.
Использовать GoTo можно, нам об этом рассказывали в универе, где я учился на программиста. Альтернатива циклу while true в небольших участках кода - вполне.
Ответили: (23)
# Ответить
12. ak0710 16.07.2012 13:54
Ваш способ конечно хорош, у каждого это идея приходит по разному , год или два назад Я настраивал авто обмен в одной фирме у них была типовая ИБ , и не было смысла убирать замок с конфигурации.
Каждую ночь в головной базе производилась выгрузка планов обмена например в 23.00 (отключались все пользователи , делался бэкап перед этим)
В базе филиала :
В 01:00 в базе филиала запускалось чтение плана обмена (перед чтение отключение всех пользователей и бэкап)
В 01:30 1С с командной строкой /UpdateDBCfg
В 02:00 повторное чтение и выгрузка

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

Ваш случай очень удобен если обмен проходит по несколько раз в день , а если одного раза достаточно , то не обязательно трогать конфигурацию.
Ответили: (13)
+ 1 [ fixin; ]
# Ответить
13. fixin 16.07.2012 14:08
(12) в моем случае компьютеры на ночь выключаются, т.е. все должно происходить с выгоном пользователей...
но я думаю, можно и на скриптах написать, чтобы не менять конфу, почему бы нет... ;-)
Ответили: (14)
# Ответить
14. ak0710 16.07.2012 14:23
(13) fixin, Я за то чтобы как можно меньше всего трогать в типовой конфигурации , можно добавить просто еще командную строку с отключением ПК после обмена , каждый сам выберет что ему надо , возможно ваш способ Я тоже когда нибудь использую
Ответили: (15)
# Ответить
15. fixin 16.07.2012 15:09
(14) у нас обновление конфы происходит не только ночью, а в любой момент.
# Ответить
16. kiros 16.07.2012 15:52
Да, идея очень достойная, мы реализовывали так, если динамическое обновление, то автоматически обновлялось, и стандартная обработка требовала от пользователей перезайти (со счетом до 3-х, т.е. не больше трех раз можно отказаться от пере захода в 1с). А в случае монопольного обновления инициировали блокировку подключения с отсрочкой 5 минут, и опять же стандартными средствами получалось выгнать, после чего спокойно обновлялись и снимали блокировку, как то так :)
Ответили: (17)
# Ответить
17. fixin 16.07.2012 16:35
(16) ну дык печатайте на ИС и зарабатывайте плюсики. ;-) Я не претендую на идеал, но система рабочая.
# Ответить
18. Программулькин 17.07.2012 10:12
Честно сказать - полная какашка!, но минус ставить не буду ибо как вариант имеет права на жизнь.

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

Во вторых, " КаталогПрограммы = КаталогПрограммы();" тоже бред. Обновил платформу и всё, приплыли, файл не найден!
У меня у юзеров тупо диск вставил запустил батник и всем 15м платформа новенькая легла без всяких там вопросов "могу" "не могу". Похер на антивири и фаерволы, за исключением вистовской попрошайки о том кто запустил файл, и то настраиваешь на низкий уровень и попёр!

обмен раз в 40 минут, тобишь всегда актуальная база и конфа.
Ответили: (19)
+ 2 [ yoyoman; papami; ]
# Ответить
19. fixin 17.07.2012 11:15
(18) понты так и сверкают. Так где же ваша замечательная программма? В файловой версии конечно, можно поставить убивцу 1с на все компьютеры точки (2-3 штуки). Но нужно управление этим убивцем, короче задача излишне усложняется. Про КаталогПрограммы я ваш нюанс не понял, как бе. В общем, готов рассмотреть ваш супер-пупер-вариант, когда он тут появится. Пока это только проджэкт, который критиковать невозможно за его отсутствием в мире реальном.
Ответили: (20)
# Ответить
20. Программулькин 17.07.2012 12:24
(19) fixin,
ниии, мой вариант далёк от идеала, просто он приближён к автоматизму и тоже имеет право на жизнь, тобишь влияние человеческого фактора 0. К вашему же варианту замечания я нарисовал, просто мне есть с чем сравнить, вот и всё.
Я тоже пробовал юзать КаталогПрограммы(), но не вышло. Она использует "C:\Program Files\1cv82\8.2.**.порядковый номер.", допустим "C:\Program Files\1cv82\8.2.15.317", при обновлении платформы в 1с8 старая платформа остается, и добавляется новая. Итог: в каталоге C:\Program Files\1cv82\8.2.15.317 имеем несколько папок 8.2.15.317, 8.2.15.318,8.2.15.319 и тд + common и conf. Так вот при обновлении платформы, Ваш путь к файлу слетит, и файл будет не найден. В 7ке такое прокатывало, но там по-моему было что-то вроде КаталогИБ() или как то так, тобишь каталог с базой, но тогда исключается клиент-серверный вариант, но это уже лирика. Свой метод пока выкладывать не намерен, ибо лень. В данном случае я использовал жёский путь:"C:\Program Files\1cv82\common\имя файла", ибо, при использовании автоматической установки платформы на клиенте, путь стандартный и не меняется.



вот кусок
Процедура СчетчикВремени() Экспорт

Константы.ВремяВСекундахДоВыбросаИзБазы.Установить(Константы.ВремяВСекундахДоВыбросаИзБазы.Получить()-1);

КонецПроцедуры

Процедура СообщенияОВремени() Экспорт

ОстСекунд = Константы.ВремяВСекундахДоВыбросаИзБазы.Получить();
//не скажу формулу перевода
чч = xx;
мм = xx;
сс = xx;

Если ОстСекунд > 0 Тогда
ФормаОстаткаВремени.ЭлементыФормы.КоличествоСекунд.Значение = "До конца работы сеанса осталось"+Символы.ПС+Дата(так фигню всякую можно вставить,чч,мм,сс);
Если ФормаОстаткаВремени.Открыта() Тогда
ФормаОстаткаВремени.Обновить();
Иначе
ФормаОстаткаВремени.Открыть();
КонецЕсли;
ИначеЕсли ОстСекунд <= 0 Тогда
ФормаОстаткаВремени.ЭлементыФормы.КоличествоСекунд.Значение = "БАЙ-БАЙ";
ОтключитьОбработчикОжидания("СообщенияОВремени");
// Если раньше выйти то блокировка установится "Истина"
Константы.БлокировкаВхода.Установить(Ложь);
//строка которая выкидывает
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;

КонецПроцедуры

Процедура ЗакрытиеСеанса() Экспорт

Если КонфигурацияИзменена() Тогда
Если РольДоступна("gvАвтообмен") тогда
Файл1 = Новый Файл("C:\Program Files\1cv82\common\UpdateDBCfg.bat");
Если Файл1.Существует() Тогда
//Проверка на последнего пользователя
ТекущийРежим = СоединенияИБ.ПараметрыБлокировкиСеансов(Истина);
КоличествоСеансов = ТекущийРежим.КоличествоСеансов;
Если КоличествоСеансов <= 1 Тогда
ПропуститьПредупреждениеПередЗавершениемРаботыСистемы = Истина;
ЗапуститьПриложение("C:\Program Files\1cv82\common\UpdateDBCfg.bat");
Иначе
Возврат;
КонецЕсли;

Иначе
ОтправитьПисьмо();
Сообщить("Файл UpdateDBCfg.bat не обнаружен!")
КонецЕсли;
Иначе
Если НЕ Константы.БлокировкаВхода.Получить() Тогда
Константы.БлокировкаВхода.Установить(Истина);
Константы.ВремяВСекундахДоВыбросаИзБазы.Установить(61);
КонецЕсли;
ПодключитьОбработчикОжидания("СчетчикВремени",1);
ПодключитьОбработчикОжидания("СообщенияОВремени",1);
ОтключитьОбработчикОжидания("ЗакрытиеСеанса");
КонецЕсли;
Иначе
//после сохранения снимается режим блокировки
Константы.БлокировкаВхода.Установить(Ложь);
КонецЕсли;

КонецПроцедуры

Процедура НачатьПроверкуНаРазличияКонфигураций() Экспорт
ПодключитьОбработчикОжидания("ЗакрытиеСеанса",15);
КонецПроцедуры

Процедура ОтправитьПисьмо()
Сообщить ("Письмо Отправлено");
//а пока пытаюсь обучит 8.2 обучить работать на ssl протоколах (stunel не предлагать)
КонецПроцедуры
Ответили: (21)
# Ответить
21. fixin 17.07.2012 13:28
(20) все равно про каталог программы не догнал. разве в 82 он не показывает на каталог, из которого запущен exe-файл?
Дядя, а если у пользователя запущен отчет или 1С повис, 1с у вас автоматом не выйдет. Это я так, на всякий случай намекаю как бе. Из практики.
Ответили: (22)
# Ответить
22. Программулькин 18.07.2012 04:00
(21) fixin, "все равно про каталог программы не догнал" ---faspalm...Тяжелый случай, делаю последнюю попытку.При обновлении платформы каталог программы меняется, т.е. создается новый.
"разве в 82 он не показывает на каталог, из которого запущен exe-файл?" именно так! После обновления у вас будет новый каталог, а бантик останется в старом!
1.Если у юзера повис 1с, то да согласен,ни хрена не выйдет, НО обмен 1 раз в 40 минут, за 40 минут юзер перезапустит свой висяк, и обмен состоится.
2.Если "отчёт" и любая другая транзакция, то , в этом вся прелесть в отличии от штатной блокировки, она ждет когда закончится "отчёт", и врубает счетчик, и обмен, опять же таки, состоится. Это уже проверено на практике.
Ответили: (24)
# Ответить
23. sa1m0nn 18.07.2012 09:28
(11) fixin,

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

ЗЫ: Но про ГоТо сказали правильно - это моветон (меня реально высаживает :)). Используйте вызов процедуры.
# Ответить
24. fixin 18.07.2012 10:37
(22) и что, функция КаталогПрограммы() не вернет этот каталог? А что она вернет? Я по-прежнему не догоняю че-та... Ну даже если вернет базовый каталог, в нем можно замутить поиск EXE-файла, в чем проблема-то.

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

(23) Гото - не моветон. В умелых руках. Я вам как программист, получивший высшее образование по специальности, говорю.
Ответили: (30)
# Ответить
25. Программулькин 18.07.2012 12:22
ыыыы "и что, функция КаталогПрограммы() не вернет этот каталог? А что она вернет? " да все верно, она именно это и сделает. Вот что у тебя получится: текущая платформа 8.2.15.317. Ты туда кидаешь свой бантик. Юзаешь КаталогПрограммы() - результат: все работает. Далее проходит месяц. Устанавливаем платформу новую. И вуаля, Ты уже юзаешь новый каталог программы, а именно: 8.2.15.318, где нет твоего бантика, результат - ошибка.Так понятно?
Если и так не понятно, то снеси все платформы, установи одну сделай обмен, а затем обнови платформу и увидишь ошибку, если ошибки не будет, тогда ты гений, и тогда обязан поделится как ты такое провернул!
Далее:
"Юзверь может и перезапустит, а может и нет, может он ваще ушел домой с работы... " - 90% случаев перезапустит, ибо ему 1с нужна, а вот если зависло и он ушёл домой, это да - косяк. Дык я и говорю, что мое решение далеко от идеала, НО в твоем случае это тоже косяк )), тоже не пройдет обновление :))) у тя есть решение такой проблемы?
Ответили: (26)
# Ответить
26. fixin 18.07.2012 12:42
(25) я батник создаю при каждом запуске автоматически из кода программы, а не кидаю туда. Как-то так. Так что никаких проблем у меня с этим не возникнет. Так что у меня косяков нету. Пользователя задолбает напоминалка и он обновится. Проверено на пользователях.
# Ответить
27. fieryfist 19.07.2012 10:42
отличная публикация, как раз настраиваю РИБ искал что-то подобное. Подскажите как настроить вызов функции ПостояннаяПроверкаРедкая() каждые пять минут, я сделал это через регламентное задание, но это не удобно т.к. сообщение выдается только пользователю для регламентных заданий, а у нас всегда запущено два сеанса.
Ответили: (28)
# Ответить
28. fixin 19.07.2012 11:02
(27) Через ПодключитьОбработчикОжидания
+ 2 [ astraborz; fieryfist; ]
# Ответить
29. EfiopReal 19.07.2012 13:46
Спасибо, возьмем на заметку.
# Ответить
30. sa1m0nn 23.07.2012 10:55
(24) fixin,
>> Я вам как программист, получивший высшее образование по специальности, говорю.

Вы, наверное, один тут программист с высшим образованием :)
Ответили: (31)
# Ответить
31. fixin 23.07.2012 16:29
(30) без понятия. речь идет о высшем профильном образовании.
Ответили: (32)
# Ответить
32. sa1m0nn 24.07.2012 08:36
(31) fixin,

Тысяча извинений за офф...
Вероятно, я на сантехника учился...
Да и Эдсгеру Дейкстре, наверно, далеко до Ваших преподавателей...
http://ru.wikipedia.org/wiki/GOTO
Тысяча извинений, это всего лишь моё скромное мнение.
Ответили: (33)
# Ответить
33. fixin 24.07.2012 11:33
(32) курите раздел "Оправданное применение" по вашей ссылке. Мы изучали GoTo в рамках курса "Структурное программирование". Вы бы еще на BREAK ополчились, это тот же скрытый GoTo. В своем коде я использую Goto вместо цикла Repeat Until, которого нет в 1С, и это его нормальное применение. Оно более наглядно, чем замена на While (true)
# Ответить
34. maria7777777 25.07.2012 09:00
Да идея не плохая, но вот пользователям на удаленных точках полные права не могу дать, противоречит корпоративной безопасности...
Ответили: (35)
# Ответить
35. fixin 25.07.2012 11:22
(34) а зачем им полные права, не понял?
# Ответить
36. CnupT 27.07.2012 06:23
Не совсем понял, как согласуются
Для обновления конфигурации на точке достаточно перезайти в 1С под Администратор1

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

Т.е. они сначала заходят под Администратор1, потом программа заходит под Автообмен? Зачем так сложно?
Ответили: (38)
# Ответить
37. CnupT 27.07.2012 06:29
И еще момент. Как у Вас на точках организован сам процесс периодического обмена?
Пользователи держат включенными 2 окна 1с, или планировщиком Windows запускается?
Просто 2 окна крайне неудобно, а раз в NN минут открывающееся и закрывающееся окно
1С и того хуже.
Всю голову сломал как бы это покрасивше реализовать. Пока что с помощью v82.Automation
добился того, чтобы 1С висела себе в памяти без видимых проявлений, но при обновлении
конфигурации ее же выгружать надо, потом опять как-то загружать...
Ответили: (38)
# Ответить
38. fixin 27.07.2012 08:21
(36) Администратор1 - это логин для работы под пользователем. Пароль пустой.
Автообмен - это пользователь, если зайти под которым, то произойдет автообмен и 1с сразу же выйдет. Сейчас думаю, что можно было бы и без этого обойтись, в принципе. Пароль пустой.


(37) через обработчик ожидания. запускается периодически проверка, если автообмена давно не было (по истории обмена смотрим), то создаем скрипт, сохраняем его во временный файл, запускаем скрипт, а из скрипта коннектимся к 1с по ком-соединению и выполняем в ком-соединении обмен. Только такой расклад позволяет запустить автообмен полностью в невидимом режиме, чтобы юзверь его не видел. и юзверь может его снять через диспетчер задач, если чё.
# Ответить
39. yoyoman 06.08.2012 09:30
А у нас как:
Около 20 рибов, обмены идут раз в 15-20 минут.
Cтандартное назначенное задание средствами Windows Server 2003, которое инициирует вход в 1с под пользователем Obmen. В настройках обмена стоит: Выполнять обмен при входе в систему пользователя Obmen.
Назначенное задание инициирует два таких запуска, один с ключом /UpdateDBCfg, а второй без.
При динамическом обновлении никаких проблем не возникает, и в течение дня всегда актуальные обмены. Не динамические обновления стараемся делать ночью. Ночью все серваки перезагружаются и активных сеансов 1с не остается. (также можно обычным батником в одну строчку перезапускать службу 1с).
Если же надо срочно не динамически обновиться средь бела дня, в каталоге обмена валяется psexec.ехе. Через него рассылается сообщение пользователям (через netsend) о предупреждении завершения сеансов 1с. Через psexec же перезапускается служба (или через taskkill убиваются все процессы 1с.ехе) и выполняется вход в 1с с ключом /UpdateDBCfg. Миссия выполнена. Изменений в конфигурации никаких. Все сделано тройкой батников по паре строк в каждом батнике.
Ответили: (40)
# Ответить
40. fixin 06.08.2012 10:32
(39) много отличий у нас с вами. я тоже сначала делал батником.
Но у меня есть нюансы:
1. Машины работают только днем
2. Обновления конфы чаще всего тоже приходят днем
3. Из-за глюков 1с задания, запущенные под фоновым пользователем винды имеют свойство зависать и только перезагрузка спасает, а потом она опять стартует и опять виснет. Поэтому отказался от запуска под фоновым юзверем...
4. Прописывать в 1С ручками windows-пользователя root на каждой из 40 узлов РИБ как-то стремно. Проще назначить пользователя с авторизацией из 1с, а не винды.
... и еще много нюансов.

Как-то так... Так что я понимаю ваш ура-оптимизм, но в реальной жизни все сложнее бывает
# Ответить
41. yoyoman 06.08.2012 10:54
1) Можно утром же обновлять, в 9 утра пришли на работу. В 9:01 обновление конфы, в 9:02 все радуются
2) У нас тоже днем идет в диапазоне 15-20 минут. С одним РИБом, и того каждые 2-3 минуты.
3) У нас за 4 года крайне редко случаются подобные проблемы, но легко мониторятся и лечатся обычным schtasks (запускаемым в пакетном режиме). Если перезагражать компьютер из-за зависшего назначенного задания - проблемы тогда надо искать в винде, а не в 1с.
4) В чем стремно? я не совсем понял, пользователь обмена то 1совский. Назначенное задание лишь под этим пользователем инициирует вход.
Ответили: (42)
# Ответить
42. fixin 06.08.2012 11:07
(41) ха, наивный чукотский юноша. у клиента 40 магазинов с самым разным временем открытия, к тому же обновления обычно происходят в середине дня, а не в начале и не в конце. Это как бы не проблема, можно предупреждать пользователя сделать обмен, тем же net send, как бы...

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

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

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

По поводу виндового пользователя - я подумал, что obmen у тебя виндовый пользователь, ну да ладно... ;-)
# Ответить
43. q1q1q1 06.09.2012 12:05
Перейти ~ПовторнаяПопыткаОбновления;


Таки я дико извиняюсь, но при всем уважении к автору, за использование goto надо руки вырывать.
Ответили: (44)
# Ответить
44. fixin 06.09.2012 12:24
(43) оператор гото допустимо использовать, но не всегда. там где использовал я - допустимо
Ответили: (45)
# Ответить
45. q1q1q1 06.09.2012 13:03
(44)А какова необходимость использовать goto там, где без него можно прекрасно обойтись?
Ответили: (46)
# Ответить
46. fixin 06.09.2012 13:32
(45) стилистическая необходимость. Т.к. в 1с отсутствует цикл UNTIL, а GOTO смотрится красивее и проще вместо замены цикла UNTIL бесконечным циклом с брик.
# Ответить
47. relanium86 04.06.2013 12:21
Никто не пробовал если запускать через скрипт в режиме обновления конфигурации, если есть возможность динамического обновления, если в базе работают пользователи отработает скрипт?
# Ответить
48. sdv88 26.06.2013 16:58
а как проверить пройдет ли динамическое обновление или нет?
Ответили: (49)
# Ответить
49. Linx-p 09.10.2013 11:24
(48) sdv88, проверить прошло ли обновление можно запустив обмен ;)
# Ответить
50. Muppo 26.05.2015 09:45
А есть вариант не с файловым обновлением а серверным с БД?
Ответили: (51)
# Ответить
51. fixin 26.05.2015 13:38
(50) Muppo, нету. Сами напишите, несложно.
# Ответить
52. Xershi 19.04.2016 10:19
Я так понимаю уже тут спецы определили какой вариант самый лучший, чтобы эту операцию (выполнение обмена на автомате при изменении конфигурации в ЦБ) выполнять на автомате?

Подскажите лучшее решение?
А то сегодня ручками все проделал. Не охота каждый день убивать на это 20 минут))
Ответили: (53)
# Ответить
53. fixin 19.04.2016 12:35
(52) ну у меня ваще автоматом делается.
1. отключается главный узел.
2. через командную строку загружается конфа целиком.
3. подключается главный узел.

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


а так все же описано, берите скрипт и юзайте.
Ответили: (54)
# Ответить
54. Xershi 19.04.2016 12:53
(53) fixin, об этом и речь. У нас может и 2 раза на день конфа обновиться. А может быть день и не обновляем. Как разработки внедряем.

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

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

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

У вас есть более развернутая статья со всеми примерами? А то пока это задача на втором плане, но хотелось бы разобрать вопрос в кратчайшие сроки!
Ответили: (55)
# Ответить
55. fixin 19.04.2016 14:11
(54) куда уж развернутее. Если Вы не понимаете смысла этой статьи, боюсь у Вас не хватает понимания механизмов работы РИБ.
Ответили: (56)
# Ответить
56. Xershi 19.04.2016 14:21
(55) fixin, речь идет об
run.bat

В статье нет разбора этого файла. Вот что более развернуто интересует.
Ответили: (57)
# Ответить
57. fixin 19.04.2016 17:26
(56) А что run.bat?
В нем несколько раз запускается обновление конфигурации базы данных, чтобы полученная конфа была принята (10 попыток вроде).
Командная строка вида:
config /Visible /NАвтообмен /P"""" /UpdateDBCfg /" +СтрокаСоединения;
Ответили: (58) (62)
# Ответить
58. Xershi 21.04.2016 09:42
(57) fixin, а попытки для чего? Конфа же один раз обновляется для чего 10 раз?
Ответили: (59)
# Ответить
59. fixin 21.04.2016 13:22
(58) батник запускается после выхода из 1С.
вообще можно вместо батника юзать скрипт vbs, батник то туповат.
Повторение потому что 1с медленно освобождает файл базы, поэтому первые 1-2 прогона могут не сработать, файл базы еще заблокирован после выхода из 1с.
Ответили: (60)
# Ответить
60. Xershi 21.04.2016 14:51
(59) fixin, у меня например 1С работает через компоненту с пауршел. Суть в том что в винде нужно скрипт написать, который отработает определенный сценарий запуска 1С?
Ответили: (61)
# Ответить
61. fixin 21.04.2016 15:40
(60) да. хоть пауэршелл, хоть bat, хоть vbs-скрипт, без разницы. Главное чтобы 1с после выхода запустила скрипт.
Ответили: (62)
# Ответить
62. Xershi 21.04.2016 16:39
(61) fixin, а текст скрипта ты в (57) написал полный?
Что туда конкретно запихнуть?
Ответили: (63)
# Ответить
63. fixin 22.04.2016 13:57
(62) да, там 10 раз запускается 1с с ключом "config /Visible /NАвтообмен /P"""" /UpdateDBCfg /" +СтрокаСоединения;", для того, чтобы принять изменения конфигурации. Т.е. чтобы обновить конфигу, ключ: UpdateDBCfg
Ответили: (64)
# Ответить
64. Xershi 29.04.2016 09:47
(63) fixin, посмотрел, как сделан механизм в БП2, сейчас вожусь с адаптацией для любой конфигурации. У нас просто конфа еще с 8.1 и там нет некоторых модулей. А так будет универсальный механизм, скачал подсистему поставил и не паришься!
# Ответить
65. Xershi 29.04.2016 17:11
В типовой выполняется такой код:
//Окончаение завершения работы пользователей
		//Обновление конфигурации ИБ                	
		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);
		
...Показать Скрыть


Почему он его с первого раза не обновляет?
# Ответить
66. Xershi 29.04.2016 17:30
/Visible

Добавил ключ видимости, он получается что просто не успевает открыть конфигуратор?
# Ответить
67. Xershi 29.04.2016 17:41
//Окончаение завершения работы пользователей
			//Обновление конфигурации ИБ                	
			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, как и было в изначальной версии, с файлом не хотел мудрить, тогда операция идет долго и гарантировано обновляет конфигурацию.
В понедельник поиграюсь еще, но думаю я почти закончил подсистему.
Ответили: (68)
# Ответить
68. fixin 30.04.2016 00:38
(67) Поздравляю!
Ответили: (69)
# Ответить
69. Xershi 02.05.2016 16:45
(68) fixin, кстати подскажи как правильно реализовать такую штуку:
Если ПланыОбмена.ГлавныйУзел() <> Неопределено Тогда
		
		Если КонфигурацияИзменена() Тогда			
			
			ОтключитьОбработчикОжидания("ПроверкаНаОбновлениеРИБ");
			
			СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
			Если СтрЧислоВхождений(ВРег(СтрокаСоединения), "FILE=") Тогда
				#Если Клиент Тогда
					Предупреждение("Конфигурация базы данных изменена, чтобы не образовался простой в обменах, обновите конфигурацию или свяжитесь с поддержкой 1с!" + Символы.ПС +
					"Для обновления конфигурации на точке достаточно перезайти в 1С под Администратором, при этом будет выдан запрос на обновление. " + ТекущаяДата());
				#КонецЕсли 				
				ОбработкаОбновлениеКонфигурации = Обработки.ОбновлениеКонфигурации.Создать();
				ФормаОбработки = ОбработкаОбновлениеКонфигурации.ПолучитьФорму();
				ФормаОбработки.Открыть(); 
			Иначе				
				МодульРегламентныхЗаданий.ОбновлениеКонфигурации();				
				#Если Клиент Тогда
					Предупреждение("Конфигурация базы данных изменена, чтобы не образовался простой в обменах, завершите работу!" + Символы.ПС +
					"Конфигурация будет обновлена автоматически: " + Строка(ТекущаяДата()+300));
				#КонецЕсли				
			КонецЕсли;			
			
		КонецЕсли;
		
	Иначе
		
		ОтключитьОбработчикОжидания("ПроверкаНаОбновлениеРИБ");
		
	КонецЕсли;
...Показать Скрыть


Т.е. в чем вопрос: Как правильно запустить процедуру 1 раз в клиент-серверном варианте?
Делать проверку заблокирована ли база? Если она уже заблокирована, значит считать что обновление пошло? Но когда я отлаживал, скрипт вылетал в ошибки (криво 1С скрипт написали) и база будет заблокирована и не обновлена.
Ответили: (70)
# Ответить
70. fixin 03.05.2016 10:23
(69) запускай в цикле и анализируй ответ.
Ответили: (71)
# Ответить
71. Xershi 03.05.2016 12:31
(70) fixin, анализ через что делать. Пользователей много, а если что пойдет не так чем восстановить без участия администратора?
Ответили: (72)
# Ответить
72. fixin 03.05.2016 21:36
(71) а что там восстанавливать то? можно проанализировать ситуацию и предложить пользователю обновить конфигурацию или выйти, например.
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл






IE 2016