Автоматическое обновление отчетов/обработок

Администрирование - Системное

Что ни говорите товарищи, но лень - двигатель прогресса.

А все началось с одной обработки на одной конфигурации


Существовала некая обработка для синхронизации 1С с другой учетной системой. Изменялась раз\два в неделю. Спустя некоторое время эта обработка начала изменяться, чуть ли не каждый день, а так как рабочая БД была периферийная, измененную обработку приходилось сохранять в каталог ИБ до следующего обновления (обновление происходило раз в неделю).

Все бы ничего, да вот таких конфигураций стало две, потом три и т.д., пришло время что-то изменить.

 

Что из этого всего получилось.


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Перем Версия;
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Процедура ОбновитьВерсиюОбработки()

DialMail_Загружено = 0;
Если ФС.СуществуетФайл(КаталогПрограммы()+"DialMail.dll") = 1 Тогда

DialMail_Загружено = ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+"DialMail.dll");

ИначеЕсли ФС.СуществуетФайл(КаталогИБ()+"DialMail.dll") = 1 Тогда

DialMail_Загружено = ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"DialMail.dll");

КонецЕсли;

Если DialMail_Загружено = 0 Тогда

Предупреждение("Библиотеку DialMail.dll НЕ НАЙДЕНО!");
Возврат;

КонецЕсли;

ИмяFTPСервера = "ftp.com";
Порт = "";
Пользователь = "ftp";
Пароль = "qwerty";
КаталогFTP = "Update";
НазваниеФайла = "Sync.ert";
ПолноеНазваниеФайлаНаФТП = КаталогFTP + "/" + НазваниеФайла;
ПолноеНазваниеФайлаВ1С = КаталогИБ() + НазваниеФайла;

FTP = СоздатьОбъект("AddIn.FTP");
Если ПустоеЗначение(Порт) = 1 Тогда

_Рез = FTP.Подключиться(ИмяFTPСервера,, Пользователь, Пароль, 1, 3);

Иначе

_Рез = FTP.Подключиться(ИмяFTPСервера, Порт, Пользователь, Пароль, 1, 3);

КонецЕсли;

Если _Рез = 0 Тогда

FTP = 0;
Возврат;

КонецЕсли;

Если FTP.Лист("/" + КаталогFTP) = 0 Тогда

Сообщить("Не удалось считать файлы с FTP-сервера", "!");
FTP = 0;
Возврат;

КонецЕсли;

КвоФайлов = FTP.КоличествоФайлов();
Если КвоФайлов = 0 Тогда

FTP = 0;
Возврат;

КонецЕсли;

НомерФайлаНаФТП = 0;
Для н = 1 По КвоФайлов Цикл

Если FTP.ЭтоКаталог(н) = 1 Тогда

Продолжить;

КонецЕсли;

НазваниеФайлаНаФТП = FTP.ПолучитьИмяФайла(н);
Если НазваниеФайлаНаФТП = НазваниеФайла Тогда

НомерФайлаНаФТП = н;
Прервать;

Иначе

Продолжить;

КонецЕсли;

КонецЦикла;

Если НомерФайлаНаФТП = 0 Тогда

Сообщить("Файл " + НазваниеФайла + " не найден на FTP-сервере", "!");
FTP = 0;
Возврат;

КонецЕсли;

Если ФС.СуществуетФайл(ПолноеНазваниеФайлаВ1С) = 1 Тогда

ДатаВремяВ1С = ""; ДатаВремяНаФТП = "";
ФС.АтрибутыФайла(ПолноеНазваниеФайлаВ1С,,,,,ДатаВремяВ1С);

ДатаНаФТП = FTP.ПолучитьДатуФайла(НомерФайлаНаФТП);
ВремяНаФТП = FTP.ПолучитьВремяФайла(НомерФайлаНаФТП);
ДатаВремяНаФТП = Шаблон("[ДатаГод(ДатаНаФТП)].[Формат(ДатаМесяц(ДатаНаФТП),""Ч(0)2"")].[Формат(ДатаЧисло(ДатаНаФТП),""Ч(0)2"")] [ВремяНаФТП]");

