Главная » 1С Предприятие » ПЕРЕДАЧА ДАННЫХ ИЗ  1С В DBF-ФАЙЛЫ – ЧАСТЬ 1

0

9.3.1.   ЭКСПОРТ ДАННЫХ   ИЗ  СПРАВОЧНИКА  СОТРУДНИКИ_2

9.3.1.1.       ПОСТАНОВКА  ЗАДАЧИ

В разд.  7.4.6 мы загрузили в  1С, используя объект типа XBase, DBF-файл с данными о начальном сальдо. Объекты того же типа применяются и для выгрузки данных из 1С.

Рассмотрим  задачу  переноса данных  из  справочника Сотрудники_2 в  файл  еmployee.dbf.

Задача осложняется тем, что реквизит Оклад справочника Сотрудники_2 является периодическим. Перенос  значений  этого  реквизита мы  выполним  в  отдельный  файл  salary.dbf, то есть поступим так же, как и 1С, которая  хранит данные  о периодических реквизитах в   файле   1SCONST.DBF.  Структуру   файла   salary.dbf  воспроизводит табл. 9.2, в заголовках столбцов которой  после символа / указано  имя соответствующего поля DBFфайла.

Таблица 9.2

Структура файла salary.dbf на примере истории окладов Горюновой У. В.

Код\Id

Дата/Date

Имя документа

/DocNarne

Номер документа

/Docld

Оклад/Salary

2010

20.11.2001

ПриказОПриеме

2

2500

2010

22.11.2001

ИзменениеОклада

2

2700

2010

30.11.2001

-

-

3200

Характеристики  полей  файла  salary.dbf опишем в табл.  9.3,  в  которой  формат числовых полей  определяется заданными  в  конфигурации  1С свойствами Длина и  Точность  соответствующих реквизитов.

Характеристики  полей  файла  salary.dbf

Таблица 9.3

Имя поля

Свойства  поля

Id, Docld

Числовые поля  формата 5.0

Date

Поле типа Дата

DocName

Строка  из 20 символов

Salary

Числовое поле формата  10.2

Вторым   осложняющим  обстоятельством является  то, что  реквизиты  Образование, ПриказОклад, ПриказПрием и Календарь имеют типы, которые в чистом виде нельзя  воспроизвести в DBF-файле. (Средствами 1С в DBF-файле можно определить числовые, символьные, логические поля  и поля типа Дата.) Поэтому нам придется некоторым образом заменить значения  этих реквизитов  на значения  стандартных типов,  но таким образом, чтобы  иметь возможность восстановить при обратном преобразовании исходные величины. Замены будем выполнять в соответствии с правилами, изложенными в табл. 9.4.

Таблица 9.4

Правила преобразования значений объектов 1С

Объект   1С

На  что заменяется в DBF-файле

Элемент  справочника

Идентификатор справочника и код элемента

Документ

Идентификатор документа и  номер документа

Календарь

Идентификатор календаря

И наконец, третий осложняющий фактор  в том, что, кроме данных  о сотрудниках, справочник содержит группы, отражающие  имена подразделений предприятия, а также описывает иерархию групп и сотрудников (см.  табл. 5.1). В создаваемом  файле  эти сведения также надо сохранить.

Таким образом, файл employee.dbf будет иметь отраженные в табл. 9.5 поля.

Таблица 9.5

Поля  файла employee.dbf

Имя  DBFполя

Имя 1Cреквизита

Свойства  DBF-поля

Описание

Id

Код

Числовое поле  формата 5.0

Код сотрудника или  группы

Parentld

-

" " 5.0

Ссылка на группу,  в  которую входит текущий  элемент

IsGroup

-

Логическое  поле

Имеет значение истина, если элемент  является группой, или ложь  в  противном  случае

Name

Наименование

Строка  из 30 символов

ФИО  сотрудника или имя группы

Ed

Образование

Строка из 13 символов

Имеет значение  Образование_2

EdId

"

Числовое поле  формата 3.0

Код  соответствующей  записи

в справочнике Образование_2

Имя DBFполя

