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

Оптимизировать выгрузку в xls

Тюмень(Россия )
68 |  0
27 сентября 2024 в 05:14:37 (8 недель 3 дня 21 час назад)
57887
Текст задания
есть процедура в типовой конфигурации ЖКХ Айлант по выгрузки данных по лицевым счетам в файлы xls
Структур файлов менять нельзя
надо оптимизировать скорость выгрузки. железо на сервере хорошее, загрузки процессора почти нет. 1С работает на SQL

&НаКлиенте
Процедура ВыгрузитьДанныеЛС();

Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = 0;
Excel.ScreenUpdating = 0;
Excel.EnableEvents = 0;
Excel.Visible = 0;
Исключение
Инфо = ИнформацияОбОшибке();
КУ_ИнтерфейсВызовСервера.СообщитьОбОшибке("Excel: Неудачная попытка подключения компоненты Excel. Возможно, программа Excel не установлена на данном компьютере!");
КУ_ИнтерфейсВызовСервера.СообщитьОбОшибке(ПодробноеПредставлениеОшибки(Инфо));
Возврат;
КонецПопытки;

ТЗ_ЛС = Объект.ТЧ_ЛС;
ТЗ_ЛС_Помещения = Объект.ТЧ_ЛС_Помещения;

Книга = Неопределено;
ПредельноеКоличествоСтрокДляВыгрузки = 4000;
Партия = 0;
Лист_ЛС = Неопределено;
Лист_Помещения = Неопределено;
Лист_Основания = Неопределено;
СчетчикСтрок_ЛС = 3;
СчетчикСтрок_Помещения = 3;
СчетчикСтрок_Основания = 3;
НомерЗаписиЛицевогоСчета = 1;


Для Каждого Строка_ТЗ_ЛС Из ТЗ_ЛС Цикл

// Пропускаем ЛС с незаполненными обязательными полями
Если НЕ Строка_ТЗ_ЛС.ЗаполненыВсеОбязательныеПоля И НЕ Объект.ВыгружатьДанныеНеПрошедшиеПроверку Тогда
Продолжить;
КонецЕсли;

// Создаем файл для выгрузки
Если Книга = Неопределено Тогда
Попытка
Партия = Партия + 1;
ИмяФайла = Объект.Каталог + "" + "Сведения о ЛС от " + Формат(ТекущаяДата(), "ДФ='dd.MM.yyyy HH.mm.ss'") + "_" + Строка(Партия) + ".xlsx";
Если ЗначениеЗаполнено(Объект.ФайлШаблона) Тогда
ШаблонФайла = Новый Файл(Объект.ФайлШаблона);
Если ШаблонФайла.Существует() Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Используется внешний шаблон! Путь: " + Объект.ФайлШаблона);
КопироватьФайл(Объект.ФайлШаблона, ИмяФайла);
Иначе
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не найден файл шаблона! Путь: " + Объект.ФайлШаблона);
КонецЕсли;
Иначе
ДвоичныеДанные = ПолучитьШаблонЛС();
ДвоичныеДанные.Записать(ИмяФайла);
КонецЕсли;
Исключение
Инфо = ИнформацияОбОшибке();
КУ_ИнтерфейсВызовСервера.СообщитьОбОшибке(ПодробноеПредставлениеОшибки(Инфо));
Возврат;
КонецПопытки;

Попытка
Книга = Excel.WorkBooks.Open(ИмяФайла);
Исключение
Инфо = ИнформацияОбОшибке();
КУ_ИнтерфейсВызовСервера.СообщитьОбОшибке("Excel: Неудачная попытка открытия файла Excel");
КУ_ИнтерфейсВызовСервера.СообщитьОбОшибке(ПодробноеПредставлениеОшибки(Инфо));
Возврат;
КонецПопытки;

Попытка
Лист_ЛС = Книга.WorkSheets(1);
Лист_Помещения = Книга.WorkSheets(2);
Лист_Основания = Книга.WorkSheets(3);
СчетчикСтрок_ЛС = 3;
СчетчикСтрок_Помещения = 3;
СчетчикСтрок_Основания = 3;
НомерЗаписиЛицевогоСчета = 1;
Исключение
Инфо = ИнформацияОбОшибке();
КУ_ИнтерфейсВызовСервера.СообщитьОбОшибке(ПодробноеПредставлениеОшибки(Инфо));
Возврат;
КонецПопытки;

КонецЕсли;

НаименованиеТЧ = "Лицевые счета";
// Выгрузка ЛС
//Строка_ТЗ_ЛС.ТипПотребителя ФизЛицо, ИП, ЮрЛицо

