Значения по умолчанию в 1С: свойство реквизита, код модуля и настройки пользователя

· 9 мин

Содержание

Самый простой способ установить значение по умолчанию в 1С 8.3 — открыть реквизит в конфигураторе и заполнить свойство Значение заполнения на вкладке свойств. Если значение должно зависеть от пользователя, даты или другого поля, его задают кодом в обработчике ОбработкаЗаполнения модуля объекта.

Тема общая для платформы 8.3: механизм одинаков в любой конфигурации на управляемых формах. Отличаются только готовые пользовательские настройки типовых решений: в Бухгалтерии и Управлении торговлей многие умолчания включаются без конфигуратора, одной командой в списке или в персональных настройках.

Откуда 1С берёт значение по умолчанию: четыре источника

Когда пользователь создаёт новый элемент справочника или документ, платформа заполняет его реквизиты в определённом порядке. Понимание этого порядка снимает половину вопросов «почему поле пустое».

ИсточникГде задаётсяКогда срабатывает
🧱 Свойство реквизита Значение заполненияКонфигуратор, палитра свойствПри вызове стандартного заполнения нового объекта
📦 Данные заполненияОтбор списка, ввод на основании, параметры формыЕсли у реквизита включено Заполнять из данных заполнения или код их разбирает
🧩 Обработчик ОбработкаЗаполненияМодуль объектаПосле стандартного заполнения
👤 Настройки пользователяТиповая конфигурация, хранилище настроекЧитаются из кода типовой при заполнении

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

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

Как установить значение по умолчанию в конфигураторе

Для постоянного значения код не нужен. Порядок действий:

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

Что можно указать в Значение заполнения:

  • ✅ значения примитивных типов: число, строку, булево, конкретную дату;
  • ✅ значение перечисления, например ВидыДоговоров.СПокупателем;
  • ✅ предопределённый элемент справочника или плана счетов;
  • ❌ обычный, не предопределённый элемент справочника — ссылку на него в свойство не выбрать;
  • ❌ «текущую дату», «текущего пользователя» и любое вычисляемое значение.

Рядом находится флаг Заполнять из данных заполнения. Включайте его у реквизитов, которые логично подхватывать из контекста: организация, контрагент, склад, владелец. Без флага платформа проигнорирует такое поле в данных заполнения, и его придётся разбирать кодом.

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

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

Когда значение вычисляется, нужен код. Основное место — обработчик ОбработкаЗаполнения в модуле объекта. Он выполняется на сервере, поэтому из него доступны запросы и общие модули.

Пример для документа с реквизитами Склад и Ответственный:

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

	// Склад: если не пришёл из отбора или основания — берём из настроек пользователя
	Если Не ЗначениеЗаполнено(Склад) Тогда
		Склад = ХранилищеОбщихНастроек.Загрузить("НастройкиДокументов", "ОсновнойСклад");
	КонецЕсли;

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

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

Проверка Не ЗначениеЗаполнено здесь главная. Без неё код перетрёт склад, который пользователь получил из отбора списка или из документа-основания.

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

Значение по умолчанию в форме

Иногда значение нужно только при интерактивном создании, а при загрузке из обмена — нет. Тогда пишите в модуле формы:

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

	Если Объект.Ссылка.Пустая() И Не ЗначениеЗаполнено(Объект.ДатаНачала) Тогда
		Объект.ДатаНачала = НачалоМесяца(ТекущаяДатаСеанса());
	КонецЕсли;

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

Условие Объект.Ссылка.Пустая() отсекает открытие уже записанного объекта. Без него дата будет меняться при каждом открытии карточки.

Строки табличной части

У новой строки значения ставят в обработчике ПриНачалеРедактирования таблицы на форме:

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

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

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

Флаг Копирование важен: при копировании строки пользователь ждёт точную копию, а не сброшенное количество.

Программное создание объекта

При создании через Справочники.Номенклатура.СоздатьЭлемент() свойство Значение заполнения само не применяется. Чтобы сработали и свойства, и обработчик, вызовите заполнение явно:

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Заполнить(Неопределено);
НовыйЭлемент.Наименование = "Болт М8";
НовыйЭлемент.Записать();

Это частая причина ситуации «вручную поле заполняется, а из обработки загрузки — нет».

Значения из контекста: отбор, основание, родитель

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

  • 🔎 Отбор списка. Пользователь отфильтровал список документов по контрагенту и нажал «Создать». В данные заполнения попадает структура с полем Контрагент. При включённом Заполнять из данных заполнения реквизит заполнится сам.
  • 📄 Ввод на основании. В ДанныеЗаполнения приходит ссылка на документ-основание. Её разбирают в ОбработкаЗаполнения по типу.
  • 📁 Группа иерархического справочника. Если пользователь стоит в группе и создаёт элемент, родитель проставляется этой группой.
  • 🧾 Параметры формы. Из кода можно открыть форму нового объекта с параметром ЗначенияЗаполнения — структурой нужных полей.

Пример разбора основания:

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

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

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

Открытие формы с готовыми значениями из своего кода:

ЗначенияЗаполнения = Новый Структура("Контрагент, Склад", ВыбранныйКонтрагент, ВыбранныйСклад);
ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ЗначенияЗаполнения);
ОткрытьФорму("Документ.РасходнаяНакладная.ФормаОбъекта", ПараметрыФормы);

Имена документов в примерах условные. Подставьте объекты своей конфигурации.

Где задать значение по умолчанию?

Значения по умолчанию в типовых конфигурациях

В типовых решениях многие значения по умолчанию уже вынесены в пользовательские настройки. Программировать их не надо.

