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

0

5.               Конец.

Для  выбранного  сотрудника  пп.  3 и 4 алгоритма реализует следующий код:

дбф.Добавить(); дбф.Id = сСотр_2.Код;

дбф.ParentId=  сСотр_2.Родитель.Код; дбф.IsGroup = сСотр_2.ЭтоГруппа(); дбф.Name = сСотр_2.Наименование; дбф.Ed = сСотр_2.0бразование.Вид(); дбф.EdId = сСотр_2.Образование.Код;

дбф.QrderEng =  сСотр_2.ПриказПрием.Вид(); дбф.OrderEngId  =  сСотр_2.ПриказПрием.НомерДок; дбф.OrderSal =  сСотр_2.ПриказОклад.Вид(); дбф.OrderSalId = сСотр_2.ПриказОклад.НомерДок; дбф.Calendar =  сСотр_2.Календарь.Вид(); дбф.3аписать();

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

Заполнение   файла   salary.dbf  выполним  в   процедуре  ПеренестиОклад  по   схеме, реализованной  в  примере  3 разд.  6.1.  Процедура ПеренестиОклад  вызывается для  выбранного сотрудника  в  процедуре ПеренестиСотр.

Итоговый  код  переноса будет таким:

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

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

процедура СоздатьПоляДБФ(тЗнач, дбф, пРекв) далее

процедура  СоздатьСотр(дбф) далее процедура ДляДБФ2(тЗнач) далее процедура  СоздатьОклад(дбф) далее

процедура ПеренестиСотр(дбф, дбф2) далее

процедура ПеренестиОклад(сотр, оп, дбф) далее

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

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

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

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

// Готовим таблицу значений тЗнач для процедуры создания файла employee.dbf ДляДБФ(тЗнач);

// Просмотр таблицы значений. Результат см. на рис. 9.4 тЗнач.ВыбратьСтроку(, "Свойства полей  файла  employee.dbf); СоздатьПоляДБФ(тЗнач, дбф, 0);            //       Создаем поля  файла employee.dbf СоздатьСотр(дбф);                        //               Создаем файл  employee.dbf ДляДБФ2(тЗнач);

// Просмотр таблицы значений. Результат см. на рис. 9.5 тЗнач.ВыбратьСтроку(, "Свойства полей  файла  salary.dbf); СоздатьПоляДБФ(тЗнач,    дбф2,    1);    //  Создаем     поля    файла    salary.dbf

// Готовим таблицу значений тЗнач для процедуры создания файла salary.dbf СоздатьОклад(дбф2);            //                  Создаем файл salary.dbf

// Перенос данных в файлы employee.dbf и salary.dbf.

// Вызывает процедуру  ПеренестиОклад. Результаты см. на рис. 9.6 и 9.7

ПеренестиСотр(дбф, дбф2); Предупреждение("Готово.");

конецПроцедуры // Выполнить

// Код процедур  АтрСвойства и ЕщеОднаСтрока см. выше

// Заменяет в таблице значений тЗнач данные столбца Идентификатор,

// на соответствующие имена поле файла  employee.dbf. Вставляет также две

// строки для полей Parentld и IsGroup файла employee.dbf  процедура ДляДБФ(тЗнач)

перем сЗнач, ин, поз, имяПоля, номСтроки, колСтрок;

// Список значений сЗнач содержит перечень  соответствий между именами

// DBF-полей файла employee.dbf и значениями столбца Идентификатор таблицы тЗнач

сЗнач = СоздатьОбъект("СписокЗначений"); сЗнач.ДобавитьЗначение("Код", "Id"); сЗнач.ДобавитьЗначение("Наименование", "Name"); сЗнач.ДобавитьЗначение("Оклад", "Salary"); сЗнач.ДобавитьЗначение("Образование_2",  "Ed"); сЗнач.ДобавитьЗначение("Образование_22";  "Edld"); сЗнач.ДобавитьЗначение("ПриказОПриеме", "OrderEng"); сЗнач.ДобавитьЗначение("ПриказОПриеме2", "OrderEngld"); сЗнач.ДобавитьЗначение("ИзменениеОклада", "OrderSal"); сЗнач.ДобавитьЗначение("ИзменениеОклада2", "OrderSalld"); сЗнач.ДобавитьЗначение("Календарь",  "Calendar"); тЗнач.ВыбратьСтроки();

// Заносим вместо имеющегося в столбце Идентификатор значения имя DBF-поля пока тЗнач.ПолучитьСтроку() = 1 цикл

