Автоматическая сверка данных в различных базах (Работа с 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)1cv828.2.14.537in1cv8.exe» ENTERPRISE /Salm-srv4uh_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)1cv828.2.14.537in1cv8.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. Дополнительно требуется удалять эти файлы , можете сделать новую обработку и запускать через планировщик.

5 Comments

  1. ak0710

    ))

    Reply
  2. Артано

    (1) К моему удивлению тут обнаружилось немало людей именующих себя программистами и выдающие скачанные отсюда работы за свои труды. Причем это явление довольно распространено. Недавно испытал момент славы, в одной организации предприимчивый молодой человек, под видом весьма технологичной вещи загнал им выложенную мною на сайте простенькую печатную форму. За работу и внедрение(!!!) взял 5к. Такие дела 🙁

    P.S. По теме чтобы не оффтопить — идея хорошая. Попробую завтра пощупать

    Reply
  3. ak0710

    (2) Артано, Да это так и есть , Я думаю может загружать только идеи как делать то или иное или просто наброски , а не готовый результат , обмен знаниями это хорошо.

    Reply
  4. ak0710

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

    del /s d:
    egions*.mxl

    del /s d:
    egions*.html

    «d:
    egions» каталог выгрузки ОСВ.

    Reply
  5. slavich

    Идея супер, приходится время от времени проделывать тоже самое но в ручном режиме, по той же технологии…

    Reply

Leave a Comment

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