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