Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
28 мар 2024, 21:47

Перекачка данных в DBF-файлы. Проблема с индексами.

Автор bobinnick, 11 ноя 2010, 15:41

0 Пользователей и 1 гость просматривают эту тему.

bobinnick

Произвожу выкачку данных в DBF-файл из элементарного справочника:
--------------------------------------------------------------------------------------------
        // Создание файлов
        ФайлБД=КаталогИмя+"Spr_podr.";   // Название файла без расширения

   xБД = Новый XBase; // создание объекта файла формата xBase

   // добавим поля
   xБД.Поля.Добавить("Id", "S", 5);
   xБД.Поля.Добавить("Name", "S", 25);
   xБД.СоздатьФайл(ФайлБД+"dbf"); // создадим реальный файл из объекта

   // Индексное выражение
   ИндВр="Id";
   xБД.индексы.Добавить("Id",ИндВр,Истина);
   ИБД = xБД.СоздатьИндексныйФайл(ФайлБД+"cdx"); // создание индексного файла
   xБД.АвтоСохранение=Истина;
      
   // Выкачка данных
   Выборка=Справочники.Подразделения.Выбрать();
   Пока Выборка.Следующий() Цикл
      xБД.Добавить();
      xБД.ID=Выборка.Код;
      xБД.Name=Выборка.Наименование;
   КонецЦикла;
   xБД.ЗакрытьФайл();
--------------------------------------------------------------------------------------------

Почему не активируется и не формируется индексный файл? То есть файл xBase создается и данные из справочника переписываются, а вот индексный файл как бы и вовсе не причем.

И как потом при открытии, активировать первый или другой индекс (если индексов будет несколько)?

Заранее спасибо.

***Vjacheslav***

1)В цикл Нужно добавить  xБД.Записать();
2)Вследующий раз при открытии открывай его с индексным файлом   
хБД.ОткрытьФайл(ИмяФайла,ИмяИндексногоФайла);   
xБД.ТекущийИндекс = xБД.Индексы.Id;

bobinnick

Цитата: ***Vjacheslav***
1)В цикл Нужно добавить  xБД.Записать();
2)Вследующий раз при открытии открывай его с индексным файлом   
хБД.ОткрытьФайл(ИмяФайла,ИмяИндексногоФайла);   
xБД.ТекущийИндекс = xБД.Индексы.Id;

Слава, спасибо. Заработало:
-----------------------------------------------------------------------------------------------------
// Перекачка справочника "Подразделение" в DBF-файле
   
   ФайлБД=КаталогИмя+"Spr_podr.";   // Название файла без расширения
   xБД=Новый Файл(ФайлБД+"dbf");   // Создание объекта файла в среде 1С
   
   // Удалить, если файлы уже есть (в том числе и индексный файл)
   Если xБД.Существует() Тогда
      УдалитьФайлы(ФайлБД,"*");
   КонецЕсли;
   
   // Создание файлов
   xБД = Новый XBase; // создание объекта файла формата xBase
   // добавим поля
   xБД.Поля.Добавить("Id", "S", 5);
   xБД.Поля.Добавить("Name", "S", 25);
   xБД.СоздатьФайл(ФайлБД+"dbf"); // создадим реальный файл из объекта
   // Индексное выражение
   ИндВр="Id";
   xБД.индексы.Добавить("Id",ИндВр,Истина);
   ИБД = xБД.СоздатьИндексныйФайл(ФайлБД+"cdx"); // создание индексного файла
   xБД.АвтоСохранение=Истина;
   xБД.ЗакрытьФайл();
   
   // Выкачка данных
   xБД.ОткрытьФайл(ФайлБД+"dbf",ФайлБД+"cdx");
   xБД.ТекущийИндекс = xБД.индексы.Id;
   Выборка=Справочники.Подразделения.Выбрать();
   Пока Выборка.Следующий() Цикл
      xБД.Добавить();
      xБД.ID=Выборка.Код;
      xБД.Name=Выборка.Наименование;
      xБД.Записать();
   КонецЦикла;
   xБД.ЗакрытьФайл();
   
   // проверка работы индекса
   xБД.ОткрытьФайл(ФайлБД+"dbf",ФайлБД+"cdx");
   xБД.ТекущийИндекс = xБД.индексы.Id;
   Если xБД.Найти("00003",">=") Тогда
      Сообщить(xБД.ID+" - "+xБД.NAME);
      Пока xБД.Следующая() Цикл
         Сообщить(xБД.ID+" - "+xБД.NAME);
      КонецЦикла;
   КонецЕсли;      
   xБД.ЗакрытьФайл();

Это лишь небольшая заготовка для подготовки глобальной выкачки баз данных. Полный алгоритм указан, например, в книге Бартеньева О.В. «Опыты программирования».

В системе 1С 8 есть выкачка ВСЕХ данных. Мне же необходимо выкачивать только их часть. И потом база, созданная даже в 1С 8.0 уже напрямую не передается в 1С 8.1. Наконец, при перекачке с 1С 7.7 и вовсе требуется писать (на мой взгляд) алгоритмы конвертации самому.

----------------------------------------------------------------------------------------------------------
Не хочется создавать отдельную тему, задам вопрос здесь: модуль перекачки будет оформляться как внешняя обработка. Соответственно, чтобы из моих подчиненных никто не перепутал из какой базы нужно делать выкачку, а куда перекачивать, я должен поставить проверку: в какой базе данных находится пользователь. Как мне узнать имя базы или конфигурации, чтобы сделать такую проверку? (может можно определить рабочий каталог базы, например?)

progmikon

Цитата: bobinnick от 12 ноя 2010, 07:55
(может можно определить рабочий каталог базы, например?)

Как вариант СтрокаСоединенияИнформационнойБазы().... а от туда можно и строку подключения получить.

bobinnick

Цитата: progmikonКак вариант СтрокаСоединенияИнформационнойБазы().... а от туда можно и строку подключения получить.
Большое спасибо! Именно то, что я и искал. Но сам не нашел, а использовал просто имя метаданных: «Метаданные.Имя». Однако, рабочий каталог – более верный способ, потому что метаданные могут иметь и одинаковое название.

Просто для информации: столкнулся с одним подводным рифом при перекачке данных. По привычке использовал индексы. А надо понять с самого начала, что индексы 1С создает только уникальные. По крайне мере – по умолчанию. Выбрав в качестве индекса, при перекачке номер документа, потерял все записи документа (в DBF-файле), кроме одной. Когда выключил индекс, или создал другой, который соответствовал бы требованию уникальности – всё получилось.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск