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

Необходимо было быстрое решение — ежедневный обмен 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)1cv828.2.15.319in»;»C:Program Files1cv828.2.15.319in»
start 1cv8.exe ENTERPRISE /F»\Bases2012База» /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Выполнить=». )))

11 Comments

  1. Программулькин

    а будет выгрузка автоматическая если изменения в конфу внесёшь??

    Reply
  2. ikar-nikolay

    Не совсем понял вопроса…

    Выгрузка будет автоматической из-за того, что Планировщик заданий будет запускать bat-файл в определенное время. А что бы все корректно работало, необходимо дописать кусочек кода — обработки параметра, передаваемого при запуске 1с в ключе «/с» в предопределенной процедуре ПриНачалеРаботыСистемы(), а остальные механизмы РИБ остаются типовыми.

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

    Reply
  3. Жолтокнижниг
    Мне это показалось не совсем универсально.

    А править конфигу ох как универсально. /Execute и пусть юзеры подождут.

    В чем минусы то?Время на старт обработок?

    Reply
  4. ikar-nikolay

    (3) Жолтокнижниг, ведь написал же, почему /Execute не подойдет, повторюсь!

    /Execute выполняется после отработки ПриНачалеРаботыСистемы(). В БП 2.0 в процедуре ПриНачалеРаботыСистемы() вылетают 2 панели, где необходимо вмешательство пользователя (что бы нажали на ту или иную кнопку). /Execute выполнится только после этого:

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

    2) панель расчета границ итогов, для отключения которой необходимо со всех регистров убрать галочку с прав «Рассчитывать итоги», т.е. полные права не подойдут. А значит нужно создать новую роль — типа полные права без галочки «Рассчитывать итоги» на регистрах и таскать эту роль по релизам. Выбирая между тасканием роли или внесением нескольких строк в конфигурацию — выбрал второе, поскольку второе решение дало новый функционал — теперь можно выполнять любые строки кода при запуске 1с, указав их в строке запуска, например, — те же самые внешние обработки и т.д., причем эти строки будут выполняться до появления панелей 1) и 2).

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

    Вы меня лучше поймете, если сами в БП 2.0 попробуете через /Execute запустить обработку, выводящую надпись: «Hello, World!!!». Не кликнув по кнопкам вылетевших панелек — вы эту надпись не увидите!

    Reply
  5. Жолтокнижниг

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

    Reply
  6. ikar-nikolay

    (5) Жолтокнижниг, к сожалению, нет! )))

    Я же не блокирую базу. Во время запуска обмена РИБ — остальные пользователи могут спокойно работать. 1с запускается в фоне и не видна пользователю. О её существовании можно узнать только в Диспетчере задач, появлением нового процесса 1с.

    Reply
  7. ikar-nikolay

    Я в шоке!!!

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

    Показать

    И вызывается обработка параметра запуска до открытия форм.

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

    Получается, что колесо изобрел ))))))))

    В шоке!!!

    Не знал про обработку параметров — буду знать! Спасибо!!!

    Reply
  8. ikar-nikolay

    (7) Жолтокнижниг, не работает. Процедура обмена не включается. (((

    Reply
  9. hasan-rusel

    Интересная статья !

    Может подскажете мне ? У меня нетиповая конфигурация, после обмена в батнике выполняю:

    «C:Program Files1cv82common1cestart.exe» CONFIG /F «C:Sklad» /N»Admin» /P»8160″ /UpdateDBCfg

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

    Реорганизация информации. Изменена …… Принять. Отмена.

    И команда

    /UpdateDBCfg

    не выполняется, как быть ?! 🙁

    Reply
  10. ikar-nikolay

    (10) hasan-rusel, попробуйте ещё прописать ключ:

    /DisableStartupMessages

    может поможет.

    Кстати, спасибо за идею! Завтра попробуем с удаленным программистом после описанного в статье обмена РИБ прикрутить сохранение конфигурации (которое необходимо, если вносились изменения в главном узле и эти изменения ушли по РИБу в подчиненный узел). Если победим — то перевыложу .bat файл.

    Reply
  11. hasan-rusel

    (11) Если получиться, то отпишите пожалуйста строку с сохранением конфигурации!

    Reply

Leave a Comment

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