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