Имя: Пароль:
1C
1С v8
Помощь в разборе DBF структуры
0 DoctorPIX
 
18.04.14
14:59
ЗДрасте, пожалуйста помогите разобраться в структуре требуемого файла.
Должено быть 3 файла как я понял DBF. Какие поля там будут?
В 1С не силен, а напарник ушел в отпуск, оставив обработку.


    БД = Новый XBase;
    БД.ОткрытьФайл(ЭтаФорма.ПутьКФайлуПациентов,,Истина);
    
    Если НЕ БД.Открыта() Тогда
        Возврат;
    КонецЕсли;
    
    БД2 = Новый XBase;
    БД2.ОткрытьФайл(ЭтаФорма.ПутьКФайлуПолисов,ЭтаФорма.ПутьКФайлуИндексаПолисов,Истина);
    
    Если НЕ БД2.Открыта() Тогда
        Возврат;
    КонецЕсли;
    БД2.ТекущийИндекс = БД2.Индексы.IDX;
    
    МассивПациентов = Новый Массив;
    БД.Первая();
    Счетчик = 1;    
    
    БД.Первая();
    Пока НЕ БД.ВКонце() и Счетчик < 2  Цикл
        Счетчик = Счетчик + 1;
        Пациент = Новый Структура;
        Пациент.Вставить("Фамилия", СокрП(БД.FAM));
        Пациент.Вставить("Имя", СокрП(БД.IM));
        Пациент.Вставить("Отчество", СокрП(БД.OT));
        Пациент.Вставить("ДатаРождения", БД.DR);
        Пациент.Вставить("Пол", БД.W);
        Полис = СокрП(БД.SN_POL);
        Пробел = Найти(Полис, " ");
        Пациент.Вставить("ТипПолиса", БД.TIP_D);
        
        Если Пробел = 0 Тогда
            Пациент.Вставить("СерияПолиса", "");
            Пациент.Вставить("НомерПолиса", Полис);
        Иначе
            Пациент.Вставить("СерияПолиса", Сред(Полис, 1, Пробел-1));
            Пациент.Вставить("НомерПолиса", Сред(Полис, Пробел + 1));
        КонецЕсли;
    
        Если не ПустаяСтрока(БД.TEL) Тогда
            Сч = 1;
            Пока Сч < 12  Цикл
                Если КодСимвола(БД.TEL, Сч) = 48 Тогда
                    Сч = Сч + 1;
                Иначе
                    Прервать;
                КонецЕсли;
            КонецЦикла;
            Если Сч = 1 Тогда
                Тел = "+" + Сред(БД.TEL, 1, 1) +
                        " (" + Сред(БД.TEL, 2, 3) + ") " +
                        Сред(БД.TEL, 5);
                Пациент.Вставить("ТипТелефона", "Сотовый");
            ИначеЕсли Сч = 2 Тогда
                Тел = "(" + Сред(БД.TEL, 2, 3) + ") " +
                        Сред(БД.TEL, 5);
                Пациент.Вставить("ТипТелефона", "Сотовый");
            ИначеЕсли Сч = 5 Тогда
                Тел = Сред(БД.TEL, 5);
                Пациент.Вставить("ТипТелефона", "Домашний");
            Иначе
                Тел = Сред(БД.TEL, Сч + 1);
                Пациент.Вставить("ТипТелефона", "Домашний");
            КонецЕсли;
            Пациент.Вставить("Телефон", Тел);
            
          КонецЕсли;
  
        Пациент.Вставить("Улица", СокрП(БД.UL));
        Пациент.Вставить("Дом", СокрП(БД.DOM));
        Пациент.Вставить("Корпус", СокрП(БД.KOR));
        Пациент.Вставить("Строение", СокрП(БД.STR));
        Пациент.Вставить("Квартира", СокрП(БД.KV));
        ТипДУЛ = БД.Q_PASP;
        НомерДУЛ = СокрП(БД.SN_PASP);
        Если Не ПустаяСтрока(НомерДУЛ) Тогда
  
              Если ТипДУЛ = "0" или ТипДУЛ = "1" или ТипДУЛ = " " Тогда
                Н_ = Найти(НомерДУЛ, "-");
                Если Н_ > 0 Тогда
                      ТипДУЛ = 0;
                    СерияДУЛ = Сред(НомерДУЛ, 1, Н_ + 2);
                    НомерДУЛ = Сред(НомерДУЛ, Н_ + 4);
                Иначе
                    СерияДУЛ = Сред(НомерДУЛ, 1, 5);
                    НомерДУЛ = Сред(НомерДУЛ, 7);
                    ТипДУЛ = 1;
                КонецЕсли;
            ИначеЕсли ТипДУЛ = "9" Тогда
                ТипДУЛ = 2;
                СерияДУЛ = Сред(НомерДУЛ, 1, 6);
                НомерДУЛ = Сред(НомерДУЛ, 8);
            ИначеЕсли ТипДУЛ = "v" или ТипДУЛ = "w" Тогда
                СерияДУЛ = "";
                ТипДУЛ = 3;
                СерияДУЛ = "";
            КонецЕсли;
            
            Пациент.Вставить("ТипДУЛ", ТипДУЛ);
            Пациент.Вставить("СерияДУЛ", СерияДУЛ);
            Пациент.Вставить("НомерДУЛ", НомерДУЛ);
            
        КонецЕсли;
        Пациент.Вставить("ГруппаИнвалидности", СокрП(БД.INV));
        Пациент.Вставить("СНИЛС", СокрП(БД.SS));
        Пациент.Вставить("КЛАДР", СокрП(БД.KLADRID));
        Пациент.Вставить("КодСМО", СокрП(БД.Q));
        Пациент.Вставить("ТипСМО", СокрП(БД.QG));
        Пациент.Вставить("НазваниеСМО", СокрП(БД.Q_NAME));
        Пациент.Вставить("ГородСМО", СокрП(БД.Q_GOR));
        СМО = БД.Q_NAME + БД.Q_GOR;
        Пациент.Вставить("Работа", СокрП(БД.RAB));
                
        ЗаписьНайдена = БД2.Найти(Полис, "=");
        Если ЗаписьНайдена Тогда
            Пациент.Вставить("Карта", СокрП(БД2.C_I));
        Иначе
            Сообщить(Пациент.Фамилия + " " + Пациент.Имя + " " + Пациент.Отчество);
        КонецЕсли;
        
        МассивПациентов.Добавить(Пациент);
        Если Не БД.Следующая() Тогда
            Прервать;
        КонецЕсли;
    КонецЦикла;    
    
    БД.ЗакрытьФайл();
    БД2.ЗакрытьФайл();
    СоздатьПациентаИКарту(МассивПациентов);
