Для решения данного вопроса залез в интернет и понял, что единого решения нет — каждый извращается как может. Ну вот и я присоединился к этой компашке. Воевал за максимальную функциональность, поэтому при выборе решения остановился на своём.
Решения без изменения конфигурации мне найти не удалось… Уже вижу, как как в меня полетели помидоры — ведь при запуске 1с есть ключ /Execute , который позволяет после запуска 1с запустить внешнюю обработку и сделать обмен, да вот только — фик там! После загрузки 1с загружается: сначало панель интернет-соединение (отключил), а вот потом панель «Установить границу расчитанных итогов на…?» — быстро победить мне эту панельку не удалось. У-у-у-у-у, вторая порция помидоров полетела. Знаю, что есть права на регистрах — рассчитывать итоги, через которые можно избавить пользователя от этой ненужной обузы, да вот только для этого нужно создавать новую роль и тащить её через последующие релизы и для одной только цели — делать обмен. Мне это показалось не совсем универсально.
Покопавшись в интернете и ключах запуска нашел ключ /C — передача параметра в конфигурацию. 1с Бухгалтерия отрабатывает ключ /CРазрешитьРаботуПользователей, при котором работа 1с завершается, но с параметром Ложь: ЗавершитьРаботуСистемы(Ложь), при этом 1с просто подрубается, не выполняя функций завершения работы программы.
Но ведь через этот ключ можно передать, что-то типа /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Выполнить=». )))
а будет выгрузка автоматическая если изменения в конфу внесёшь??
Не совсем понял вопроса…
Выгрузка будет автоматической из-за того, что Планировщик заданий будет запускать bat-файл в определенное время. А что бы все корректно работало, необходимо дописать кусочек кода — обработки параметра, передаваемого при запуске 1с в ключе «/с» в предопределенной процедуре ПриНачалеРаботыСистемы(), а остальные механизмы РИБ остаются типовыми.
Ну, и соответственно, этот кусочек кода не забывать проставлять при последующих обновлениях конфигураций (что занимает минимум времени, при большой приносимой пользе).
А править конфигу ох как универсально. /Execute и пусть юзеры подождут.
В чем минусы то?Время на старт обработок?
(3) Жолтокнижниг, ведь написал же, почему /Execute не подойдет, повторюсь!
/Execute выполняется после отработки ПриНачалеРаботыСистемы(). В БП 2.0 в процедуре ПриНачалеРаботыСистемы() вылетают 2 панели, где необходимо вмешательство пользователя (что бы нажали на ту или иную кнопку). /Execute выполнится только после этого:
1) панель интернет-соединения, которую можно отключить (обработки можно найти тут же на Инфостарте, штатных средств не придумано).
2) панель расчета границ итогов, для отключения которой необходимо со всех регистров убрать галочку с прав «Рассчитывать итоги», т.е. полные права не подойдут. А значит нужно создать новую роль — типа полные права без галочки «Рассчитывать итоги» на регистрах и таскать эту роль по релизам. Выбирая между тасканием роли или внесением нескольких строк в конфигурацию — выбрал второе, поскольку второе решение дало новый функционал — теперь можно выполнять любые строки кода при запуске 1с, указав их в строке запуска, например, — те же самые внешние обработки и т.д., причем эти строки будут выполняться до появления панелей 1) и 2).
Поскольку вмешательство пользователя для решения данной задачи недопустимо (нужно через бат-файл выполнить операцию обмена РИБ без вмешательства пользователя), то самое простое — выполнить нужные строки кода до появления панелек 1) и 2), что и делается.
Вы меня лучше поймете, если сами в БП 2.0 попробуете через /Execute запустить обработку, выводящую надпись: «Hello, World!!!». Не кликнув по кнопкам вылетевших панелек — вы эту надпись не увидите!
Хм а попробуй такую штуку: параметр /CРазрешитьРаботуПользователей, (БП 2.0 у меня нет под рукой, но думаю механизмы 1с унифицированы) имхо это даст тот же результат, но без изменения конфиги
(5) Жолтокнижниг, к сожалению, нет! )))
Я же не блокирую базу. Во время запуска обмена РИБ — остальные пользователи могут спокойно работать. 1с запускается в фоне и не видна пользователю. О её существовании можно узнать только в Диспетчере задач, появлением нового процесса 1с.
Я в шоке!!!
Показать
И вызывается обработка параметра запуска до открытия форм.
И ЗавершитьРаботуСистемы(Ложь) — не должна вывести вопросов о закрытии, т.к. у нас ничего не модифицировалось…
Получается, что колесо изобрел ))))))))
В шоке!!!
Не знал про обработку параметров — буду знать! Спасибо!!!
(7) Жолтокнижниг, не работает. Процедура обмена не включается. (((
Интересная статья !
Может подскажете мне ? У меня нетиповая конфигурация, после обмена в батнике выполняю:
Но если есть изменения в конфигурации, то выходит окно
И команда
не выполняется, как быть ?! 🙁
(10) hasan-rusel, попробуйте ещё прописать ключ:
/DisableStartupMessages
может поможет.
Кстати, спасибо за идею! Завтра попробуем с удаленным программистом после описанного в статье обмена РИБ прикрутить сохранение конфигурации (которое необходимо, если вносились изменения в главном узле и эти изменения ушли по РИБу в подчиненный узел). Если победим — то перевыложу .bat файл.
(11) Если получиться, то отпишите пожалуйста строку с сохранением конфигурации!