Разберем задачу поиска информации внутри макета, который встроен в обработку. Часто возникает ситуация, когда в макете печатной формы хранятся справочные данные (например, наименования организаций и их расчетные счета), и нам нужно программно получить значение счета по наименованию организации. Если подобные сведения необходимо сопоставить в разных базах с несовпадающими ссылками, можно использовать сопоставление по произвольным полям поиска вместо стандартных идентификаторов.
Прежде чем приступать к написанию кода, важно осознать, как именно данные хранятся в макете. В платформе 1С макеты табличных документов могут содержать ячейки разных типов: Параметр, Шаблон или просто Текст. Если ваша задача — просто найти «ООО Рога и копыта» в ячейке, то это обычный тип Текст. Если же вы хотите динамически подставлять значения в форму, используются Параметры.
Самый простой и эффективный способ для поиска статических данных — это использование встроенного метода НайтиТекст объекта ТабличныйДокумент. Этот метод позволяет не перебирать все ячейки вручную, а сразу получить результат.
Рассмотрим алгоритм действий по шагам:
НайтиТекст для поиска нужной строки.
// Пример на сервере
&НаСервере
Функция НайтиСчетПоНаименованию(НаименованиеОрганизации)
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
Макет = ОбъектОбработки.ПолучитьМакет("Макет");
// Ищем текст в табличном документе
НайденнаяОбласть = Макет.НайтиТекст(НаименованиеОрганизации);
Если НайденнаяОбласть <> Неопределено Тогда
// Смещаемся на одну колонку вправо, если счет находится рядом
ЯчейкаСоСчетом = Макет.Область(НайденнаяОбласть.Верх, НайденнаяОбласть.Лево + 1);
Возврат ЯчейкаСоСчетом.Текст;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Если же ваш макет содержит именно Параметры (например, в ячейке написано [Счет]), то для работы с ними необходимо проанализировать структуру областей. Для этого мы можем программно перебрать все ячейки области и проверить их тип заполнения.
Разберем код функции, которая собирает все имена параметров из выбранной области:
Функция ПолучитьМассивИменПараметров(ОбластьТабДокумента)
МассивИменПараметров = Новый Массив;
Для НомерСтроки = 1 По ОбластьТабДокумента.ВысотаТаблицы Цикл
Для НомерКолонки = 1 По ОбластьТабДокумента.ШиринаТаблицы Цикл
Ячейка = ОбластьТабДокумента.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
// Проверяем, является ли ячейка параметром
Если Ячейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр Тогда
Если МассивИменПараметров.Найти(Ячейка.Параметр) = Неопределено Тогда
МассивИменПараметров.Добавить(Ячейка.Параметр);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат МассивИменПараметров;
КонецФункции
Хранение данных в макетах — это не всегда лучшее решение для бизнес-задач. Проанализируем, почему стоит рассмотреть другие варианты: для контроля корректности учета после доработки механизмов обработки данных можно автоматически сверять проводки между базами.
Соответствие прямо в коде модуля. Поиск в нем происходит мгновенно.РегистрСведений. Это обеспечит целостность данных и удобный интерфейс редактирования.JSON или XML, которые легко читаются платформой 1С.Использование метода НайтиТекст является предпочтительным, если вы уже имеете готовую печатную форму (макет) и вам не хочется переделывать структуру хранения данных. Не забывайте, что при работе с макетами на управляемых формах все манипуляции с объектом РеквизитФормыВЗначение должны выполняться исключительно на сервере.