Основная организация. В Бухгалтерии предприятия 3.0 откройте справочник Главное → Организации, выделите нужную и выполните команду Использовать как основную. Новые документы этого пользователя будут создаваться с ней. Если организация в базе одна, она подставляется сама.

Персональные настройки. В БП 3.0 и УТ 11 у каждого пользователя есть форма персональных настроек, она открывается из главного меню программы (кнопка с тремя полосками в заголовке окна). Там задают основные значения для подстановки в документы. Набор полей зависит от конфигурации: в торговых решениях это обычно склад и подразделение, в бухгалтерии — организация и ответственный.

Настройки других пользователей. Администратор может посмотреть и скопировать чужие настройки в разделе Администрирование → Настройки пользователей и прав. Это удобно, когда нужно выдать новому сотруднику те же умолчания, что у коллеги.

Свои умолчания в типовой: через расширение

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

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

	Если Не ЗначениеЗаполнено(Комментарий) Тогда
		Комментарий = "Создан по регламенту склада";
	КонецЕсли;

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

Аннотация &После выполняет ваш код после типового. Значения, которые поставила типовая, уже на месте, и вы дополняете только пустые. Расширение переживает обновления релизов без ручного объединения.

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

Как не замедлить открытие форм

Код значений по умолчанию выполняется при каждом создании объекта. Ошибки здесь копятся незаметно: 200 мс на документ превращаются в секунды задержки при массовом вводе.

Правила, которые держат заполнение быстрым:

  1. Заполняйте на сервере. ОбработкаЗаполнения и ПриСозданииНаСервере уже выполняются на сервере. Не делайте из клиентского кода отдельный серверный вызов ради одного поля.
  2. Один запрос вместо нескольких. Если нужно получить склад, подразделение и тип цен, читайте их одним запросом или одним чтением настроек, а не тремя.
  3. Кешируйте неизменное. Значения, которые не меняются в течение сеанса, выносите в общий модуль с повторным использованием возвращаемых значений «На время сеанса».
  4. Не обращайтесь к реквизитам через точку в цикле. ДанныеЗаполнения.Контрагент.ОсновнойДоговор на каждой строке табличной части — это отдельное чтение объекта каждый раз.
  5. Строки таблицы — на клиенте. Простые умолчания в ПриНачалеРедактирования ставьте без серверного вызова, как в примере выше.

Модуль с повторным использованием возвращает одно и то же значение до конца сеанса. Если пользователь сменил основной склад, новое значение подхватится только после перезапуска. Для часто меняемых настроек кеш не подходит.

Как проверить значения по умолчанию автотестом

Значения по умолчанию ломаются тихо: после обновления или правки кода поле просто остаётся пустым. Автотест ловит это до пользователей.

Два популярных инструмента:

  • 🧪 YAxUnit — модульные тесты на встроенном языке, устанавливается как расширение;
  • 🥒 Vanessa Automation — сценарные тесты на языке Gherkin, работает через интерфейс как пользователь.

Модульный тест проверяет логику заполнения без форм. Суть проверки:

Процедура ПроверитьЗаполнениеОтветственного() Экспорт

	Документ = Документы.РасходнаяНакладная.СоздатьДокумент();
	Документ.Заполнить(Неопределено);

	Если Документ.Ответственный <> Пользователи.ТекущийПользователь() Тогда
		ВызватьИсключение "Ответственный не заполнен по умолчанию";
	КонецЕсли;

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

В YAxUnit вместо ВызватьИсключение используют его собственные утверждения, синтаксис смотрите в документации инструмента. Логика та же: создать объект, вызвать Заполнить, сравнить поле с ожидаемым.

Что стоит покрыть тестами:

  • создание без контекста: работают свойства и обработчик;
  • создание с данными заполнения: значение из отбора не перетирается кодом;
  • ввод на основании: поля перенеслись из основания;
  • копирование: ненужные поля сброшены в ПриКопировании.

Сценарный тест в Vanessa Automation дополняет модульный. Он открывает форму, нажимает «Создать» и проверяет, что в поле видно нужное значение. Так ловятся ошибки в ПриСозданииНаСервере, которые модульный тест не видит.

Частые ошибки и как их избежать

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

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

Можно ли задать значение по умолчанию для реквизита формы, а не объекта?
Свойства «Значение заполнения» у реквизита формы нет. Значение ставят в ПриСозданииНаСервере. Если оно должно запоминаться между сеансами, включите у реквизита формы флажок «Сохраняемые данные», а у формы — автоматическое сохранение данных в настройках.
Почему поле с числом показывает 0, хотя я ничего не задавал?
Это пустое значение типа Число. Платформа не различает «ноль» и «не заполнено» для чисел. Если нужно отличать, используйте составной тип с Неопределено или отдельный флаг.
Чем значение по умолчанию отличается от проверки заполнения?
Значение по умолчанию подставляет данные в новый объект. Проверка заполнения (свойство реквизита «Проверка заполнения») не даёт записать объект с пустым полем. Их часто используют вместе: подставили склад и запретили его стирать.
Как сделать, чтобы у каждого пользователя было своё значение по умолчанию?
Храните его в хранилище общих настроек с ключом пользователя или в регистре сведений «пользователь → значение». В типовых для этого уже есть персональные настройки.
Будет ли ОбработкаЗаполнения срабатывать при обмене данными?
При загрузке объекта из обмена новый объект обычно создаётся без вызова Заполнить, поэтому обработчик не срабатывает. Это защищает данные из источника от перезаписи.