Если ДатаВремяНаФТП <= ДатаВремяВ1С Тогда

FTP = 0;
Возврат;

КонецЕсли;

КонецЕсли;

Если FTP.ПолучитьФайл(ПолноеНазваниеФайлаНаФТП, ПолноеНазваниеФайлаВ1С) = 0 Тогда

Сообщить("Не удалось получить файл '"+ПолноеНазваниеФайлаВ1С+"' з FTP '"+ПолноеНазваниеФайлаНаФТП+"'!");
FTP = 0;
Возврат;

КонецЕсли;

FTP = 0;

КонецПроцедуры
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Процедура ПриОткрытии()

Версия = 1;
НазваниеФайла = "Sync.ert";

// Определим, открывается ли внешняя обработка
// Если да, тогда не будем выполнять обновление, так как это приведет к циклической!
Путь = ""; Имя = "";
РасположениеФайла(Путь, Имя);
Если ПустаяСтрока(Путь) = 1 Тогда

ОбновитьВерсиюОбработки();
Если ФС.СуществуетФайл(КаталогИБ() + НазваниеФайла) = 1 Тогда

Кт = "";
ОткрытьФорму("Отчет"Кт, КаталогИБ() + НазваниеФайла);
Если Кт.Версия > Версия Тогда

СтатусВозврата(0);
Возврат;

Иначе

Кт.Форма.Закрыть();

КонецЕсли;

КонецЕсли;

КонецЕсли;

КонецПроцедуры
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


Вот собственно и все. Как всегда надеюсь, что данная статья облегчит жизнь не только мне :)

Весь алгоритм заключен в одну процедуру ОбновитьВерсиюОбработки() и часть кода, который нужно вставить в процедуру ПриОткрытии()

Как это все работает ? При открытии "отчета\обработки" с конфигурации 1С происходит проверка на наличие новой версии обработки. Если обработка существует и ее версия выше, чем та,что в "КаталогИБ()\конфигурации", она скачивается и запускается на выполнение.

Что бы это все заработало, требуется наличие внешней компоненты "DialMail.dll"

См. также

Комментарии
1. Иван Иванов (Famza) 80 17.01.12 08:18 Сейчас в теме
"Библиотеку DialMail.dll НЕ НАЙДЕНО!"

Улыбнуло. Сам последнее время стал в описании ошибок использовать "неграммотический" текст
2. Имя Фамилия (ShEvOvIcH) 72 17.01.12 09:14 Сейчас в теме
(1) Famza, поподробней пожалуйста про
"неграммотический" текст
3. Александр Рытов (Арчибальд) 2660 17.01.12 09:43 Сейчас в теме
(2)
Кто стучишься в дверь моя?
Видишь, дома нет никто!
ShantinTD; rom-x; +2 Ответить
4. Тимофей Шантин (ShantinTD) 85 17.01.12 18:49 Сейчас в теме
(1) Famza, поподробней пожалуйста про
- это к Розенталю.
Лично я, когда вижу вижу программу с орфографическими ошибками - начинаю трижды перечитывать саму программу на предмет ее правильности.
5. Имя Фамилия (ShEvOvIcH) 72 17.01.12 23:00 Сейчас в теме

Все такие красноречивы, сразу нельзя было написать, что в коде ошибка + орфография хромает???
Да, облажался немного, виноват! Во время перевода на рус. язык допустил несколько ошибок (изначально было на укр. языке).
Исправил, прошу лингвистов перепроверить.
6. Иван Иванов (Famza) 80 17.01.12 23:38 Сейчас в теме
(2)Ну "неграммотический" текст как-то приятнее воспринимается, а то надоело "Объект не найден, Документ не проведен". Вот вношу разнообразие. Например, в интерфейсе вместо ":" поставил ":)", вы не поверите из 10 человек, только 1 спросил, что это значит. Прикольно. )))
7. Александр Зубцов (iov) 363 17.01.12 23:55 Сейчас в теме
dropbox и я логи оперативно получаю...
но за код все равно +
Оставьте свое сообщение