Как сделать, чтобы реквизит в 1С заполнялся сам: конфигуратор, код и форма
Содержание
Чтобы установить значение реквизита по умолчанию в 1С 8.3, откройте реквизит в конфигураторе и заполните свойство «Значение заполнения» на вкладке «Использование» палитры свойств. Это работает для констант, перечислений и предопределённых элементов. Текущую дату, текущего пользователя или значение, зависящее от других полей, задают кодом в обработчике ОбработкаЗаполнения модуля объекта.
Способ выбирают по двум вопросам: какое значение нужно (постоянное или вычисляемое) и когда оно должно появиться (только при вводе в форме или при любом создании объекта, включая обмен и программную загрузку). Всё ниже относится к платформе 8.3 и управляемым формам и одинаково работает в справочниках, документах и планах видов характеристик.
Пять способов задать значение по умолчанию: что выбрать
| Способ | Какое значение | Когда срабатывает | Нужен код |
|---|---|---|---|
| Свойство «Значение заполнения» | постоянное: число, строка, булево, перечисление, предопределённый элемент | при заполнении объекта (ввод нового, Заполнить()) | нет |
| «Заполнять из данных заполнения» | значение из отбора списка или основания | при вводе из списка с отбором | нет |
ОбработкаЗаполнения в модуле объекта | любое, в том числе вычисляемое | при заполнении нового объекта на сервере | да |
ПриСозданииНаСервере в форме | любое | только при открытии формы нового объекта | да |
ПриНачалеРедактирования у таблицы формы | значение в новой строке | при добавлении строки пользователем | да |
Правило выбора простое. Если значение одно и то же для всех — свойство в конфигураторе. Если оно зависит от даты, пользователя, организации или других реквизитов — код в модуле объекта. Форму трогайте, только когда значение нужно исключительно при интерактивном вводе.
Когда значение по умолчанию лучше не задавать
Значение по умолчанию экономит клики, но иногда вредит. Пользователь не замечает подставленное поле и проводит документ с неверными данными.
- ⛔ Контрагент, договор, сумма — то, что каждый раз разное. Пустое поле с проверкой заполнения надёжнее подсказки, которая подходит в половине случаев.
- ⛔ Счёт учёта или статья затрат, от которых зависят проводки. Ошибка всплывёт только при закрытии месяца.
- ✅ Единица измерения, валюта, склад при одном складе, ставка налога для основной номенклатуры, текущая дата — подставляйте смело.
Если сомневаетесь, задайте значение и сделайте поле обязательным: пользователь хотя бы увидит, что оно есть.
Свойство «Значение заполнения» в конфигураторе
Это самый быстрый способ без единой строки кода.
- Откройте конфигуратор и дерево метаданных.
- Найдите объект (например, документ «Заказ») и раскройте ветку «Реквизиты».
- Двойным щелчком откройте палитру свойств нужного реквизита.
- Найдите свойство «Значение заполнения» (группа «Использование»).
- Выберите значение в поле. Для ссылочного типа откроется список предопределённых элементов или значений перечисления.
- Обновите конфигурацию базы данных (
F7) и проверьте, создав новый объект в режиме «Предприятие».
Что можно указать в этом свойстве:
- ✅ число, строку, булево значение;
- ✅ значение перечисления (например,
ВидыОплаты.Безналичная); - ✅ предопределённый элемент справочника, плана счетов, плана видов характеристик;
- ❌ обычный, не предопределённый элемент справочника;
- ❌ текущую дату, текущего пользователя и любые вычисления.
Рядом в палитре есть флажок «Заполнять из данных заполнения». Если он включён, реквизит получит значение из отбора. Пример: в списке номенклатуры открыта группа «Канцтовары», пользователь создаёт новый элемент — поле «Родитель» уже заполнено этой группой. Тот же механизм подставляет владельца в подчинённый справочник, когда список открыт из карточки владельца.
«Значение заполнения» не срабатывает при простом создании объекта кодом. Строка Документы.Заказ.СоздатьДокумент() даёт пустой объект. Чтобы применились значения по умолчанию, вызовите Объект.Заполнить(Неопределено) сразу после создания.
Предопределённый элемент как значение по умолчанию реквизита
Когда нужен конкретный элемент справочника — единица «шт», склад «Основной», валюта «руб.» — его делают предопределённым. Только тогда его можно выбрать в «Значении заполнения» и надёжно найти в коде по имени.
Как создать предопределённый элемент
- Откройте справочник в конфигураторе, вкладка «Прочие».
- Нажмите кнопку «Предопределённые».
- Добавьте элемент: укажите «Имя» (латиница или кириллица без пробелов, например
ОсновнойСклад), «Код» и «Наименование». - Обновите конфигурацию базы данных. При запуске платформа создаст элемент в таблице справочника.
- Вернитесь к реквизиту документа и выберите этот элемент в свойстве «Значение заполнения».
Как обращаться к нему из кода
На сервере и в модулях объектов:
Склад = Справочники.Склады.ОсновнойСклад;
На клиенте и в общих модулях, которые выполняются в разных контекстах:
Склад = ПредопределенноеЗначение("Справочник.Склады.ОсновнойСклад");
Связь элемента в базе с описанием в конфигурации хранится в поле «Имя предопределённых данных». Если пользователь создал обычный элемент «Основной» вручную, это другой объект: в «Значение заполнения» он не попадёт.
Пользователь может пометить предопределённый элемент на удаление, и тогда в новые документы будет подставляться помеченный элемент. Следите за этим в правах: изменение таких элементов лучше оставить администратору. Перед удалением предопределённого элемента из конфигурации найдите все реквизиты, где он стоит значением заполнения, иначе при обновлении в этих свойствах окажется пустое значение.
Значение по умолчанию программно: модуль объекта
Если значение вычисляется, пишите код в модуле объекта, а не в форме. Модуль объекта отрабатывает при любом создании через Заполнить(): из формы, по кнопке «Создать на основании», из обработки загрузки. Значения, установленные в форме, туда не попадают.
Откройте модуль объекта: правой кнопкой по объекту в дереве → «Открыть модуль объекта». Добавьте обработчик:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
// Ввод на основании: данные заполнения — ссылка на документ-основание
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
Контрагент = ДанныеЗаполнения.Контрагент;
Склад = ДанныеЗаполнения.Склад;
КонецЕсли;
// Значения по умолчанию — только если поля ещё пустые
Если Не ЗначениеЗаполнено(Ответственный) Тогда
Ответственный = Пользователи.ТекущийПользователь();
КонецЕсли;
Если Не ЗначениеЗаполнено(ДатаОтгрузки) Тогда
ДатаОтгрузки = НачалоДня(ТекущаяДатаСеанса()) + 86400 * 3;
КонецЕсли;
КонецПроцедуры
Пояснения к коду:
- 📌 Проверка
ЗначениеЗаполнено()не даёт затереть то, что уже пришло из отбора списка или основания. - 📌
ТекущаяДатаСеанса()учитывает часовой пояс сеанса, в отличие отТекущаяДата(), которая берёт время компьютера. - 📌
86400 * 3— три дня в секундах: дата отгрузки по умолчанию через трое суток. - 📌
Пользователи.ТекущийПользователь()— функция Библиотеки стандартных подсистем. В конфигурации без БСП используйте свой способ получить пользователя, например черезПользователиИнформационнойБазы.ТекущийПользователь().
Какие данные приходят в параметр ДанныеЗаполнения:
| Как создан объект | Что в ДанныеЗаполнения |
|---|---|
| кнопка «Создать» в списке без отбора | Неопределено |
| «Создать» в списке с отбором или в группе | Структура с полями отбора |
| «Создать на основании» | ссылка на объект-основание |
вызов Объект.Заполнить(Данные) в коде | то, что передали в Данные |
Поэтому в начале обработчика всегда проверяйте тип через ТипЗнч(), иначе обращение к полю основания упадёт с ошибкой на структуре.
Копирование — отдельный обработчик
При копировании объекта (F9) ОбработкаЗаполнения не вызывается. Копия получает все значения оригинала. Если какие-то поля нужно сбросить или переустановить, используйте ПриКопировании:
Процедура ПриКопировании(ОбъектКопирования)
Ответственный = Пользователи.ТекущийПользователь();
НомерВходящегоДокумента = "";
КонецПроцедуры
Свойство и код одновременно
Не задавайте одному реквизиту и «Значение заполнения», и присваивание в ОбработкаЗаполнения без проверки на заполненность. Так сложно понять, какое значение победит. Если нужен полный контроль, установите в обработчике СтандартнаяОбработка = Ложь — тогда стандартное заполнение платформы (включая «Значение заполнения» и данные из отбора) не выполнится, и всё придётся заполнять кодом.
Заполнение реквизита по умолчанию в форме документа
Код в форме нужен, когда значение должно появиться только перед глазами пользователя и не должно навязываться обменам или загрузке. Пример — подсказка в комментарии или выбор склада по последнему документу этого пользователя.
Обработчик ПриСозданииНаСервере формы объекта:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Новый объект, не копия
Если Параметры.Ключ.Пустая() И Не ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда
Если Не ЗначениеЗаполнено(Объект.Склад) Тогда
Объект.Склад = ПоследнийСкладПользователя();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Почему именно так:
- 🔹
Параметры.Ключ.Пустая()— форма открыта для нового объекта, а не для существующего. - 🔹
Параметры.ЗначениеКопированиязаполнено при копировании — тогда значения оригинала не трогаем. - 🔹 Работаем на сервере, поэтому нет лишних вызовов с клиента.
Значения по умолчанию в формах обработок и отчётов
У обработки нет записи в базу, поэтому «по умолчанию» обычно означает «как в прошлый раз». Для этого не нужен код:
- Откройте форму обработки в конфигураторе.
- В свойствах самой формы включите «Автоматическое сохранение данных в настройках».
- У нужного реквизита формы установите флажок «Сохраняемые данные».
Теперь платформа запомнит введённое значение для каждого пользователя и подставит его при следующем открытии.
Если значение хранится между сеансами и не привязано к форме, используйте хранилище настроек:
ХранилищеОбщихНастроек.Сохранить("МояОбработка", "Склад", Склад);
Склад = ХранилищеОбщихНастроек.Загрузить("МояОбработка", "Склад");
Значения по умолчанию в строках табличной части
Новая строка табличной части, добавленная кодом через Товары.Добавить(), всегда пустая. Значения нужно присвоить сразу:
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Номенклатура = Номенклатура;
НоваяСтрока.Количество = 1;
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
Для строк, которые добавляет пользователь, используйте событие ПриНачалеРедактирования у элемента таблицы формы. Откройте форму, выделите таблицу «Товары», в палитре свойств перейдите к событиям и создайте обработчик:
&НаКлиенте
Процедура ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
Если НоваяСтрока И Не Копирование Тогда
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
ТекущиеДанные.Количество = 1;
ТекущиеДанные.СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС20");
КонецЕсли;
КонецПроцедуры
Обработчик клиентский, поэтому предопределённое значение берётся через ПредопределенноеЗначение(). Обращение Перечисления.СтавкиНДС.НДС20 на клиенте недоступно. Флаг Копирование отсекает строки, скопированные клавишей F9: у них значения уже есть.
Имена СтавкиНДС и НДС20 в примерах условные. В своей конфигурации подставьте реальные имена из дерева метаданных: в типовых решениях перечисление ставок и его значения могут называться иначе.
Как задать значение по умолчанию в типовой конфигурации без снятия с поддержки
В типовой конфигурации (Бухгалтерия, ЗУП, УТ) не правьте модуль объекта напрямую. Снятие с поддержки усложняет каждое обновление. Используйте расширение конфигурации (доступно с платформы 8.3.6):
- В конфигураторе откройте
Конфигурация → Расширения конфигурациии создайте расширение. - В дереве основной конфигурации найдите документ, правой кнопкой → «Добавить в расширение».
- В расширении откройте модуль объекта заимствованного документа.
- Добавьте обработчик с аннотацией
&После, чтобы он выполнялся после типового:
&После("ОбработкаЗаполнения")
Процедура Расш1_ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
Если Не ЗначениеЗаполнено(Комментарий) Тогда
Комментарий = "Создан менеджером отдела продаж";
КонецЕсли;
КонецПроцедуры
- Сохраните расширение и обновите конфигурацию базы данных.
Если в типовом модуле обработчика ОбработкаЗаполнения нет, аннотация &После для него не подойдёт: создайте обычный обработчик события в модуле объекта расширения через палитру событий.
Многие повседневные «значения по умолчанию» в типовых конфигурациях вообще не требуют программирования. Основная организация, склад, подразделение, ответственный подставляются из персональных настроек пользователя. Сначала проверьте их — это часто решает задачу за минуту.