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