При разработке отчетов и печатных форм в системе 1С:Предприятие 8.1 (и более поздних версиях с использованием обычных форм) программисты часто сталкиваются с тем, что стандартное представление ссылки на документ выглядит избыточным. Например, вместо длинной строки Путевой лист (уат) ПФАД0010438 от 07.06.2018 18:49:00 пользователь хочет видеть лаконичное ПФАД0010438 от 07.06.2018. Рассмотрим подробнее, как реализовать такую задачу, сохранив при этом интерактивность — возможность открыть документ по двойному клику.
В платформе 1С представление объекта (то, как ссылка выглядит в виде строки) формируется автоматически. В версии 8.1 этот механизм жестко задан платформой и включает в себя синоним типа документа, его номер и дату. Поскольку в старых версиях платформы отсутствует механизм ОбработкаПолученияПредставления, изменить это поведение глобально для всей системы невозможно без серьезной переработки конфигурации. Однако на уровне конкретной обработки или отчета мы можем управлять выводом данных в ячейку ТабличногоДокумента.
Проанализируем структуру ячейки табличного документа. У нее есть два ключевых свойства, которые мы можем использовать для решения нашей задачи:
Разберем на примере кода, как программно заполнить ячейку так, чтобы отображался только номер и дата, но сохранялась ссылка:
// Допустим, у нас есть ссылка на документ в переменной ДокСсылка
ОбластьЯчейка = ТабДок.Область(НомерСтроки, НомерКолонки);
// Устанавливаем саму ссылку, чтобы работал механизм расшифровки
ОбластьЯчейка.СодержитЗначение = Истина;
ОбластьЯчейка.Значение = ДокСсылка;
// Формируем красивое строковое представление
НужныйТекст = "№ " + ДокСсылка.Номер + " от " + Формат(ДокСсылка.Дата, "ДФ=dd.MM.yyyy");
// Принудительно устанавливаем текст ячейки
ОбластьЯчейка.Текст = НужныйТекст;
Важно помнить: если вы используете свойство СодержитЗначение, платформа может попытаться переопределить текст обратно при обновлении документа. Поэтому наиболее надежным способом в 1С 8.1 является использование механизма расшифровки.
Если ваш отчет строится с использованием макета, выясним причину, по которой прямое редактирование текста в параметре может быть удобнее. В макете для ячейки можно указать два разных параметра: один для отображения, другой для действия.
Рассмотрим по шагам процесс настройки макета:
ПредставлениеРегистратора.СсылкаРегистратор.Пример программного заполнения такой области:
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
// Заполняем параметр, который увидит пользователь
ОбластьМакета.Параметры.ПредставлениеРегистратора = ДокСсылка.Номер + " от " + Формат(ДокСсылка.Дата, "ДФ=dd.MM.yyyy");
// Заполняем параметр расшифровки, который будет использоваться для открытия документа
ОбластьМакета.Параметры.СсылкаРегистратор = ДокСсылка;
ТабДок.Вывести(ОбластьМакета);
Этот метод считается "золотым стандартом" в 1С, так как он полностью разделяет визуальную часть и логику работы с данными.
Если данных в отчете много, обращение через точку к реквизитам Регистратор.Номер и Регистратор.Дата непосредственно при выводе каждой строки может замедлить работу (это вызывает дополнительные обращения к базе данных). Проанализируем ситуацию: как получить нужные данные максимально быстро?
Правильнее всего получить номер и дату сразу в основном запросе. Посмотрим на пример эффективного запроса:
ВЫБРАТЬ
Продажи.Регистратор КАК СсылкаНаДокумент,
Продажи.Регистратор.Номер КАК НомерДок,
Продажи.Регистратор.Дата КАК ДатаДок,
Продажи.СуммаОборот КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода) КАК Продажи
При обходе выборки такого запроса вы получите готовые значения для формирования строки. При этом функция ПРЕДСТАВЛЕНИЕ(Регистратор) в запросе вам не понадобится, так как она возвращает стандартную длинную строку, от которой мы хотим избавиться.
Чтобы дата выглядела корректно (без времени 00:00:00), всегда используйте функцию Формат(). Рассмотрим наиболее полезные форматы для документов:
Формат(Дата, "ДФ=dd.MM.yyyy") — классический вариант (07.06.2018).Формат(Дата, "ДЛФ=D") — дата прописью (7 июня 2018 г.).Формат(Дата, "ДФ='dd MMMM yyyy ""г.""'") — настраиваемый вариант с полным названием месяца.Как отметил автор темы, часто "Регистратор" является полем регистра сведений. В этом случае логика остается прежней. Если ваша обработка просто выводит список записей регистра, вы можете напрямую обращаться к полям регистратора. Главное — убедиться, что документ не является "пустым" (битая ссылка), прежде чем обращаться к его номеру или дате через точку, чтобы избежать ошибок выполнения.
Подведем итог: для изменения отображения ссылки в 1С 8.1 мы не меняем саму ссылку, а управляем парой Текст / Расшифровка. Это позволяет создавать удобные и понятные интерфейсы, не теряя при этом возможности быстрого перехода к первичным документам.