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

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

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

В этой статье мы подробно рассмотрим, как оптимизировать этот процесс, разберем программные методы обхода стандартного окна и проанализируем различные подходы к автоматизации выбора типа.

Метод 1. Создание отдельных кнопок для каждого типа справочника

Самый простой и эффективный способ ускорить работу — вынести в командную панель табличной части отдельные кнопки для каждого часто используемого типа данных. Рассмотрим ситуацию, когда у нас есть составной тип, включающий справочник «Слова» и «Предложения». Вместо одной кнопки «Добавить» мы создадим две.

Разберем алгоритм реализации этого метода:

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

Проанализируем пример кода, который позволяет сразу открыть форму выбора нужного справочника и подставить результат в новую строку:


&НаКлиенте
Процедура ДобавитьСлово(Команда)
    // Описываем, что делать после того, как пользователь выберет элемент в справочнике
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораСлова", ЭтаФорма);
    
    // Открываем форму выбора конкретного справочника, минуя окно выбора типа
    ОткрытьФорму("Справочник.Слова.ФормаВыбора", , Элементы.СловаИПредложения, , , , Оповещение, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
КонецПроцедуры

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

Метод 2. Использование подменю для выбора типа

Если справочников в составе типа много, загромождать панель кнопками не стоит. Выясним, как сделать элегантное подменю. Мы можем добавить в командную панель элемент вида Группа — Подменю, назвать его «Добавить...», а внутрь поместить команды для каждого типа справочника.

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


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

Этот способ позволяет пользователю сделать всего два клика: выбор типа в подменю и начало набора текста, полностью минуя модальные диалоги выбора типа.

Метод 3. Переопределение события «НачалоВыбора»

Посмотрим на ситуацию с другой стороны. Что если мы не хотим менять стандартную кнопку «Добавить», но хотим, чтобы при нажатии на кнопку выбора в ячейке сразу открывался нужный нам справочник? Для этого используется событие НачалоВыбора для поля табличной части.

Рассмотрим по шагам, как это реализовать:

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

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

Метод 4. Автоматическое приведение типа через «ПриИзменении»

Иногда полезно использовать метод ПривестиЗначение объекта ОписаниеТипов. Это позволяет программно ограничить доступные типы в конкретной строке. Выясним причину, почему это удобно: вы можете анализировать контекст документа (например, если в шапке выбран вид операции «Продажа товара», то в таблице по умолчанию должен выбираться справочник «Номенклатура»).

Рассмотрим программный пример установки ограничения типа:


&НаКлиенте
Процедура УстановитьТипСтроки(НоваяСтрока)
    МассивТипов = Новый Массив;
    МассивТипов.Добавить(Тип("СправочникСсылка.Слова"));
    ОписаниеТиповСлова = Новый ОписаниеТипов(МассивТипов);
    
    // Принудительно устанавливаем тип для ячейки
    НоваяСтрока.Английский = ОписаниеТиповСлова.ПривестиЗначение(НоваяСтрока.Английский);
КонецПроцедуры

Рекомендации по юзабилити

Проанализировав различные подходы, можно выделить несколько «золотых правил» для программиста 1С при работе с составными типами:

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

← На главную