При автоматизации рутинных операций в 1С часто возникает задача: при изменении данных в одной табличной части необходимо найти соответствующую позицию в других таблицах документа и перевести фокус ввода на найденную строку. Разберем по шагам, как правильно реализовать этот механизм, избегая типичных ошибок новичков.
Для поиска строки в табличной части по конкретному значению (в нашем случае — по номенклатуре) не стоит использовать тяжеловесные конструкции вроде циклов в сочетании с НайтиСтроки, если совпадение является уникальным. Самый эффективный и простой метод — это метод Найти самой табличной части.
Рассмотрим структуру кода для поиска:
// Получаем данные текущей строки из первой табличной части
СтрокаТЧ1 = Элементы.ТЧ1.ТекущиеДанные;
// Ищем строку во второй табличной части по номенклатуре
СтрокаТЧ2 = Объект.ТЧ2.Найти(СтрокаТЧ1.Номенклатура, "Номенклатура");
Если СтрокаТЧ2 <> Неопределено Тогда
// Присваиваем новое значение
СтрокаТЧ2.ЧистаяПрибыль = СтрокаТЧ1.ЧистаяПрибыль;
КонецЕсли;
Обратите внимание: метод Найти возвращает либо ссылку на найденную СтрокаТабличнойЧасти, либо значение Неопределено, если поиск не дал результатов. Это самый быстрый и надежный способ для задачи «один к одному».
Частая ошибка при разработке на управляемых формах — попытка обратиться к элементам через устаревший объект ЭлементыФормы. В современном интерфейсе 1С 8.3 необходимо использовать коллекцию Элементы.
Чтобы перевести фокус пользователя на найденную строку в таблице, мы должны присвоить свойству ТекущаяСтрока самого элемента формы объект найденной нами строки. Разберем, как это сделать правильно:
Если СтрокаТЧ2 <> Неопределено Тогда
// Делаем строку активной, передавая в свойство саму найденную строку
Элементы.ТЧ2.ТекущаяСтрока = СтрокаТЧ2;
КонецЕсли;
Важно помнить, что если таблица находится на другой странице панели, одного изменения ТекущаяСтрока может быть недостаточно, так как визуально страница может оставаться скрытой. В таком случае необходимо программно переключить видимость страницы:
// Если ТЧ2 расположена на странице "Страница2"
Элементы.ПанельТаблиц.ТекущаяСтраница = Элементы.Страница2;
// И только после этого устанавливаем фокус
Элементы.ТЧ2.ТекущаяСтрока = СтрокаТЧ2;
Проанализируем основные сложности, с которыми сталкиваются при реализации:
ЭлементыФормы вместо Элементы. Всегда проверяйте, что вы работаете с актуальной коллекцией управляемой формы.ТекущаяСтрока нельзя передавать номенклатуру или числовой индекс (номер строки). Система ожидает именно объект строки (ссылку на строку в памяти объекта формы).Найти — это экономит ресурсы сервера и клиента.Объект (реквизиты формы) и корректно обращаетесь к имени элемента, заданному в дереве элементов формы.Соберем всё воедино для надежного решения задачи:
Элементы.ТЧ1.ТекущиеДанные.Объект.ТЧ2.Найти() для поиска соответствия по колонке «Номенклатура».Неопределено.Элементы.ТЧ2.ТекущаяСтрока, чтобы подсветить результат для пользователя.ТекущаяСтраница.Следуя этим простым шагам, вы сможете организовать быструю и безошибочную работу с табличными частями в любых конфигурациях 1С, использующих управляемые формы.