gifts2017

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

Опубликовал Николай Захаренков (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 Скачать

См. также

Вознаграждение за ответ
Сумма: 0 $m
Добавили:
Николай Захаренков (ikar-nikolay) (0.20 $m)
Подписаться Добавить вознаграждение

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

7. Алексей Ко (Жолтокнижниг) 25.09.12 20:13
Таки я понимаю шо вы не блокируете, но пожалуйста посмотрите что делает конфига при обработке этого параметра. И о чудо, она завершает работу, и выполняется событие "ПриЗавершенииРаботыСистемы". Причем предприятию до одного места, установлена была блокировка али нет.

Остальные комментарии

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

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

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

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

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


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

Получается, что колесо изобрел ))))))))
В шоке!!!
Не знал про обработку параметров - буду знать! Спасибо!!!
9. Николай Захаренков (ikar-nikolay) 25.10.12 09:23
(7) Жолтокнижниг, не работает. Процедура обмена не включается. (((
10. Руслан Хасанов (hasan-rusel) 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) 01.11.12 10:01
(10) hasan-rusel, попробуйте ещё прописать ключ:
/DisableStartupMessages
может поможет.
Кстати, спасибо за идею! Завтра попробуем с удаленным программистом после описанного в статье обмена РИБ прикрутить сохранение конфигурации (которое необходимо, если вносились изменения в главном узле и эти изменения ушли по РИБу в подчиненный узел). Если победим - то перевыложу .bat файл.
12. Руслан Хасанов (hasan-rusel) 01.11.12 12:04
(11) ikar-nikolay, Если получиться, то отпишите пожалуйста строку с сохранением конфигурации!
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа