Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #Область ВспомогательныеФункций
- // http://forum.infostart.ru/forum24/topic88416/message932315/#message932315
- //
- &НаСервере
- Процедура ВывестиТаблицуНаФорму(УФ,ИмяТЗНаФорме,ТЗ, ТЗОбработчиковСобытий = Неопределено) Экспорт
- // СОЗДАНИЕ РЕКВИЗИТОВ ФОРМЫ
- МассивДобавляемыхРеквизитов = Новый Массив;
- Для Каждого Колонка Из ТЗ.Колонки Цикл
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения,ИмяТЗНаФорме ,Колонка.Заголовок));
- КонецЦикла;
- МассивУдаляемыхРеквизитов = УФ.ПолучитьРеквизиты(ИмяТЗНаФорме);
- МассивИменУдаляемыхРеквизитов = Новый Массив;
- Для каждого Элемент Из МассивУдаляемыхРеквизитов Цикл
- МассивИменУдаляемыхРеквизитов.Добавить(ИмяТЗНаФорме + "." + Элемент.Имя);
- КонецЦикла;
- УФ.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов,МассивИменУдаляемыхРеквизитов);
- // СОЗДАНИЕ ЭЛЕМЕНТОВ ФОРМЫ
- Для каждого Элемент Из МассивУдаляемыхРеквизитов Цикл
- УдаляемыйЭлемент = УФ.Элементы.Найти(ИмяТЗНаФорме + Элемент.Имя);
- УФ.Элементы.Удалить(УдаляемыйЭлемент);
- КонецЦикла;
- Для Каждого Колонка Из ТЗ.Колонки Цикл
- НоваяКолонка = УФ.Элементы.Добавить(ИмяТЗНаФорме + Колонка.Имя, Тип("ПолеФормы"), УФ.Элементы[ИмяТЗНаФорме]);
- НоваяКолонка.Заголовок = Колонка.Заголовок;
- НоваяКолонка.ПутьКДанным = ИмяТЗНаФорме + "." + Колонка.Имя;
- НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
- НоваяКолонка.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;
- НоваяКолонка.МногострочныйРежим = Истина;
- НоваяКолонка.Высота = 1;
- КонецЦикла;
- //УФ[ИмяТЗНаФорме].Очистить();
- //УФ[ИмяТЗНаФорме].Загрузить(ТЗ);
- ЗначениеВРеквизитФормы(ТЗ, ИмяТЗНаФорме);
- // Привязка обработчиков событий
- Если ТЗОбработчиковСобытий = Неопределено Тогда
- Возврат;
- КонецЕсли;
- Для Каждого Строка Из ТЗОбработчиковСобытий Цикл
- УФ.Элементы[Строка.ИмяЭлемента].УстановитьДействие(Строка.ИмяСобытия, Строка.ИмяЭлемента + Строка.ИмяСобытия);
- КонецЦикла;
- КонецПроцедуры
- //ПреобразоватьТекстCSVвТЗ () импортирует данные в ТЗ из текста в формате CSV
- //Параметры:
- //ТекстCSV - Строка, содержащая текст в формате csv
- //Разделитель - Для формата CSV разделителем является ',', но т.к.
- // Excel берет разделитель из региональных стандартов, то
- // используется ';'
- //
- &НаСервереБезКонтекста
- Функция ПреобразоватьТекстCSVвТЗ(ТекстCSV="", Разделитель=";") Экспорт
- ТЗ = Новый ТаблицаЗначений;
- ОсобаяСтрока = "$#%^&*!xyxb$#%&*!^"; // для замены ""
- НомерСтроки = 1;
- Стр = СтрПолучитьСтроку(ТекстCSV,НомерСтроки);
- Пока НомерСтроки <= СтрЧислоСтрок(ТекстCSV) Цикл
- СтрокаТЗ = ТЗ.Добавить();
- НомерПоля = 0;
- Пока Стр <> "" Цикл
- Токен = "";
- ПозицияРазделителя = Найти(стр, Разделитель);
- ПозицияОткрКавычек = Найти(стр, """");
- Если (ПозицияРазделителя > ПозицияОткрКавычек ИЛИ ПозицияРазделителя = 0) И ПозицияОткрКавычек > 0 Тогда
- // начинающееся с кавычек читаем до тех пор
- Токен = Сред(Стр, 1, ПозицияОткрКавычек);
- Стр = СтрЗаменить(Сред(Стр, ПозицияОткрКавычек+1), """""", ОсобаяСтрока);
- ПозицияЗакрКавычек = Найти(Стр, """");
- Пока ПозицияЗакрКавычек = 0 Цикл
- Токен = Токен + Стр + Символы.ПС;
- НомерСтроки = НомерСтроки + 1;
- Стр = СтрПолучитьСтроку(ТекстCSV, НомерСтроки);
- Стр = СтрЗаменить(Стр, """""", ОсобаяСтрока);
- // пока не встретим закрывающие
- ПозицияЗакрКавычек = Найти(Стр, """");
- КонецЦикла;
- ПозицияРазделителя=Найти(Сред(Стр,ПозицияЗакрКавычек), Разделитель);
- ПозицияРазделителя = ?(ПозицияРазделителя>0, ПозицияЗакрКавычек + ПозицияРазделителя-1, 0);
- КонецЕсли;
- Токен = Токен + ?(ПозицияРазделителя>0, Сред(Стр, 1, ПозицияРазделителя-1), Стр);
- Стр = ?(ПозицияРазделителя>0, Сред(Стр, ПозицияРазделителя+1), "");
- Если Лев(Токен, 1) = """" Тогда
- Токен = Сред(Токен, 2);
- Токен = ?(Прав(Токен, 1) = """", Сред(Токен, 1, СтрДлина(Токен)-1), Токен);
- КонецЕсли;
- Токен = СтрЗаменить(Токен, ОсобаяСтрока, """");
- НомерПоля = НомерПоля + 1;
- Если ТЗ.Колонки.Количество()<НомерПоля Тогда
- ТЗ.Колонки.Добавить("Колонка"+НомерПоля, Новый ОписаниеТипов("Строка"));
- КонецЕсли;
- СтрокаТЗ[НомерПоля-1] = Токен;
- КонецЦикла;
- НомерСтроки = НомерСтроки + 1;
- Стр = СтрПолучитьСтроку(ТекстCSV, НомерСтроки);
- КонецЦикла;
- Возврат ТЗ;
- КонецФункции
- //ПреобразоватьТЗвТекстCSV () экспортирует данные ТЗ в текст в формате CSV
- //Параметры:
- //ТЗ - Таблица значений данные которые сохраняются в файл
- //флЭкспортироватьИменаКолонок - Первой строкой выводить имена колонок
- //Разделитель - Для формата CSV разделителем является ',', но т.к.
- // Excel берет разделитель из региональных стандартов, то
- // используется ';'
- //
- &НаСервереБезКонтекста
- Функция ПреобразоватьТЗвТекстCSV(ТЗ, Разделитель = ";", флЭкспортироватьИменаКолонок = Ложь) Экспорт
- ТекстCSV = "";
- Если флЭкспортироватьИменаКолонок Тогда
- //Если нужно выгружать наименование колонок Выгружаем
- ПодготовленнаяСтрока = "";
- Для Каждого Колонка Из ТЗ.Колонки Цикл
- ПодготовленнаяСтрока = ПодготовленнаяСтрока + Колонка.Имя + Разделитель;
- КонецЦикла;
- ПодготовленнаяСтрока = Лев (ПодготовленнаяСтрока,СтрДлина(ПодготовленнаяСтрока)-1);
- ТекстCSV = ТекстCSV + ПодготовленнаяСтрока + Символы.ПС;
- КонецЕсли;
- Для Каждого Строка Из ТЗ Цикл
- ПодготовленнаяСтрока = "";
- Для Каждого Колонка Из ТЗ.Колонки Цикл
- ПреобразованноеПоле = Строка[Колонка.Имя];
- //по правилам CSV если поле содержит двойные ковычки они должны повторятся дважды
- Если Найти(ПреобразованноеПоле,"""") Тогда
- ПреобразованноеПоле = СтрЗаменить(ПреобразованноеПоле,"""","""""");
- КонецЕсли;
- //по правилам CSV если поле содержит перенос строки или запятую оно должно заключатся в двойные кавычки
- Если Найти(ПреобразованноеПоле,Разделитель) ИЛИ Найти(ПреобразованноеПоле,Символы.ПС) ИЛИ Найти(ПреобразованноеПоле,"""") Тогда
- ПреобразованноеПоле = """" + ПреобразованноеПоле + """";
- КонецЕсли;
- ПодготовленнаяСтрока = ПодготовленнаяСтрока + ПреобразованноеПоле + Разделитель;
- КонецЦикла;
- ПодготовленнаяСтрока = Лев (ПодготовленнаяСтрока,СтрДлина(ПодготовленнаяСтрока)-1);
- ТекстCSV = ТекстCSV + ПодготовленнаяСтрока + Символы.ПС;
- КонецЦикла;
- Возврат ТекстCSV;
- КонецФункции
- // Функция возвращает ТабличныйДокумент с данными файла.
- //
- &НаКлиенте
- Функция ПрочитатьCSV_ADO(ИмяФайла, Разделитель=",")
- ТабДок = Новый ТабличныйДокумент;
- Файл = Новый Файл(ИмяФайла);
- Connection=Новый COMОбъект("ADODB.Connection");
- Connection.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Файл.Путь+";Extended Properties=""text;HDR=No;IMEX=1;FMT=Delimited""");
- RecordSet=Новый COMОбъект("ADODB.Recordset");
- RecordSet.ActiveConnection = Connection;
- RecordSet.Open("select * from "+Файл.Имя, Connection);
- сч=0;
- Пока НЕ RecordSet.EOF() Цикл
- сч=сч+1;
- Для й=0 по RecordSet.Fields.Count-1 Цикл
- ТабДок.Область(сч, й+1).Текст = RecordSet.Fields(й).Value;
- КонецЦикла;
- Если сч%1000=0 Тогда // ~ 1000 в секунду
- Состояние(""+сч+" ...");
- ОбработкаПрерыванияПользователя();
- КонецЕсли;
- RecordSet.MoveNext();
- КонецЦикла;
- RecordSet.Close();
- Connection.Close();
- Возврат ТабДок;
- КонецФункции
- // Функция возвращает ТаблицуЗначений с данными файла.
- //
- // Источник: http://forum.script-coding.com/viewtopic.php?id=5664
- //
- &НаСервере
- Функция ПрочитатьCSV_GWF(ИмяФайла)
- Файл = Новый Файл(ИмяФайла);
- // Schema.ini уже должен быть подготовлен
- objRec = Новый COMОбъект("ADODB.Recordset");
- strQuery = "SELECT * FROM [" + Файл.Имя + "]";
- strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Файл.Путь + ";Extended Properties=""text;HDR=No""";
- adOpenStatic = 3;
- adLockOptimistic = 3;
- adCmdText = 1;
- objRec.Open(strQuery, strConn, adOpenStatic, adLockOptimistic, adCmdText);
- Если ПодключитьВнешнююКомпоненту("GameWithFire.ADOUtils") Тогда
- ADOUtils = Новый("AddIn.ADOUtils");
- Возврат ADOUtils.ADORecordsetToValueTable(objRec); // ~ 3000 в сек
- Иначе
- Сообщить("Не удалось подключить компоненту GameWithFire");
- Возврат Новый ТаблицаЗначений;
- КонецЕсли;
- КонецФункции
- &НаКлиенте
- Процедура ПрочитатьФайл(ИмяФайла, ТекстФайла)
- ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла);
- ТекстФайла = ЧтениеТекста.Прочитать();
- ЧтениеТекста.Закрыть();
- КонецПроцедуры
- &НаКлиенте
- Процедура ЗаписатьФайл(ИмяФайла, ТекстФайла)
- ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.ANSI);
- ЗаписьТекста.Записать(ТекстФайла);
- ЗаписьТекста.Закрыть();
- КонецПроцедуры
- #КонецОбласти
- &НаСервере
- Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
- // тесты
- Тесты = "";
- Тесты = Тесты + Символы.ПС + "a";
- Тесты = Тесты + Символы.ПС + "a;b;c";
- Тесты = Тесты + Символы.ПС + "a;b\nc";
- Тесты = Тесты + Символы.ПС + """a;b"";c";
- Тесты = Тесты + Символы.ПС + """a""""b"";c";
- Тесты = Тесты + Символы.ПС + """"""""";c";
- Тесты = Тесты + Символы.ПС + """;"";c";
- Тесты = Тесты + Символы.ПС + ";";
- Тесты = Тесты + Символы.ПС + "a;""b\nc"";d";
- Тесты = Тесты + Символы.ПС + "a;""b\nc;\n\nd;;\ne"";d";
- Тесты = Тесты + Символы.ПС + "a;""b""""\nc"""""";d";
- // неправильный формат
- Тесты = Тесты + Символы.ПС + "a;""b\n""с""";
- Тесты = Тесты + Символы.ПС + "a;""""b;"";""";
- ТекстCSV = СтрЗаменить(СокрЛП(Тесты), "\n", Символы.ПС);
- // инициализируем таблицу на форме
- тз = Новый ТаблицаЗначений;
- тз.Колонки.Добавить("Колонка1");
- тз.Колонки.Добавить("Колонка2");
- тз.Колонки.Добавить("Колонка3");
- тз.Добавить();
- ВывестиТаблицуНаФорму(ЭтаФорма, "ТаблицаCSV", тз);
- ЭтаФорма.Разделитель = ",";
- КонецПроцедуры
- &НаКлиенте
- Процедура ПриОткрытии(Отказ)
- ПутьФайла_ПриИзменении();
- КонецПроцедуры
- &НаКлиенте
- Процедура ПутьФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
- СтандартнаяОбработка = Ложь;
- Режим = РежимДиалогаВыбораФайла.Открытие;
- ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
- ДиалогОткрытияФайла.ПолноеИмяФайла = "";
- Фильтр = "Текст CSV (*.csv)|*.csv";
- ДиалогОткрытияФайла.Фильтр = Фильтр;
- ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
- ДиалогОткрытияФайла.Заголовок = "Выберите файл";
- Если ДиалогОткрытияФайла.Выбрать() Тогда
- ФайлДанных = Новый Файл(ДиалогОткрытияФайла.ПолноеИмяФайла);
- Если Найти(ФайлДанных.Имя, "-") ИЛИ
- Найти(ФайлДанных.Имя, " ") Тогда
- Предупреждение("В имени файла не дожно быть тире, пробелов и прочих недопустимых символов (как в имени переменной)!");
- Иначе
- ЭтаФорма.ПутьФайла = ДиалогОткрытияФайла.ПолноеИмяФайла;
- ПутьФайла_ПриИзменении();
- КонецЕсли;
- КонецЕсли;
- КонецПроцедуры
- &НаКлиенте
- Процедура Разделитель1ПриИзменении(Элемент)
- ПутьФайла_ПриИзменении();
- КонецПроцедуры
- &НаСервере
- Процедура ПутьФайла_ПриИзменении()
- ФайлДанных = Новый Файл(ЭтаФорма.ПутьФайла);
- ФайлСхемы = Новый Файл(ФайлДанных.Путь+"Schema.ini");
- ЭтаФорма.Схема = "[" + ФайлДанных.Имя+ "]
- |ColNameHeader=False
- |Format=Delimited("+ЭтаФорма.Разделитель+")
- |TextDelimiter=none
- |CharacterSet=ANSI
- |";
- КонецПроцедуры
- &НаСервере
- Процедура КомандаПреобразоватьCSVвТЗНаСервере()
- тз = ПреобразоватьТекстCSVвТЗ(ТекстCSV, ";");
- ВывестиТаблицуНаФорму(ЭтаФорма, "ТаблицаCSV", тз);
- КонецПроцедуры
- &НаКлиенте
- Процедура КомандаПреобразоватьCSVвТЗ(Команда)
- КомандаПреобразоватьCSVвТЗНаСервере();
- КонецПроцедуры
- &НаСервере
- Процедура КомандаПреобразоватьТЗвCSVНаСервере()
- тз = РеквизитФормыВЗначение("ТаблицаCSV");
- ТекстCSV = ПреобразоватьТЗвТекстCSV(тз, ";");
- КонецПроцедуры
- &НаКлиенте
- Процедура КомандаПреобразоватьТЗвCSV(Команда)
- КомандаПреобразоватьТЗвCSVНаСервере();
- КонецПроцедуры
- &НаКлиенте
- Процедура КомандаПрочитатьADO(Команда)
- // подготовим Schema.ini
- ФайлДанных = Новый Файл(ЭтаФорма.ПутьФайла);
- ФайлСхемы = Новый Файл(ФайлДанных.Путь+"Schema.ini");
- ЗаписатьФайл(ФайлСхемы.ПолноеИмя, ЭтаФорма.Схема);
- ЭтаФорма.ТабДок = ПрочитатьCSV_ADO(ЭтаФорма.ПутьФайла);
- КонецПроцедуры
- &НаСервере
- Процедура КомандаПрочитатьGWFНаСервере()
- #Если ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
- Время1 = ТекущаяУниверсальнаяДатаВМиллисекундах();
- тз = ПрочитатьCSV_GWF(ЭтаФорма.ПутьФайла);
- Время2 = ТекущаяУниверсальнаяДатаВМиллисекундах();
- Сообщить(""+(Время2-Время1)+" мс");
- Элементы.Декорация1.Заголовок = "Считано записей:" + тз.Количество();
- #Иначе
- Сообщить("Компонента GameWithFire работает только в толстом клиенте!");
- #КонецЕсли
- КонецПроцедуры
- &НаКлиенте
- Процедура КомандаПрочитатьGWF(Команда)
- // подготовим Schema.ini
- ФайлДанных = Новый Файл(ЭтаФорма.ПутьФайла);
- ФайлСхемы = Новый Файл(ФайлДанных.Путь+"Schema.ini");
- ЗаписатьФайл(ФайлСхемы.ПолноеИмя, ЭтаФорма.Схема);
- КомандаПрочитатьGWFНаСервере();
- КонецПроцедуры
Advertisement
Add Comment
Please, Sign In to add comment