Как открыть документ из сформированного списка в табличной части 1С

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

При разработке инструментов для анализа данных или автоматизации выгрузки документов часто возникает задача: вывести список документов в табличную часть обработки и предоставить пользователю возможность открыть любой из них простым нажатием. В этой статье мы подробно разберем, как правильно реализовать этот механизм, начиная от написания запроса и заканчивая настройкой интерфейса управляемой формы.

Разбор архитектуры решения

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

Шаг 1. Настройка реквизитов табличной части

Прежде чем писать код, необходимо подготовить структуру данных в самой обработке или документе. Проанализируем ситуацию: если в вашем списке могут быть документы разных типов (например, «Отпуск» и «Возврат из отпуска»), колонка в табличной части должна уметь хранить ссылки на оба этих типа.

  1. Перейдем в дерево метаданных и найдем нашу табличную часть (например, ДокументыЗУП).
  2. Создадим реквизит (колонку), назовем его СсылкаНаДокумент (в примере из темы он назывался Наименование, что не совсем корректно с точки зрения стандартов разработки).
  3. Важный момент: Установим тип данных. Если типы документов заранее известны, выберем «Составной тип данных» и отметим галочками нужные документы. Если список может быть любым, можно выбрать обобщенный тип ДокументСсылка.

Если оставить тип «Строка», 1С не сможет сопоставить текст с объектом в базе, и стандартные методы открытия формы не сработают.

Шаг 2. Программное заполнение таблицы на сервере

Рассмотрим ситуацию, когда нам нужно собрать документы двух разных видов за определенный период. Для этого лучше всего использовать запрос с оператором ОБЪЕДИНИТЬ. Обратите внимание на оптимизацию: в коде ниже мы избегаем лишних преобразований через РеквизитФормыВЗначение, если это не требуется для логики объекта.

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


&НаСервере
Процедура ЗаполнитьСписокДокументовНаСервере()
    
    // Очищаем текущую таблицу перед заполнением
    Объект.ДокументыЗУП.Очистить();
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ВозвратИзОтпуска.Ссылка КАК Ссылка,
        |   ВозвратИзОтпуска.Дата КАК Дата
        |ИЗ
        |   Документ.ВозвратИзОтпускаПоУходуЗаРебенком КАК ВозвратИзОтпуска
        |ГДЕ
        |   ВозвратИзОтпуска.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |   ОтпускПоУходу.Ссылка,
        |   ОтпускПоУходу.Дата
        |ИЗ
        |   Документ.ОтпускПоУходуЗаРебенком КАК ОтпускПоУходу
        |ГДЕ
        |   ОтпускПоУходу.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
        |
        |УПОРЯДОЧИТЬ ПО
        |   Дата УБЫВ";

    Запрос.УстановитьПараметр("ДатаНачала", НачалоМесяца(ТекущаяДата()));
    Запрос.УстановитьПараметр("ДатаОкончания", КонецМесяца(ТекущаяДата()));

    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();

    Пока Выборка.Следующий() Цикл
        НоваяСтрока = Объект.ДокументыЗУП.Добавить();
        // Записываем именно Ссылку, а не строку!
        НоваяСтрока.СсылкаНаДокумент = Выборка.Ссылка; 
    КонецЦикла;

КонецПроцедуры

Проанализируем этот код. Мы используем Объект.ДокументыЗУП напрямую. Это работает быстро, так как мы находимся в контексте формы. Использование ЗначениеВРеквизитФормы требуется только в тех редких случаях, когда логика заполнения ТЧ вынесена в модуль объекта и требует выполнения специфических проверок (например, при расчете налогов).

Шаг 3. Реализация открытия документа на клиенте

Теперь, когда данные в таблице — это полноценные ссылки, нам нужно заставить систему реагировать на действия пользователя. Существует два основных способа: использование события «Выбор» и настройка колонки как гиперссылки.

Вариант А: Использование события «Выбор»

Это классический способ. Когда пользователь дважды щелкает по строке или нажимает Enter, срабатывает обработчик. Выясним, как это реализовать:

  1. В конструкторе формы выделите элемент управления «Таблица» (вашу ТЧ).
  2. В панели свойств найдите событие Выбор и нажмите на «лупу», чтобы создать процедуру на клиенте.

Пропишем логику открытия в созданном обработчике:


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

КонецПроцедуры

Важное замечание: В процедуре присутствует параметр СтандартнаяОбработка. Если вы реализуете сложную логику открытия (например, открываете другую форму или выполняете проверки), установите СтандартнаяОбработка = Ложь;, чтобы система не пыталась выполнить действие по умолчанию параллельно с вашим кодом.

Вариант Б: Настройка гиперссылки (рекомендуется для UI/UX)

Чтобы интерфейс выглядел современно, мы можем сделать колонку со ссылкой визуально похожей на ссылку в браузере. В этом случае документ будет открываться в один клик.

  1. В редакторе формы выделите конкретное поле (колонку) внутри таблицы.
  2. В свойствах поля установите флаг Гиперссылка в значение Да.
  3. В свойстве РежимРедактирования выберите Непосредственно.

При таких настройках стандартная обработка 1С сама откроет документ при нажатии на текст ссылки, и писать дополнительный код в событии Выбор не потребуется (если только вам не нужна специфическая логика).

Сравнение методов открытия: ПоказатьЗначение vs ОткрытьФорму

Разберем подробнее, какой метод лучше использовать в профессиональной разработке:

Типичные ошибки при реализации

Проанализируем основные причины, по которым документ может не открываться:

  1. Пустая ссылка: Если в запросе или при заполнении возникла ошибка, и в ТЧ попало значение Неопределено или «Пустая ссылка», при попытке открытия ничего не произойдет или возникнет ошибка платформы. Всегда используйте ЗначениеЗаполнено().
  2. Неправильный контекст: Попытка вызвать методы открытия формы (которые являются клиентскими) из серверного кода. Помните: заполняем данные на &НаСервере, открываем интерфейс на &НаКлиенте.
  3. Тип "Строка": Как уже упоминалось, если реквизит ТЧ имеет тип «Строка», 1С просто отобразит текст. Чтобы превратить его обратно в документ, придется искать ссылку по наименованию (что крайне медленно и ненадежно). Правильный путь — сразу хранить тип ДокументСсылка.

Таким образом, для реализации качественного интерфейса выбора документов достаточно правильно типизировать колонку табличной части и использовать стандартные методы платформы 1С для работы с формами. Использование динамических списков может быть еще более эффективным решением, если вам не нужно редактировать данные прямо в этой таблице, а требуется только удобный реестр для перехода к объектам.

← На главную