Как сделать, чтобы реквизит в 1С заполнялся сам: конфигуратор, код и форма

· 9 мин

Содержание

Чтобы установить значение реквизита по умолчанию в 1С 8.3, откройте реквизит в конфигураторе и заполните свойство «Значение заполнения» на вкладке «Использование» палитры свойств. Это работает для констант, перечислений и предопределённых элементов. Текущую дату, текущего пользователя или значение, зависящее от других полей, задают кодом в обработчике ОбработкаЗаполнения модуля объекта.

Способ выбирают по двум вопросам: какое значение нужно (постоянное или вычисляемое) и когда оно должно появиться (только при вводе в форме или при любом создании объекта, включая обмен и программную загрузку). Всё ниже относится к платформе 8.3 и управляемым формам и одинаково работает в справочниках, документах и планах видов характеристик.

Пять способов задать значение по умолчанию: что выбрать

СпособКакое значениеКогда срабатываетНужен код
Свойство «Значение заполнения»постоянное: число, строка, булево, перечисление, предопределённый элементпри заполнении объекта (ввод нового, Заполнить())нет
«Заполнять из данных заполнения»значение из отбора списка или основанияпри вводе из списка с отборомнет
ОбработкаЗаполнения в модуле объекталюбое, в том числе вычисляемоепри заполнении нового объекта на сервереда
ПриСозданииНаСервере в формелюбоетолько при открытии формы нового объектада
ПриНачалеРедактирования у таблицы формызначение в новой строкепри добавлении строки пользователемда

Правило выбора простое. Если значение одно и то же для всех — свойство в конфигураторе. Если оно зависит от даты, пользователя, организации или других реквизитов — код в модуле объекта. Форму трогайте, только когда значение нужно исключительно при интерактивном вводе.

Когда значение по умолчанию лучше не задавать

Значение по умолчанию экономит клики, но иногда вредит. Пользователь не замечает подставленное поле и проводит документ с неверными данными.

  • ⛔ Контрагент, договор, сумма — то, что каждый раз разное. Пустое поле с проверкой заполнения надёжнее подсказки, которая подходит в половине случаев.
  • ⛔ Счёт учёта или статья затрат, от которых зависят проводки. Ошибка всплывёт только при закрытии месяца.
  • ✅ Единица измерения, валюта, склад при одном складе, ставка налога для основной номенклатуры, текущая дата — подставляйте смело.

Если сомневаетесь, задайте значение и сделайте поле обязательным: пользователь хотя бы увидит, что оно есть.

Свойство «Значение заполнения» в конфигураторе

Это самый быстрый способ без единой строки кода.

  1. Откройте конфигуратор и дерево метаданных.
  2. Найдите объект (например, документ «Заказ») и раскройте ветку «Реквизиты».
  3. Двойным щелчком откройте палитру свойств нужного реквизита.
  4. Найдите свойство «Значение заполнения» (группа «Использование»).
  5. Выберите значение в поле. Для ссылочного типа откроется список предопределённых элементов или значений перечисления.
  6. Обновите конфигурацию базы данных (F7) и проверьте, создав новый объект в режиме «Предприятие».

Что можно указать в этом свойстве:

  • ✅ число, строку, булево значение;
  • ✅ значение перечисления (например, ВидыОплаты.Безналичная);
  • ✅ предопределённый элемент справочника, плана счетов, плана видов характеристик;
  • ❌ обычный, не предопределённый элемент справочника;
  • ❌ текущую дату, текущего пользователя и любые вычисления.

Рядом в палитре есть флажок «Заполнять из данных заполнения». Если он включён, реквизит получит значение из отбора. Пример: в списке номенклатуры открыта группа «Канцтовары», пользователь создаёт новый элемент — поле «Родитель» уже заполнено этой группой. Тот же механизм подставляет владельца в подчинённый справочник, когда список открыт из карточки владельца.

«Значение заполнения» не срабатывает при простом создании объекта кодом. Строка Документы.Заказ.СоздатьДокумент() даёт пустой объект. Чтобы применились значения по умолчанию, вызовите Объект.Заполнить(Неопределено) сразу после создания.

Предопределённый элемент как значение по умолчанию реквизита

Когда нужен конкретный элемент справочника — единица «шт», склад «Основной», валюта «руб.» — его делают предопределённым. Только тогда его можно выбрать в «Значении заполнения» и надёжно найти в коде по имени.

Как создать предопределённый элемент

  1. Откройте справочник в конфигураторе, вкладка «Прочие».
  2. Нажмите кнопку «Предопределённые».
  3. Добавьте элемент: укажите «Имя» (латиница или кириллица без пробелов, например ОсновнойСклад), «Код» и «Наименование».
  4. Обновите конфигурацию базы данных. При запуске платформа создаст элемент в таблице справочника.
  5. Вернитесь к реквизиту документа и выберите этот элемент в свойстве «Значение заполнения».

