Автоматическая сверка данных в различных базах (Работа с FTP,SMTP,Планировщик Windows, запуск внешних обработок, командная строка 1С)


Бывают проблемы когда после обмена РИБ в базе Главного узла и дочернего наблюдаются расхождения в данных, для выяснения этих расхождений Я решил сравнивать отчет ОСВ в дочке и голове в автоматическом режиме без доработки типовой конфигурации.

Обработки и отчеты разрабатывались для конфигурации Бухгалтерии Для Казахстана 2.0 это не окончательная их версия, но при желании можно взять идею

1. Для начала сохранил нужный мне отчет как внешний .

2. В модуле при открытии этого отчета прописал выгрузку результата отчета в файлы mxl и сохранение на FTP сервере организации, в моем случае изменение модуля формы отчета ОСВ выглядит так :

Функция СоединениеФТП() /// Айбек 


Сервер = "192.168.1.59";
Пользователь = "region";
Пароль = "ht3214";
Порт = 21;

Попытка



Соединение = Новый FTPСоединение(Сервер, Порт, Пользователь, Пароль, ,Ложь);

Исключение



// ошибка при подключении к ftp

Сообщить("Ошибка при подключении к FTP : " + Сервер + " ! " + ОписаниеОшибки());

Возврат Неопределено;



КонецПопытки;

Возврат Соединение;

 

КонецФункции

 

Процедура ИзменитьОтбор(Код) Экспорт



Парам = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ОрганизацияПараметр");
Парам.Использование = Истина;
Парам.Значение = Справочники.Организации.НайтиПоКоду(Код);



КонецПроцедуры


Процедура ВыгрузитьОСВ(Соединение,КодОрганизации,КодУзла,Голова = Ложь)



ИзменитьОтбор(КодОрганизации);

Настроить();
СтандартныеОтчеты.ВосстановитьНастройкиФормы(ЭтаФорма);
ОбновитьПанельНастроек();
СтандартныеОтчеты.УправлениеОтображениемОбластейОтчета(ЭтотОбъект, ЭтаФорма);
СтандартныеОтчеты.УправлениеОтображениемПанелиПользователя(ЭтаФорма);
СтандартныеОтчеты.ЗаполнитьТаблицуЭлементов(ЭтаФорма);


ОбновитьОтчет();
ЭлементыФормы.Результат.Записать(КаталогВременныхФайлов()+"/КНС_"+КодУзла+".mxl");


Если Голова Тогда


Соединение.Записать(КаталогВременныхФайлов()+"/КНС_"+КодУзла+".mxl","КНС_"+КодУзла+".mxl");


Иначе


Соединение.Записать(КаталогВременныхФайлов()+"/КНС_"+КодУзла+".mxl","фКНС_"+КодУзла+".mxl");


КонецЕсли;



КонецПроцедуры


Процедура ПриОткрытии()


Соединение = СоединениеФТП();

/// Айбек
НачалоПериода = НачалоМесяца(ТекущаяДата());
КонецПериода = КонецМесяца(ТекущаяДата());

Если ПланыОбмена.ПоОрганизации.ЭтотУзел().Код = "КНС" Тогда



ВыгрузитьОСВ(Соединение,"000000001","АЛМ",Истина);
ВыгрузитьОСВ(Соединение,"АБ0000002","АПФ",Истина);
ВыгрузитьОСВ(Соединение,"ТР0002 ","ЖПФ",Истина);
ВыгрузитьОСВ(Соединение,"УР0000001","ЗКП",Истина);
ВыгрузитьОСВ(Соединение,"КЗ0000001","КПФ",Истина);
ВыгрузитьОСВ(Соединение,"АК0000001","МПФ",Истина);
ВыгрузитьОСВ(Соединение,"000000002","ЮКП",Истина);



ИначеЕсли ПланыОбмена.ПоОрганизации.ЭтотУзел().Код = "АЛМ" Тогда


ВыгрузитьОСВ(Соединение,"000000001","АЛМ");
ИначеЕсли ПланыОбмена.ПоОрганизации.ЭтотУзел().Код = "АПФ" Тогда
ВыгрузитьОСВ(Соединение,"АБ0000002","АПФ");
ИначеЕсли ПланыОбмена.ПоОрганизации.ЭтотУзел().Код = "ЖПФ" Тогда
ВыгрузитьОСВ(Соединение,"ТР0002 ","ЖПФ");
ИначеЕсли ПланыОбмена.ПоОрганизации.ЭтотУзел().Код = "ЗКП" Тогда
ВыгрузитьОСВ(Соединение,"УР0000001","ЗКП");
ИначеЕсли ПланыОбмена.ПоОрганизации.ЭтотУзел().Код = "КПФ" Тогда
ВыгрузитьОСВ(Соединение,"КЗ0000001","КПФ");
ИначеЕсли ПланыОбмена.ПоОрганизации.ЭтотУзел().Код = "МПФ" Тогда
ВыгрузитьОСВ(Соединение,"АК0000001","МПФ");


