В процессе разработки интерфейсов на управляемых формах 1С программисты часто сталкиваются с требованиями пользователей по оптимизации экранного пространства. Одно из таких частых требований — показывать в табличной части документы или справочники не длинное наименование элемента (ссылку), а его короткий уникальный Код. При этом критически важно сохранить весь богатый стандартный функционал платформы 1С для работы со ссылочными типами данных: кнопку выбора, историю выбора, автоподбор при вводе и открытие формы выбора.
Если мы просто заменим тип колонки на строку и будем писать туда код, мы полностью лишимся встроенных механизмов платформы. Изменение представления объекта глобально в модуле менеджера справочника (через событие ОбработкаПолученияПредставления) также не всегда подходит, поскольку это затронет отображение элемента во всей системе, а нам нужно локальное решение для одной конкретной табличной части.
В этой статье мы подробно рассмотрим, как элегантно решить эту задачу с помощью встроенного механизма Условного оформления и вспомогательного реквизита. Этот метод признан сообществом разработчиков наиболее оптимальным и производительным.
Разом разберем три основных способа реализации этой задачи — от самого профессионального до альтернативных вариантов без написания кода.
Этот способ основан на интеллектуальном использовании возможностей условного оформления формы. Мы заставим систему отображать текстовое представление кода поверх реальной ссылки, когда ячейка находится в режиме просмотра, но при переходе в режим редактирования ячейка моментально превратится в полноценное поле выбора ссылки.
Разберем реализацию этого приема по шагам.
Шаг 1. Создание вспомогательной колонки
Прежде всего, нам необходимо место для хранения строкового представления кодов элементов. Добавим в нашу табличную часть (например, Товары) новый реквизит КодЭлемента с типом данных Строка (длину укажите в соответствии с длиной кода вашего справочника). Если табличная часть является частью объекта метаданных, добавьте реквизит туда. Если таблица создана только на форме, добавьте реквизит формы.
Выводить эту колонку на форму пользователю не нужно. Она будет выполнять роль скрытого буфера данных.
Шаг 2. Заполнение вспомогательной колонки данными
Нам необходимо обеспечить своевременное заполнение колонки КодЭлемента. Это происходит в двух случаях: при открытии (или чтении) документа и при интерактивном изменении номенклатуры пользователем.
Проанализируем программный код для заполнения. В модуле формы создадим обработчики событий:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Заполняем коды для уже существующих в табличной части строк
ЗаполнитьКодыВТабличнойЧасти();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьКодыВТабличнойЧасти()
// Используем запрос для быстрого пакета данных, чтобы избежать обращений к базе в цикле
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЧ.НомерСтроки КАК НомерСтроки,
| ТЧ.Номенклатура.Код КАК Код
|ПОМЕСТИТЬ ВТ_Данные
|ИЗ
| &ТЧ КАК ТЧ
|;
|
|ВЫБРАТЬ
| ВТ_Данные.НомерСтроки,
| ВТ_Данные.Код
|ИЗ
| ВТ_Данные КАК ВТ_Данные";
// Передаем таблицу формы в параметры запроса
Запрос.УстановитьПараметр("ТЧ", Объект.Товары.Выгрузить());
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
СтрокаТЧ = Объект.Товары[ВыборкаДетальныеЗаписи.НомерСтроки - 1];
СтрокаТЧ.КодЭлемента = ВыборкаДетальныеЗаписи.Код;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Теперь напишем обработчик изменения поля ссылки, чтобы код обновлялся «на лету» при выборе новой номенклатуры пользователем:
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
Если СтрокаТЧ <> Неопределено Тогда
// Получаем код элемента. На клиенте это можно сделать быстро через ПолучитьДанныеВыбора или серверный вызов
СтрокаТЧ.КодЭлемента = ПолучитьКодНоменклатуры(СтрокаТЧ.Номенклатура);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьКодНоменклатуры(СсылкаНоменклатура)
Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНоменклатура, "Код");
КонецФункции
Шаг 3. Настройка условного оформления
Теперь переходим к самому главному — визуальной подмене. Откроем палитру свойств нашей управляемой формы, найдем свойство УсловноеОформление и нажмем ссылку «Открыть».
Создадим новый элемент оформления со следующими настройками:
Объект.Товары.КодЭлемента.ТоварыНоменклатура.Проверим результат работы. В режиме просмотра система автоматически считывает текстовое значение из колонки КодЭлемента и выводит его в поле Номенклатура. При этом тип данных в поле остается ссылочным. Как только пользователь активирует ячейку для изменения, условное оформление временно отступает, давая возможность использовать стандартный поиск, автоподбор и выбор из справочника.
Если требования дизайна интерфейса допускают вывод кода рядом с наименованием, можно использовать стандартный механизм группировки элементов на форме. Этот способ не требует написания сложного серверного кода для синхронизации данных.
Выполним следующие шаги для настройки:
Номенклатура). Нажмем на него правой кнопкой мыши и выберем пункт «Добавить поля».Код (путь к данным будет выглядеть как Объект.Товары.Номенклатура.Код) и добавим его на форму.Номенклатура) и поле кода (НоменклатураКод).ПоказыватьЗаголовок = Ложь). Поле кода настроим как приоритетное для отображения.При таком подходе платформа автоматически скомпонует код и ссылку в пределах одной физической ячейки таблицы. При просмотре пользователь будет видеть компактно расположенные данные, а при редактировании получит полный доступ к ссылке.
Рассмотрим еще один альтернативный вариант, когда колонка изначально имеет тип Строка и в ней физически хранится только код элемента, но интерфейс ведет себя так, будто в поле находится ссылка.
Посмотрим на программную реализацию этой схемы:
КнопкаВыбора = Истина и КнопкаОчистки = Истина.НачалоВыбора для этого поля:
&НаКлиенте
Процедура ТоварыКодЭлементаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Отменяем стандартное строковое поведение выбора
СтандартнаяОбработка = Ложь;
// Открываем форму выбора справочника Номенклатура
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Истина);
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
Затем обработаем событие получения значения из формы выбора. Для этого опишем процедуру ОбработкаВыбора на уровне элемента:
&НаКлиенте
Процедура ТоварыКодЭлементаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
// Нам вернулась ссылка на элемент. Получим его код и запишем в строку
СтандартнаяОбработка = Ложь;
СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
Если СтрокаТЧ <> Неопределено И ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
// Записываем код в текстовое поле
СтрокаТЧ.КодЭлемента = ПолучитьКодНоменклатуры(ВыбранноеЗначение);
// Если вам также требуется хранить саму ссылку для проведения документа,
// запишите ее в скрытый реквизит ТЧ "Номенклатура"
СтрокаТЧ.Номенклатура = ВыбранноеЗначение;
КонецЕсли;
КонецПроцедуры
Проанализируем минусы этого способа: мы теряем стандартный поиск при вводе строки (автоподбор). Пользователю придется каждый раз открывать форму выбора, либо разработчику потребуется дополнительно программировать событие АвтоПодбор, перехватывая ввод пользователя и выполняя поиск по коду на сервере. Поэтому данный вариант рекомендуется использовать только в специфических ситуациях.
Мы детально изучили три метода кастомизации представления данных в табличных частях 1С. Использование Способа 1 (Условное оформление в связке с Полем компоновки данных) является стандартом разработки. Оно обеспечивает наилучшую производительность системы, не перегружает интерфейс лишними элементами и сохраняет привычное поведение платформы для конечного пользователя.