Как добавить расширенный поиск в контекстное меню табличной части документа в 1С:Предприятии?

Программист 1С v8.3 (Управляемые формы)
← На главную

Многие пользователи 1С:Предприятия привыкли к удобству расширенного поиска, доступного в формах списков документов, который вызывается, как правило, нажатием правой кнопки мыши (ПКМ) или через сочетание клавиш Ctrl+F. Однако при работе с табличными частями документов возникает вопрос: можно ли реализовать аналогичный функционал прямо в контекстном меню табличной части? Некоторые разработчики и пользователи полагают, что это невозможно из-за различий в типах объектов – табличная часть и динамический список. Давайте вместе разберем эту ситуацию и найдем оптимальное решение.

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

Подтверждение наличия расширенного поиска в табличной части

Рассмотрим текущую ситуацию в современных версиях платформы 1С:Предприятие. Действительно, в более ранних версиях платформы расширенный поиск был преимущественно функционалом динамических списков. Однако, начиная с определённых версий платформы 1С:Предприятие 8.3, механизм расширенного поиска стал доступен и для табличных частей документов. Это означает, что платформа предоставляет возможность выполнять поиск по различным критериям непосредственно внутри табличных данных документа.

Наш опыт и практика показывают, что такой функционал действительно реализован. Пользователи подтверждают, что в версиях платформы, начиная примерно с 8.3.14, 8.3.15, 8.3.16, 8.3.17, 8.3.18 и 8.3.20, расширенный поиск в табличных частях документов уже присутствует "из коробки". Он обычно доступен через командную панель табличной части, как стандартная команда. Таким образом, наше первоначальное предположение о невозможности такого поиска не соответствует действительности в современных реалиях платформы.

Вывод расширенного поиска в контекстное меню табличной части

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

Мы выяснили, что это вполне реализуемая задача. Для того чтобы добавить стандартную команду "Расширенный поиск" в контекстное меню табличной части документа в управляемых формах, мы можем использовать следующие подходы в режиме Конфигуратора:

  1. Добавление команды через свойства элемента формы

    Этот способ является наиболее прямым и интуитивно понятным:

    1. Откроем форму документа в режиме Конфигуратора, для которого хотим настроить контекстное меню.
    2. Выберем нужную табличную часть (реквизит формы типа ТабличнаяЧасть) в дереве элементов формы.
    3. Найдем свойство КонтекстноеМеню у этой табличной части. Обычно это свойство изначально не заполнено.
    4. Нажмем на кнопку открытия (троеточие) рядом со свойством КонтекстноеМеню. Откроется окно редактирования меню.
    5. В этом окне мы увидим командную панель, которая будет служить основой для нашего контекстного меню. Нам необходимо добавить в эту панель элемент типа "Кнопка".
    6. Для новой кнопки установим свойство Команда. Нажмем на кнопку выбора (троеточие) и в открывшемся списке стандартных команд формы найдем команду, которая отвечает за расширенный поиск. Обычно она называется что-то вроде Найти, РасширенныйПоиск или Поиск. Выберем ее. Платформа 1С автоматически определит и подставит соответствующую команду.
    7. При необходимости, настроим свойство Заголовок для кнопки, чтобы она отображалась в контекстном меню с нужным нам текстом, например, "Расширенный поиск".
    8. Сохраним изменения формы.

    После этих действий, при работе с формой документа в режиме пользователя, при нажатии правой кнопки мыши по табличной части, в контекстном меню появится наш пункт "Расширенный поиск", который будет вызывать стандартный механизм поиска.

  2. Использование скрытой командной панели

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

    1. Создадим новую командную панель на форме документа. Мы можем разместить ее в любом месте формы, но для нашего случая, она может быть скрытой.
    2. Установим для этой командной панели свойство Видимость в значение "Ложь". Это сделает панель невидимой для пользователя, но ее команды будут доступны.
    3. Добавим в эту скрытую командную панель новую кнопку.
    4. Для этой кнопки установим свойство Команда, выбрав стандартную команду расширенного поиска, как мы делали в предыдущем пункте.
    5. Теперь вернемся к свойствам нашей табличной части. В свойстве КонтекстноеМеню вместо создания нового меню, мы можем указать созданную нами скрытую командную панель.

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

  3. Настройка отображения команды в контекстном меню

    Если команда поиска уже существует в командной панели табличной части, но мы хотим, чтобы она отображалась только в контекстном меню (или, наоборот, и там, и там), мы можем использовать соответствующее свойство команды:

    1. Найдем существующую кнопку команды поиска в командной панели табличной части (или добавим ее туда).
    2. Выберем эту кнопку в дереве элементов формы.
    3. Найдем свойство ОтображениеВКонтекстномМеню у этой кнопки.
    4. Установим это свойство в одно из значений:
      • Авто: Команда будет отображаться в контекстном меню по умолчанию, если оно не было явно сконфигурировано иначе.
      • ТолькоВКонтекстномМеню: Команда будет видна только при вызове контекстного меню и не будет отображаться в основной командной панели.
      • ИВКоманднойПанелиИВКонтекстномМеню: Команда будет видна как в командной панели, так и в контекстном меню.

    Этот способ позволяет нам гибко управлять тем, где и как будет отображаться стандартная команда поиска без дублирования ее функциональности.

Реализация собственного поиска и расширенные возможности

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

Для поиска строк по заданным критериям в табличной части мы можем использовать метод НайтиСтроки() объекта ТабличнаяЧасть. Однако следует учитывать, что этот метод по умолчанию ищет по полному совпадению значений. Если нам нужен более гибкий поиск, например, по вхождению подстроки или по более сложным условиям, нам потребуется:

  1. Перебрать строки табличной части в цикле и вручную проверять соответствие условиям, используя строковые функции (например, Найти(), СтрНайти()) для поиска подстрок.

    
    Для Каждого СтрокаТЧ Из Объект.ТабличнаяЧасть Цикл
        Если СтрНайти(СтрокаТЧ.Наименование, ИскомыйТекст) > 0 Тогда
            // Найдена строка, можно ее выделить или добавить в список найденных
            Сообщить("Найдено в строке: " + СтрокаТЧ.НомерСтроки + " " + СтрокаТЧ.Наименование);
        КонецЕсли;
    КонецЦикла;
    
  2. Использовать отборы системы компоновки данных (СКД), если табличная часть является источником данных для динамического списка или отчета. Это позволяет строить сложные фильтры, аналогичные тем, что используются в расширенном поиске.

  3. Создать временную таблицу значений, заполнить ее данными из табличной части и затем выполнять поиск или отбор по этой таблице значений, используя метод Отбор() или перебор.

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

Заключение

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

← На главную