Имя 1Cреквизита

Свойства DBF-поля

Описание

OrderEng

ПриказПрием

Строка из 15 символов

Имеет значение ПриказОПриеме

OrderEngld

"

Числовое поле формата 5.0

Номер приказа о приеме на работу

OrderSal

ПриказОклад

Строка из 13 символов

Имеет значение ИзменениеОклада

OrderSalld

"

Числовое поле формата 5.0

Номер приказа об изменении оклада

Calendar

Календарь

Строка из 9 символов

Идентификатор календаря

Очевидно,  что, имея  файлы  employee.dbf и  salary.dbf, можно   полностью  восстановить  справочник  Сотрудники_2.  Правда,  восстановленный  справочник  не  будет  точной  копией оригинала.

9.3.1.2.           ПРОЦЕДУРЫ   ПЕРЕНОСА   ДАННЫХ

Во-первых, нужно  по  известной структуре  справочника  Сотрудники_2  и  по  изложенным  правилам  преобразования   данных   создать   файлы  employee.dbf и   salary.dbf. Предварительно, однако,  мы  в  процедуре АтрСвойства сформируем таблицу значений, содержащую  преобразованное  в  соответствии  с  табл.  9.5  описание  атрибутов  (реквизитов) справочника  Сотрудники_2.  Для  этого  нам  придется  воспользоваться  объектом Метаданные.  Запустим  процедуру АтрСвойства из обработки  Проба  и  просмотрим  п олученный результат.

процедура АтрСвойства(тЗнач) далее

процедура ЕщеОднаСтрока(тЗнач, видСпр, типРек, ин, кон) далее

процедура Выполнить()                     //              Связана с кнопкой Пуск  обработки Проба  перем тЗнач;

ОчиститьОкноСообщений();

// Формируем таблицу с описанием реквизитов справочника Сотрудники_2

АтрСвойства(тЗнач);

// Просмотр таблицы значений. Результат см. на рис. 9.3

тЗнач.ВыбратьСтроку(, "Преобразованные реквизиты справочника Сотрудники_2"); конецПроцедуры // Выполнить

// Возвращает таблицу значений, содержащую преобразованное описание

// атрибутов справочника Сотрудники_2 процедура  АтрСвойства(тЗнач)

перем видСпр;

тЗнач  = СоздатьОбъект("ТаблицаЗначений");

видСпр = "Сотрудники_2";                //          Вид справочника

// Формируем столбцы таблицы значений тЗнач.НоваяКолонка("Идентификатор", "Строка");  тЗнач.НоваяКолонка("Тип", "Строка");  тЗнач.НоваяКолонка("Длина", "Число"); тЗнач.НоваяКолонка("Точность", "Число"); тЗнач.НоваяКолонка("Периодический"," Число");

// Запишем в таблицу значений идентификатор, тип, длину и точность реквизитов

// справочника Сотрудники_2. Длина записывается для символьных и числовых

// реквизитов, а точность только для числовых

// Два первых реквизита это атрибуты Код и Наименование справочника

тЗнач.НоваяСтрока();                      //              Добавляем новую строку в таблицу значений

// Атрибут Код тЗнач.Идентификатор = "Код";

тЗнач.Тип = Метаданные.Справочник(видСпр).ТипКода;

тЗнач.Длина =  Метаданные.Справочник(видСпр).ДлинаКода; тЗнач.Точность  = 0;

тЗнач.Периодический = 0;

тЗнач.НоваяСтрока();            //                   Еще  одна  новая строка

// Атрибут Наименование тЗнач.Идентификатор = "Наименование"; тЗнач.Тип = "Строка";

тЗнач.Длина = Метаданные.Справочник(видСпр).ДлинаНаименования;

тЗнач.Точность = 0; тЗнач.Периодический = 0;

// Реквизиты справочника Сотрудники_2

// Напоминаем, что реквизиты типа Справочник  и Документ порождают 2 DBF-поля,

// поэтому для  них в тЗнач  выделяем две строки

для ин = 1 по Метаданные.Справочник(видСпр).Реквизит() цикл