поз =  сЗнач.НайтиЗначение(тЗнач.Идентификатор); если поз > 0 тогда

сЗнач.ПолучитьЗначение(поз, имяПоля);  тЗнач.Идентификатор  = имяПоля;

конецЕсли; конецЦикла; // пока

// Добавляем данные  для двух полей  файла employee.dbfParentID и IsGroup,

// а затем располагаем добавленные строки вслед за первой строкой таблицы тЗнач

тЗнач.НоваяСтрока(); тЗнач.Идентификатор = "ParentID";  тЗнач.Тип = "Число";

// Длина поля ParentID равна длине поля ID тЗнач.НайтиЗначение("Id", номСтроки, 1);

тЗнач.Длина = тЗнач.ПолучитьЗначение(номСтроки,  3); тЗнач.Точность = 0;

тЗнач.Периодический = 0; тЗнач.НоваяСтрока(); тЗнач.Идентификатор = "IsGroup";

тЗнач.Тип = "Логический"; тЗнач.Длина=  1; тЗнач.Точность  0; тЗнач.Периодический = 0;

// Сдвигаем новые строки вверх колСтрок  = тЗнач.КоличествоСтрок(); тЗнач.СдвинутьСтроку(2 колСтрок,  колСтрок);  тЗнач.СдвинутьСтроку(2  колСтрок, колСтрок);

конецПроцедурЫ // ДляДБФ

// Создает  на основе таблицы значений  тЗнач  поля DBF-файл процедура СоздатьПоляДБФ(тЗнач, дбф, пРекв)

// Формальный  параметр пРекв = 1, если создается поле для периодического реквизита,

// или пРекв = 0 в противном случае перем имяПоля, типПоля;

дбф  =  СоздатьОбъект("ХВаse");

тЗнач.ВыбратьСтроки();

// Каждая  строка  таблицы значений  тЗнач,  отвечающая  непериодическому реквизиту

// справочника Сотрудники2,  порождает одно DBF-поле пока тЗнач.ПолучитьСтроку() =  1  цикл

// Значения  периодических реквизитов размещаются в отдельной таблице

// (в нашем случае речь  идет о периодическом реквизите Оклад)  если (тЗнач.Периодический =  1) и (пРекв = 0) тогда

продолжить;                        //                Пропускаем периодический реквизит конецЕсли;

имяПоля = тЗнач.Идентификатор;

если (тЗнач.Тип = "Число") или (тЗнач.Тип = "Числовой") тогда типПоля = "N";

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

типПоля = "S";

иначеЕсли тЗнач.Тип  =  "Дата" тогда типПоля = "D" ;

иначеЕсли тЗнач.Тип  = "Логический" тогда

типПоля = "L"; конецЕсли;

дбф.ДобавитьПоле(имяПоля, типПоля, тЗнач.Длина, тЗнач.Точность);

конецЦикла; // пока конецПроцедуры // СоздатьПоляДБФ

процедура СоздатьСотр(дбф)                      //              Создает файл employee.dbf

// Создаем два индекса

// Индекс Name обеспечит сортировку по значению поля Name дбф.ДобавитьИндекс("Name", "Name", 0, 0,"");

// Индекс Depart обеспечить  сортировку по группам  (поле  Parentld),

// а в пределах  групп  по полю  Name

