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

Программист 1С v8.3 (Обычные формы)
← На главную

При разработке отчетов и печатных форм в системе 1С:Предприятие 8.1 (и более поздних версиях с использованием обычных форм) программисты часто сталкиваются с тем, что стандартное представление ссылки на документ выглядит избыточным. Например, вместо длинной строки Путевой лист (уат) ПФАД0010438 от 07.06.2018 18:49:00 пользователь хочет видеть лаконичное ПФАД0010438 от 07.06.2018. Рассмотрим подробнее, как реализовать такую задачу, сохранив при этом интерактивность — возможность открыть документ по двойному клику.

Понимание механизма представления объектов

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

Решение 1: Разделение свойств Значение и Текст

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

  1. Значение (Value): здесь хранится сам объект (ссылка). Это позволяет платформе понимать, какой документ открывать при расшифровке.
  2. Текст (Text): это визуальное содержимое ячейки. Если это свойство заполнено, пользователь увидит именно этот текст, независимо от того, что записано в значении.

Разберем на примере кода, как программно заполнить ячейку так, чтобы отображался только номер и дата, но сохранялась ссылка:


// Допустим, у нас есть ссылка на документ в переменной ДокСсылка
ОбластьЯчейка = ТабДок.Область(НомерСтроки, НомерКолонки);

// Устанавливаем саму ссылку, чтобы работал механизм расшифровки
ОбластьЯчейка.СодержитЗначение = Истина;
ОбластьЯчейка.Значение = ДокСсылка;

// Формируем красивое строковое представление
НужныйТекст = "№ " + ДокСсылка.Номер + " от " + Формат(ДокСсылка.Дата, "ДФ=dd.MM.yyyy");

// Принудительно устанавливаем текст ячейки
ОбластьЯчейка.Текст = НужныйТекст;

Важно помнить: если вы используете свойство СодержитЗначение, платформа может попытаться переопределить текст обратно при обновлении документа. Поэтому наиболее надежным способом в 1С 8.1 является использование механизма расшифровки.

Решение 2: Использование параметра Расшифровка в макете

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

Рассмотрим по шагам процесс настройки макета:

  1. В ячейке макета напишите имя параметра, например ПредставлениеРегистратора.
  2. В свойствах этой ячейки найдите поле Расшифровка и впишите туда имя другого параметра, например СсылкаРегистратор.
  3. В коде обработки заполните оба этих параметра по отдельности.

Пример программного заполнения такой области:


ОбластьМакета = Макет.ПолучитьОбласть("Строка");
// Заполняем параметр, который увидит пользователь
ОбластьМакета.Параметры.ПредставлениеРегистратора = ДокСсылка.Номер + " от " + Формат(ДокСсылка.Дата, "ДФ=dd.MM.yyyy");

// Заполняем параметр расшифровки, который будет использоваться для открытия документа
ОбластьМакета.Параметры.СсылкаРегистратор = ДокСсылка;

ТабДок.Вывести(ОбластьМакета);

Этот метод считается "золотым стандартом" в 1С, так как он полностью разделяет визуальную часть и логику работы с данными.

Решение 3: Оптимизация запроса для получения данных регистратора

Если данных в отчете много, обращение через точку к реквизитам Регистратор.Номер и Регистратор.Дата непосредственно при выводе каждой строки может замедлить работу (это вызывает дополнительные обращения к базе данных). Проанализируем ситуацию: как получить нужные данные максимально быстро?

Правильнее всего получить номер и дату сразу в основном запросе. Посмотрим на пример эффективного запроса:


ВЫБРАТЬ
    Продажи.Регистратор КАК СсылкаНаДокумент,
    Продажи.Регистратор.Номер КАК НомерДок,
    Продажи.Регистратор.Дата КАК ДатаДок,
    Продажи.СуммаОборот КАК Сумма
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода) КАК Продажи

При обходе выборки такого запроса вы получите готовые значения для формирования строки. При этом функция ПРЕДСТАВЛЕНИЕ(Регистратор) в запросе вам не понадобится, так как она возвращает стандартную длинную строку, от которой мы хотим избавиться.

Использование функции Формат() для профессионального вида

Чтобы дата выглядела корректно (без времени 00:00:00), всегда используйте функцию Формат(). Рассмотрим наиболее полезные форматы для документов:

Особенности для Регистров Сведений

Как отметил автор темы, часто "Регистратор" является полем регистра сведений. В этом случае логика остается прежней. Если ваша обработка просто выводит список записей регистра, вы можете напрямую обращаться к полям регистратора. Главное — убедиться, что документ не является "пустым" (битая ссылка), прежде чем обращаться к его номеру или дате через точку, чтобы избежать ошибок выполнения.

Подведем итог: для изменения отображения ссылки в 1С 8.1 мы не меняем саму ссылку, а управляем парой Текст / Расшифровка. Это позволяет создавать удобные и понятные интерфейсы, не теряя при этом возможности быстрого перехода к первичным документам.

← На главную