Автоматические выгрузки РИБ на файловых БД (моя реализация)

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

Необходимо было быстрое решение - ежедневный обмен 15 удаленных файловых распределенных 1с БП 2.0 с центральным клиент-серверным узлом. Реализовал первым пришедшим в голову вариантом...

Для решения данного вопроса залез в интернет и понял, что единого решения нет - каждый извращается как может. Ну вот и я присоединился к этой компашке. Воевал за максимальную функциональность, поэтому при выборе решения остановился на своём.

Решения без изменения конфигурации мне найти не удалось... Уже вижу, как как в меня полетели помидоры - ведь при запуске 1с есть ключ /Execute , который позволяет после запуска 1с запустить внешнюю обработку и сделать обмен, да вот только - Sealed фик там! После загрузки 1с загружается: сначало панель интернет-соединение (отключил), а вот потом панель "Установить границу расчитанных итогов на...?" - быстро победить мне эту панельку не удалось. У-у-у-у-у, вторая порция помидоров полетела. Знаю, что есть права на регистрах - рассчитывать итоги, через которые можно избавить пользователя от этой ненужной обузы, да вот только для этого нужно создавать новую роль и тащить её через последующие релизы и для одной только цели - делать обмен. Мне это показалось не совсем универсально.

Покопавшись в интернете и ключах запуска нашел ключ /C - передача параметра в конфигурацию. 1с Бухгалтерия отрабатывает ключ /CРазрешитьРаботуПользователей, при котором работа 1с завершается, но с параметром Ложь: ЗавершитьРаботуСистемы(Ложь), при этом 1с просто подрубается, не выполняя функций завершения работы программы. Frown

Но ведь через этот ключ можно передать, что-то типа /cВыполнить=ЗавершитьРаботуСистемы(Истина); и при запуске обрезав "/cВыполнить=" выполнять строку кода, т.е. сразу же завершать работу 1с ещё до запуска окон "интернет-соединения" и "расчета границы итогов".

Для этого в процедуру ПриНачалеРаботыСистемы() внес обработчик передаваемого параметра (текст нашел где-то в нете, может и на инфостарте):

// Процедура - обработчик события "При начале работы системы".
//
Процедура ПриНачалеРаботыСистемы()

КонтрольВерсииПлатформы.ПроверитьВерсиюПлатформы();
ПервыйЗапуск = (Константы.НомерВерсииКонфигурации.Получить()="");

ПользовательОпределен = Ложь;
ОписаниеОшибкиОпределенияПользователя = "";
Если Не ЗначениеЗаполнено(ПараметрыСеанса.ТекущийПользователь) Тогда
Если УправлениеПользователями.ОпределитьТекущегоПользователя(ОписаниеОшибкиОпределенияПользователя) Тогда
ПользовательОпределен = ЗначениеЗаполнено(ПараметрыСеанса.ТекущийПользователь);
КонецЕсли;
Иначе
ПользовательОпределен = Истина;
КонецЕсли;

Если Не ПользовательОпределен Тогда
Если ПустаяСтрока(ОписаниеОшибкиОпределенияПользователя) Тогда
ОписаниеОшибкиОпределенияПользователя = "Ошибка идентификации пользователя. Обратитесь к администратору";
КонецЕсли;
Предупреждение(ОписаниеОшибкиОпределенияПользователя);
ЗавершитьРаботуСистемы(Ложь);
Возврат;
Иначе

//Изменение от 03.09.2012
//обработка cВыполнить=ЗавершитьРаботуСистемы(Истина);
Ключ = "Выполнить=";
ДлКлюча = СтрДлина(Ключ);
Если Лев(ПараметрЗапуска, ДлКлюча) = Ключ Тогда
Попытка ДлПараметра = СтрДлина(ПараметрЗапуска);
СтрокаКода = Прав(ПараметрЗапуска, ДлПараметра-ДлКлюча);
Выполнить(СтрокаКода);
Исключение СтрСообщения="Не удалось выполнить код:"+Символы.ПС+СтрокаКода;
Предупреждение(СтрСообщения,3);
ЗаписьЖурналаРегистрации("Запуск кода из командной строки.", УровеньЖурналаРегистрации.Ошибка, , , СтрСообщения);
КонецПопытки;
КонецЕсли;
// конец Изменение от 03.09.2012
//Заменим интерфейс УСН8

... и т.д.

(понимаю, что лучше было бы внести эти строки в обработку ключа /С: ОбщиеМодули-УправлениеСоединениями-ОбработатьПараметрыЗапуска(), но в любом случае в типовую конфигурацию надо вносить изменения).

 

 А дальше все просто - создаем bat-файл и ставим на шедулер (Планировщик заданий), что б в обед в 13.00-14.00 была выгрузка. Текст батника у меня такой (можно скачать в приложении):

