новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума
Форум

Обсуждение к заданию: Переписать обработку с 7.7 на 8.1

    • #1
    • 21.02.2019 10:43
    0
    Имеется обработка объединяющая дбф файлы и проверяющая на ошибки результирующий файл. Необходимо переписать с 7.7 на 8.2  Подробнее>>
    • #2
    • 21.02.2019 10:44
    0
    Вы можете выложить обработку 7.7?
    • #3
    • 21.02.2019 11:18
    0
    ////////////////////////////////////////////////////////////////////////////////
    // Блок для работы со статус-строкой формы
    Перем СтатусСтрока;

    //******************************************************************************
    // ПоказатьВСтатусСтроке(Стр="")
    // Параметры:
    // Стр Строка
    // Описание:
    // Выводит сообщение в статус-строке формы
    Процедура ПоказатьВСтатусСтроке(Стр="")
    СтатусСтрока = Стр;
    Форма.Обновить(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;
    • #4
    • 21.02.2019 11:19
    0
    ////////////////////////////////////////////////////////////////////////////////
    // Блок для работы со статус-строкой формы
    Перем СтатусСтрока;

    //******************************************************************************
    // ПоказатьВСтатусСтроке(Стр="")
    // Параметры:
    // Стр Строка
    // Описание:
    // Выводит сообщение в статус-строке формы
    Процедура ПоказатьВСтатусСтроке(Стр="")
    СтатусСтрока = Стр;
    Форма.Обновить(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;
Для участия в обсуждении Вам необходимо авторизоваться либо   зарегистрироваться