///////////////////////////////////////////////////////////////////////////// // АЛГОРИТМ ЗАГРУЗКИ ДАННЫХ СЧЕТЧИКОВ. СИСТЕМА АНТИВОР // НачатьТранзакцию(); БылиНеКритическиеОшибки = Ложь; БылиКритическиеОшибки = Ложь; КоличествоОбработанныхВТранзАкцииДокументов = 0; КоличествоФайлов = МассивНайденныхФайлов.Количество(); ЗагруженоФайлов = 0; НомерФайла = 0; МассивОбработанныхФайлов = Новый Массив; Для каждого НайденныйФайл Из МассивНайденныхФайлов Цикл НомерФайла = НомерФайла + 1; ФайлНеСодержитОшибок = Истина; Если НайденныйФайл.ЭтоФайл() Тогда //Стандартная обработка Если Не НайденныйФайл.Расширение = ".rstatfr" Тогда Продолжить; КонецЕсли; ИмяФайла = НайденныйФайл.ПолноеИмя; ЧтениеXML = Новый ЧтениеXML; Попытка ЧтениеXML.ОткрытьФайл(ИмяФайла); Исключение СтрСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файл - %1 |Прервана |Причина: Не правильная структура файла'"), ИмяФайла ); ЗаписатьВЖурналИВыдатьСообщение(СтрСообщения, Истина); БылиНеКритическиеОшибки = Истина; ФайлНеСодержитОшибок = Ложь; Продолжить; КонецПопытки; СчетчикПодсчетаПосетителей = Неопределено; ИндексНомерСтроки = 0; ДокументРегистрацииДляЗаписи = Неопределено; ЗаменилиДанныеСтатистики = Ложь; ЗагруженоФайлов = ЗагруженоФайлов + 1; Попытка Пока ЧтениеXML.Прочитать() Цикл Если НЕ ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда Продолжить; КонецЕсли; ИндексНомерСтроки = ИндексНомерСтроки + 1; Если ЧтениеXML.имя = "sensor" Тогда ТехническийКод = СокрЛП(ЧтениеXML.ПолучитьАтрибут("GUID")); ТехническоеИмя = СокрЛП(ЧтениеXML.ПолучитьАтрибут("name")); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | СчетчикиПодсчетаПосетителей.Ссылка |ИЗ | Справочник.СчетчикиПодсчетаПосетителей КАК СчетчикиПодсчетаПосетителей |ГДЕ | СчетчикиПодсчетаПосетителей.ТехническийКод = &ТехническийКод | |УПОРЯДОЧИТЬ ПО | СчетчикиПодсчетаПосетителей.ПометкаУдаления"; Запрос.УстановитьПараметр("ТехническийКод", ТехническийКод); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Если Выборка.Следующий() Тогда СчетчикПодсчетаПосетителей = Выборка.Ссылка; Иначе СтрСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '%1 |Файл - %2 |Не правильный технический код - %3 (%4)'"), ЗаголовокСообщения, ИмяФайла, ТехническийКод, ТехническоеИмя ); ЗаписатьВЖурналИВыдатьСообщение(СтрСообщения, Истина); БылиНеКритическиеОшибки = Истина; СчетчикПодсчетаПосетителей = Неопределено; ФайлНеСодержитОшибок = Ложь; КонецЕсли; ИначеЕсли ЧтениеXML.имя = "stat" И НЕ СчетчикПодсчетаПосетителей = Неопределено Тогда СтрокаДатаВремя = СокрЛП(ЧтениеXML.ПолучитьАтрибут("datetime")); СтрокаДатаВремя = СтрЗаменить(СтрокаДатаВремя, " ", Символы.ПС); СтрокаДатаВремя = СтрЗаменить(СтрокаДатаВремя, ":", Символы.ПС); СтрокаДатаВремя = СтрЗаменить(СтрокаДатаВремя, "/", Символы.ПС); СтрокаДатаВремя = СтрЗаменить(СтрокаДатаВремя, ".", Символы.ПС); Попытка Год = Число(СокрЛП(СтрПолучитьСтроку(СтрокаДатаВремя,1))); Месяц = Число(СокрЛП(СтрПолучитьСтроку(СтрокаДатаВремя,2))); День = Число(СокрЛП(СтрПолучитьСтроку(СтрокаДатаВремя,3))); Час = Число(СокрЛП(СтрПолучитьСтроку(СтрокаДатаВремя,4))); Минута = Число(СокрЛП(СтрПолучитьСтроку(СтрокаДатаВремя,5))); Если СтрЧислоСтрок(СтрокаДатаВремя)>5 Тогда Секунда = Число(СокрЛП(СтрПолучитьСтроку(СтрокаДатаВремя,6))); Иначе Секунда = 0; КонецЕсли; Если Не ЗначениеЗаполнено(Дата(Год, Месяц, День, Час, Минута, Секунда)) Тогда СтрСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '%1 |Файл - %2 |В узле №%3 не правильный формат даты'"), ЗаголовокСообщения, ИмяФайла, ИндексНомерСтроки ); ЗаписатьВЖурналИВыдатьСообщение(СтрСообщения, Истина); БылиНеКритическиеОшибки = Истина; ФайлНеСодержитОшибок = Ложь; Продолжить; КонецЕсли; Если Год < 2000 Тогда Год = 2000 + Год; КонецЕсли; ВремяРегистрации = Дата(1, 1, 1, Час, Минута, Секунда); ДатаВремяРегистрации = Дата(Год, Месяц, День, Час, Минута, Секунда); КоличествоВходящих = Число(СокрЛП(ЧтениеXML.ПолучитьАтрибут("realin"))); КоличествоВыходящих = Число(СокрЛП(ЧтениеXML.ПолучитьАтрибут("realout"))); Исключение СтрСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '%1 |Файл - %2 |В узле №%3 не правильные параметры'"), ЗаголовокСообщения, ИмяФайла, ИндексНомерСтроки ); ЗаписатьВЖурналИВыдатьСообщение(СтрСообщения, Истина); БылиНеКритическиеОшибки = Истина; ФайлНеСодержитОшибок = Ложь; Продолжить; КонецПопытки; // Поиск документа Если Не ДокументРегистрацииДляЗаписи = Неопределено И НачалоДня(ДокументРегистрацииДляЗаписи.Дата) = НачалоДня(ДатаВремяРегистрации) И ДокументРегистрацииДляЗаписи.СчетчикПодсчетаПосетителей = СчетчикПодсчетаПосетителей Тогда ДокументРегистрации = ДокументРегистрацииДляЗаписи; СтрокаДокумента = ДокументРегистрации.ДанныеПодсчета.Найти(ВремяРегистрации, "ВремяРегистрации"); Если Не СтрокаДокумента = Неопределено Тогда НомерСтроки = СтрокаДокумента.НомерСтроки; Иначе НомерСтроки = 0; КонецЕсли; Иначе Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РегистрацияПодсчетаПосетителей.Ссылка, | ЕСТЬNULL(ВложенныйЗапрос.НомерСтроки, 0) КАК НомерСтроки, | ВЫБОР | КОГДА ВложенныйЗапрос.Ссылка ЕСТЬ NULL | ТОГДА ИСТИНА | ИНАЧЕ ЛОЖЬ | КОНЕЦ КАК ЕстьНомерСтроки |ИЗ | Документ.РегистрацияПодсчетаПосетителей КАК РегистрацияПодсчетаПосетителей | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | РегистрацияПодсчетаПосетителейДанныеПодсчета.Ссылка КАК Ссылка, | РегистрацияПодсчетаПосетителейДанныеПодсчета.НомерСтроки КАК НомерСтроки | ИЗ | Документ.РегистрацияПодсчетаПосетителей.ДанныеПодсчета КАК РегистрацияПодсчетаПосетителейДанныеПодсчета | ГДЕ | (НЕ РегистрацияПодсчетаПосетителейДанныеПодсчета.Ссылка.ПометкаУдаления) | И РегистрацияПодсчетаПосетителейДанныеПодсчета.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания | И РегистрацияПодсчетаПосетителейДанныеПодсчета.Ссылка.СчетчикПодсчетаПосетителей = &СчетчикПодсчетаПосетителей | И РегистрацияПодсчетаПосетителейДанныеПодсчета.ВремяРегистрации = &ВремяРегистрации) КАК ВложенныйЗапрос | ПО РегистрацияПодсчетаПосетителей.Ссылка = ВложенныйЗапрос.Ссылка |ГДЕ | (НЕ РегистрацияПодсчетаПосетителей.ПометкаУдаления) | И РегистрацияПодсчетаПосетителей.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания | И РегистрацияПодсчетаПосетителей.СчетчикПодсчетаПосетителей = &СчетчикПодсчетаПосетителей | |УПОРЯДОЧИТЬ ПО | ЕстьНомерСтроки, | РегистрацияПодсчетаПосетителей.Проведен УБЫВ"; Запрос.УстановитьПараметр("ДатаНачала" , НачалоДня(ДатаВремяРегистрации)); Запрос.УстановитьПараметр("ДатаОкончания" , КонецДня(ДатаВремяРегистрации)); Запрос.УстановитьПараметр("СчетчикПодсчетаПосетителей", СчетчикПодсчетаПосетителей); Запрос.УстановитьПараметр("ВремяРегистрации" , ВремяРегистрации ); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Если Выборка.Следующий() Тогда ДокументРегистрации = Выборка.Ссылка.ПолучитьОбъект(); НомерСтроки = Выборка.НомерСтроки; Иначе ДокументРегистрации = Документы.РегистрацияПодсчетаПосетителей.СоздатьДокумент(); ДокументРегистрации.Дата = ДатаВремяРегистрации; ДокументРегистрации.СчетчикПодсчетаПосетителей = СчетчикПодсчетаПосетителей; ДокументРегистрации.Магазин = СчетчикПодсчетаПосетителей.Магазин; ДокументРегистрации.Ответственный = ПараметрыСеанса.ТекущийПользователь; НомерСтроки = 0; ЗаменилиДанныеСтатистики = Истина; ДокументРегистрации.СтатистикаПодсчетаСотрудников.Загрузить(СчетчикПодсчетаПосетителей.СтатистикаПодсчетаСотрудников.Выгрузить()); КонецЕсли; КонецЕсли; Если Не ДокументРегистрацииДляЗаписи = Неопределено И ДокументРегистрацииДляЗаписи <> ДокументРегистрации Тогда ЗаменилиДанныеСтатистики = Ложь; Попытка Если ДокументРегистрацииДляЗаписи.ДанныеПодсчета.Количество()>0 Тогда ДокументРегистрацииДляЗаписи.Записать(РежимЗаписиДокумента.Проведение); КонецЕсли; ДокументРегистрацииДляЗаписи = Неопределено; КоличествоОбработанныхВТранзАкцииДокументов = КоличествоОбработанныхВТранзАкцииДокументов + 1; Исключение СтрСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '%1 |Файл - %2 |Ошибка проведения документа за дату %3'"), ЗаголовокСообщения, ИмяФайла, Формат(ДокументРегистрацииДляЗаписи.Дата, "ДЛФ=D") ); ЗаписатьВЖурналИВыдатьСообщение(СтрСообщения, Истина); БылиКритическиеОшибки = Истина; ФайлНеСодержитОшибок = Ложь; КонецПопытки; Если Не ДанныеНастройки.КоличествоЭлементовВТранзакции = 0 И КоличествоОбработанныхВТранзАкцииДокументов = ДанныеНастройки.КоличествоЭлементовВТранзакции Тогда ЗафиксироватьТранзакцию(); КоличествоОбработанныхВТранзАкцииДокументов = 0; НачатьТранзакцию(); КонецЕсли; КонецЕсли; Если НомерСтроки = 0 Тогда СтрокаДокумента = ДокументРегистрации.ДанныеПодсчета.Добавить(); ИначеЕсли ДанныеНастройки.ЗаменятьДанныеПриПовторнойЗагрузке Тогда СтрокаДокумента = ДокументРегистрации.ДанныеПодсчета[НомерСтроки - 1]; КонецЕсли; Если НомерСтроки = 0 или ДанныеНастройки.ЗаменятьДанныеПриПовторнойЗагрузке Тогда СтрокаДокумента.ВремяРегистрации = ВремяРегистрации; СтрокаДокумента.КоличествоВходящих = КоличествоВходящих; СтрокаДокумента.КоличествоВыходящих = КоличествоВыходящих; ДокументРегистрацииДляЗаписи = ДокументРегистрации; КонецЕсли; Если НЕ ЗаменилиДанныеСтатистики И ДанныеНастройки.ЗаменятьДанныеПриПовторнойЗагрузке Тогда ДокументРегистрации.СтатистикаПодсчетаСотрудников.Загрузить(СчетчикПодсчетаПосетителей.СтатистикаПодсчетаСотрудников.Выгрузить()); ЗаменилиДанныеСтатистики = Истина; КонецЕсли; КонецЕсли; КонецЦикла; //цикл по узлам Исключение СтрСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файл - %1 |Не правильная структура файла'"), ИмяФайла ); ЗаписатьВЖурналИВыдатьСообщение(СтрСообщения, Истина); БылиНеКритическиеОшибки = Истина; ФайлНеСодержитОшибок = Ложь; КонецПопытки; Если Не ДокументРегистрацииДляЗаписи = Неопределено Тогда Попытка Если ДокументРегистрацииДляЗаписи.ДанныеПодсчета.Количество()>0 Тогда ДокументРегистрацииДляЗаписи.Записать(РежимЗаписиДокумента.Проведение); КонецЕсли; ДокументРегистрацииДляЗаписи = Неопределено; КоличествоОбработанныхВТранзАкцииДокументов = КоличествоОбработанныхВТранзАкцииДокументов + 1; Исключение СтрСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '%1 |Файл - %2 |Ошибка проведения документа за дату %3'"), ЗаголовокСообщения, ИмяФайла, Формат(ДокументРегистрацииДляЗаписи.Дата, "ДЛФ=D") ); ЗаписатьВЖурналИВыдатьСообщение(СтрСообщения, Истина); БылиКритическиеОшибки = Истина; ФайлНеСодержитОшибок = Ложь; КонецПопытки; Если Не ДанныеНастройки.КоличествоЭлементовВТранзакции = 0 И КоличествоОбработанныхВТранзАкцииДокументов = ДанныеНастройки.КоличествоЭлементовВТранзакции Тогда ЗафиксироватьТранзакцию(); КоличествоОбработанныхВТранзАкцииДокументов = 0; НачатьТранзакцию(); КонецЕсли; КонецЕсли; ЧтениеXML.Закрыть(); Если ФайлНеСодержитОшибок Тогда МассивОбработанныхФайлов.Добавить(НайденныйФайл); КонецЕсли; КонецЕсли; КонецЦикла; // цикл по файлам ЗафиксироватьТранзакцию(); Если ДанныеНастройки.УдалятьУспешноЗагруженныеФайлы Тогда Если ДанныеНастройки.ВидТранспортаСообщенийОбменаПоУмолчанию = Перечисления.ВидыТранспортаСообщенийОбмена.FILE Тогда Для каждого ВременныйФайл Из МассивОбработанныхФайлов Цикл УдалитьФайлы(ВременныйФайл.ПолноеИмя); КонецЦикла; ИначеЕсли ДанныеНастройки.ВидТранспортаСообщенийОбменаПоУмолчанию = Перечисления.ВидыТранспортаСообщенийОбмена.FTP Тогда FTPСоединение.УстановитьТекущийКаталог(КаталогНаСервере); Для каждого ВременныйФайл Из МассивОбработанныхФайлов Цикл FTPСоединение.Удалить(ВременныйФайл.Имя); КонецЦикла; КонецЕсли; КонецЕсли; Если БылиКритическиеОшибки Тогда СтрСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '%1 |Были критические ошибки при загрузке'"), ЗаголовокСообщения ); ЗаписатьВЖурналИВыдатьСообщение(СтрСообщения, Истина); ИначеЕсли БылиНеКритическиеОшибки Тогда СтрСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '%1 |Были не критические ошибки при загрузке'"), ЗаголовокСообщения ); ЗаписатьВЖурналИВыдатьСообщение(СтрСообщения, Истина); Иначе СтрСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '%1 |Загрузка прошла успешно!'"), ЗаголовокСообщения ); ЗаписатьВЖурналИВыдатьСообщение(СтрСообщения, Ложь); КонецЕсли;