Как отобрать документы 1С 7.7 по реквизиту табличной части?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Одной из частых задач при работе с платформой 1С 7.7 является поиск документов по значениям, хранящимся не в шапке документа, а в его табличной части. Стандартный механизм поиска 1С ориентирован прежде всего на реквизиты шапки, поэтому для обращения к строкам табличной части требуется нестандартный подход. Давайте разберем основные методы решения этой задачи.

Использование «Грам отбора»

Самый простой и эффективный способ, предусмотренный самой архитектурой 1С 7.7, — это создание граф отбора. Механизм графы отбора позволяет вынести нужный реквизит (даже если он находится в табличной части) на уровень журнала документов.

  1. Откройте конфигуратор вашей базы данных.
  2. Перейдите в раздел Метаданные.
  3. Найдите пункт Графы отбора.
  4. Добавьте новую графу и выберите документы, в которых этот реквизит будет доступен для поиска.

Преимущества: скорость работы. Индексация графы позволяет системе мгновенно находить документы по значению реквизита. Это идеальный вариант для часто используемых отборов, например, по артикулу товара или штрихкоду.

Недостатки: необходимость редактирования метаданных при появлении новых типов документов, в которых вы хотите использовать этот отбор.

Использование объекта «Запрос»

Если вам нужно получить универсальный инструмент, который не требует изменения структуры конфигурации при добавлении новых документов, используйте объект Запрос. Это наиболее гибкий метод в 1С 7.7.

Рассмотрим пример того, как построить запрос для выборки данных из табличных частей:


Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "
|Документ = Документ.Реализация.ТекущийДокумент;
|Товар = Документ.Реализация.Товар;
|Группировка Документ;
|Условие (Товар = ВыбТовар);";
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
    Пока Запрос.Группировка(1) = 1 Цикл
        // Здесь работаем с найденным документом
        Сообщить(Запрос.Документ);
    КонецЦикла;
КонецЕсли;

Этот подход позволяет искать значения как в шапке, так и в табличных частях. Механизм Запрос перебирает все записи, удовлетворяющие условию, и возвращает уникальные ссылки на документы.

Реализация через SQL-запросы (для SQL-версий)

Если ваша база работает в формате SQL, вы можете использовать прямые запросы к таблицам БД. Это самый быстрый способ поиска на больших объемах данных. В 1С 7.7 табличные части хранятся в таблицах, начинающихся на DT (например, DT123), а шапки — в таблицах на DH (например, DH123).

Используя внешнюю компоненту, например, 1С++, вы можете выполнить поиск напрямую через ВыполнитьSQL:


ТекстSQL = "SELECT DISTINCT T1.iddoc 
|FROM DT123 AS T1 
|INNER JOIN DH123 AS T2 ON T1.iddoc = T2.iddoc 
|WHERE T1.SP456 = :ЗначениеОтбора";

Этот метод требует глубокого понимания структуры таблиц базы данных 1С и наличия навыков работы с SQL-синтаксисом. Однако скорость работы такого решения будет значительно выше, чем у штатного объекта Запрос, особенно если на колонку с реквизитом в SQL-сервере наложен индекс.

Создание регистра для быстрого поиска

Если поиск по табличным частям выполняется очень часто и производительность запросов вас не устраивает, можно реализовать «служебный» регистр. Суть метода заключается в следующем:

Важно: этот метод требует настройки логики проведения документов, чтобы данные в регистре всегда были актуальными. Если документ перепроводится или удаляется, данные в регистре должны обновляться синхронно.

Итоги и рекомендации

Проанализировав задачу, мы можем сделать вывод:

Выбирайте метод исходя из текущих задач вашего проекта и требований к скорости работы системы!

← На главную