Как найти данные в макете табличного документа 1С?

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

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

Понимание структуры макета

Прежде чем приступать к написанию кода, важно осознать, как именно данные хранятся в макете. В платформе 1С макеты табличных документов могут содержать ячейки разных типов: Параметр, Шаблон или просто Текст. Если ваша задача — просто найти «ООО Рога и копыта» в ячейке, то это обычный тип Текст. Если же вы хотите динамически подставлять значения в форму, используются Параметры.

Решение 1: Поиск текста по ячейкам табличного документа

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

Рассмотрим алгоритм действий по шагам:

  1. Получаем объект макета из обработки на сервере.
  2. Используем метод НайтиТекст для поиска нужной строки.
  3. Если область найдена, считываем значение из соседней ячейки, используя координаты найденной области. Чтобы гарантировать стабильную работу таких алгоритмов после обновлений, можно автоматически тестировать информационные базы по расписанию.

// Пример на сервере
&НаСервере
Функция НайтиСчетПоНаименованию(НаименованиеОрганизации)
    ОбъектОбработки = РеквизитФормыВЗначение("Объект");
    Макет = ОбъектОбработки.ПолучитьМакет("Макет");
    
    // Ищем текст в табличном документе
    НайденнаяОбласть = Макет.НайтиТекст(НаименованиеОрганизации);
    
    Если НайденнаяОбласть <> Неопределено Тогда
        // Смещаемся на одну колонку вправо, если счет находится рядом
        ЯчейкаСоСчетом = Макет.Область(НайденнаяОбласть.Верх, НайденнаяОбласть.Лево + 1);
        Возврат ЯчейкаСоСчетом.Текст;
    КонецЕсли;
    
    Возврат Неопределено;
КонецФункции

Решение 2: Получение имен параметров из макета

Если же ваш макет содержит именно Параметры (например, в ячейке написано [Счет]), то для работы с ними необходимо проанализировать структуру областей. Для этого мы можем программно перебрать все ячейки области и проверить их тип заполнения.

Разберем код функции, которая собирает все имена параметров из выбранной области:


Функция ПолучитьМассивИменПараметров(ОбластьТабДокумента)
    МассивИменПараметров = Новый Массив;
    Для НомерСтроки = 1 По ОбластьТабДокумента.ВысотаТаблицы Цикл
        Для НомерКолонки = 1 По ОбластьТабДокумента.ШиринаТаблицы Цикл
            Ячейка = ОбластьТабДокумента.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
            
            // Проверяем, является ли ячейка параметром
            Если Ячейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр Тогда
                Если МассивИменПараметров.Найти(Ячейка.Параметр) = Неопределено Тогда
                    МассивИменПараметров.Добавить(Ячейка.Параметр);
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    Возврат МассивИменПараметров;
КонецФункции

Важные рекомендации по архитектуре

Хранение данных в макетах — это не всегда лучшее решение для бизнес-задач. Проанализируем, почему стоит рассмотреть другие варианты: для контроля корректности учета после доработки механизмов обработки данных можно автоматически сверять проводки между базами.

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

← На главную