Методика полягає в тому що в 1С ,мені наприклад, зручніше працювати з Таблицею Значень ніж з
DBF файлом по багатьох причинах.
Універсальність обробки полягає в тому, що при імпорті DBF формується Таблиця Значень з типами полів і структурою що повністю відповідають файлу з якого зачитуємо дані.
При експорті, все навпаки, потрібно в 1С сформувати Таблицю Значень з назвами і типами полів такими як потрібна структура майбутнього DBF файлу.
//*******************************************
// Переносить таблицю значень ТЗ в ДБФ файл НазвиКолонокТЗ = НазвамПолівДБФ
// SVB (kreont@meta.ua)
Функция ТаблицюЗначеньВФайлДБФ(Каталог,ІмяФайлу,ТЗ,Кодування = 0)
Попытка
ИмяФайла = СокрЛП(Каталог) + ІмяФайлу + ".dbf";
ДБФ=СоздатьОбъект("XBase");
ДБФ.КодоваяСтраница(Кодування);
КількістьКолонок = ТЗ.КоличествоКолонок();
Для і =1 по КількістьКолонок Цикл
ТипДаних = "";
ДовжинаДаних = 0;
ТочністьДаних = 0;
НазваКолонки = ТЗ.ПолучитьПараметрыКолонки(і,ТипДаних,ДовжинаДаних, ТочністьДаних);
Если ТипДаних = "Число" Тогда
ТипДанихЧислом = "N";
ИначеЕсли ТипДаних = "Строка" Тогда
ТипДанихЧислом = "S";
ИначеЕсли ТипДаних = "Дата" Тогда
ТипДанихЧислом = "D";
Иначе
ТипДанихЧислом = "S";
ДовжинаДаних = 100;
КонецЕсли;
ДБФ.ДобавитьПоле(НазваКолонки,ТипДанихЧислом,ДовжинаДаних,ТочністьДаних);
КонецЦикла;
ДБФ.СоздатьФайл(ИмяФайла);
ТЗ.ВыбратьСтроки();
КолКолонок = ТЗ.КоличествоКолонок();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
ДБФ.Добавить();
Для і = 1 по КількістьКолонок Цикл
ДБФ.УстановитьЗначениеПоля(СокрЛП(ТЗ.ПолучитьПараметрыКолонки(і)),ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки,і));
КонецЦикла;
ДБФ.Записать();
КонецЦикла;
ДБФ.ЗакрытьФайл();
Возврат 0; //Успішно записано
Исключение
Сообщить("Помилка створення " + ИмяФайла + " при записі:");
Сообщить(ОписаниеОшибки());
Возврат 1;
КонецПопытки;
КонецФункции //
//*******************************************
// Переносить ДБФ в Таблицю значень НазвиКолонокТЗ = НазвамПолівДБФ
// SVB (kreont@meta.ua)
Функция ДБФвТаблицюЗначень(Каталог,ІмяФайлу,Кодування = 0)
Попытка
ИмяФайла = СокрЛП(Каталог) + ІмяФайлу;
ДБФ=СоздатьОбъект("XBase");
ДБФ.ОткрытьФайл(ИмяФайла);
ДБФ.КодоваяСтраница(Кодування);
ТЗ = СоздатьОбъект("ТаблицаЗначений");
КількістьКолонок = ДБФ.КоличествоПолей();
Для і = 1 по КількістьКолонок Цикл
НазваКолонки = "";
ТипДаних = "";
ТипДанихЧислом = 0;
ДовжинаДаних = 0;
ТочністьДаних = 0;
ДБФ.ОписаниеПоля(і,НазваКолонки,ТипДанихЧислом,ДовжинаДаних,ТочністьДаних);
Если ТипДанихЧислом = 1 Тогда
ТипДаних = "Число";
ИначеЕсли ТипДанихЧислом = 2 Тогда
ТипДаних = "Строка";
ИначеЕсли ТипДанихЧислом = 3 Тогда
ТипДаних = "Дата";
Иначе
ТипДаних = "Строка";
ДовжинаДаних = 255; // Для невизначених типів полів, пробуєм зачитати те що є як тип стрічка
КонецЕсли;
//Сообщить(НазваКолонки + ",Тип:" + ТипДаних + ", Довжина:" + ДовжинаДаних + ", Точність:" + ТочністьДаних);
ТЗ.НоваяКолонка(НазваКолонки,ТипДаних,ДовжинаДаних,ТочністьДаних,НазваКолонки);
КонецЦикла;
ДБФ.Первая();
Пока ДБФ.ВКонце() = 0 Цикл
ТЗ.НоваяСтрока();
Для і = 1 по КількістьКолонок Цикл
ТЗ.УстановитьЗначение(ДБФ.НомерЗаписи(),і,ДБФ.ПолучитьЗначениеПоля(і));
КонецЦикла;
ДБФ.Следующая();
КонецЦикла;
ДБФ.ЗакрытьФайл();
Возврат ТЗ; //Успішно зачитано
Исключение
Сообщить("Помилка отримання ТЗ з " + ИмяФайла);
Сообщить(ОписаниеОшибки());
Возврат 0;
КонецПопытки;
КонецФункции //
Приклад обробки для тестування, хто сумнівається в простоті (достатньо вставити в новий зовнішній звіт):
Процедура Сформировать()
НазваФайлу = "";
РобочийКаталог = "";
ТЗДБФ = СоздатьОбъект("ТаблицаЗначений");
Если ФС.ВыбратьФайл(0,НазваФайлу,РобочийКаталог,"Тест відкриття DBF файлу","DBF-файли (*.dbf)|*.dbf") = 1 Тогда
ТЗДБФ = ДБФвТаблицюЗначень(РобочийКаталог,НазваФайлу,КодуванняДБФ);
Если ПустоеЗначение(ТЗДБФ) = 0 Тогда
// Дивимся на екрані що зачитали
ТЗДБФ.ВыбратьСтроку();
// Запис ТЗ під іншим іменем (TestZap0) наприклад в той же каталог
ТаблицюЗначеньВФайлДБФ(РобочийКаталог,"TestZap0",ТЗДБФ);
Иначе
// Помилка отримання ДБФ в ТЗ
КонецЕсли;
КонецЕсли;
КонецПроцедуры
|