-
Отзыв к заданию
22 февраля 2019 в 15:06:19
Спасибо за помощь. Очень оперативно, и качественно.
-
Сообщение на форуме
21 февраля 2019 в 11:19:03
////////////////////////////////////////////////////////////////////////////////
// Блок для работы со статус-строкой формы
Перем СтатусСтрока;
//******************************************************************************
// ПоказатьВСтатусСтроке(Стр="")
// Параметры:
// Стр Строка
// Описание:
// Выводит сообщение в статус-строке формы
Процедура ПоказатьВСтатусСтроке(Стр="")
СтатусСтрока = Стр;
Форма.Обновить(0);
КонецПроцедуры // ПоказатьВСтатусСтроке()
//******************************************************************************
// ПрогрессорВСтатусстроку(Пар1=1,Пар2=0)
// Параметры:
// Пар1 Число - Количество значений
// Пар2 Число - Текущее значение
// Описание:
// Отображает "прогрессор" в статус-строке формы
Процедура ПрогрессорВСтатусстроку(Пар1=1,Пар2=0)
Перем Стр, Процент, СтрПрогресс;
Стр = "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||";
СтрВсего = "....................................................................................................";
Процент = Мин(Цел(100 * Пар2/Пар1),100);
Если Процент < 100 Тогда
СтрПрогресс = Формат(Процент,"Ч(0)3") + "% " + Лев(Стр,Процент) + Лев(СтрВсего,100-Процент);
Иначе
СтрПрогресс = "Готово";
Конецесли;
ПоказатьВСтатусСтроке("Выполнено: "+СтрПрогресс);
КонецПроцедуры // ПрогрессорВСтатусстроку()
////////////////////////////////////////////////////////////////////////////////
//******************************************************************************
// ФайлПуть(ИмяФайла="")
// Параметры:
// ИмяФайла Строка - Полное имя файла
// Возвращаемое значение:
// Строка - имя файла
// Описание:
// Из полного имени файла возвращает строку, содержащую имя файла без пути.
Функция ФайлПуть(ИмяФайла="")
Перем Зн, Стр, Позиция;
Зн = "";
Стр = СокрП(ИмяФайла);
Позиция = 0;
Для i=1 по СтрДлина(Стр) Цикл
Если Сред(Стр,i,1)="" Тогда
Позиция = i;
Конецесли;
КонецЦикла;
Если Позиция>0 Тогда
Зн = Лев(Стр,Позиция);
Конецесли;
Возврат Зн;
КонецФункции // ФайлПуть()
//******************************************************************************
// ФайлИмя(ИмяФайла="")
// Параметры:
// ИмяФайла Строка - Полное имя файла
// Возвращаемое значение:
// Строка - Путь
// Описание:
// Из полного имени файла возвращает строку, содержащую путь.
Функция ФайлИмя(ИмяФайла="")
Перем Зн, Стр, Позиция;
Зн = "";
Стр = СокрП(ИмяФайла);
Позиция = 0;
Для i=1 по СтрДлина(Стр) Цикл
Если Сред(Стр,i,1)="" Тогда
Позиция = i;
Конецесли;
КонецЦикла;
Если Позиция>0 Тогда
Зн = Сред(Стр,Позиция+1);
Конецесли;
Возврат Зн;
КонецФункции // Функция()
Функция ИмяПапкиИБ()
Перем Зн, Стр, Позиция;
Перем Сп;
Зн = "";
Стр = СокрЛП(КаталогИБ());
Сп = СоздатьОбъект("СписокЗначений");
Сп.ИзСтрокиСРазделителями(""""+СтрЗаменить(Стр,"",""","""));
Позиция = Макс(1,(Сп.РазмерСписка()-1));
Сп.ПолучитьЗначение(Позиция,Зн);
Возврат Зн;
КонецФункции // Функция()
//******************************************************************************
// ПриВыбореФайла()
// Описание:
// Обработка выбора файла загрузки
Процедура ПриВыбореФайла()
Перем Кат;
Если ФС.СуществуетФайл(ФайлПуть(Файл)+"NUL")=1 Тогда
Кат = ФайлПуть(Файл);
Иначе
Кат = КаталогПользователя();
КонецЕсли;
ИмяФайла = "";
ФС.ВыбратьКаталог(Кат,"Выберите Папку",120);
Файл = Кат;
КонецПроцедуры // ПриВыбореФайла()
//******************************************************************************
// ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандОбр)
// Описание:
// Предопределенная процдура
Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандОбр)
Если ИдентЭлемДиалога = "Файл" Тогда
ФлагСтандОбр = 0;
ПриВыбореФайла();
КонецЕсли;
КонецПроцедуры //ПриНачалеВыбораЗначения
//******************************************************************************
// ОчиститьСтроку(пСтр, пУдаляемыеСимволы = "")
// Параметры:
// пСтр Строка - Строка, которую нужно обработать
// пУдаляемыеСимволы Строка - Строка символов, которые нужно удалить из обрабатываемой строки
// Возвращаемое значение:
// Строка
// Описание:
// Удаляет из исходной строки начальные, конечные и двойные пробелы
// Удаляет из исходной строки символы, переданные в параметре пУдаляемыеСимволы
Функция ОчиститьСтроку(пСтр, пУдаляемыеСимволы = "")
Перем Зн;
Перем Стр;
Стр = СокрЛП(пСтр);
// удаляем двойные пробелы
Пока Найти(Стр," ") > 0 Цикл
Стр = СтрЗаменить(Стр," "," ");
КонецЦикла;
// удаляем прочие символы
УдаляемыеСимволы = пУдаляемыеСимволы;
Для i = 1 по СтрДлина(УдаляемыеСимволы) Цикл
СтрПоиска = Сред(УдаляемыеСимволы,i,1);
Пока Найти(Стр,СтрПоиска) > 0 Цикл
Стр = СтрЗаменить(Стр,СтрПоиска,"");
КонецЦикла;
КонецЦикла;
Зн = СокрЛП(Стр);
Возврат Зн;
КонецФункции // ОчиститьСтроку()
//******************************************************************************
// СохранитьВосстановитьЗначения(пПар = "Сохранить")
// Параметры:
// пПар Строка; "Сохранить", "Восстановить"
// Описание:
// Сохранение/восстановление настроек отчета между сеансами
// Дата изменения:
//
// Примечание:
//
Процедура СохранитьВосстановитьЗначения(пПар = "Сохранить")
Если пПар = "Сохранить" Тогда
СохранитьЗначение("Файл",Файл);
СохранитьЗначение("рдИмяБД",рдИмяБД);
СохранитьЗначение("НачДата",НачДата);
СохранитьЗначение("КонДата",КонДата);
ИначеЕсли пПар = "Восстановить" Тогда
Файл = ВосстановитьЗначение("Файл");
рдИмяБД = ВосстановитьЗначение("рдИмяБД");
НачДата = ВосстановитьЗначение("НачДата");
КонДата = ВосстановитьЗначение("КонДата");
Конецесли;
КонецПроцедуры // СохранитьВосстановитьЗначения()
//******************************************************************************
//()
// Параметры:
// Возвращаемое значение:
// Описание:
Функция СуммаКОплате(пАбонент)
Перем Зн,Запрос, ТекстЗапроса;
Зн=0;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с НачДата по КонДата;
|Обрабатывать НеПомеченныеНаУдаление;
|Квитанция = Документ.Квитанция.ТекущийДокумент;
|Абонент = Документ.Квитанция.Абонент;
|СуммаКОплате = Документ.Квитанция.СуммаКОплате;
//Это в базе Центр
//|СуммаКОплате = Документ.Квитанция.Сумма - Документ.Квитанция.СуммаЛьгот - Документ.Квитанция.Аванс + Документ.Квитанция.СуммаПоАкту - Документ.Квитанция.СуммаРанееОпл - Документ.Квитанция.СуммаСубсидии + Документ.Квитанция.Перерасчет-Документ.Квитанция.СуммаЕДК;
|Функция СуммаКОплатеСумма = Сумма(СуммаКОплате);
|Группировка Абонент без групп;
|Условие(Абонент=пАбонент);
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат Зн;
КонецЕсли;
Зн = Запрос.СуммаКОплатеСумма;
Возврат Зн;
//Пока Запрос.Группировка(1) = 1 Цикл
//КонецЦикла;
КонецФункции
//******************************************************************************
//()
// Параметры:
// Возвращаемое значение:
// Описание:
Процедура СоздатьДБФ(пИмяБД)
Перем ДБФ;
ДБФ = СоздатьОбъект("XBase");
ДБФ.КодоваяСтраница(пДосКодировка);
ДБФ.ДобавитьПоле("LS_ID",2,12,0);
ДБФ.ДобавитьПоле("FIO",2,80,0);
//ДБФ.ДобавитьПоле("ADDRESS",2,150,0);
ДБФ.ДобавитьПоле("RAION",2,40,0);
ДБФ.ДобавитьПоле("NPUNKT",2,50,0);
ДБФ.ДобавитьПоле("ULICA",2,60,0);
ДБФ.ДобавитьПоле("ZDANIE",2,10,0);
ДБФ.ДобавитьПоле("KVARTIRA",2,5,0);
ДБФ.ДобавитьПоле("SUMMA",1,8,2);
ДБФ.СоздатьФайл(пИмяБД);
ДБФ.ЗакрытьФайл();
КонецПроцедуры
//******************************************************************************
Функция СодержитНеЧисла(пСтр)
Перем Стр;
Стр = СокрЛП(Строка(пСтр));
СтрЧисла = "1234567890";
Для i=1 По СтрДлина(Стр) Цикл
Если Найти(СтрЧисла,Сред(Стр,i,1))=0 Тогда
Возврат 0;
//Возврат 1;
КонецЕсли;
КонецЦикла;
Возврат 0;
КонецФункции
//******************************************************************************
// Загрузить(пПар = "Файл")
// Параметры:
// пПар Строка - вариант загрузки "Файл", "Интернет"
// Описание:
// Обработка загрузки файла
Процедура Выгрузить(пПар = "Файл")
Перем Таблица;
Перем ДБФ;
ДБФ = СоздатьОбъект("XBase");
ДБФ.КодоваяСтраница(пДосКодировка);
ИмяБД = СокрЛП(Файл)+""+СокрЛП(рдИмяБД)+".dbf";
Если ФС.СуществуетФайл(ИмяБД)=0 Тогда
СоздатьДБФ(ИмяБД);
КонецЕсли;
Если ФС.СуществуетФайл(ИмяБД)=1 Тогда
Спр=СоздатьОбъект("Справочник.Абоненты");
ДБФ.ОткрытьФайл(ИмяБД,,0);
//Не очищаем. Добавляем записи в тот же файл, чтобы несколько баз данных РС слить в один файл
//ДБФ.ОчиститьФайл();
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
Если Спр.ЭтоГруппа()=1 Тогда
Продолжить;
КонецЕсли;
Если Спр.ПометкаУдаления()=1 Тогда
Продолжить;
КонецЕсли;
ФИО = ОчиститьСтроку(Спр.Наименование, ",-");
Если ПустаяСтрока(ФИО)=1 Тогда
Продолжить;
КонецЕсли;
//Лицевой счет надо подкорректировать в зависимости от конфигурации базы в каждой РС
Попытка
ЛицевойСчет = СокрЛП(Спр.Префикс) + СокрЛП(Спр.Код);
Исключение
ЛицевойСчет = СокрЛП(Спр.Код);
КонецПопытки;
Если ПустаяСтрока(ЛицевойСчет)=1 Тогда
Продолжить;
КонецЕсли;
Если СтрДлина(ЛицевойСчет)<12 Тогда
Сообщить("Не выгружен счет менее 12 символов: "+ЛицевойСчет+" "+ФИО);
Продолжить;
КонецЕсли;
Если СодержитНеЧисла(ЛицевойСчет)=1 Тогда
Сообщить("Не выгружен счет содержит не числовые символы: "+ЛицевойСчет+" "+ФИО);
Продолжить;
КонецЕсли;
Если ПустаяСтрока(АдресСтр(Спр.ТекущийЭлемент()))=1 Тогда
Сообщить("Не выгружен пустой адрес: "+ЛицевойСчет+" "+ФИО);
Продолжить;
КонецЕсли;
ПоказатьВСтатусСтроке(Спр.Наименование);
ДБФ.Добавить();
ДБФ.LS_ID = ЛицевойСчет;
ДБФ.FIO = ФИО;
//ДБФ.ADDRESS = ОчиститьСтроку(АдресСтр(Спр.ТекущийЭлемент()));
ДБФ.RAION = ОчиститьСтроку(Спр.Район);
ДБФ.NPUNKT = ОчиститьСтроку(""+Спр.Город+Спр.НаселенныйПункт);
ДБФ.ULICA = ОчиститьСтроку(Спр.Улица);
ДБФ.ZDANIE = ОчиститьСтроку(Спр.Дом);
Если ПустаяСтрока(Спр.Корпус)>0 Тогда
ДБФ.ZDANIE = ОчиститьСтроку(""+Спр.Дом+"/"+Спр.Корпус);
КонецЕсли;
ДБФ.KVARTIRA = ОчиститьСтроку(Спр.Квартира);
ДБФ.SUMMA = СуммаКОплате(Спр.ТекущийЭлемент());
ДБФ.Записать();
КонецЦикла;
ДБФ.ЗакрытьФайл();
ПоказатьВСтатусСтроке("Выгружен файл "+ИмяБД);
Иначе
Предупреждение("Не найден файл БД: "+ИмяБД+". Выгрузка не возможна.");
КонецЕсли;
КонецПроцедуры // Загрузить()
//******************************************************************************
Процедура ОбъединитьДБФ()
ИмяБД = СокрЛП(Файл)+"all.dbf";
Если ФС.СуществуетФайл(ИмяБД)=0 Тогда
СоздатьДБФ(ИмяБД);
КонецЕсли;
ОбщийДБФ = СоздатьОбъект("XBase");
ОбщийДБФ.КодоваяСтраница(пДосКодировка);
ОбщийДБФ.ОткрытьФайл(ИмяБД,,0);
ОбщийДБФ.ОчиститьФайл();
ДБФ = СоздатьОбъект("XBase");
ДБФ.КодоваяСтраница(пДосКодировка);
ФС.УстТекКаталог(СокрЛП(Файл));
НайденныйФайл = ФС.НайтиПервыйФайл("*.dbf");
Пока ПустаяСтрока(НайденныйФайл) = 0 Цикл
Если НайденныйФайл = "all.dbf" Тогда
//ищем следующий файл
Иначе
ДБФ.ОткрытьФайл(НайденныйФайл,,1);
Если ДБФ.Открыта()=1 Тогда
Сообщить("Объединение файла "+НайденныйФайл);
ДБФ.Первая();
Пока ДБФ.ВКонце() = 0 Цикл
ОбщийДБФ.Добавить();
ОбщийДБФ.LS_ID = ДБФ.LS_ID;
ОбщийДБФ.FIO = ДБФ.FIO;
//ОбщийДБФ.ADDRESS = ДБФ.ADDRESS;
ОбщийДБФ.RAION = ДБФ.RAION;
ОбщийДБФ.NPUNKT = ДБФ.NPUNKT;
ОбщийДБФ.ULICA = ДБФ.ULICA;
ОбщийДБФ.ZDANIE = ДБФ.ZDANIE;
ОбщийДБФ.KVARTIRA = ДБФ.KVARTIRA;
ОбщийДБФ.SUMMA = ДБФ.SUMMA;
ОбщийДБФ.Записать();
ДБФ.Следующая();
КонецЦикла;
ДБФ.ЗакрытьФайл();
КонецЕсли;
КонецЕсли;
НайденныйФайл = ФС.НайтиСледующийФайл();
КонецЦикла;
ОбщийДБФ.ЗакрытьФайл();
Сообщить("Готово!");
КонецПроцедуры
//******************************************************************************
Процедура ПроверитьИсправитьДБФ()
Перем СпОбработанныеСчета;
СпОбработанныеСчета = СоздатьОбъект("СписокЗначений");
ИмяБД = СокрЛП(Файл)+"all_new.dbf";
Если ФС.СуществуетФайл(ИмяБД)=0 Тогда
СоздатьДБФ(ИмяБД);
КонецЕсли;
ОбщийДБФ = СоздатьОбъект("XBase");
ОбщийДБФ.КодоваяСтраница(пДосКодировка);
ОбщийДБФ.ОткрытьФайл(ИмяБД,,0);
ОбщийДБФ.ОчиститьФайл();
ДБФ = СоздатьОбъект("XBase");
ДБФ.КодоваяСтраница(пДосКодировка);
ФС.УстТекКаталог(СокрЛП(Файл));
НайденныйФайл = ФС.НайтиПервыйФайл("*.dbf");
Пока ПустаяСтрока(НайденныйФайл) = 0 Цикл
//Если НайденныйФайл = "all_new.dbf" Тогда
// //ищем следующий файл
Если НРег(НайденныйФайл) = "all.dbf" Тогда
ДБФ.ОткрытьФайл(НайденныйФайл,,1);
Если ДБФ.Открыта()=1 Тогда
Сообщить("Проверка файла "+НайденныйФайл);
КоличествоСтрокДБФ = ДБФ.КоличествоЗаписей();
СпОбработанныеСчета.УдалитьВсе();
ДБФ.Первая();
Пока ДБФ.ВКонце() = 0 Цикл
ЕстьОшибка = 0;
Если ПустаяСтрока(ДБФ.LS_ID)=1 Тогда
Сообщить("Пустой ЛС"+ДБФ.FIO + " " +ДБФ.LS_ID);
ЕстьОшибка = 1;
КонецЕсли;
Если СтрДлина(СокрЛП(Строка(ДБФ.LS_ID)))=12 Тогда
Иначе
Сообщить("Не правильный ЛС менее 12 символов "+ДБФ.FIO + " " +ДБФ.LS_ID);
ЕстьОшибка = 1;
КонецЕсли;
Если СодержитНеЧисла(ДБФ.LS_ID)=1 Тогда
Сообщить("Не правильный ЛС содержит не числовые символы "+ДБФ.FIO + " " +ДБФ.LS_ID);
ЕстьОшибка = 1;
КонецЕсли;
Если ПустаяСтрока(ДБФ.FIO)=1 Тогда
Сообщить("Пустой ФИО "+ДБФ.LS_ID);
ЕстьОшибка = 1;
КонецЕсли;
Если ПустаяСтрока(""+ДБФ.RAION+ДБФ.NPUNKT+ДБФ.ULICA+ДБФ.ZDANIE+ДБФ.KVARTIRA)=1 Тогда
Сообщить("Пустой Адрес "+ДБФ.FIO + " " +ДБФ.LS_ID);
ЕстьОшибка = 1;
КонецЕсли;
Если СпОбработанныеСчета.Принадлежит(ДБФ.LS_ID)=1 Тогда
Сообщить("Дублирование ЛС "+ДБФ.FIO + " " +ДБФ.LS_ID);
ЕстьОшибка = 1;
КонецЕсли;
Если ЕстьОшибка = 0 Тогда
ОбщийДБФ.Добавить();
ОбщийДБФ.LS_ID = ДБФ.LS_ID;
ОбщийДБФ.FIO = ДБФ.FIO;
//ОбщийДБФ.ADDRESS = ДБФ.ADDRESS;
ОбщийДБФ.RAION = ДБФ.RAION;
ОбщийДБФ.NPUNKT = ДБФ.NPUNKT;
ОбщийДБФ.ULICA = ДБФ.ULICA;
ОбщийДБФ.ZDANIE = ДБФ.ZDANIE;
ОбщийДБФ.KVARTIRA = ДБФ.KVARTIRA;
ОбщийДБФ.SUMMA = ДБФ.SUMMA;
ОбщийДБФ.Записать();
Если СпОбработанныеСчета.РазмерСписка()>5000 Тогда
СпОбработанныеСчета.УдалитьВсе();
КонецЕсли;
СпОбработанныеСчета.ДобавитьЗначение(ДБФ.LS_ID,ДБФ.LS_ID);
КонецЕсли;
ПрогрессорВСтатусстроку(КоличествоСтрокДБФ,ДБФ.НомерЗаписи());
ДБФ.Следующая();
КонецЦикла;
ДБФ.ЗакрытьФайл();
КонецЕсли;
КонецЕсли;
НайденныйФайл = ФС.НайтиСледующийФайл();
КонецЦикла;
ОбщийДБФ.ЗакрытьФайл();
Сообщить("Готово!");
ПоказатьВСтатусСтроке("Готово!");
КонецПроцедуры
//******************************************************************************
// ПриЗакрытии()
// Описание:
// предопределенная процедура
Процедура ПриЗакрытии()
СохранитьВосстановитьЗначения("Сохранить");
КонецПроцедуры // ПриЗакрытии()
// Основная программа
СохранитьВосстановитьЗначения("Восстановить");
пДосКодировка=0;
-
Сообщение на форуме
21 февраля 2019 в 11:18:27
////////////////////////////////////////////////////////////////////////////////
// Блок для работы со статус-строкой формы
Перем СтатусСтрока;
//******************************************************************************
// ПоказатьВСтатусСтроке(Стр="")
// Параметры:
// Стр Строка
// Описание:
// Выводит сообщение в статус-строке формы
Процедура ПоказатьВСтатусСтроке(Стр="")
СтатусСтрока = Стр;
Форма.Обновить(0);
КонецПроцедуры // ПоказатьВСтатусСтроке()
//******************************************************************************
// ПрогрессорВСтатусстроку(Пар1=1,Пар2=0)
// Параметры:
// Пар1 Число - Количество значений
// Пар2 Число - Текущее значение
// Описание:
// Отображает "прогрессор" в статус-строке формы
Процедура ПрогрессорВСтатусстроку(Пар1=1,Пар2=0)
Перем Стр, Процент, СтрПрогресс;
Стр = "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||";
СтрВсего = "....................................................................................................";
Процент = Мин(Цел(100 * Пар2/Пар1),100);
Если Процент < 100 Тогда
СтрПрогресс = Формат(Процент,"Ч(0)3") + "% " + Лев(Стр,Процент) + Лев(СтрВсего,100-Процент);
Иначе
СтрПрогресс = "Готово";
Конецесли;
ПоказатьВСтатусСтроке("Выполнено: "+СтрПрогресс);
КонецПроцедуры // ПрогрессорВСтатусстроку()
////////////////////////////////////////////////////////////////////////////////
//******************************************************************************
// ФайлПуть(ИмяФайла="")
// Параметры:
// ИмяФайла Строка - Полное имя файла
// Возвращаемое значение:
// Строка - имя файла
// Описание:
// Из полного имени файла возвращает строку, содержащую имя файла без пути.
Функция ФайлПуть(ИмяФайла="")
Перем Зн, Стр, Позиция;
Зн = "";
Стр = СокрП(ИмяФайла);
Позиция = 0;
Для i=1 по СтрДлина(Стр) Цикл
Если Сред(Стр,i,1)="" Тогда
Позиция = i;
Конецесли;
КонецЦикла;
Если Позиция>0 Тогда
Зн = Лев(Стр,Позиция);
Конецесли;
Возврат Зн;
КонецФункции // ФайлПуть()
//******************************************************************************
// ФайлИмя(ИмяФайла="")
// Параметры:
// ИмяФайла Строка - Полное имя файла
// Возвращаемое значение:
// Строка - Путь
// Описание:
// Из полного имени файла возвращает строку, содержащую путь.
Функция ФайлИмя(ИмяФайла="")
Перем Зн, Стр, Позиция;
Зн = "";
Стр = СокрП(ИмяФайла);
Позиция = 0;
Для i=1 по СтрДлина(Стр) Цикл
Если Сред(Стр,i,1)="" Тогда
Позиция = i;
Конецесли;
КонецЦикла;
Если Позиция>0 Тогда
Зн = Сред(Стр,Позиция+1);
Конецесли;
Возврат Зн;
КонецФункции // Функция()
Функция ИмяПапкиИБ()
Перем Зн, Стр, Позиция;
Перем Сп;
Зн = "";
Стр = СокрЛП(КаталогИБ());
Сп = СоздатьОбъект("СписокЗначений");
Сп.ИзСтрокиСРазделителями(""""+СтрЗаменить(Стр,"",""","""));
Позиция = Макс(1,(Сп.РазмерСписка()-1));
Сп.ПолучитьЗначение(Позиция,Зн);
Возврат Зн;
КонецФункции // Функция()
//******************************************************************************
// ПриВыбореФайла()
// Описание:
// Обработка выбора файла загрузки
Процедура ПриВыбореФайла()
Перем Кат;
Если ФС.СуществуетФайл(ФайлПуть(Файл)+"NUL")=1 Тогда
Кат = ФайлПуть(Файл);
Иначе
Кат = КаталогПользователя();
КонецЕсли;
ИмяФайла = "";
ФС.ВыбратьКаталог(Кат,"Выберите Папку",120);
Файл = Кат;
КонецПроцедуры // ПриВыбореФайла()
//******************************************************************************
// ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандОбр)
// Описание:
// Предопределенная процдура
Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандОбр)
Если ИдентЭлемДиалога = "Файл" Тогда
ФлагСтандОбр = 0;
ПриВыбореФайла();
КонецЕсли;
КонецПроцедуры //ПриНачалеВыбораЗначения
//******************************************************************************
// ОчиститьСтроку(пСтр, пУдаляемыеСимволы = "")
// Параметры:
// пСтр Строка - Строка, которую нужно обработать
// пУдаляемыеСимволы Строка - Строка символов, которые нужно удалить из обрабатываемой строки
// Возвращаемое значение:
// Строка
// Описание:
// Удаляет из исходной строки начальные, конечные и двойные пробелы
// Удаляет из исходной строки символы, переданные в параметре пУдаляемыеСимволы
Функция ОчиститьСтроку(пСтр, пУдаляемыеСимволы = "")
Перем Зн;
Перем Стр;
Стр = СокрЛП(пСтр);
// удаляем двойные пробелы
Пока Найти(Стр," ") > 0 Цикл
Стр = СтрЗаменить(Стр," "," ");
КонецЦикла;
// удаляем прочие символы
УдаляемыеСимволы = пУдаляемыеСимволы;
Для i = 1 по СтрДлина(УдаляемыеСимволы) Цикл
СтрПоиска = Сред(УдаляемыеСимволы,i,1);
Пока Найти(Стр,СтрПоиска) > 0 Цикл
Стр = СтрЗаменить(Стр,СтрПоиска,"");
КонецЦикла;
КонецЦикла;
Зн = СокрЛП(Стр);
Возврат Зн;
КонецФункции // ОчиститьСтроку()
//******************************************************************************
// СохранитьВосстановитьЗначения(пПар = "Сохранить")
// Параметры:
// пПар Строка; "Сохранить", "Восстановить"
// Описание:
// Сохранение/восстановление настроек отчета между сеансами
// Дата изменения:
//
// Примечание:
//
Процедура СохранитьВосстановитьЗначения(пПар = "Сохранить")
Если пПар = "Сохранить" Тогда
СохранитьЗначение("Файл",Файл);
СохранитьЗначение("рдИмяБД",рдИмяБД);
СохранитьЗначение("НачДата",НачДата);
СохранитьЗначение("КонДата",КонДата);
ИначеЕсли пПар = "Восстановить" Тогда
Файл = ВосстановитьЗначение("Файл");
рдИмяБД = ВосстановитьЗначение("рдИмяБД");
НачДата = ВосстановитьЗначение("НачДата");
КонДата = ВосстановитьЗначение("КонДата");
Конецесли;
КонецПроцедуры // СохранитьВосстановитьЗначения()
//******************************************************************************
//()
// Параметры:
// Возвращаемое значение:
// Описание:
Функция СуммаКОплате(пАбонент)
Перем Зн,Запрос, ТекстЗапроса;
Зн=0;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с НачДата по КонДата;
|Обрабатывать НеПомеченныеНаУдаление;
|Квитанция = Документ.Квитанция.ТекущийДокумент;
|Абонент = Документ.Квитанция.Абонент;
|СуммаКОплате = Документ.Квитанция.СуммаКОплате;
//Это в базе Центр
//|СуммаКОплате = Документ.Квитанция.Сумма - Документ.Квитанция.СуммаЛьгот - Документ.Квитанция.Аванс + Документ.Квитанция.СуммаПоАкту - Документ.Квитанция.СуммаРанееОпл - Документ.Квитанция.СуммаСубсидии + Документ.Квитанция.Перерасчет-Документ.Квитанция.СуммаЕДК;
|Функция СуммаКОплатеСумма = Сумма(СуммаКОплате);
|Группировка Абонент без групп;
|Условие(Абонент=пАбонент);
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат Зн;
КонецЕсли;
Зн = Запрос.СуммаКОплатеСумма;
Возврат Зн;
//Пока Запрос.Группировка(1) = 1 Цикл
//КонецЦикла;
КонецФункции
//******************************************************************************
//()
// Параметры:
// Возвращаемое значение:
// Описание:
Процедура СоздатьДБФ(пИмяБД)
Перем ДБФ;
ДБФ = СоздатьОбъект("XBase");
ДБФ.КодоваяСтраница(пДосКодировка);
ДБФ.ДобавитьПоле("LS_ID",2,12,0);
ДБФ.ДобавитьПоле("FIO",2,80,0);
//ДБФ.ДобавитьПоле("ADDRESS",2,150,0);
ДБФ.ДобавитьПоле("RAION",2,40,0);
ДБФ.ДобавитьПоле("NPUNKT",2,50,0);
ДБФ.ДобавитьПоле("ULICA",2,60,0);
ДБФ.ДобавитьПоле("ZDANIE",2,10,0);
ДБФ.ДобавитьПоле("KVARTIRA",2,5,0);
ДБФ.ДобавитьПоле("SUMMA",1,8,2);
ДБФ.СоздатьФайл(пИмяБД);
ДБФ.ЗакрытьФайл();
КонецПроцедуры
//******************************************************************************
Функция СодержитНеЧисла(пСтр)
Перем Стр;
Стр = СокрЛП(Строка(пСтр));
СтрЧисла = "1234567890";
Для i=1 По СтрДлина(Стр) Цикл
Если Найти(СтрЧисла,Сред(Стр,i,1))=0 Тогда
Возврат 0;
//Возврат 1;
КонецЕсли;
КонецЦикла;
Возврат 0;
КонецФункции
//******************************************************************************
// Загрузить(пПар = "Файл")
// Параметры:
// пПар Строка - вариант загрузки "Файл", "Интернет"
// Описание:
// Обработка загрузки файла
Процедура Выгрузить(пПар = "Файл")
Перем Таблица;
Перем ДБФ;
ДБФ = СоздатьОбъект("XBase");
ДБФ.КодоваяСтраница(пДосКодировка);
ИмяБД = СокрЛП(Файл)+""+СокрЛП(рдИмяБД)+".dbf";
Если ФС.СуществуетФайл(ИмяБД)=0 Тогда
СоздатьДБФ(ИмяБД);
КонецЕсли;
Если ФС.СуществуетФайл(ИмяБД)=1 Тогда
Спр=СоздатьОбъект("Справочник.Абоненты");
ДБФ.ОткрытьФайл(ИмяБД,,0);
//Не очищаем. Добавляем записи в тот же файл, чтобы несколько баз данных РС слить в один файл
//ДБФ.ОчиститьФайл();
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
Если Спр.ЭтоГруппа()=1 Тогда
Продолжить;
КонецЕсли;
Если Спр.ПометкаУдаления()=1 Тогда
Продолжить;
КонецЕсли;
ФИО = ОчиститьСтроку(Спр.Наименование, ",-");
Если ПустаяСтрока(ФИО)=1 Тогда
Продолжить;
КонецЕсли;
//Лицевой счет надо подкорректировать в зависимости от конфигурации базы в каждой РС
Попытка
ЛицевойСчет = СокрЛП(Спр.Префикс) + СокрЛП(Спр.Код);
Исключение
ЛицевойСчет = СокрЛП(Спр.Код);
КонецПопытки;
Если ПустаяСтрока(ЛицевойСчет)=1 Тогда
Продолжить;
КонецЕсли;
Если СтрДлина(ЛицевойСчет)<12 Тогда
Сообщить("Не выгружен счет менее 12 символов: "+ЛицевойСчет+" "+ФИО);
Продолжить;
КонецЕсли;
Если СодержитНеЧисла(ЛицевойСчет)=1 Тогда
Сообщить("Не выгружен счет содержит не числовые символы: "+ЛицевойСчет+" "+ФИО);
Продолжить;
КонецЕсли;
Если ПустаяСтрока(АдресСтр(Спр.ТекущийЭлемент()))=1 Тогда
Сообщить("Не выгружен пустой адрес: "+ЛицевойСчет+" "+ФИО);
Продолжить;
КонецЕсли;
ПоказатьВСтатусСтроке(Спр.Наименование);
ДБФ.Добавить();
ДБФ.LS_ID = ЛицевойСчет;
ДБФ.FIO = ФИО;
//ДБФ.ADDRESS = ОчиститьСтроку(АдресСтр(Спр.ТекущийЭлемент()));
ДБФ.RAION = ОчиститьСтроку(Спр.Район);
ДБФ.NPUNKT = ОчиститьСтроку(""+Спр.Город+Спр.НаселенныйПункт);
ДБФ.ULICA = ОчиститьСтроку(Спр.Улица);
ДБФ.ZDANIE = ОчиститьСтроку(Спр.Дом);
Если ПустаяСтрока(Спр.Корпус)>0 Тогда
ДБФ.ZDANIE = ОчиститьСтроку(""+Спр.Дом+"/"+Спр.Корпус);
КонецЕсли;
ДБФ.KVARTIRA = ОчиститьСтроку(Спр.Квартира);
ДБФ.SUMMA = СуммаКОплате(Спр.ТекущийЭлемент());
ДБФ.Записать();
КонецЦикла;
ДБФ.ЗакрытьФайл();
ПоказатьВСтатусСтроке("Выгружен файл "+ИмяБД);
Иначе
Предупреждение("Не найден файл БД: "+ИмяБД+". Выгрузка не возможна.");
КонецЕсли;
КонецПроцедуры // Загрузить()
//******************************************************************************
Процедура ОбъединитьДБФ()
ИмяБД = СокрЛП(Файл)+"all.dbf";
Если ФС.СуществуетФайл(ИмяБД)=0 Тогда
СоздатьДБФ(ИмяБД);
КонецЕсли;
ОбщийДБФ = СоздатьОбъект("XBase");
ОбщийДБФ.КодоваяСтраница(пДосКодировка);
ОбщийДБФ.ОткрытьФайл(ИмяБД,,0);
ОбщийДБФ.ОчиститьФайл();
ДБФ = СоздатьОбъект("XBase");
ДБФ.КодоваяСтраница(пДосКодировка);
ФС.УстТекКаталог(СокрЛП(Файл));
НайденныйФайл = ФС.НайтиПервыйФайл("*.dbf");
Пока ПустаяСтрока(НайденныйФайл) = 0 Цикл
Если НайденныйФайл = "all.dbf" Тогда
//ищем следующий файл
Иначе
ДБФ.ОткрытьФайл(НайденныйФайл,,1);
Если ДБФ.Открыта()=1 Тогда
Сообщить("Объединение файла "+НайденныйФайл);
ДБФ.Первая();
Пока ДБФ.ВКонце() = 0 Цикл
ОбщийДБФ.Добавить();
ОбщийДБФ.LS_ID = ДБФ.LS_ID;
ОбщийДБФ.FIO = ДБФ.FIO;
//ОбщийДБФ.ADDRESS = ДБФ.ADDRESS;
ОбщийДБФ.RAION = ДБФ.RAION;
ОбщийДБФ.NPUNKT = ДБФ.NPUNKT;
ОбщийДБФ.ULICA = ДБФ.ULICA;
ОбщийДБФ.ZDANIE = ДБФ.ZDANIE;
ОбщийДБФ.KVARTIRA = ДБФ.KVARTIRA;
ОбщийДБФ.SUMMA = ДБФ.SUMMA;
ОбщийДБФ.Записать();
ДБФ.Следующая();
КонецЦикла;
ДБФ.ЗакрытьФайл();
КонецЕсли;
КонецЕсли;
НайденныйФайл = ФС.НайтиСледующийФайл();
КонецЦикла;
ОбщийДБФ.ЗакрытьФайл();
Сообщить("Готово!");
КонецПроцедуры
//******************************************************************************
Процедура ПроверитьИсправитьДБФ()
Перем СпОбработанныеСчета;
СпОбработанныеСчета = СоздатьОбъект("СписокЗначений");
ИмяБД = СокрЛП(Файл)+"all_new.dbf";
Если ФС.СуществуетФайл(ИмяБД)=0 Тогда
СоздатьДБФ(ИмяБД);
КонецЕсли;
ОбщийДБФ = СоздатьОбъект("XBase");
ОбщийДБФ.КодоваяСтраница(пДосКодировка);
ОбщийДБФ.ОткрытьФайл(ИмяБД,,0);
ОбщийДБФ.ОчиститьФайл();
ДБФ = СоздатьОбъект("XBase");
ДБФ.КодоваяСтраница(пДосКодировка);
ФС.УстТекКаталог(СокрЛП(Файл));
НайденныйФайл = ФС.НайтиПервыйФайл("*.dbf");
Пока ПустаяСтрока(НайденныйФайл) = 0 Цикл
//Если НайденныйФайл = "all_new.dbf" Тогда
// //ищем следующий файл
Если НРег(НайденныйФайл) = "all.dbf" Тогда
ДБФ.ОткрытьФайл(НайденныйФайл,,1);
Если ДБФ.Открыта()=1 Тогда
Сообщить("Проверка файла "+НайденныйФайл);
КоличествоСтрокДБФ = ДБФ.КоличествоЗаписей();
СпОбработанныеСчета.УдалитьВсе();
ДБФ.Первая();
Пока ДБФ.ВКонце() = 0 Цикл
ЕстьОшибка = 0;
Если ПустаяСтрока(ДБФ.LS_ID)=1 Тогда
Сообщить("Пустой ЛС"+ДБФ.FIO + " " +ДБФ.LS_ID);
ЕстьОшибка = 1;
КонецЕсли;
Если СтрДлина(СокрЛП(Строка(ДБФ.LS_ID)))=12 Тогда
Иначе
Сообщить("Не правильный ЛС менее 12 символов "+ДБФ.FIO + " " +ДБФ.LS_ID);
ЕстьОшибка = 1;
КонецЕсли;
Если СодержитНеЧисла(ДБФ.LS_ID)=1 Тогда
Сообщить("Не правильный ЛС содержит не числовые символы "+ДБФ.FIO + " " +ДБФ.LS_ID);
ЕстьОшибка = 1;
КонецЕсли;
Если ПустаяСтрока(ДБФ.FIO)=1 Тогда
Сообщить("Пустой ФИО "+ДБФ.LS_ID);
ЕстьОшибка = 1;
КонецЕсли;
Если ПустаяСтрока(""+ДБФ.RAION+ДБФ.NPUNKT+ДБФ.ULICA+ДБФ.ZDANIE+ДБФ.KVARTIRA)=1 Тогда
Сообщить("Пустой Адрес "+ДБФ.FIO + " " +ДБФ.LS_ID);
ЕстьОшибка = 1;
КонецЕсли;
Если СпОбработанныеСчета.Принадлежит(ДБФ.LS_ID)=1 Тогда
Сообщить("Дублирование ЛС "+ДБФ.FIO + " " +ДБФ.LS_ID);
ЕстьОшибка = 1;
КонецЕсли;
Если ЕстьОшибка = 0 Тогда
ОбщийДБФ.Добавить();
ОбщийДБФ.LS_ID = ДБФ.LS_ID;
ОбщийДБФ.FIO = ДБФ.FIO;
//ОбщийДБФ.ADDRESS = ДБФ.ADDRESS;
ОбщийДБФ.RAION = ДБФ.RAION;
ОбщийДБФ.NPUNKT = ДБФ.NPUNKT;
ОбщийДБФ.ULICA = ДБФ.ULICA;
ОбщийДБФ.ZDANIE = ДБФ.ZDANIE;
ОбщийДБФ.KVARTIRA = ДБФ.KVARTIRA;
ОбщийДБФ.SUMMA = ДБФ.SUMMA;
ОбщийДБФ.Записать();
Если СпОбработанныеСчета.РазмерСписка()>5000 Тогда
СпОбработанныеСчета.УдалитьВсе();
КонецЕсли;
СпОбработанныеСчета.ДобавитьЗначение(ДБФ.LS_ID,ДБФ.LS_ID);
КонецЕсли;
ПрогрессорВСтатусстроку(КоличествоСтрокДБФ,ДБФ.НомерЗаписи());
ДБФ.Следующая();
КонецЦикла;
ДБФ.ЗакрытьФайл();
КонецЕсли;
КонецЕсли;
НайденныйФайл = ФС.НайтиСледующийФайл();
КонецЦикла;
ОбщийДБФ.ЗакрытьФайл();
Сообщить("Готово!");
ПоказатьВСтатусСтроке("Готово!");
КонецПроцедуры
//******************************************************************************
// ПриЗакрытии()
// Описание:
// предопределенная процедура
Процедура ПриЗакрытии()
СохранитьВосстановитьЗначения("Сохранить");
КонецПроцедуры // ПриЗакрытии()
// Основная программа
СохранитьВосстановитьЗначения("Восстановить");
пДосКодировка=0;