При разработке конфигураций часто возникает задача автоматического подставления значений по умолчанию. Например, если в справочнике Подразделения создана всего одна запись или требуется подставлять конкретный элемент, логично заполнять соответствующее поле автоматически при открытии формы, чтобы пользователю не приходилось каждый раз выбирать его вручную.
Рассмотрим подробно, как реализовать автозаполнение реквизита, какие проверки необходимо добавить в код и какие архитектурные особенности следует учитывать.
Если в справочнике присутствует только одна запись и необходимо подставить именно её, можно воспользоваться языком запросов для получения ссылки на этот элемент. Проанализируем пример кода, выполняющего данный выбор:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Спр.Ссылка ИЗ Справочник.Подразделения КАК Спр";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Объект.Подразделение = Выборка.Ссылка;
КонецЕсли;
С помощью конструкции ВЫБРАТЬ ПЕРВЫЕ 1 запрос получает первую попавшуюся запись из справочника Подразделения и записывает ссылку на элемент в реквизит Подразделение.
Если подразделение не является предопределенным элементом, но его код известен заранее, можно применить стандартный метод поиска по коду НайтиПоКоду() менеджерa справочника.
ИскомыйКод = "000000001"; // Укажите реальный код элемента
НайденноеПодразделение = Справочники.Подразделения.НайтиПоКоду(ИскомыйКод);
Если ЗначениеЗаполнено(НайденноеПодразделение) Тогда
Объект.Подразделение = НайденноеПодразделение;
КонецЕсли;
В этом случае система находит элемент по его уникальному коду и присваивает значение реквизиту объекта.
Выполнять автозаполнение безоглядно при каждом открытии формы не рекомендуется. Если открыть уже ранее сохраненный элемент или документ, в котором подразделение по какой-то причине не заполнено, код может случайно перезаписать данные или привести к изменению формы при простом просмотре.
Разберем по шагам, какие проверки следует добавить в условие:
Объект.Ссылка.Пустая() позволяет убедиться, что форма открыта для создания нового элемента или документа, а не для просмотра существующего.ЗначениеЗаполнено(Объект.Подразделение) проверяет, не выбрано ли уже значение пользователем или другой процедурой.Посмотрим на итоговый вариант условия с учетом всех проверок:
Если Объект.Ссылка.Пустая() И НЕ ЗначениеЗаполнено(Объект.Подразделение) Тогда
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Спр.Ссылка ИЗ Справочник.Подразделения КАК Спр";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Объект.Подразделение = Выборка.Ссылка;
КонецЕсли;
КонецЕсли;
Выясним, где именно в структуре конфигурации правильнее всего размещать подобную логику:
ОбработкаЗаполнения): Это наиболее правильный способ назначения значений по умолчанию. Код, написанный в ОбработкаЗаполнения, сработает не только при интерактивном создании объекта из формы, но и при его программном создании через код модуля.ПриСозданииНаСервере): Если заставить реквизит заполняться требуется строго на уровне формы, выполняйте код в серверном событии ПриСозданииНаСервере. Выполнение запросов на клиенте в событии ПриОткрытии приводит к дополнительным вызовам сервера и снижает производительность системы.