Одной из частых задач при работе с платформой 1С 7.7 является поиск документов по значениям, хранящимся не в шапке документа, а в его табличной части. Стандартный механизм поиска 1С ориентирован прежде всего на реквизиты шапки, поэтому для обращения к строкам табличной части требуется нестандартный подход. Давайте разберем основные методы решения этой задачи.
Самый простой и эффективный способ, предусмотренный самой архитектурой 1С 7.7, — это создание граф отбора. Механизм графы отбора позволяет вынести нужный реквизит (даже если он находится в табличной части) на уровень журнала документов.
Преимущества: скорость работы. Индексация графы позволяет системе мгновенно находить документы по значению реквизита. Это идеальный вариант для часто используемых отборов, например, по артикулу товара или штрихкоду.
Недостатки: необходимость редактирования метаданных при появлении новых типов документов, в которых вы хотите использовать этот отбор.
Если вам нужно получить универсальный инструмент, который не требует изменения структуры конфигурации при добавлении новых документов, используйте объект Запрос. Это наиболее гибкий метод в 1С 7.7.
Рассмотрим пример того, как построить запрос для выборки данных из табличных частей:
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "
|Документ = Документ.Реализация.ТекущийДокумент;
|Товар = Документ.Реализация.Товар;
|Группировка Документ;
|Условие (Товар = ВыбТовар);";
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
Пока Запрос.Группировка(1) = 1 Цикл
// Здесь работаем с найденным документом
Сообщить(Запрос.Документ);
КонецЦикла;
КонецЕсли;
Этот подход позволяет искать значения как в шапке, так и в табличных частях. Механизм Запрос перебирает все записи, удовлетворяющие условию, и возвращает уникальные ссылки на документы.
Если ваша база работает в формате 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-сервере наложен индекс.
Если поиск по табличным частям выполняется очень часто и производительность запросов вас не устраивает, можно реализовать «служебный» регистр. Суть метода заключается в следующем:
Важно: этот метод требует настройки логики проведения документов, чтобы данные в регистре всегда были актуальными. Если документ перепроводится или удаляется, данные в регистре должны обновляться синхронно.
Проанализировав задачу, мы можем сделать вывод:
Выбирайте метод исходя из текущих задач вашего проекта и требований к скорости работы системы!