дбф.ДобавитьИндекс("Depart", "trim(str(ParentId)) + Name", 0, 0, "") ; дбф.СоздатьФайл("employee.dbf,     "employee.cdx");

конецПроцедуры  // СоздатьСотр

// Готовит таблицу значений тЗнач для создания файл  salary.dbf процедура  ДляДБФ2(тЗнач)

перем сЗнач, ин, значен, предст, номСтроки, тЗнач2, колСтрок;

// Модифицируем таблицу значений тЗнач в  соответствии с табл. 9.2

//Для этого  создадим  список  значений  сЗнач,  содержащий  соответствия между

// старыми и новыми значениями поля  Идентификатор  таблицы тЗнач

// Строки таблицы значений  тЗнач,  не отраженные в списке сЗнач, удаляются сЗнач  = СоздатьОбъект("СписокЗначений");

сЗнач.ДобавитьЗначение("Id", "Id");

сЗнач.ДобавитьЗначение("OrderSal",  "DocName"); сЗнач.ДобавитьЗначение("OrderSalId",  "DocId"); сЗнач.ДобавитьЗначение("Salary",    "Salary");

// Перемещаем  строки, отраженные  в списке сЗнач, в верх  таблицы значений тЗнач

// и делаем предписанные списком сЗнач замены имен для ин = 1 по сЗнач.РазмерСписка() цикл

значен = сЗнач.ПолучитьЗначение(ин, предст); номСтроки = 0;

тЗнач.НайтиЗначение(значен, номСтроки, 1);

// Изменения значения  поля  Идентификатор  в соответствии со списком сЗнач

тЗнач.УстановитьЗначение(номСтроки, 1, предст); тЗнач.СдвинутьСтроку(ин номСтроки,  номСтроки);

конецЦикла; // для

// Выгружаем строки, отраженные  в списке сЗнач,  в таблицу тЗнач2 тЗнач2  = СоздатьОбъект("ТаблицаЗначений"); тЗнач.Выгрузить(тЗнач2, 1, сЗнач.РазмерСписка());

// Переносим таблицу тЗнач2 в таблицу тЗнач

т3нач.3агрузить(т3нач2);

тЗнач2 = 0;                                 //                      Более таблица значений тЗнач2 не нужна

// Добавляем в тЗнач строку для даты и перемещаем  ее на вторую позицию таблицы тЗнач.НоваяСтрока();                    //            Добавляем новую строку в таблицу значений тЗнач.Идентификатор = "Date";

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

// Ставим строку  с датой  на вторую позицию колСтрок  = тЗнач.КоличествоСтрок(); тЗнач.СдвинутьСтроку(2 колСтрок,  колСтрок);

конецПроцедуры // ДляДБФ2

процедура СоздатьОклад(дбф)                     //             Создает файл salary.dbf

// Создаем один индекс

// Индекс IdDate обеспечит сортировку по дате в пределах  заданного кода сотрудника дбф.ДобавитьИндекс("IdDate", "str(Id)  + dtos(Date)", 0, 0,""); дбф.СоздатьФайл("salary.dbf, "salary.cdx");

конецПроцедуры // СоздатьОклад

// Заполняет файл  employee.dbf и  вызывает процедуру ПеренестиОклад, которая добавляет

//данные в  файл  salary.dbf для выбранного  сотрудника процедура  ПеренестиСотр(дбф,  дбф2)

перем  сСотр_2, оп;

// Создаем объект типа Периодический для работы с файлом оп = СоздатьОбъект("Периодический");

сСотр_2  = СоздатьОбъект("Справочник.Сотрудники_2"); сСотр_2.ВыбратьЭлементы();

пока  сСотр_2.ПолучитьЭлемент() = 1 цикл

дбф.Добавить();                        //               Новая  запись в файле employee.dbf дбф.Id = сСотр_2.Код;

дбф.ParentId = сСотр_2.Родитель.Код;

дбф.IsGroup = сСотр_2.ЭтоГруппа(); дбф.Name = сСотр_2.Наименование; дбф.Ed  = сСотр_2.0бразование.Вид(); дбф.EdId  = сСотр_2.0бразование.Код;

дбф.OrderEng = сСотр_2.ПриказПрием.Вид();

дбф.OrderEngId = сСотр_2.ПриказПрием.НомерДок; дбф.OrderSal =  сСотр_2.ПриказОклад.Вид(); дбф.OrderSalId  = сСотр_2.ПриказОклад.НомерДок; дбф.Calendar = сСотр_2.Календарь.Вид();

дбф.3аписать();                        //                Сохраняем  данные

// Если выбран сотрудник, а не группа  если  сСотр_2.ЭтоГруппа() = 0 тогда

// Добавляем данные об окладе текущего сотрудника в файл  salary.dbf

ПеренестиОклад(сСотр_2, оп, дбф2); конецЕсли;

конецЦикла // пока

конецПроцедуры // ПеренестиСотр

// Добавляет для сотрудника сотр записи в файл salary.dbf процедура ПеренестиОклад(сотр, оп, дбф)

перем док;

// Прикрепляем ОП  к периодическому  реквизиту Оклад  найденного сотрудника  оп.ИспользоватьОбъект("Оклад",  сотр.ТекущийЭлемент());

// Позиционируемся перед первой записью истории окладов сотрудника

оп.ВыбратьЗначения();

// Метод ПолучитьЗначение позиционирует ОП на следующей записи

// периодического  реквизита Оклад  пока оп.ПолучитьЗначение() = 1 цикл

// Документ, вызвавший изменение оклада док = оп.ТекущийДокумент();

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

По теме:

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