Дополнительное ПО устанавливать не нужно, работает как на файловом, так и клиент-серверном варианте. Код полностью открыт.
Работает на управляемых формах.
Проверено на Рознице 2.1, но возможна адаптация для любой конфигурации, имеющей типовой механизм подключения внешних обработок и планы обмена (например, УТ, Комплексная).
В центральном узле добавляем сценарий в соответствующий справочник. Ставим метки в каких узлах нужно выполнить задание.
В магазине работает регламентное задание, которое проверяет наличие не выполненных заданий и выполняет их по мере необходимости. По одному за каждый запуск, в порядке очередности установленной в справочнике.
Результат выполнения записывается в регистр сведений. После обмена можно в центральной базе посмотреть: выполнилось ли задание, наличие ошибки выполнения. Если есть необходимость - то через результат выполнения можно передать с узла в центр данные.
Задание выполняется один раз на каждом узле.
Примеры сценариев:
1 Создать копию рабочего места
МассивФайлов = НайтиФайлы("C:\Users\","1cv8u.pfl",Истина);
Результат = "Всего фалов настройки "+МассивФайлов.Количество();
Если МассивФайлов.Количество()>0 тогда
Для Каждого НайденФайл Из МассивФайлов Цикл
СтарыйФайл = СтрЗаменить(НайденФайл.ПолноеИмя,"1cv8u.pfl","_1cv8u.pfl");
КопироватьФайл(НайденФайл.ПолноеИмя, СтарыйФайл);
КонецЦикла;
Иначе
Результат = "Нет файлов настройки";
КонецЕсли;
2 Создание файла run1C и смена пароля админа
ПарольАдмина = "123";
Результат = "";
Админ = Справочники.Пользователи.НайтиПоНаименованию("Администратор");
Если ЗначениеЗаполнено(Админ.ИдентификаторПользователяИБ) Тогда
ЗначХран = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Админ.ИдентификаторПользователяИБ);
ЗначХран.Пароль = ПарольАдмина;
Попытка
ЗначХран.Записать();
Исключение
Результат = "Не удалось записать пользователя.";
Конецпопытки;
КонецЕсли;
Если Результат = "" Тогда
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();//File="C:\1cv8\Base".
Если лев(СтрокаСоединения,4) = "Srvr" Тогда //Srvr="obmensrv";Ref="testpirozhkov";
Сервак = Лев(СтрокаСоединения,Найти(СтрокаСоединения,";Ref="));
База = Прав(СтрокаСоединения,Найти(СтрокаСоединения,";Ref="));
Сервак = СтрЗаменить(Сервак, "Srvr=", "");
Сервак = СтрЗаменить(Сервак, ";", "");
База = СтрЗаменить(База, ";", "");
СтрокаСоединения = Сервак+"\"+База;
СтрокаСоединения = СтрЗаменить(СтрокаСоединения, """", "");
КаталогПрограммы = КаталогПрограммы();
ИмяФайлаПрограммы = КаталогПрограммы + "\1cv8.exe";
КоманднаяСтрокаОбновления = "echo off
|cls
|"""+ИмяФайлаПрограммы+""" CONFIG /S"""+СтрокаСоединения+""" /N""Администратор"" /P"""+ПарольАдмина+""" /DisableStartupMessages /UpdateDBCfg /UC""КодРазрешения""
|"""+ИмяФайлаПрограммы+""" ENTERPRISE /S"""+СтрокаСоединения+""" /N""Администратор"" /P"""+ПарольАдмина+""" /DisableStartupMessages /C""РазрешитьРаботуПользователей"" /UC""КодРазрешения""";
Иначе
СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "File=", "");
СтрокаСоединения = СтрЗаменить(СтрокаСоединения, ";", "");
КаталогПрограммы = КаталогПрограммы();
ИмяФайлаПрограммы = КаталогПрограммы + "\1cv8.exe";
КоманднаяСтрокаОбновления = "echo off
|cls
|"""+ИмяФайлаПрограммы+""" CONFIG /F"+СтрокаСоединения+" /N""Администратор"" /P"""+ПарольАдмина+""" /DisableStartupMessages /UpdateDBCfg /UC""КодРазрешения""
|"""+ИмяФайлаПрограммы+""" ENTERPRISE /F"+СтрокаСоединения+" /N""Администратор"" /P"""+ПарольАдмина+""" /DisableStartupMessages /C""РазрешитьРаботуПользователей"" /UC""КодРазрешения""";
КонецЕсли;
ИмяФайлаСкрипта = "C:\run1С.bat";
Ф = Новый ТекстовыйДокумент();
Ф.УстановитьТекст(КоманднаяСтрокаОбновления);
Ф.Записать(ИмяФайлаСкрипта, КодировкаТекста.OEM);
Результат = "Выполнено";
КонецЕсли;
3 Настройка регламента "ВыполнениеПроизвольногоСценария"
//ВключитьРегламент("ВыполнениеПроизвольногоСценария");
ИмяРег = "ВыполнениеПроизвольногоСценария";
//запуск в магазинах регламента
//Процедура ВключитьРегламент(ИмяРег)
УстановитьПривилегированныйРежим(Истина);
Отб = Новый Структура;
ИмяРЗ = "Дополнительная обработка: "+ИмяРег+" / Команда: "+ИмяРег;
Отб.Вставить("Наименование", ИмяРЗ);
Задания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отб);
Если Задания.Количество()>0 тогда
Задание = Задания[0];
Иначе
Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание("ЗапускДополнительныхОбработок");
КонецЕсли;
Задание.Использование = Истина;
Задание.Наименование = ИмяРЗ;
Расписание = Новый РасписаниеРегламентногоЗадания;
Расписание.ПериодНедель = 1;
МД = Новый Массив();
МД.Добавить(1);
МД.Добавить(2);
МД.Добавить(3);
МД.Добавить(4);
МД.Добавить(5);
МД.Добавить(6);
МД.Добавить(7);
Расписание.ДниНедели = МД;
Расписание.ДатаНачала = ТекущаяДата();
Расписание.ПериодПовтораВТечениеДня = 1800;
Расписание.ПериодПовтораДней = 1;
Задание.Расписание = Расписание;
ПарЗад = Новый Массив;
ПарЗад.Добавить(Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(ИмяРег));
ПарЗад.Добавить(ИмяРег);
Задание.Параметры = ПарЗад;
Задание.Записать();
//КонецПроцедуры
Результат = "Выполнено без ошибок";
4 Настройка регламента "ОбновлениеКонфигурации"
//ВключитьРегламент("ОбновлениеКонфигурации");
ИмяРег = "ОбновлениеКонфигурации";
//запуск в магазинах регламента
//Процедура ВключитьРегламент(ИмяРег)
УстановитьПривилегированныйРежим(Истина);
Отб = Новый Структура;
ИмяРЗ = "Дополнительная обработка: "+ИмяРег+" / Команда: "+ИмяРег;
Отб.Вставить("Наименование", ИмяРЗ);
Задания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отб);
Если Задания.Количество()>0 тогда
Задание = Задания[0];
Иначе
Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание("ЗапускДополнительныхОбработок");
КонецЕсли;
Задание.Использование = Истина;
Задание.Наименование = ИмяРЗ;
Расписание = Новый РасписаниеРегламентногоЗадания;
Расписание.ПериодНедель = 1;
МД = Новый Массив();
МД.Добавить(1);
МД.Добавить(2);
МД.Добавить(3);
МД.Добавить(4);
МД.Добавить(5);
МД.Добавить(6);
МД.Добавить(7);
Расписание.ДниНедели = МД;
Расписание.ДатаНачала = ТекущаяДата();
Расписание.ПериодПовтораВТечениеДня = 300;
Расписание.ПериодПовтораДней = 1;
Задание.Расписание = Расписание;
УправляющийПользователь = "";
Управляющий = Справочники.ГруппыДоступа.НайтиПоНаименованию("СударьУправляющий");
Для каждого Стр Из Управляющий.Пользователи Цикл
УправляющийПользователь = Стр.Пользователь;
Попытка
Если ЗначениеЗаполнено(УправляющийПользователь) тогда
Если ЗначениеЗаполнено(УправляющийПользователь.ИдентификаторПользователяИБ) Тогда
ЗначХран = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(УправляющийПользователь.ИдентификаторПользователяИБ).Имя;
Прервать;
КонецЕсли;
КонецЕсли;
Исключение
конецпопытки
КонецЦикла;
Задание.ИмяПользователя = ЗначХран;
ПарЗад = Новый Массив;
ПарЗад.Добавить(Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(ИмяРег));
ПарЗад.Добавить(ИмяРег);
Задание.Параметры = ПарЗад;
Задание.Записать();
//КонецПроцедуры
Результат = "Выполнено без ошибок";
5 Настройка регламента "Синхронизация с центром"
Сценарий = Справочники.СценарииОбменовДанными.НайтиПоКоду("00001");
Если ЗначениеЗаполнено(Сценарий) Тогда
УстановитьПривилегированныйРежим(Истина);
Отб = Новый Структура;
ИмяРЗ = "Выполнение обмена по сценарию: Сценарий синхронизации для Центр";
Отб.Вставить("Наименование", ИмяРЗ);
Задания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отб);
Если Задания.Количество()>0 тогда
Задание = Задания[0];
Иначе
Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание("СинхронизацияДанных");
Задание.Наименование = "Выполнение обмена по сценарию: Сценарий синхронизации для Центр";
КонецЕсли;
Задание.Использование = Истина;
Расписание = Новый РасписаниеРегламентногоЗадания;
Расписание.ПериодНедель = 1;
//ТекущийОбъект.НастройкиОбмена
//ТекущийОбъект
МД = Новый Массив();
МД.Добавить(1);
МД.Добавить(2);
МД.Добавить(3);
МД.Добавить(4);
МД.Добавить(5);
МД.Добавить(6);
МД.Добавить(7);
Расписание.ДниНедели = МД;
//Расписание.ДатаНачала = ТекущаяДата();
Расписание.ПериодПовтораВТечениеДня = 2400;
Расписание.ПериодПовтораДней = 1;
Расписание.ДатаНачала = НачалоДня(ТекущаяДата());
Задание.Расписание = Расписание;
Задание.ИмяПользователя = "Администратор";
ПараметрыРегламентногоЗадания = Новый Массив;
ПараметрыРегламентногоЗадания.Добавить(Сценарий.Код);
Задание.Параметры = ПараметрыРегламентногоЗадания;
Задание.Записать();
СценарийОбъект = Сценарий.ПолучитьОбъект();
СценарийОбъект.РегламентноеЗаданиеGUID = Задание.УникальныйИдентификатор;
СценарийОбъект.Записать();
Результат = "Выполнено без ошибок";
Иначе
Результат = "Не обнаружен сценарий обмена данными с центром";
КонецЕсли;