@ECHO OFF
chcp 1251
PATH "C:\Program Files (x86)\1cv82\8.2.15.319\bin";"C:\Program Files\1cv82\8.2.15.319\bin"
start 1cv8.exe ENTERPRISE /F"\\Bases\2012\База" /N"Обмен" /P"12345" /cВыполнить=ЗавершитьРаботуСистемы(Истина); &

 Что б было понятно, объясню: 

1 строка - переключаемся в нужную кодировку, что б понимать русский язык.

2 строка - прописываем пути, где искать запускной файл 1с для 32 и 64 битных систем. У меня пути прописаны для 15 платформы 319 релиз.

3 строка - запускаем 1с: /F - указываем путь до базы, /N - указываем пользователя, /P - указываем пароль, /c- передаем параметр, & - запускаем в фоне, что б пользователь даже не видел запуска 1с.

 

А зачем завершать работу, спросите вы? И как при этом происходит выгрузка?

Все просто! При настройке обменов РИБ можно определенному пользователю (в нашем случае - под кем загружаем 1с из бат-файла) назначить выполнять обмен при различных событиях. Одним из событий является "Завершение работы", где мы и ставим галочку (смотрите рисунок).

Да, пользователю, который будет делать обмен не забудьте снять в настройках (Сервис - Настройки пользователя) галочку - "Запрашивать подтверждение при завершении работы", а то нажать на Да/Нет в "Завершить работу 1с?" при закрытии 1с будет некому.

 

Т.е. весь процесс выглядит так:

1. Шедулер ежедневно в фоне запускает 1с под пользователем "Обмен" и с ключем, который передает строку кода: ЗавершитьРаботуСистемы(Истина).

2. При загрузке системы отрабатывает наша обработка параметра, где переданная строка кода (в п.1) выполняется - т.е. завершается работа 1с.

3. Перед завершение работы делается обмен РИБ, после чего 1с благополучно завершает работу.

Всё!!! Одним емором стало меньше!!!

И теперь при загрузке 1с можно выполнять любые команды не вторгаясь в конфигурацию, прописав их в "/cВыполнить=". )))

Скачать файлы

Наименование Файл Версия Размер
Пример файла выгрузки РИБ
.bat 0,23Kb
21.09.12
23
.bat 0,23Kb 23 Скачать

См. также

Вознаграждение за ответ
Показать полностью
Лучшие комментарии
7. Алексей Ко (Жолтокнижниг) 233 25.09.12 20:13 Сейчас в теме
Таки я понимаю шо вы не блокируете, но пожалуйста посмотрите что делает конфига при обработке этого параметра. И о чудо, она завершает работу, и выполняется событие "ПриЗавершенииРаботыСистемы". Причем предприятию до одного места, установлена была блокировка али нет.
Остальные комментарии
1. Программулькин (Программулькин) 259 21.09.12 03:52 Сейчас в теме
а будет выгрузка автоматическая если изменения в конфу внесёшь??
2. Николай Захаренков (ikar-nikolay) 70 21.09.12 12:02 Сейчас в теме
Не совсем понял вопроса...
Выгрузка будет автоматической из-за того, что Планировщик заданий будет запускать bat-файл в определенное время. А что бы все корректно работало, необходимо дописать кусочек кода - обработки параметра, передаваемого при запуске 1с в ключе "/с" в предопределенной процедуре ПриНачалеРаботыСистемы(), а остальные механизмы РИБ остаются типовыми.
Ну, и соответственно, этот кусочек кода не забывать проставлять при последующих обновлениях конфигураций (что занимает минимум времени, при большой приносимой пользе).
3. Алексей Ко (Жолтокнижниг) 233 25.09.12 16:37 Сейчас в теме
Мне это показалось не совсем универсально.

А править конфигу ох как универсально. /Execute и пусть юзеры подождут.
В чем минусы то?Время на старт обработок?
4. Николай Захаренков (ikar-nikolay) 70 25.09.12 18:30 Сейчас в теме
(3) Жолтокнижниг, ведь написал же, почему /Execute не подойдет, повторюсь!
/Execute выполняется после отработки ПриНачалеРаботыСистемы(). В БП 2.0 в процедуре ПриНачалеРаботыСистемы() вылетают 2 панели, где необходимо вмешательство пользователя (что бы нажали на ту или иную кнопку). /Execute выполнится только после этого:
1) панель интернет-соединения, которую можно отключить (обработки можно найти тут же на Инфостарте, штатных средств не придумано).
2) панель расчета границ итогов, для отключения которой необходимо со всех регистров убрать галочку с прав "Рассчитывать итоги", т.е. полные права не подойдут. А значит нужно создать новую роль - типа полные права без галочки "Рассчитывать итоги" на регистрах и таскать эту роль по релизам. Выбирая между тасканием роли или внесением нескольких строк в конфигурацию - выбрал второе, поскольку второе решение дало новый функционал - теперь можно выполнять любые строки кода при запуске 1с, указав их в строке запуска, например, - те же самые внешние обработки и т.д., причем эти строки будут выполняться до появления панелей 1) и 2).

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