1 Wobland
 
18.04.14
15:00
и взрослых рядом нет?
2 Сияющий в темноте
 
18.04.14
15:15
А если сделать DBF-файлы и заглянут в них - не проще ли будет ?
3 DoctorPIX
 
18.04.14
15:35
(2) дак мне и надо понять как сделать их )
4 Wobland
 
18.04.14
15:36
(3) что мешает?
5 Гобсек
 
18.04.14
15:45
FAM
IM
OT
DR
W
SN_POL
TIP_D

и так далее. Например, в тексте модуля встречается выражение СокрП(БД.RAB) Значит, есть поле под названием RAB. Кроме того, поскольку в выражении использована функция СокрП, то это поле строковое.
6 Wobland
 
18.04.14
15:50
(5) то это поле неизвестно какого типа приводится к строке
7 DoctorPIX
 
18.04.14
15:58
зачем файл индекса полисов?
8 Wobland
 
18.04.14
15:58
(7) для индексов
9 SSSSS_AAAAA
 
18.04.14
16:00
(0) А что с ней разбираться? Простой список полей.
1. Куча кода читающего из файла. Пишущего в файл код нет. Поэтому, каким боком тут вопрос "какие будут поля" к уже существующему файлу? В существующем файле поля ЕСТЬ, а не будут.
2. О каких трёх файлах речь? В приведенном коде открывается, читается и закрывается один файл.
Может таки нормально сформулируете вопрос?
10 DoctorPIX
 
18.04.14
16:03
1-ый файл БД.ОткрытьФайл(ЭтаФорма.ПутьКФайлуПациентов,,Истина);
2-ой и 3-ий файл  БД2.ОткрытьФайл(ЭтаФорма.ПутьКФайлуПолисов,ЭтаФорма.ПутьКФайлуИндексаПолисов,Истина);

1.ПутьКФайлуПациентов
2.ПутьКФайлуПолисов
3.ПутьКФайлуИндексаПолисов

В файлы ничего не пишется, наоборот с них идет загрузка в базу. Я хочу понять какой структуры файлы, чтобы наполнить их, и с помощью этой обработки загрузить данные в базу.!
11 Wobland
 
18.04.14
16:04
а чем наполнять собрался?
12 DoctorPIX
 
18.04.14
16:05
дак мне и надо понять, чем наполнять :)
13 DoctorPIX
 
18.04.14
16:06
загрузка пациентов, ФИО ДАТА ПОЛИС и прочее прочее... только какие нужны я хз
14 Wobland
 
18.04.14
16:08
мда...
15 SSSSS_AAAAA
 
18.04.14
16:08
(10) Ну так просто откройте их любой смотрелкой dbf-файлов. Индексы смотреть не надо и заполнять их тоже не надо, они сами заполнятся.
16 bolder
 
18.04.14
22:13
(12) У вас есть пример кода на ЧТЕНИЕ кем то созданных dbf.
Если вы когда либо работали с ними, то должны понимать, что поля dbf называются так, как к ним обращается эта обработка.Тип полей нужно устанавливать из общих соображений.Например, БД.FAM - явно фамилия, это же по- русски написано,значит тип строковый, длиной скажем 100 символов, ну и так далее.Индексный файл нужно создать автоматически.
17 Garykom
 
гуру
19.04.14
00:20
(0) Открой как ты базу 1С и смотри куда там эти поля грузятся - узнаешь что в них должно быть.
Конкретно глянь процедурку:
СоздатьПациентаИКарту(МассивПациентов);
В ней и происходит заполнение справочников из массива
18 Torquader
 
19.04.14
01:48
Давайте вы расскажете задачу или ТЗ полностью и не будем страдать фигнёй и пытаться понять, зачем в dbf-файле поля.
19 Miracle_
Miracle
 
19.04.14
06:17
(0)Самый простой вариант спросить структуру требуемого файла(ов) у тех кому вы их сдавать собираетесь.
Например у клиент-банков (некоторых) строгое ограничение на длину поля и версию  dbf.И гадание из (12) может сыграть злую шутку.
20 Wobland
 
19.04.14
06:18
(18) ты ж на нашей стороне. давайте все вместе и придумаем, что нужно ТС и как этого добиться ;)