К статье
Практический материал

Автоматизация · 11 мин

Как автоматически заполнить поле в 1С

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

Автоматическое заполнение полей в 1С — одна из самых частых задач при доработке конфигураций и повседневной работе. Цель проста: избавить пользователя от ручного ввода повторяющихся данных — даты, организации, склада, договора, ставки НДС — и снизить количество ошибок. В зависимости от ситуации задача решается разными инструментами: от настроек, доступных обычному пользователю, до программного кода в модуле формы.

Ключевой момент — правильно выбрать способ. Если значение известно заранее и одинаково для всех документов, достаточно настройки подстановки. Если значение зависит от других данных (например, договор подбирается по контрагенту), потребуется либо стандартный механизм связей параметров выбора, либо обработчик события в коде. Ниже разобраны все основные варианты с точными действиями и ограничениями.

Определите, откуда должно браться значение

Прежде чем что-либо настраивать, ответьте на три вопроса: значение постоянное или вычисляемое; зависит ли оно от других полей документа; должно ли оно перезаполняться при изменении исходных данных. От ответов зависит выбор механизма.

Постоянное значение (например, «Основной склад» для всех документов пользователя) — это задача настройки или подписки на событие записи. Значение, зависящее от другого поля (договор по контрагенту, ставка НДС по номенклатуре), решается через связи параметров выбора или обработчик ПриИзменении. Сложная бизнес-логика с проверками — только программный код.

Маршрут решения

Как выбрать способ заполнения

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

Заполнение без программирования: настройки и подстановка

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

Второй встроенный механизм — свойство поля «Значение заполнения» в конфигураторе. Для реквизита объекта можно указать конкретное значение или произвольное выражение, которое система подставит при создании нового элемента. Это работает без единой строки кода, но подходит только для простых статических значений.

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

Заполнение при создании: событие ПриСозданииНаСервере и ОбработкаЗаполнения

Когда документ или элемент справочника создаётся, система вызывает цепочку событий. В модуле объекта срабатывает ОбработкаЗаполнения — именно здесь типовые конфигурации заполняют документы данными основания. В модуле формы первым инициализационным событием является ПриСозданииНаСервере — оно подходит для установки начальных значений, видимых пользователю сразу при открытии формы.

Пример: при создании документа нужно подставить текущего пользователя в поле «Ответственный». В управляемой форме это делается в обработчике ПриСозданииНаСервере:

&НаСервере

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

Если Объект.Ссылка.Пустая() Тогда

Объект.Ответственный = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;

КонецЕсли;

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

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

Заполнение при изменении другого поля

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

Внутри обработчика напишите логику подстановки. Если данные берутся с сервера (запрос к базе), вызывайте серверную процедуру — в клиентском контексте управляемого приложения прямые запросы к базе недоступны:

&НаКлиенте

Процедура КонтрагентПриИзменении(Элемент)

ЗаполнитьДоговорПоКонтрагенту();

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

&НаСервере

Процедура ЗаполнитьДоговорПоКонтрагенту()

Объект.Договор = НайтиОсновнойДоговор(Объект.Контрагент);

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

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

Порядок настройки автозаполнения через ПриИзменении
  1. 1
    Откройте форму объекта в конфигураторе и найдите нужное поле
  2. 2
    В палитре свойств поля создайте обработчик события ПриИзменении
  3. 3
    Напишите клиентскую процедуру-обёртку и серверную процедуру с логикой заполнения
  4. 4
    Добавьте проверку заполненности исходного поля, чтобы не подставлять пустые значения
  5. 5
    Протестируйте на копии базы: выбор значения, очистка поля, повторный выбор
  6. 6
    Проверьте, что при вводе на основании и копировании логика не конфликтует с типовым заполнением

Заполнение на основании и программное создание объектов

Механизм ввода на основании — штатный способ переноса данных из одного документа в другой. В конфигураторе у объекта настраивается свойство «Вводится на основании», а в модуле объекта процедура ОбработкаЗаполнения получает параметр ДанныеЗаполнения — ссылку на документ-основание. Именно здесь поля нового документа заполняются значениями исходного.

Если объект создаётся программно (из обработки, обмена, фонового задания), поля заполняются напрямую перед записью:

НовыйДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

НовыйДок.Дата = ТекущаяДатаСеанса();

НовыйДок.Организация = ОсновнаяОрганизация;

НовыйДок.Заполнить(ДанныеОснования); // вызывает ОбработкаЗаполнения

НовыйДок.Записать();

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

Автозаполнение табличных частей и дополнительных реквизитов

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

Дополнительные реквизиты и сведения (механизм БСП) заполняются иначе: их значения хранятся не в реквизитах объекта, а в табличной части «ДополнительныеРеквизиты» или регистре сведений. Программно значение устанавливается поиском строки по свойству и присвоением ей значения. В типовых конфигурациях для этого есть вспомогательные процедуры общих модулей работы с дополнительными реквизитами.

Типичные ошибки
01
Заполнение без проверки нового объекта — значения перезаписываются при каждом открытии документа
02
Выполнение запроса к базе в клиентской процедуре управляемой формы — ошибка компиляции или неработающий код
03
Игнорирование очистки поля: при сбросе контрагента договор остаётся от старого значения
04
Доработка типового модуля вместо расширения — конфликты и потеря изменений при обновлении
05
Присвоение значения до вызова Заполнить() — типовая обработка затирает вручную заданные данные

Проверка результата и ограничения

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

Учитывайте ограничения платформы: в тонком и веб-клиенте серверный вызов — это обращение к серверу, поэтому частые «тяжёлые» обработчики ПриИзменении замедляют работу формы. Если при изменении поля нужно пересчитывать много данных, объединяйте логику в один серверный вызов, а не вызывайте сервер из пяти отдельных обработчиков.

Контрольные точки

Как проверить результат

Создание нового документа
Норма

Поле заполнено ожидаемым значением

Тревожный признак

Поле пустое или содержит устаревшее значение

Повторное открытие документа
Норма

Введённое пользователем значение сохраняется

Тревожный признак

Значение перезаписывается значением по умолчанию

Очистка исходного поля (например, контрагента)
Норма

Зависимое поле очищается или предлагает выбор заново

Тревожный признак

Остаётся значение, не связанное с новым контрагентом

Ввод на основании
Норма

Поля переносятся из документа-основания

Тревожный признак

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

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

Можно ли настроить автозаполнение поля без доступа к конфигуратору?

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

Чем расширение конфигурации лучше прямой доработки?

Расширение не изменяет типовые модули, а добавляет обработчики «после» или «вместо» типовых. При обновлении конфигурации расширение сохраняется и не конфликтует с новыми версиями типового кода, что резко упрощает сопровождение.

Почему обработчик ПриИзменении не срабатывает при программном заполнении?

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

Как подставить в поле текущую дату при создании документа?

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

Что делать, если автозаполнение конфликтует с типовым механизмом?

Определите, какой обработчик срабатывает последним — именно его значение останется в поле. Перенесите свою логику в более позднюю точку (например, из ПриСозданииНаСервере в конец типовой цепочки через расширение «после») либо добавьте условие, при котором типовое значение не перезаписывается.

Итог

Что важно запомнить

Простые постоянные значения заполняйте настройками и свойством «Значение заполнения», зависимые — через ПриИзменении с серверным вызовом, данные основания — в ОбработкеЗаполнения. Всегда проверяйте, новый ли это объект, очищайте зависимые поля при сбросе исходных и тестируйте доработки на копии базы, предпочитая расширения прямым изменениям типовой конфигурации.