Почему перестает работать поиск в печатной форме 1С 7.7 при объединении ячеек?

Программист 1С v7.7
← На главную

В процессе работы с платформой 1С:Предприятие 7.7 можно столкнуться с неочевидным, но неприятным поведением стандартного механизма поиска. Представим ситуацию: у нас есть печатная форма, в которой для красивого отобрания данных используется свойство ячеек Положение - "по выделенным столбцам". Как только мы устанавливаем для всей таблицы свойство Только просмотр, встроенный поиск по Ctrl+F3 или F3 перестает работать корректно. Он находит первое совпадение и останавливается, будто других значений в документе нет.

Давайте подробно разберемся, почему так происходит, и какие существуют способы решения этой проблемы. Проанализируем ситуацию и рассмотрим все доступные варианты, от самых простых до более продвинутых.

Выясним причину: почему поиск "ломается"

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

Когда вы запускаете поиск, происходит следующее:

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

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

Решение 1: Использовать стандартное объединение ячеек

Самый простой и логичный способ решить проблему — отказаться от свойства, которое ее вызывает. Вместо "виртуального" растягивания текста применим "физическое" объединение ячеек.

Разберем по шагам:

  1. Откройте макет вашей печатной формы в конфигураторе.
  2. Выделите ячейку, у которой установлено свойство Положение - "по выделенным столбцам".
  3. В палитре свойств найдите это свойство и установите для него значение по умолчанию (обычно "Авто").
  4. Теперь выделите эту ячейку и все соседние, на которые ее текст должен был распространяться.
  5. Нажмите на панели инструментов кнопку "Объединить" или воспользуйтесь контекстным меню.

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

Решение 2: "Нормализовать" макет – одна ячейка для одного значения

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

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

Преимущества этого метода:

Недостатки:

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

Решение 3: Написать собственную процедуру поиска

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

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

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

Примерный фрагмент кода для поиска мог бы выглядеть так (это псевдокод для иллюстрации идеи):


Процедура НайтиСледующий(ТабДокумент, ИскомыйТекст, НачатьСоСтроки, НачатьСКолонки)

    Для Стр = НачатьСоСтроки По ТабДокумент.ВысотаТаблицы() Цикл
        Для Кол = 1 По ТабДокумент.ШиринаТаблицы() Цикл

            // Пропускаем ячейки до стартовой позиции при повторном поиске
            Если (Стр = НачатьСоСтроки) И (Кол <= НачатьСКолонки) Тогда
                Продолжить;
            КонецЕсли;

            ТекущаяЯчейка = ТабДокумент.Область(Стр, Кол);
            Если СтрНайти(ТекущаяЯчейка.Текст, ИскомыйТекст) > 0 Тогда
                // Нашли!
                ТабДокумент.АктивизироватьОбласть(ТекущаяЯчейка);
                // Сохраняем позицию для следующего поиска
                ЗапомнитьПозицию(Стр, Кол);
                Возврат; // Прерываем поиск до следующего нажатия кнопки
            КонецЕсли;

        КонецЦикла;
    КонецЦикла;

    // Если ничего не нашли
    Предупреждение("Больше совпадений не найдено!");

КонецПроцедуры

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

Решение 4: Применить внешнюю компоненту "Йоксель" (Yoksel)

Для платформы 1С 7.7 существует множество внешних компонент, расширяющих ее стандартные возможности. Одной из самых известных для работы с таблицами является "Йоксель" (Yoksel). Она представляет собой мощную замену стандартному объекту Таблица.

Ключевые преимущества "Йоксель":

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

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

← На главную