Работа с индексами (DBF-файлы)

Для организации упорядочивания содержимого файла БД и поиска в ней по значению одного или нескольких полей применяется механизм индексов. Его применение можно сравнить с сортировкой картотеки по определенному признаку (совокупности признаков). Однако, в отличие от картотеки, файл БД может иметь сразу несколько индексов, и, соответственно, являться упорядоченным одновременно по нескольким признакам. Индексы хранятся в индексном файле. Индексный файл может содержать информацию более чем об одном индексе. Рекомендуется для одного файла DBF иметь один индексный файл, в котором хранятся все индексы для этого файла.
Каждый индекс имеет наименование, признак уникальности, выражение индекса и фильтр. Наименование индекса используется для идентификации индекса. Выражение индекса и фильтр представляют собой написанные на специальном языке выражения, вычисление значения которых для каждой записи позволяет определить ее место при упорядочивании и необходимость помещения ее в упорядоченный список (индекс может содержать упоминание не обо всех записях таблицы, а только об удовлетворяющих выражению фильтра). Уникальный индекс (имеющий установленным признак уникальности) позволяет иметь в индексе ссылки на записи только с различным значением индексного выражения.
Основное правило: индекс нужен, чтобы быстро искать нужную запись.
DBF-ФАЙЛ:
1 Иванов
2 Абдулов
3 Барабанов
4 Мирнов
5 Раскольников

6 Комаров
Индекс по фамилии (по алфавиту):
Абдулов 2
Барабанов 3
Иванов 1
Мирнов 4
Комаров 6
Раскольников 5
Нужно быстро найти Комаров. В неупорядоченном исходном файле искать его можно только последовательным перебором всех записей, что будет очень долго при большом числе записей. В индексе найти Комарова можно очень быстро, поскольку индекс отсортирован по полю Фамилия. При этом мы узнаем физический номер записи в файле DBF и производим прямое позиционирование на нужную запись.
После создания структуры базы данных можно добавить индексы следующим образом:
//Синтаксис: ДобавитьИндекс(<Название>, <Выражение>, <Уникальность>, <Убывание>, <Фильтр>)
Файл = СоздатьОбъект(“XBase”);
Файл.ДобавитьПоле(“NAME”, 1, 19, 3);
Файл.ДобавитьПоле(“PRICE”, 2, 25, 0);
Файл.ДобавитьИндекс(“IDXCODE”, “CODE”, 1, 0, “”);
Файл.ДобавитьИндекс(“IDXNAME”, “NAME”, 0, 0, “”);
Файл.ДобавитьИндекс(“IDXNAMECODE”, “NAME+CODE”, 0, 0, “”);
Файл.СоздатьФайл(“mydb.dbf”, “mydb.cdx”);
//1-й вариант
Файл.ТекущийИндекс(“IDXNAME”);
Файл.Найти(“Иванов”,0); //передается значение и режим поиска
//2-й вариант
Файл.ТекущийИндекс(“IDXNAMECODE”);
Файл.Ключ.NAME = “Иванов”;
Файл.Ключ.CODE = 123;
Файл.НайтиПоКлючу(0);
//после сбоя рекомендуется заново переформировать все индексы
Файл.Переиндексировать();
В 1С существует специальный язык для задания выражений и фильтра индекса. Подробнее о нем, смотрите в документации на встроенный язык.

Комментарии | опубликовано: 28 Август 2008, 08:46

Объекты конфигурации

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

Комментарии | опубликовано: 3 Август 2008, 21:28

Как при записи периодического реквизита установить значение документа, изменившего реквизит?

При нажатии кнопки «История» выводится таблица периодических реквизитов справочника. В ней имеется колонка, в которой указывается значение документа, изменившего реквизит. Как при записи периодического реквизита установить значение этого документа программно?
Используйте метод:
УстановитьРеквизитСправочника(,,,,,,);
Синтаксис:
УстановитьРеквизитСправочника(<ЭлементСправочника>, <НазваниеРеквизита>, <Значение>, <ДатаУстановки>, <ИмяТипа>, <Длина>, <Точность>)
Назначение:
Записать значение периодического реквизита справочника с привязкой к проведению документа.
Параметры:
– элемент справочника, в который будет запись;
– название периодического реквизита справочника;
– новое значение периодического реквизита;
– дата установки нового значения периодического реквизита. Дата установки имеет смысл только для не оперативных документов.
– необязательный параметр. Строковое выражение – название типа данных (или Вид субконто);
– необязательный параметр. Число – длина числового или строкового значения;
– необязательный параметр. Число знаков после десятичной точки.
У реквизита справочника, который будете устанавливать документом должен быть поднят флаг “Изменяется Документами”.
Пример:
Процедура ЗаписатьПоставщика()
СпрПост=СоздатьОбъект(«Справочник.Поставщики»);
СпрПост.ИспользоватьВладельца(Товар);
Если СпрПост.НайтиПоРеквизиту(«Поставщик»,Контрагент,0)=1 Тогда
СпрПост.КодПоставщика = КодПоставщика;
СпрПост.Записать();
УстановитьРеквизитСправочника(СпрПост.ТекущийЭлемент(),»Цена»,ЦенаБезНДС);
УстановитьРеквизитСправочника(СпрПост.ТекущийЭлемент(),»Валюта»,Валюта);
УстановитьРеквизитСправочника(СпрПост.ТекущийЭлемент(),»ДатаПоследнейПоставки»,ДатаДок);
Иначе
СпрПост.Новый();
СпрПост.Наименование = Контрагент.Наименование;
СпрПост.Поставщик = Контрагент;
СпрПост.КодПоставщика = КодПоставщика;
СпрПост.Записать();
УстановитьРеквизитСправочника(СпрПост.ТекущийЭлемент(),»Цена»,ЦенаБезНДС);
УстановитьРеквизитСправочника(СпрПост.ТекущийЭлемент(),»Валюта»,Валюта);
УстановитьРеквизитСправочника(СпрПост.ТекущийЭлемент(),»ДатаПоследнейПоставки»,ДатаДок);
КонецЕсли;
СпрПост=0;
КонецПроцедуры

Процедура ОбработкаПроведения()
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
ЗаписатьПоставщика();
КонецЦикла;
КонецПроцедуры

Комментарии | опубликовано: 15 Апрель 2008, 08:33


<--- Предыдущая страница Следующая страница --->