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