НомерВыгружаемойСтроки = Строка(Строка_ТЗ_ЛС.НомерСтроки);

// = НомерЗаписиЛицевогоСчета =
ТекЗначение = НомерЗаписиЛицевогоСчета;
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 1, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "НомерЗаписиЛицевогоСчета");
// = НомерЛицевогоСчета =
ТекЗначение = Строка_ТЗ_ЛС.НомерЛицевогоСчета;
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 2, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "НомерЛицевогоСчета");
// = ГИСЖКХИдентификаторЖКУ =
ТекЗначение = Строка_ТЗ_ЛС.ГИСЖКХИдентификаторЖКУ;
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 3, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "ГИСЖКХИдентификаторЖКУ");
// = ТипЛицевогоСчета =
ТекЗначение = ТипЛицевогоСчета;
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 4, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "ТипЛицевогоСчета");
// = ЯвляетсяНанимателем =
ТекЗначение = ПолучитьПредставлениеЯвляетсяНанимателем(Строка_ТЗ_ЛС.ЯвляетсяНанимателем,ТипЛицевогоСчета);
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 5, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "ЯвляетсяНанимателем");
// = НесколькоЛСНаПомещение =
ТекЗначение = Формат(Строка_ТЗ_ЛС.НесколькоЛСНаПомещение,"БЛ=Нет; БИ=Да");
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 6, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "НесколькоЛСНаПомещение");
// = Фамилия =
ТекЗначение = Строка_ТЗ_ЛС.Фамилия;
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 7, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Фамилия");
// = Имя =
ТекЗначение = Строка_ТЗ_ЛС.Имя;
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 8, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Имя");
// = Отчество =
ТекЗначение = Строка_ТЗ_ЛС.Отчество;
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 9, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Отчество");
// = СНИЛС =
ТекЗначение = Строка_ТЗ_ЛС.СНИЛС;
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 10, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "СНИЛС");
// = ВидДокумента =
ТекЗначение = ПолучитьПредставлениеВидДокумента(Строка_ТЗ_ЛС.ВидДокумента);
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 11, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "ВидДокумента");
// = Номер =
ТекЗначение = Строка_ТЗ_ЛС.Номер;
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 12, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Номер");
// = Серия =
ТекЗначение = Строка_ТЗ_ЛС.Серия;
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 13, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Серия");
// = ДатаВыдачи =
ТекЗначение = ?(ЗначениеЗаполнено(Строка_ТЗ_ЛС.ДатаВыдачи), Формат(Строка_ТЗ_ЛС.ДатаВыдачи, "ДФ=dd.MM.yyyy"),"");
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 14, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "ДатаВыдачи");
// = ОГРН_ОГРНИП =
ТекЗначение = ?(ТипЛицевогоСчета = "ЛС ОГВ/ОМС", "",Строка_ТЗ_ЛС.ОГРН_ОГРНИП);
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 15, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "ОГРН_ОГРНИП");
// = НЗА =
ТекЗначение = ?(ТипЛицевогоСчета = "ЛС ОГВ/ОМС", "",Строка_ТЗ_ЛС.НЗА);
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 16, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "НЗА");
// = КПП =
ТекЗначение = ?(ТипЛицевогоСчета = "ЛС ОГВ/ОМС", "",Строка_ТЗ_ЛС.КПП);
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 17, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "КПП");
// = ОбщаяПлощадь =
ТекЗначение = Строка_ТЗ_ЛС.ОбщаяПлощадь;
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 18, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "ОбщаяПлощадь");
// = ЖилаяПлощадь =
ТекЗначение = Строка_ТЗ_ЛС.ЖилаяПлощадь;
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 19, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "ЖилаяПлощадь");
// = ОтапливаемаяПлощадь =
ТекЗначение = Строка_ТЗ_ЛС.ОтапливаемаяПлощадь;
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 20, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "ОтапливаемаяПлощадь");
// = КоличествоПроживающих =
ТекЗначение = Строка_ТЗ_ЛС.КоличествоПроживающих;
ЗаписатьЗначениеВЯчейку(Лист_ЛС, СчетчикСтрок_ЛС, 21, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "КоличествоПроживающих");

СчетчикСтрок_ЛС = СчетчикСтрок_ЛС + 1;

