Как в 1С 7.7 сделать переход из таблицы отчета в карточку номенклатуры

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

При разработке отчетов и печатных форм в среде 1С:Предприятие 7.7 (в частности, в конфигурации «Торговля и Склад 9.2») часто возникает задача сделать отчет интерактивным. Пользователю гораздо удобнее дважды кликнуть по строке сформированной таблицы, чтобы сразу открыть карточку нужного товара или документа, чем вручную искать его в справочнике. Разберем по шагам, как устроен этот механизм и как правильно его реализовать в собственных отчетах.

Базовый механизм: настройка расшифровки в макете

Основной механизм интерактивности табличных документов в 1С 7.7 — это механизм расшифровки. Платформа устроена так, что если в свойствах ячейки таблицы указано значение объектного типа (ссылка на элемент справочника или документ), то при двойном щелчке мыши система автоматически попытается открыть форму этого объекта.

Рассмотрим порядок настройки ячейки в табличном макете:

  1. Откроем макет печатной формы или отчета в конфигураторе.
  2. Выделим ячейку, в которой выводится наименование товара или его код, и откроем ее свойства (двойной клик или клавиши Alt + Enter).
  3. Перейдем на вкладку «Текст».
  4. В поле «Расшифровка» пропишем переменную, которая содержит ссылку на сам объект справочника, например ТекНоменклатура или ПечНоменклатура. Важно: туда необходимо помещать именно объект (позиционированный элемент справочника), а не строковое значение вроде ТекНоменклатура.Наименование.

Обязательное условие: включение режима «Только просмотр»

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

Для работы механизма расшифровки таблица обязательно должна быть защищена от редактирования пользователем. Посмотрим на пример кода формирования отчета:


Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");

Пока Спр.ПолучитьЭлемент() = 1 Цикл
    ТекНоменклатура = Спр.ТекущийЭлемент();
    Таб.ВывестиСекцию("Строка");
КонецЦикла;

// Включаем режим только для чтения для активации расшифровок
Таб.ТолькоПросмотр(1);
Таб.Показать("Остатки ТМЦ");

Метод Таб.ТолькоПросмотр(1); переводит сформированную таблицу в специальный режим отображения, при котором двойной клик или нажатие клавиши Enter вызывают действие расшифровки.

Программное управление через процедуру ОбработкаЯчейкиТаблицы

Если требуется переопределить стандартное поведение платформы, выполнить дополнительные проверки или открыть специализированную форму, воспользуемся предопределенной процедурой модуля отчета ОбработкаЯчейкиТаблицы.

Разберем структуру этой процедуры:


Процедура ОбработкаЯчейкиТаблицы(Значение, ФлагСтандартнойОбработки, Таблица, Адрес)
    // Проверяем тип данных, переданный в параметре расшифровки
    Если ТипЗначенияСтр(Значение) = "Справочник.Номенклатура" Тогда
        Если Значение.Выбран() = 1 Тогда
            // Открываем форму элемента принудительно
            ОткрытьФорму(Значение);
            // Отключаем стандартную обработку, так как действие уже выполнено
            ФлагСтандартнойОбработки = 0;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Проанализируем параметры процедуры:

  1. Значение — данные, которые были вычислены в поле «Расшифровка» конкретной ячейки при выводе секции.
  2. ФлагСтандартнойОбработки — флаг управления. По умолчанию равен 1. Если присвоить ему значение 0, платформа отменяет свое стандартное действие по открытию объекта.
  3. Таблица — ссылка на объект таблицы, в которой произошел клик.
  4. Адрес — адрес выбранной ячейки в виде строки (например, "R4C2").

Передача составных параметров через СписокЗначений

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

Рассмотрим подробнее реализацию такого подхода:


// При формировании строки отчета формируем список параметров
ПараметрыРасшифровки = СоздатьОбъект("СписокЗначений");
ПараметрыРасшифровки.ДобавитьЗначение(ТекНоменклатура, "Номенклатура");
ПараметрыРасшифровки.ДобавитьЗначение(ВыбСклад, "Склад");
ПараметрыРасшифровки.ДобавитьЗначение("Движения", "Режим");

// В макете в поле «Расшифровка» указываем переменную ПараметрыРасшифровки
Таб.ВывестиСекцию("Строка");

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


Процедура ОбработкаЯчейкиТаблицы(Значение, ФлагСтандартнойОбработки, Таблица, Адрес)
    Если ТипЗначенияСтр(Значение) = "СписокЗначений" Тогда
        Режим = Значение.Получить("Режим");
        Если Режим = "Движения" Тогда
            ФлагСтандартнойОбработки = 0;
            
            Конт = "";
            ПараметрыОтчета = СоздатьОбъект("СписокЗначений");
            ПараметрыОтчета.ДобавитьЗначение(Значение.Получить("Номенклатура"), "Номенклатура");
            ПараметрыОтчета.ДобавитьЗначение(Значение.Получить("Склад"), "Склад");
            
            // Открываем детальный отчет по движениям товара
            ОткрытьФорму("Отчет.ДвижениеТМЦ", Конт, ПараметрыОтчета);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Чек-лист: почему расшифровка может не работать

Если переход в карточку не срабатывает, проверим следующие моменты:

  1. Вызвана ли инструкция Таб.ТолькоПросмотр(1); перед показом таблицы.
  2. Передается ли в ячейку ссылка на объект (Спр.ТекущийЭлемент()), а не строка с его представлением.
  3. Спозиционирован ли объект справочника на момент вывода секции таблицы (метод Выбран() возвращает 1).
  4. Не сброшен ли ФлагСтандартнойОбработки = 0; в процедуре ОбработкаЯчейкиТаблицы без вызова собственного кода открытия формы.
← На главную