При разработке интерфейсов в «1С:Предприятие 8» программисты часто сталкиваются с ситуацией, когда стандартное представление документа (например, «Покупка № 1015 от 12.01.2023») занимает слишком много места в табличной части или отчете. Возникает логичное желание сократить эту запись до простого номера «1015», сохранив при этом тип данных ДокументСсылка, чтобы пользователь мог привычно нажать на номер и открыть документ. В этой статье мы подробно разберем, почему стандартные функции запросов здесь не помогут и какими методами можно добиться желаемого результата.
Рассмотрим ситуацию, с которой столкнулся автор темы. Попытка применить функцию ПОДСТРОКА() непосредственно к реквизиту Ссылка в запросе всегда будет приводить к ошибке. Давайте выясним причину. В системе 1С Ссылка — это не строковое значение, а уникальный идентификатор (GUID), хранящийся в базе данных в бинарном виде. Функции работы со строками в языке запросов ожидают на вход именно строковый тип данных.
Даже если использовать функцию ПРЕДСТАВЛЕНИЕ(Ссылка), результат будет преобразован в строку на стороне СУБД, но при этом мы потеряем «ссылочность». Если мы выведем такую строку в таблицу, система перестанет понимать, какой именно документ нужно открыть при нажатии. Поэтому нам нужны решения, которые разделяют визуальное отображение и внутреннее содержимое ячейки.
Для управляемых форм наиболее элегантным и правильным решением является использование Условного оформления. Этот метод позволяет подменить текст в колонке, не создавая лишних обработчиков событий и не затрагивая глобальные настройки системы. При необходимости программной реализации этого механизма можно воспользоваться конструктором кода условного оформления для табличных частей.
Разберем этот метод по шагам:
ТабЧ.Ссылка).Объект.ТабЧ.Номер.Результат: В колонке со ссылкой система будет рисовать текст из колонки с номером, но при этом тип значения останется ДокументСсылка. Стандартная расшифровка и кнопка открытия («лупа») будут работать автоматически. Для быстрого переноса настроенного интерактивно оформления в программный код можно использовать инструмент для автоматического формирования кода условного оформления.
Если нам необходимо, чтобы документ Покупка отображался только в виде номера во всей системе (в списках, в других документах, в отчетах), то следует использовать модуль менеджера документа. Рассмотрим, как это реализовать программно.
Нам необходимо зайти в модуль менеджера соответствующего документа и найти (или создать) процедуру ОбработкаПолученияПредставления. Проанализируем пример кода:
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
// Отключаем стандартную генерацию строки вида "Документ №... от..."
СтандартнаяОбработка = Ложь;
// Формируем свое представление, используя только номер
// СокрЛП используется для удаления лишних пробелов
Представление = "№ " + СокрЛП(Данные.Номер);
КонецПроцедуры
Важный нюанс: Этот метод очень мощный, но его нужно использовать осторожно. Он влияет на производительность, так как вызывается каждый раз, когда системе нужно отрисовать ссылку на этот документ. Кроме того, помните, что изменения увидят все пользователи во всех формах.
Если по каким-то причинам условное оформление не подходит (например, вы работаете в «обычном» приложении или логика формирования номера слишком сложная), можно воспользоваться классическим приемом со скрытой колонкой. Рассмотрим этот алгоритм:
Ссылка и НомерДокумента.Ссылка сделаем невидимой (свойство Видимость = Ложь).НомерДокумента будет строковой, и именно её будет видеть пользователь.Выбор для таблицы.Пример кода для обработки нажатия на номер:
&НаКлиенте
Процедура ТабЧВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Проверяем, что нажали именно на колонку с номером
Если Поле.Имя = "ТабЧНомерДокумента" Тогда
// Отменяем стандартную обработку (чтобы система не пыталась редактировать текст)
СтандартнаяОбработка = Ложь;
// Получаем ссылку из текущей строки (даже если колонка невидима, данные в строке есть)
ТекущиеДанные = Элементы.ТабЧ.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
// Открываем форму документа по ссылке
ПоказатьЗначение(, ТекущиеДанные.Ссылка);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Часто номер документа в базе хранится в формате «0000-001015» — для управления префиксами и автонумерацией пригодится автоматическая настройка нумерации документов с префиксами в 1С. Просто вывести такой номер — не всегда красиво. Рассмотрим, как программно очистить номер перед его выводом в таблицу. Если в вашей конфигурации используется БСП (Библиотека стандартных подсистем), лучше всего использовать встроенные функции:
// Пример очистки номера для вывода пользователю
НомерДляОтображения = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Выборка.Номер, Истина, Ложь);
Этот метод автоматически уберет префиксы организации, префиксы узлов распределенной информационной базы и лидирующие нули, оставив только значимую часть номера. Проанализируем ситуацию: если мы заполняем таблицу в коде (как в исходном запросе автора), мы можем подготовить данные еще на этапе обхода выборки:
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НовСтр = Объект.ТабЧ.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр, ВыборкаДетальныеЗаписи);
// Дополнительно записываем "красивый" номер в отдельную колонку
НовСтр.НомерДляОтображения = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ВыборкаДетальныеЗаписи.Номер);
КонецЦикла;
Подведем итог и выясним, какой метод выбрать в зависимости от ситуации:
Номер) — для отладки сложных схем компоновки данных пригодятся инструменты быстрой разработки и анализа кода в 1С.ОформлениеСтроки.Ячейки.Ссылка.УстановитьТекст().Важно помнить: работая с типами данных в 1С, всегда старайтесь сохранять Ссылку в данных формы. Это обеспечит целостность системы, позволит работать стандартным командам (например, «Найти», «Отфильтровать») и даст пользователю возможность беспрепятственного перехода к объекту конфигурации.