27 сентября 2024 в 05:14:37
(8 недель 23 часа назад)
57887
12.10.2019 15:33:34
Текст задания
есть процедура в типовой конфигурации ЖКХ Айлант по выгрузки данных по лицевым счетам в файлы xls
Структур файлов менять нельзя
надо оптимизировать скорость выгрузки. железо на сервере хорошее, загрузки процессора почти нет. 1С работает на SQL
&НаКлиенте
Процедура ВыгрузитьДанныеЛС();
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = 0;
Excel.ScreenUpdating = 0;
Excel.EnableEvents = 0;
Excel.Visible = 0;
Исключение
Инфо = ИнформацияОбОшибке();
КУ_ИнтерфейсВызовСервера.СообщитьОбОшибке("Excel: Неудачная попытка подключения компоненты Excel. Возможно, программа Excel не установлена на данном компьютере!");
КУ_ИнтерфейсВызовСервера.СообщитьОбОшибке(ПодробноеПредставлениеОшибки(Инфо));
Возврат;
КонецПопытки;
// Пропускаем ЛС с незаполненными обязательными полями
Если НЕ Строка_ТЗ_ЛС.ЗаполненыВсеОбязательныеПоля И НЕ Объект.ВыгружатьДанныеНеПрошедшиеПроверку Тогда
Продолжить;
КонецЕсли;
// Создаем файл для выгрузки
Если Книга = Неопределено Тогда
Попытка
Партия = Партия + 1;
ИмяФайла = Объект.Каталог + "" + "Сведения о ЛС от " + Формат(ТекущаяДата(), "ДФ='dd.MM.yyyy HH.mm.ss'") + "_" + Строка(Партия) + ".xlsx";
Если ЗначениеЗаполнено(Объект.ФайлШаблона) Тогда
ШаблонФайла = Новый Файл(Объект.ФайлШаблона);
Если ШаблонФайла.Существует() Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Используется внешний шаблон! Путь: " + Объект.ФайлШаблона);
КопироватьФайл(Объект.ФайлШаблона, ИмяФайла);
Иначе
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не найден файл шаблона! Путь: " + Объект.ФайлШаблона);
КонецЕсли;
Иначе
ДвоичныеДанные = ПолучитьШаблонЛС();
ДвоичныеДанные.Записать(ИмяФайла);
КонецЕсли;
Исключение
Инфо = ИнформацияОбОшибке();
КУ_ИнтерфейсВызовСервера.СообщитьОбОшибке(ПодробноеПредставлениеОшибки(Инфо));
Возврат;
КонецПопытки;
Попытка
Книга = Excel.WorkBooks.Open(ИмяФайла);
Исключение
Инфо = ИнформацияОбОшибке();
КУ_ИнтерфейсВызовСервера.СообщитьОбОшибке("Excel: Неудачная попытка открытия файла Excel");
КУ_ИнтерфейсВызовСервера.СообщитьОбОшибке(ПодробноеПредставлениеОшибки(Инфо));
Возврат;
КонецПопытки;
// Выгрузка помещений
НаименованиеТЧ = "Помещения";
ТЗ_ЛС_Помещения_ТекЛС = ТЗ_ЛС_Помещения.НайтиСтроки(Новый Структура("ВладелецСсылка", Строка_ТЗ_ЛС.Ссылка));
Для Каждого Строка_ТЗ_ЛС_Помещения из ТЗ_ЛС_Помещения_ТекЛС Цикл
// Пропускаем с незаполненными обязательными полями
Если НЕ Строка_ТЗ_ЛС_Помещения.ЗаполненыВсеОбязательныеПоля И НЕ Объект.ВыгружатьДанныеНеПрошедшиеПроверку Тогда
Продолжить;
КонецЕсли;
// = Адрес =
Адрес = Строка_ТЗ_ЛС_Помещения.Адрес;
Если НЕ Строка_ТЗ_ЛС_Помещения.ИндивидуальныйДом Тогда
Адрес = Адрес + ", " + ПолучитьПредставлениеНомерЛитера(Строка_ТЗ_ЛС_Помещения.НомерПомещения,Строка_ТЗ_ЛС_Помещения.ЛитераПомещения);
КонецЕсли;
ТекЗначение = Адрес;
ЗаписатьЗначениеВЯчейку(Лист_Помещения, СчетчикСтрок_Помещения, 2, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Адрес");
// = Код дома по ФИАС =
ТекЗначение = Строка_ТЗ_ЛС_Помещения.КодДомаПоФИАС;
ЗаписатьЗначениеВЯчейку(Лист_Помещения, СчетчикСтрок_Помещения, 3, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Код дома по ФИАС");
// = Тип помещения =
Если НЕ Строка_ТЗ_ЛС_Помещения.ЧастныйСектор И НЕ Строка_ТЗ_ЛС_Помещения.ИндивидуальныйДом Тогда
ТекЗначение = Строка_ТЗ_ЛС_Помещения.ТипПомещения;
ЗаписатьЗначениеВЯчейку(Лист_Помещения, СчетчикСтрок_Помещения, 4, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Тип помещения");
ИначеЕсли Строка_ТЗ_ЛС_Помещения.флДомБлокированнойЗастройки И Строка_ТЗ_ЛС_Помещения.ИндивидуальныйДом Тогда
ТекЗначение = "Блок в доме блокированной застройки";
ЗаписатьЗначениеВЯчейку(Лист_Помещения, СчетчикСтрок_Помещения, 4, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Тип помещения");
КонецЕсли;
// = Номер помещения =
НомерПомещения = "";
Если НЕ Строка_ТЗ_ЛС_Помещения.ЧастныйСектор И НЕ Строка_ТЗ_ЛС_Помещения.ИндивидуальныйДом Тогда
НомерПомещения = ПолучитьПредставлениеНомерЛитера(?(Строка_ТЗ_ЛС_Помещения.НомерПомещения <> 0,Строка_ТЗ_ЛС_Помещения.НомерПомещения,""),Строка_ТЗ_ЛС_Помещения.ЛитераПомещения);
ИначеЕсли Строка_ТЗ_ЛС_Помещения.флДомБлокированнойЗастройки И Строка_ТЗ_ЛС_Помещения.ИндивидуальныйДом Тогда
НомерПомещения = ПолучитьПредставлениеНомерЛитера(?(Строка_ТЗ_ЛС_Помещения.НомерПомещения <> 0,Строка_ТЗ_ЛС_Помещения.НомерПомещения,""),Строка_ТЗ_ЛС_Помещения.ЛитераПомещения);
КонецЕсли;
ТекЗначение = НомерПомещения;
ЗаписатьЗначениеВЯчейку(Лист_Помещения, СчетчикСтрок_Помещения, 5, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Номер помещения");
// = Номер комнаты =
ТекЗначение = ПолучитьПредставлениеНомерЛитера(?(Строка_ТЗ_ЛС_Помещения.НомерКомнаты <> 0,Строка_ТЗ_ЛС_Помещения.НомерКомнаты,""),Строка_ТЗ_ЛС_Помещения.ЛитераКомнаты);
ЗаписатьЗначениеВЯчейку(Лист_Помещения, СчетчикСтрок_Помещения, 6, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Номер комнаты");
// Страница Основания
Если ТипЛицевогоСчета = "ЛС РСО" Тогда
ТЗ_ЛС_Основание_ТекЛС = Объект.ТЧ_ЛС_Основания.НайтиСтроки(Новый Структура("ВладелецСсылка", Строка_ТЗ_ЛС.Ссылка));
НаименованиеТЧ = "Основания";
Для Каждого Строка_ТЗ_ЛС_Основание_ТекЛС из ТЗ_ЛС_Основание_ТекЛС Цикл
// Пропускаем с незаполненными обязательными полями
Если НЕ Строка_ТЗ_ЛС_Основание_ТекЛС.ЗаполненыВсеОбязательныеПоля И НЕ Объект.ВыгружатьДанныеНеПрошедшиеПроверку Тогда
Продолжить;
КонецЕсли;
// = Тип основания =
ТекЗначение = "Договор ресурсоснабжения (ЛС РСО или ЛС РЦ)";
ЗаписатьЗначениеВЯчейку(Лист_Основания, СчетчикСтрок_Основания, 2, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Тип основания");
// = Идентификатор основания =
ТекЗначение = Строка_ТЗ_ЛС_Основание_ТекЛС.ИдентификаторГИСЖКХ;
ЗаписатьЗначениеВЯчейку(Лист_Основания, СчетчикСтрок_Основания, 3, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Идентификатор основания");
// <<---- Договор ресурсоснабжения ----
// = Договор не является публичным и присутствует заключенный на бумажном носителе или в электронной форме =
ТекЗначение = Формат(Строка_ТЗ_ЛС_Основание_ТекЛС.НаличиеЗаключенногоДоговора,"БЛ=нет; БИ=да");
ЗаписатьЗначениеВЯчейку(Лист_Основания, СчетчикСтрок_Основания, 7, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Договор не является публичным и присутствует заключенный на бумажном носителе или в электронной форме");
// = Номер =
ТекЗначение = Строка_ТЗ_ЛС_Основание_ТекЛС.НомерДоговора;
ЗаписатьЗначениеВЯчейку(Лист_Основания, СчетчикСтрок_Основания, 8, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Номер");
// = Дата заключения =
ТекЗначение = Формат(Строка_ТЗ_ЛС_Основание_ТекЛС.ДатаЗаключения, "ДФ=dd.MM.yyyy");
ЗаписатьЗначениеВЯчейку(Лист_Основания, СчетчикСтрок_Основания, 9, ТекЗначение, НаименованиеТЧ, НомерВыгружаемойСтроки, "Дата заключения");
// >>---- Договор ресурсоснабжения ----
Если СчетчикСтрок_ЛС + СчетчикСтрок_Помещения + СчетчикСтрок_Основания > ПредельноеКоличествоСтрокДляВыгрузки Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Выгружен файл: " + Книга.Name);
Книга.Save();
Книга.Close();
Книга = Неопределено;
КонецЕсли;
КонецЦикла;
Если Книга <> Неопределено Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Выгружен файл: " + Книга.Name);
Книга.Save();
Книга.Close();
КонецЕсли;