Тип: КоллекцияИндексовXBase. Содержит коллекцию индексов таблицы базы данных формата DBF.
Полное описание, параметры и ограничения
XBase.Индексы (XBase.Indexes)
XBase (XBase)
Индексы (Indexes)
Доступен, начиная с версии 8.0.
Использование:
Только чтение.
Описание:
Тип: КоллекцияИндексовXBase.
Содержит коллекцию индексов таблицы базы данных формата DBF.
Доступность:
Тонкий клиент, сервер, толстый клиент, внешнее соединение.
См. также:
КоллекцияИндексовXBase
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Найти строку по составному ключу CODE и QTY
Не воспроизводим строковое представление числа вручную в 1С: заполняем поля объекта Ключ, а выражение CODE + STR(QTY, 9, 0) вычисляет XBase.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Запускайте только в учебной базе на сервере. XBase работает с DBF, а не с таблицами вашей информационной базы; доступ к временному каталогу сервера должен быть разрешён.
Код сам создаёт уникальный новый каталог. В нём только собственные goods.dbf и goods.cdx: имена файлов соответствуют ограничению 8.3, имена полей и индексов латинские, не длиннее 10 символов.
Не подставляйте путь к существующему DBF. В каждой задаче новый набор: A-01 / Книга / 3 / 250 и B-02 / Ручка / 1 / 50. Сумма количества на цену равна 800.
Файлы закрываются перед удалением двух точных собственных путей. Пустой уникальный каталог остаётся; его путь выводится, чтобы при необходимости удалить именно его вручную.
УчебныйКаталог = ПолучитьИмяВременногоФайла();
ПроверкаКаталога = Новый Файл(УчебныйКаталог);
Если ПроверкаКаталога.Существует() Тогда
ВызватьИсключение "Учебный путь уже существует; существующие файлы не используем";
КонецЕсли;
СоздатьКаталог(УчебныйКаталог);
Сообщить("Собственный временный каталог: " + УчебныйКаталог);
ИмяDBF = УчебныйКаталог + "/goods.dbf";
ИмяCDX = УчебныйКаталог + "/goods.cdx";
База = Новый XBase;
Попытка
База.Кодировка = КодировкаXBase.ANSI;
База.АвтоСохранение = Ложь;
База.Поля.Добавить("CODE", "S", 10);
База.Поля.Добавить("TITLE", "S", 40);
База.Поля.Добавить("QTY", "N", 9, 0);
База.Поля.Добавить("PRICE", "N", 12, 2);
База.Поля.Добавить("ONDATE", "D");
База.Поля.Добавить("ACTIVE", "L");
База.СоздатьФайл(ИмяDBF);
Если Не База.Открыта() Тогда
ВызватьИсключение "Собственный DBF не открыт";
КонецЕсли;
База.Добавить();
База.CODE = "A-01";
База.TITLE = "Книга";
База.QTY = 3;
База.PRICE = 250;
База.ONDATE = Дата(2026, 10, 3);
База.ACTIVE = Истина;
База.Записать();
База.Добавить();
База.CODE = "B-02";
База.TITLE = "Ручка";
База.QTY = 1;
База.PRICE = 50;
База.ONDATE = Дата(2026, 10, 3);
База.ACTIVE = Истина;
База.Записать();
База.Индексы.Добавить("BYCQ", "CODE + STR(QTY, 9, 0)", Ложь);
Если Не База.СоздатьИндексныйФайл(ИмяCDX) Тогда
ВызватьИсключение "Не создан собственный составной индекс";
КонецЕсли;
База.ТекущийИндекс = База.Индексы.Найти("BYCQ");
База.Ключ.CODE = "A-01";
База.Ключ.QTY = 3;
Если Не База.НайтиПоКлючу("=") Тогда
ВызватьИсключение "Не найдена собственная пара A-01 / 3";
КонецЕсли;
Сообщить(СокрЛП(База.CODE) = "A-01");
Сообщить(База.QTY = 3);
База.Ключ.CODE = "A-01";
База.Ключ.QTY = 99;
Сообщить(Не База.НайтиПоКлючу("="));
Исключение
Если База.Открыта() Тогда
База.ЗакрытьФайл();
КонецЕсли;
Для Каждого ИмяСобственногоФайла Из СтрРазделить(ИмяDBF + "|" + ИмяCDX, "|") Цикл
СобственныйФайл = Новый Файл(ИмяСобственногоФайла);
Если СобственныйФайл.Существует() Тогда
УдалитьФайлы(ИмяСобственногоФайла);
КонецЕсли;
КонецЦикла;
ВызватьИсключение;
КонецПопытки;
Если База.Открыта() Тогда
База.ЗакрытьФайл();
КонецЕсли;
Для Каждого ИмяСобственногоФайла Из СтрРазделить(ИмяDBF + "|" + ИмяCDX, "|") Цикл
СобственныйФайл = Новый Файл(ИмяСобственногоФайла);
Если СобственныйФайл.Существует() Тогда
УдалитьФайлы(ИмяСобственногоФайла);
КонецЕсли;
КонецЦикла;Разбор по шагам
Создаём собственную структуру DBF и записываем два товара с явным Записать.
Создаём составной индекс из строкового CODE и числового QTY.
Перед каждым поиском задаём все участвующие поля Ключ. Не оставляем значение от предыдущего поиска.
НайтиПоКлючу самостоятельно вычисляет выражение индекса; пара A-01 / 99 отсутствует.
Закрываем DBF и удаляем только два собственных файла; информационная база не изменяется.
Как проверить результат
Три сравнения Истина; найдена только A-01 / 3.
Задание База.Ключ.QTY = 99 не меняет количество в записи DBF.
Ожидаемый результат
Составной поиск выполнен без ручного расчёта числового строкового ключа.
На что обратить внимание
Не запускайте операции изменения, Сжать или ОчиститьФайл на чужом либо рабочем DBF.
Ключ и текущие значения полей — разные объекты.
STR здесь часть строки выражения XBase, а не Строка или Формат встроенного языка 1С.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Отобрать индексом количество больше одного, не удалить ручку
Индекс BYQTY имеет убывающий порядок и фильтр QTY > 1. В индексном проходе только книга; физически файл по-прежнему содержит две строки.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Запускайте только в учебной базе на сервере. XBase работает с DBF, а не с таблицами вашей информационной базы; доступ к временному каталогу сервера должен быть разрешён.
Код сам создаёт уникальный новый каталог. В нём только собственные goods.dbf и goods.cdx: имена файлов соответствуют ограничению 8.3, имена полей и индексов латинские, не длиннее 10 символов.
Не подставляйте путь к существующему DBF. В каждой задаче новый набор: A-01 / Книга / 3 / 250 и B-02 / Ручка / 1 / 50. Сумма количества на цену равна 800.
Файлы закрываются перед удалением двух точных собственных путей. Пустой уникальный каталог остаётся; его путь выводится, чтобы при необходимости удалить именно его вручную.
УчебныйКаталог = ПолучитьИмяВременногоФайла();
ПроверкаКаталога = Новый Файл(УчебныйКаталог);
Если ПроверкаКаталога.Существует() Тогда
ВызватьИсключение "Учебный путь уже существует; существующие файлы не используем";
КонецЕсли;
СоздатьКаталог(УчебныйКаталог);
Сообщить("Собственный временный каталог: " + УчебныйКаталог);
ИмяDBF = УчебныйКаталог + "/goods.dbf";
ИмяCDX = УчебныйКаталог + "/goods.cdx";
База = Новый XBase;
Попытка
База.Кодировка = КодировкаXBase.ANSI;
База.АвтоСохранение = Ложь;
База.Поля.Добавить("CODE", "S", 10);
База.Поля.Добавить("TITLE", "S", 40);
База.Поля.Добавить("QTY", "N", 9, 0);
База.Поля.Добавить("PRICE", "N", 12, 2);
База.Поля.Добавить("ONDATE", "D");
База.Поля.Добавить("ACTIVE", "L");
База.СоздатьФайл(ИмяDBF);
Если Не База.Открыта() Тогда
ВызватьИсключение "Собственный DBF не открыт";
КонецЕсли;
База.Добавить();
База.CODE = "A-01";
База.TITLE = "Книга";
База.QTY = 3;
База.PRICE = 250;
База.ONDATE = Дата(2026, 10, 3);
База.ACTIVE = Истина;
База.Записать();
База.Добавить();
База.CODE = "B-02";
База.TITLE = "Ручка";
База.QTY = 1;
База.PRICE = 50;
База.ONDATE = Дата(2026, 10, 3);
База.ACTIVE = Истина;
База.Записать();
База.Индексы.Добавить("BYQTY", "QTY", Ложь, Истина, "QTY > 1");
Если Не База.СоздатьИндексныйФайл(ИмяCDX) Тогда
ВызватьИсключение "Не создан собственный отфильтрованный индекс";
КонецЕсли;
База.ТекущийИндекс = База.Индексы.Найти("BYQTY");
Сообщить(База.ТекущийИндекс.Убыв);
Сообщить(База.ТекущийИндекс.Фильтр = "QTY > 1");
Прочитано = 0;
Если База.Первая() Тогда
Пока Не База.ВКонце() Цикл
Сообщить(СокрЛП(База.CODE) = "A-01");
Прочитано = Прочитано + 1;
Если Не База.Следующая() Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Сообщить(Прочитано = 1);
Сообщить(База.КоличествоЗаписей() = 2);
Если Не База.Перейти(2) Тогда
ВызватьИсключение "Физическая ручка потеряна";
КонецЕсли;
Сообщить(СокрЛП(База.CODE) = "B-02");
Исключение
Если База.Открыта() Тогда
База.ЗакрытьФайл();
КонецЕсли;
Для Каждого ИмяСобственногоФайла Из СтрРазделить(ИмяDBF + "|" + ИмяCDX, "|") Цикл
СобственныйФайл = Новый Файл(ИмяСобственногоФайла);
Если СобственныйФайл.Существует() Тогда
УдалитьФайлы(ИмяСобственногоФайла);
КонецЕсли;
КонецЦикла;
ВызватьИсключение;
КонецПопытки;
Если База.Открыта() Тогда
База.ЗакрытьФайл();
КонецЕсли;
Для Каждого ИмяСобственногоФайла Из СтрРазделить(ИмяDBF + "|" + ИмяCDX, "|") Цикл
СобственныйФайл = Новый Файл(ИмяСобственногоФайла);
Если СобственныйФайл.Существует() Тогда
УдалитьФайлы(ИмяСобственногоФайла);
КонецЕсли;
КонецЦикла;Разбор по шагам
Создаём собственную структуру DBF и записываем два товара с явным Записать.
Убыв описывает направление сортировки, Фильтр — участие строки в индексе.
Считаем записи индексного прохода, не используем физическое КоличествоЗаписей как размер отбора.
Через физический Перейти(2) проверяем, что отфильтрованная ручка не была удалена.
Закрываем DBF и удаляем только два собственных файла; информационная база не изменяется.
Как проверить результат
Шесть логических сообщений Истина: один товар в проходе, два физически.
Удалить, Сжать и ОчиститьФайл в теле задачи не вызываются.
Ожидаемый результат
Отбор индексом отделён от изменения и удаления записей.
На что обратить внимание
Не запускайте операции изменения, Сжать или ОчиститьФайл на чужом либо рабочем DBF.
На одном подходящем товаре направление сортировки не видно визуально; оно проверяется свойством Убыв.
Динамический фильтр индекса не является механизмом ограничения прав доступа.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.