Вы меня лучше поймете, если сами в БП 2.0 попробуете через /Execute запустить обработку, выводящую надпись: "Hello, World!!!". Не кликнув по кнопкам вылетевших панелек - вы эту надпись не увидите!
5. Алексей Ко (Жолтокнижниг) 233 25.09.12 19:14 Сейчас в теме
Хм а попробуй такую штуку: параметр /CРазрешитьРаботуПользователей, (БП 2.0 у меня нет под рукой, но думаю механизмы 1с унифицированы) имхо это даст тот же результат, но без изменения конфиги
6. Николай Захаренков (ikar-nikolay) 70 25.09.12 20:02 Сейчас в теме
(5) Жолтокнижниг, к сожалению, нет! )))
Я же не блокирую базу. Во время запуска обмена РИБ - остальные пользователи могут спокойно работать. 1с запускается в фоне и не видна пользователю. О её существовании можно узнать только в Диспетчере задач, появлением нового процесса 1с.
8. Николай Захаренков (ikar-nikolay) 70 25.09.12 20:43 Сейчас в теме
Я в шоке!!!

// Обработать параметры запуска, связанные с завершение и разрешение соединений ИБ.
//
// Параметры
//  ЗначениеПараметраЗапуска  – Строка – главный параметр запуска
//  ПараметрыЗапуска          – Массив – дополнительные параметры запуска, разделенные
//                                       символом ";".
//
// Возвращаемое значение:
//   Булево   – Истина, если требуется прекратить выполнение запуска системы.
//
Функция ОбработатьПараметрыЗапуска(Знач ЗначениеПараметраЗапуска, Знач ПараметрыЗапуска) Экспорт

	// Обработка параметров запуска программы - 
	// ЗапретитьРаботуПользователей и РазрешитьРаботуПользователей
	Если ЗначениеПараметраЗапуска = Врег("РазрешитьРаботуПользователей") Тогда
		
		Если Не ПравоДоступа("Администрирование", Метаданные) Тогда
			Сообщить("Параметр запуска РазрешитьРаботуПользователей не отработан. Нет прав на администрирование информационной базы.", 
			         СтатусСообщения.Внимание);
			Возврат Ложь;
		КонецЕсли;   
		
		РазрешитьРаботуПользователей();
		ЗавершитьРаботуСистемы(Ложь);
		Возврат Истина;

	ИначеЕсли ЗначениеПараметраЗапуска = Врег("ЗавершитьРаботуПользователей") Тогда
...
...
...Показать Скрыть


И вызывается обработка параметра запуска до открытия форм.
И ЗавершитьРаботуСистемы(Ложь) - не должна вывести вопросов о закрытии, т.к. у нас ничего не модифицировалось...

Получается, что колесо изобрел ))))))))
В шоке!!!
Не знал про обработку параметров - буду знать! Спасибо!!!
9. Николай Захаренков (ikar-nikolay) 70 25.10.12 09:23 Сейчас в теме
(7) Жолтокнижниг, не работает. Процедура обмена не включается. (((
10. Руслан Хасанов (hasan-rusel) 10 01.11.12 04:45 Сейчас в теме
Интересная статья !
Может подскажете мне ? У меня нетиповая конфигурация, после обмена в батнике выполняю:
"C:\Program Files\1cv82\common\1cestart.exe" CONFIG /F "C:\Sklad" /N"Admin" /P"8160" /UpdateDBCfg

Но если есть изменения в конфигурации, то выходит окно
Реорганизация информации. Изменена ...... Принять. Отмена.

И команда
/UpdateDBCfg
не выполняется, как быть ?! :(
11. Николай Захаренков (ikar-nikolay) 70 01.11.12 10:01 Сейчас в теме
(10) hasan-rusel, попробуйте ещё прописать ключ:
/DisableStartupMessages
может поможет.
Кстати, спасибо за идею! Завтра попробуем с удаленным программистом после описанного в статье обмена РИБ прикрутить сохранение конфигурации (которое необходимо, если вносились изменения в главном узле и эти изменения ушли по РИБу в подчиненный узел). Если победим - то перевыложу .bat файл.
12. Руслан Хасанов (hasan-rusel) 10 01.11.12 12:04 Сейчас в теме
(11) ikar-nikolay, Если получиться, то отпишите пожалуйста строку с сохранением конфигурации!