Как обращаться к нему из кода

На сервере и в модулях объектов:

Склад = Справочники.Склады.ОсновнойСклад;

На клиенте и в общих модулях, которые выполняются в разных контекстах:

Склад = ПредопределенноеЗначение("Справочник.Склады.ОсновнойСклад");

Связь элемента в базе с описанием в конфигурации хранится в поле «Имя предопределённых данных». Если пользователь создал обычный элемент «Основной» вручную, это другой объект: в «Значение заполнения» он не попадёт.

Пользователь может пометить предопределённый элемент на удаление, и тогда в новые документы будет подставляться помеченный элемент. Следите за этим в правах: изменение таких элементов лучше оставить администратору. Перед удалением предопределённого элемента из конфигурации найдите все реквизиты, где он стоит значением заполнения, иначе при обновлении в этих свойствах окажется пустое значение.

Значение по умолчанию программно: модуль объекта

Если значение вычисляется, пишите код в модуле объекта, а не в форме. Модуль объекта отрабатывает при любом создании через Заполнить(): из формы, по кнопке «Создать на основании», из обработки загрузки. Значения, установленные в форме, туда не попадают.

Откройте модуль объекта: правой кнопкой по объекту в дереве → «Открыть модуль объекта». Добавьте обработчик:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)

	// Ввод на основании: данные заполнения — ссылка на документ-основание
	Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
		Контрагент = ДанныеЗаполнения.Контрагент;
		Склад      = ДанныеЗаполнения.Склад;
	КонецЕсли;

	// Значения по умолчанию — только если поля ещё пустые
	Если Не ЗначениеЗаполнено(Ответственный) Тогда
		Ответственный = Пользователи.ТекущийПользователь();
	КонецЕсли;

	Если Не ЗначениеЗаполнено(ДатаОтгрузки) Тогда
		ДатаОтгрузки = НачалоДня(ТекущаяДатаСеанса()) + 86400 * 3;
	КонецЕсли;

КонецПроцедуры

Пояснения к коду:

  • 📌 Проверка ЗначениеЗаполнено() не даёт затереть то, что уже пришло из отбора списка или основания.
  • 📌 ТекущаяДатаСеанса() учитывает часовой пояс сеанса, в отличие от ТекущаяДата(), которая берёт время компьютера.
  • 📌 86400 * 3 — три дня в секундах: дата отгрузки по умолчанию через трое суток.
  • 📌 Пользователи.ТекущийПользователь() — функция Библиотеки стандартных подсистем. В конфигурации без БСП используйте свой способ получить пользователя, например через ПользователиИнформационнойБазы.ТекущийПользователь().

Какие данные приходят в параметр ДанныеЗаполнения:

Как создан объектЧто в ДанныеЗаполнения
кнопка «Создать» в списке без отбораНеопределено
«Создать» в списке с отбором или в группеСтруктура с полями отбора
«Создать на основании»ссылка на объект-основание
вызов Объект.Заполнить(Данные) в кодето, что передали в Данные

Поэтому в начале обработчика всегда проверяйте тип через ТипЗнч(), иначе обращение к полю основания упадёт с ошибкой на структуре.

Копирование — отдельный обработчик

При копировании объекта (F9) ОбработкаЗаполнения не вызывается. Копия получает все значения оригинала. Если какие-то поля нужно сбросить или переустановить, используйте ПриКопировании:

Процедура ПриКопировании(ОбъектКопирования)
	Ответственный = Пользователи.ТекущийПользователь();
	НомерВходящегоДокумента = "";
КонецПроцедуры

Свойство и код одновременно

Не задавайте одному реквизиту и «Значение заполнения», и присваивание в ОбработкаЗаполнения без проверки на заполненность. Так сложно понять, какое значение победит. Если нужен полный контроль, установите в обработчике СтандартнаяОбработка = Ложь — тогда стандартное заполнение платформы (включая «Значение заполнения» и данные из отбора) не выполнится, и всё придётся заполнять кодом.

Заполнение реквизита по умолчанию в форме документа

Код в форме нужен, когда значение должно появиться только перед глазами пользователя и не должно навязываться обменам или загрузке. Пример — подсказка в комментарии или выбор склада по последнему документу этого пользователя.

Обработчик ПриСозданииНаСервере формы объекта:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

КонецПроцедуры

