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