// Тип реквизита

типРек = Метаданные.Справочник(видСпр).Реквизит(ин).Тип;

// Очередная новая строка ЕщеОднаСтрока(тЗнач, видСпр, типРек, ин, "") ;

если (типРек = "Справочник")  или (типРек = "Документ") тогда

// Очередная новая строка

ЕщеОднаСтрока(тЗнач, видСпр, типРек, ин, "2"); конецЕсли;

конецЦикла; конецПроцедуры // АтрСвойства

// Добавляет новую строку в таблицу значений тЗнач

процедура ЕщеОднаСтрока(тЗнач, видСпр, типРек, ин, кон)

перем  обВид;                                 //                     Разновидность  типа объекта

// кон = "", если добавляется  первая строка  для  справочника или документа

// кон = "2", если добавляется вторая строка для справочника или документа тЗнач.НоваяСтрока();

если (типРек = "Число") или (типРек = "Строка") или (типРек = "Дата") тогда тЗнач.Идентификатор =

Метаданные.Справочник(видСпр).Реквизит(ин).Идентификатор;

тЗнач.Тип  = типРек;

тЗнач.Длина = Метаданные.Справочник(видСпр).Реквизит(ин).Длина;

иначе                                         //                          Справочник, Документ или Календарь если типРек = "Календарь" тогда

тЗнач.Идентификатор =

Метаданные.Справочник(видСпр).Реквизит(ин).Идентификатор;

иначе

обВид =  Метаданные.Справочник(видСпр).Реквизит(ин).Вид; тЗнач.Идентификатор = обВид + кон;

конецЕсли;

если кон = "" тогда тЗнач.Тип  "Строка";

тЗнач.Длина  =  СтрДлина(тЗнач.Идентификатор); иначе                               //                               кон = 2

тЗнач.Тип = "Число";

если типРек = "Справочник" тогда

тЗнач.Длина  =  Метаданные.Справочник(обВид).ДлинаКода; иначе                            //                            типРек = "Документ"

тЗнач.Длина  =  Метаданные.Документ(обВид).ДлинаНомера; конецЕсли;

конецЕсли; конецЕсли;

тЗнач.Точность =  Метаданные.Справочник(видСпр).Реквизит(ин).Точность; тЗнач.Периодический  = Метаданные.Справочник(видСпр).Реквизит(ин).Периодический;

конецПроцедуры // ЕщеОднаСтрока

Замечания:

Рис. 9.3. Результат работы процедуры АтрСвойства

1.      Процедуры  АтрСвойства  и   ЕщеОднаСтрока  показывают,  что  объект  Метаданные обеспечивает  доступ  к  значению  любого   компонента  структуры  объекта   агрегатного  типа.

2.       Примеры  структур  метаданных системы приведены в  прил.  1.

Теперь  таблица  тЗнач  содержит  практически  все необходимые  данные  для  создания  файла   employee.dbf.  Осталось   только   заменить  значения  столбца  Идентификатор на  соответствующие имена полей  файла  employee.dbf.  Выполним  эти  замены   в  процедуре ДляДБФ.  В  процедуре СоздатьПоляДБФ  подготовим,  пользуясь   данными  таблицы  значений  тЗнач,  поля  для  файла  employee.dbf, а в  процедуре  СоздатьСотр  сформируем  файл  employee.dbf  и  его  индексы.

Перенос данных  в  файл  employee.dbf  выполнит процедура ПеренестиСотр,  обраб атывающая  справочник  Сотрудники_2  по  следующему   алгоритму:

1.              Начало.

2.                 Выполнить  выборку элементов справочника Сотрудники_2.

3.               Для каждого элемента найти переносимые в DBF-поля значения.

4.                 Создать  новую запись в файле employee.dbf и перенести в нее найденные в п. 3 значения.

Источник: Бартеньев О. В. 1С:Предприятие:  программирование для  всех.  Базовые объекты и расчеты на одной дискете. М.: Диалог-МИФИ, 2005. 464 с.

По теме:

  • Комментарии