Почему именно так:

  • 🔹 Параметры.Ключ.Пустая() — форма открыта для нового объекта, а не для существующего.
  • 🔹 Параметры.ЗначениеКопирования заполнено при копировании — тогда значения оригинала не трогаем.
  • 🔹 Работаем на сервере, поэтому нет лишних вызовов с клиента.

Значения по умолчанию в формах обработок и отчётов

У обработки нет записи в базу, поэтому «по умолчанию» обычно означает «как в прошлый раз». Для этого не нужен код:

  1. Откройте форму обработки в конфигураторе.
  2. В свойствах самой формы включите «Автоматическое сохранение данных в настройках».
  3. У нужного реквизита формы установите флажок «Сохраняемые данные».

Теперь платформа запомнит введённое значение для каждого пользователя и подставит его при следующем открытии.

Если значение хранится между сеансами и не привязано к форме, используйте хранилище настроек:

ХранилищеОбщихНастроек.Сохранить("МояОбработка", "Склад", Склад);
Склад = ХранилищеОбщихНастроек.Загрузить("МояОбработка", "Склад");

Значения по умолчанию в строках табличной части

Новая строка табличной части, добавленная кодом через Товары.Добавить(), всегда пустая. Значения нужно присвоить сразу:

НоваяСтрока = Товары.Добавить();
НоваяСтрока.Номенклатура = Номенклатура;
НоваяСтрока.Количество   = 1;
НоваяСтрока.СтавкаНДС    = Перечисления.СтавкиНДС.НДС20;

Для строк, которые добавляет пользователь, используйте событие ПриНачалеРедактирования у элемента таблицы формы. Откройте форму, выделите таблицу «Товары», в палитре свойств перейдите к событиям и создайте обработчик:

&НаКлиенте
Процедура ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

	Если НоваяСтрока И Не Копирование Тогда
		ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
		ТекущиеДанные.Количество = 1;
		ТекущиеДанные.СтавкаНДС  = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС20");
	КонецЕсли;

КонецПроцедуры

Обработчик клиентский, поэтому предопределённое значение берётся через ПредопределенноеЗначение(). Обращение Перечисления.СтавкиНДС.НДС20 на клиенте недоступно. Флаг Копирование отсекает строки, скопированные клавишей F9: у них значения уже есть.

Имена СтавкиНДС и НДС20 в примерах условные. В своей конфигурации подставьте реальные имена из дерева метаданных: в типовых решениях перечисление ставок и его значения могут называться иначе.

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

В типовой конфигурации (Бухгалтерия, ЗУП, УТ) не правьте модуль объекта напрямую. Снятие с поддержки усложняет каждое обновление. Используйте расширение конфигурации (доступно с платформы 8.3.6):

  1. В конфигураторе откройте Конфигурация → Расширения конфигурации и создайте расширение.
  2. В дереве основной конфигурации найдите документ, правой кнопкой → «Добавить в расширение».
  3. В расширении откройте модуль объекта заимствованного документа.
  4. Добавьте обработчик с аннотацией &После, чтобы он выполнялся после типового:
&После("ОбработкаЗаполнения")
Процедура Расш1_ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
	Если Не ЗначениеЗаполнено(Комментарий) Тогда
		Комментарий = "Создан менеджером отдела продаж";
	КонецЕсли;
КонецПроцедуры
  1. Сохраните расширение и обновите конфигурацию базы данных.

Если в типовом модуле обработчика ОбработкаЗаполнения нет, аннотация &После для него не подойдёт: создайте обычный обработчик события в модуле объекта расширения через палитру событий.

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

Почему значение по умолчанию не подставляется

Диагностика: выберите симптом

Частые вопросы

Можно ли задать значение по умолчанию для реквизита регистра сведений?
Да. У ресурсов и реквизитов регистра сведений тоже есть свойство «Значение заполнения». Вычисляемые значения задают в обработчике ПриСозданииНаСервере формы записи или в модуле набора записей перед записью.
Как сделать значение по умолчанию для констант?
У константы свойства «Значение заполнения» нет. Начальное значение записывают один раз кодом при первом запуске или обновлении: Константы.ИмяКонстанты.Установить(Значение).
Почему булево поле всегда «Ложь», хотя я ничего не задавал?
Это пустое значение типа Булево. Если нужно «Истина» по умолчанию, укажите его в свойстве «Значение заполнения» реквизита.
Применится ли новое значение по умолчанию к уже созданным документам?
Нет. Значение подставляется только при создании объекта. Старые документы дозаполняют групповым изменением реквизитов или своей обработкой, с резервной копией базы перед изменением.
Значение заполнения проверяется при записи объекта?
Нет. Это только начальное значение: пользователь может его стереть. Чтобы поле было обязательным, включите свойство «Проверка заполнения» = «Выдавать ошибку».