// Выгрузка помещений
НаименованиеТЧ = "Помещения";
ТЗ_ЛС_Помещения_ТекЛС = ТЗ_ЛС_Помещения.НайтиСтроки(Новый Структура("ВладелецСсылка", Строка_ТЗ_ЛС.Ссылка));
Для Каждого Строка_ТЗ_ЛС_Помещения из ТЗ_ЛС_Помещения_ТекЛС Цикл

// Пропускаем с незаполненными обязательными полями
Если НЕ Строка_ТЗ_ЛС_Помещения.ЗаполненыВсеОбязательныеПоля И НЕ Объект.ВыгружатьДанныеНеПрошедшиеПроверку Тогда
Продолжить;
КонецЕсли;

НомерВыгружаемойСтроки = Строка(Строка_ТЗ_ЛС_Помещения.НомерСтроки);

// = НомерЗаписиЛицевогоСчета =
ТекЗначение = НомерЗаписиЛицевогоСчета;
ЗаписатьЗначениеВЯчейку(Лист_Помещения, СчетчикСтрок_Помещения, 1, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "НомерЗаписиЛицевогоСчета");

// = Адрес =
Адрес = Строка_ТЗ_ЛС_Помещения.Адрес;
Если НЕ Строка_ТЗ_ЛС_Помещения.ИндивидуальныйДом Тогда
Адрес = Адрес + ", " + ПолучитьПредставлениеНомерЛитера(Строка_ТЗ_ЛС_Помещения.НомерПомещения,Строка_ТЗ_ЛС_Помещения.ЛитераПомещения);
КонецЕсли;
ТекЗначение = Адрес;
ЗаписатьЗначениеВЯчейку(Лист_Помещения, СчетчикСтрок_Помещения, 2, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Адрес");
// = Код дома по ФИАС =
ТекЗначение = Строка_ТЗ_ЛС_Помещения.КодДомаПоФИАС;
ЗаписатьЗначениеВЯчейку(Лист_Помещения, СчетчикСтрок_Помещения, 3, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Код дома по ФИАС");
// = Тип помещения =
Если НЕ Строка_ТЗ_ЛС_Помещения.ЧастныйСектор И НЕ Строка_ТЗ_ЛС_Помещения.ИндивидуальныйДом Тогда
ТекЗначение = Строка_ТЗ_ЛС_Помещения.ТипПомещения;
ЗаписатьЗначениеВЯчейку(Лист_Помещения, СчетчикСтрок_Помещения, 4, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Тип помещения");
ИначеЕсли Строка_ТЗ_ЛС_Помещения.флДомБлокированнойЗастройки И Строка_ТЗ_ЛС_Помещения.ИндивидуальныйДом Тогда
ТекЗначение = "Блок в доме блокированной застройки";
ЗаписатьЗначениеВЯчейку(Лист_Помещения, СчетчикСтрок_Помещения, 4, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Тип помещения");
КонецЕсли;

// = Номер помещения =
НомерПомещения = "";
Если НЕ Строка_ТЗ_ЛС_Помещения.ЧастныйСектор И НЕ Строка_ТЗ_ЛС_Помещения.ИндивидуальныйДом Тогда
НомерПомещения = ПолучитьПредставлениеНомерЛитера(?(Строка_ТЗ_ЛС_Помещения.НомерПомещения <> 0,Строка_ТЗ_ЛС_Помещения.НомерПомещения,""),Строка_ТЗ_ЛС_Помещения.ЛитераПомещения);
ИначеЕсли Строка_ТЗ_ЛС_Помещения.флДомБлокированнойЗастройки И Строка_ТЗ_ЛС_Помещения.ИндивидуальныйДом Тогда
НомерПомещения = ПолучитьПредставлениеНомерЛитера(?(Строка_ТЗ_ЛС_Помещения.НомерПомещения <> 0,Строка_ТЗ_ЛС_Помещения.НомерПомещения,""),Строка_ТЗ_ЛС_Помещения.ЛитераПомещения);
КонецЕсли;
ТекЗначение = НомерПомещения;
ЗаписатьЗначениеВЯчейку(Лист_Помещения, СчетчикСтрок_Помещения, 5, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Номер помещения");
// = Номер комнаты =
ТекЗначение = ПолучитьПредставлениеНомерЛитера(?(Строка_ТЗ_ЛС_Помещения.НомерКомнаты <> 0,Строка_ТЗ_ЛС_Помещения.НомерКомнаты,""),Строка_ТЗ_ЛС_Помещения.ЛитераКомнаты);
ЗаписатьЗначениеВЯчейку(Лист_Помещения, СчетчикСтрок_Помещения, 6, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Номер комнаты");

//// = Идентификатор дома, помещения, комнаты, присвоенный ГИС ЖКХ =
//ТекЗначение = "";
//ЗаписатьЗначениеВЯчейку(Лист_Помещения, СчетчикСтрок_Помещения, 7, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Идентификатор дома, помещения, комнаты, присвоенный ГИС ЖКХ");

// = Доля внесения платы, размер доли в % =
ТекЗначение = ПолучитьПроцентноеПредставлениеДолиСобственности(Строка_ТЗ_ЛС_Помещения.ДоляСобственности);
ЗаписатьЗначениеВЯчейку(Лист_Помещения, СчетчикСтрок_Помещения, 8, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Доля внесения платы, размер доли в %");

СчетчикСтрок_Помещения = СчетчикСтрок_Помещения + 1;
КонецЦикла;

// Страница Основания
Если ТипЛицевогоСчета = "ЛС РСО" Тогда
ТЗ_ЛС_Основание_ТекЛС = Объект.ТЧ_ЛС_Основания.НайтиСтроки(Новый Структура("ВладелецСсылка", Строка_ТЗ_ЛС.Ссылка));
НаименованиеТЧ = "Основания";
Для Каждого Строка_ТЗ_ЛС_Основание_ТекЛС из ТЗ_ЛС_Основание_ТекЛС Цикл

// Пропускаем с незаполненными обязательными полями
Если НЕ Строка_ТЗ_ЛС_Основание_ТекЛС.ЗаполненыВсеОбязательныеПоля И НЕ Объект.ВыгружатьДанныеНеПрошедшиеПроверку Тогда
Продолжить;
КонецЕсли;

НомерВыгружаемойСтроки = Строка(Строка_ТЗ_ЛС_Основание_ТекЛС.НомерСтроки);

// = НомерЗаписиЛицевогоСчета =
ТекЗначение = НомерЗаписиЛицевогоСчета;
ЗаписатьЗначениеВЯчейку(Лист_Основания, СчетчикСтрок_Основания, 1, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "НомерЗаписиЛицевогоСчета");


// = Тип основания =
ТекЗначение = "Договор ресурсоснабжения (ЛС РСО или ЛС РЦ)";
ЗаписатьЗначениеВЯчейку(Лист_Основания, СчетчикСтрок_Основания, 2, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Тип основания");
// = Идентификатор основания =
ТекЗначение = Строка_ТЗ_ЛС_Основание_ТекЛС.ИдентификаторГИСЖКХ;
ЗаписатьЗначениеВЯчейку(Лист_Основания, СчетчикСтрок_Основания, 3, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Идентификатор основания");

// <<---- Договор ресурсоснабжения ----
// = Договор не является публичным и присутствует заключенный на бумажном носителе или в электронной форме =
ТекЗначение = Формат(Строка_ТЗ_ЛС_Основание_ТекЛС.НаличиеЗаключенногоДоговора,"БЛ=нет; БИ=да");
ЗаписатьЗначениеВЯчейку(Лист_Основания, СчетчикСтрок_Основания, 7, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Договор не является публичным и присутствует заключенный на бумажном носителе или в электронной форме");
// = Номер =
ТекЗначение = Строка_ТЗ_ЛС_Основание_ТекЛС.НомерДоговора;
ЗаписатьЗначениеВЯчейку(Лист_Основания, СчетчикСтрок_Основания, 8, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Номер");
// = Дата заключения =
ТекЗначение = Формат(Строка_ТЗ_ЛС_Основание_ТекЛС.ДатаЗаключения, "ДФ=dd.MM.yyyy");
ЗаписатьЗначениеВЯчейку(Лист_Основания, СчетчикСтрок_Основания, 9, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Дата заключения");
// >>---- Договор ресурсоснабжения ----

СчетчикСтрок_Основания = СчетчикСтрок_Основания + 1;
КонецЦикла;
КонецЕсли;

НомерЗаписиЛицевогоСчета = НомерЗаписиЛицевогоСчета + 1;

Если СчетчикСтрок_ЛС + СчетчикСтрок_Помещения + СчетчикСтрок_Основания > ПредельноеКоличествоСтрокДляВыгрузки Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Выгружен файл: " + Книга.Name);
Книга.Save();
Книга.Close();
Книга = Неопределено;
КонецЕсли;

КонецЦикла;

Если Книга <> Неопределено Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Выгружен файл: " + Книга.Name);
Книга.Save();
Книга.Close();
КонецЕсли;

КонецПроцедуры
0
Отклики (12)