Иначе


ВыгрузитьОСВ(Соединение,"000000002","ЮКП");


КонецЕсли;

ПрекратитьРаботуСистемы();

 

КонецПроцедуры

 

3. Cохранил этот отчет в справочнике внешние отчеты , конешно можно его запускать на прямую как внешний но Я решил чтобы сам отчет был в базе.

Создал обработку которая бы запускала этот отчет  в форме ПриОткрытии()  прописал:

СсылкаОтчет = Справочники.ВнешниеОбработки.НайтиПоКоду("ШМ0000003");// код отчета в справочнике ВнешниеОбработки
ХранОбъект = СсылкаОтчет.ХранилищеВнешнейОбработки.Получить();
ХранОбъект.Записать(КаталогВременныхФайлов()+"/otchet.ert");
Отчет = ВнешниеОтчеты.Создать(КаталогВременныхФайлов()+"/otchet.ert");
ФормаОтчета = Отчет.ПолучитьФорму("ФормаОтчета");
ФормаОтчета.Открыть();

Если без сохранения можно ограничиться тремя нижними строчками , и на прямую указать путь к отчету.

Далее добавил задание в планировщик которое запускало все это:

 

ДЛЯ КЛИЕНТ-СЕРВЕРНОЙ БАЗЫ 1С

 

"C:\Program Files (x86)\1cv82\8.2.14.537\bin\1cv8.exe" ENTERPRISE /Salm-srv4\buh_cons82 /NАдмин /P1й2ц /AppAutoCheckMode /Execute"C:\RunSaveOSV.epf" /DisableStartupMessages

Расшифровки для создания задания :

alm-srv4 – Имя Сервера на котором находиться база

buh_cons82 – Имя Базы на севере 1С Предприятие

Админ – Имя пользователя 

1й2ц – Пароль пользователя

C:\RunSaveOSV.epf – Путь к файлу обработки

 

ДЛЯ ФАЙЛОВОЙ БАЗЫ 1С

"C:\Program Files (x86)\1cv82\8.2.14.537\bin\1cv8.exe" ENTERPRISE /F”C:\База1С” /NАдмин /P1й2ц /AppAutoCheckMode /Execute"C:\RunSaveOSV.epf" /DisableStartupMessages

Расшифровки для создания задания :

C:\База1С – Каталог базы данных 1С Предприятие

Админ – Имя пользователя

1й2ц – Пароль пользователя

C:\RunSaveOSV.epf – Путь к файлу обработки

 

Задание выполнено , файлы сохраняются на фтп сервере, задание должно быть запущено в главном узле и дочках

 

4 . Сверка данных файлов , для этого я воспользовался типовой фукцией 1С для сравнения файлов , и в случае если файлы не равны отправлялось сообщение на почтовый адрес.

МодульФормы обработки сравнения файлов:

 

Функция ОтправитьНаПочту(ТекстПисьма)

Профиль = Новый ИнтернетПочтовыйПрофиль;

Профиль.Пользователь = "asdasd@mail.ru";
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
Профиль.АутентификацияPOP3 = СпособPOP3Аутентификации.Обычная;
Профиль.ПользовательSMTP = "asdasd@mail.ru";
Профиль.Пароль = "выфвыф";
Профиль.ПарольSMTP = "выфвыф";
Профиль.ПользовательSMTP = "asdasd";
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 25;

Письмо = Новый ИнтернетПочтовоеСообщение;

//Письмо.Получатели.Добавить("321@321.kz");
Письмо.Получатели.Добавить("вфыв@выф.kz");

Письмо.ИмяОтправителя = "Служба проверки ОСВ";
Письмо.Отправитель.ОтображаемоеИмя = "Служба проверки ОСВ";
Письмо.Отправитель.Адрес = "asdasd@mail.ru";

Письмо.Кодировка = "UTF-8";

Письмо.Тема = "Расхождение данных в ОСВ от " +Формат(ТекущаяДата(),"ДЛФ=DD") ;

ТекстПисьма = Письмо.Тексты.Добавить(ТекстПисьма,ТипТекстаПочтовогоСообщения.HTML);

