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

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

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

Анализ проблемы: почему ПОДСТРОКА() не работает для ссылок

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

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

Решение 1. Использование механизма «Условное оформление» (самый оптимальный способ)

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

Разберем этот метод по шагам:

  1. Откроем форму документа или обработки, где расположена наша табличная часть.
  2. Перейдем на вкладку «Условное оформление».
  3. Добавим новый элемент оформления. В поле «Оформление» выберем параметр «Текст» и пока оставим его пустым (мы привяжем его к полю позже).
  4. В «Условии» ничего указывать не нужно, если мы хотим, чтобы номер отображался всегда.
  5. В «Оформляемых полях» выберем нашу колонку, где отображается ссылка (например, ТабЧ.Ссылка).
  6. Теперь самое важное: в правой части настройки элемента оформления найдем колонку «Текст» и нажмем кнопку выбора. Вместо ввода текста выберем «Поле компоновки данных» и укажем Объект.ТабЧ.Номер.

Результат: В колонке со ссылкой система будет рисовать текст из колонки с номером, но при этом тип значения останется ДокументСсылка. Стандартная расшифровка и кнопка открытия («лупа») будут работать автоматически. Для быстрого переноса настроенного интерактивно оформления в программный код можно использовать инструмент для автоматического формирования кода условного оформления.

Решение 2. Обработка получения представления (глобальное изменение)

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

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


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) 
    // Отключаем стандартную генерацию строки вида "Документ №... от..."
    СтандартнаяОбработка = Ложь;
    
    // Формируем свое представление, используя только номер
    // СокрЛП используется для удаления лишних пробелов
    Представление = "№ " + СокрЛП(Данные.Номер);
КонецПроцедуры

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

Решение 3. Скрытая колонка и подмена событий (для обычных форм или специфических задач)

Если по каким-то причинам условное оформление не подходит (например, вы работаете в «обычном» приложении или логика формирования номера слишком сложная), можно воспользоваться классическим приемом со скрытой колонкой. Рассмотрим этот алгоритм:

  1. В табличную часть на форме добавим две колонки: Ссылка и НомерДокумента.
  2. Колонку Ссылка сделаем невидимой (свойство Видимость = Ложь).
  3. Колонка НомерДокумента будет строковой, и именно её будет видеть пользователь.
  4. Чтобы реализовать открытие документа, создадим обработчик события Выбор для таблицы.

Пример кода для обработки нажатия на номер:


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

Как избавиться от префиксов и лишних нулей

Часто номер документа в базе хранится в формате «0000-001015» — для управления префиксами и автонумерацией пригодится автоматическая настройка нумерации документов с префиксами в 1С. Просто вывести такой номер — не всегда красиво. Рассмотрим, как программно очистить номер перед его выводом в таблицу. Если в вашей конфигурации используется БСП (Библиотека стандартных подсистем), лучше всего использовать встроенные функции:


// Пример очистки номера для вывода пользователю
НомерДляОтображения = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Выборка.Номер, Истина, Ложь);

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


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

Рекомендации по выбору метода

Подведем итог и выясним, какой метод выбрать в зависимости от ситуации:

  1. Если вам нужно просто изменить отображение в одной конкретной таблице на управляемой форме — используйте Условное оформление. Это быстро, не требует написания кода и легко поддерживается.
  2. Если вы хотите изменить логику отображения документа во всей программе — используйте ОбработкаПолученияПредставления в модуле менеджера.
  3. Если вы строите отчет на СКД — используйте свойство поля «Выражение представления» в настройках набора данных (просто укажите там Номер) — для отладки сложных схем компоновки данных пригодятся инструменты быстрой разработки и анализа кода в 1С.
  4. Если вы работаете в старых конфигурациях (8.2, Обычные формы) — используйте событие ПриВыводеСтроки и метод ОформлениеСтроки.Ячейки.Ссылка.УстановитьТекст().

Важно помнить: работая с типами данных в 1С, всегда старайтесь сохранять Ссылку в данных формы. Это обеспечит целостность системы, позволит работать стандартным командам (например, «Найти», «Отфильтровать») и даст пользователю возможность беспрепятственного перехода к объекту конфигурации.

← На главную