Почта = Новый ИнтернетПочта;

Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();
Отправлено = Истина;
Исключение
Сообщить(НСтр("Ошибка отправки!") + ОписаниеОшибки());
Отправлено = Ложь;
КонецПопытки;


 Возврат Отправлено;

КонецФункции


Функция СоединениеФТП() /// Айбек


Сервер = "192.168.1.59";
Пользователь = "region";
Пароль = "585858";
Порт = 21;

Попытка



Соединение = Новый FTPСоединение(Сервер, Порт, Пользователь, Пароль, ,Ложь);



Исключение



// ошибка при подключении к ftp
Сообщить("Ошибка при подключении к FTP : " + Сервер + " ! " + ОписаниеОшибки());



Возврат Неопределено;



КонецПопытки;

Возврат Соединение;


КонецФункции


Процедура ПроверитьОСВ(КодУзла,Соединение,Ошибка,ТекстДобавление)

 

Попытка /// лень писать код с проверкой существования файлов на фтп


Соединение.Получить("КНС_"+КодУзла+".mxl", КаталогВременныхФайлов()+"/КНС_"+КодУзла+".mxl");
Соединение.Получить("фКНС_"+КодУзла+".mxl", КаталогВременныхФайлов()+"/фКНС_"+КодУзла+".mxl");

Сравнение = Новый СравнениеФайлов;

Сравнение.ПервыйФайл = КаталогВременныхФайлов()+"/КНС_"+КодУзла+".mxl";
Сравнение.ВторойФайл = КаталогВременныхФайлов()+"/фКНС_"+КодУзла+".mxl";


Если НЕ Сравнение.Сравнить() Тогда


ТекстДобавление = ТекстДобавление + КодУзла + "

"; // Символы.ПС можно было
Ошибка = Истина;


КонецЕсли;
Исключение

КонецПопытки;

 

КонецПроцедуры


Процедура КнопкаВыполнитьНажатие(Кнопка) // можно было прописать сразу при открытии , но я сначала проверял потом так и осталось


Соединение = СоединениеФТП();
Ошибка = Ложь;
ТекстДобавление = "";
ПроверитьОСВ("АЛМ",Соединение,Ошибка,ТекстДобавление);
ПроверитьОСВ("АПФ",Соединение,Ошибка,ТекстДобавление);
ПроверитьОСВ("ЮКП",Соединение,Ошибка,ТекстДобавление);
ПроверитьОСВ("ЖПФ",Соединение,Ошибка,ТекстДобавление);
ПроверитьОСВ("МПФ",Соединение,Ошибка,ТекстДобавление);
ПроверитьОСВ("КПФ",Соединение,Ошибка,ТекстДобавление);
ПроверитьОСВ("ЗКП",Соединение,Ошибка,ТекстДобавление);

Если Ошибка Тогда
ТекстHTML =
"
|
|
|
|
|
|
|Добрый День!

|

|Данное письмо было посланно в автоматическом режиме , отвечать на него не требуется, расхождение
|наблюдается по следующим узлам :

"
+ ТекстДобавление +"

|С уважением №"№"№" Айбек

|Департамент информационных технологий

|АО ""№"№"№"к""

|Тел: 1267

|
|";

ЛогФайл = Новый ТекстовыйДокумент;
ЛогФайл.УстановитьТекст(ТекстHTML);

Если НЕ ОтправитьНаПочту(ТекстHTML) Тогда


ЛогФайл.Записать(КаталогВременныхФайлов()+"/log.html");
Соединение.Записать(КаталогВременныхФайлов()+"/log.html","mail_error"+Формат(ТекущаяДата(),"ДФ=dd.MM.yyyy")+".html");


КонецЕсли;


ЛогФайл.Записать(КаталогВременныхФайлов()+"/log.html");

Соединение.Записать(КаталогВременныхФайлов()+"/log.html","mail_error"+Формат(ТекущаяДата(),"ДФ=dd.MM.yyyy")+".html");


КонецЕсли;


Сообщить("Расхождение данных по :" + ТекстДобавление);



КонецПроцедуры

Процедура ПриОткрытии()


КнопкаВыполнитьНажатие(Неопределено);


ПрекратитьРаботуСистемы();

 

КонецПроцедуры

 

5. Требуется создать задание в планировщике с запуском обработки из пункта №4 , по времени после выгрузок всех файлов.

6. Дополнительно требуется удалять эти файлы , можете сделать новую обработку и запускать через планировщик.

Файлы обработки:

-