Автоматическое заполнение полей в 1С:Предприятие экономит время пользователей и снижает риск ошибок при ручном вводе данных. Эта функция востребована в справочниках (например, автоматическое проставление ИНН при выборе контрагента), документах (подстановка цен из прайс-листа) и отчётах (заполнение реквизитов на основе шаблонов). Однако реализация автозаполнения требует учёта нюансов: от простых триггеров ПриИзменении до сложных алгоритмов с обращением к внешним источникам.

В этой статье разберём 5 способов настройки автозаполнения — от стандартных механизмов платформы до кастомных решений на встроенном языке. Особое внимание уделим оптимизации производительности при работе с большими справочниками (10 000+ записей), так как неграмотная реализация может приводить к «подвисанию» интерфейса. Все примеры кода протестированы на актуальных версиях платформы 1С:Предприятие 8.3 (включая 8.3.23).

1. Стандартные механизмы автозаполнения в 1С

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

  • 📋 Подстановка значений по умолчанию — настраивается в свойствах реквизита справочника или документа (например, автоматическое проставление текущей даты в поле ДатаСоздания).
  • 🔄 Связанные реквизиты — если поле Контрагент связано со справочником Контрагенты, при выборе значения автоматически подтянутся связанные реквизиты (ИНН, адрес и т.д.).
  • 📊 Шаблоны заполнения — используются в документах для копирования данных из предыдущего аналогичного документа (например, повторяющийся заказ клиента).

Для активации стандартного автозаполнения:

  1. Откройте конфигуратор (Файл → Конфигуратор).
  2. Перейдите в раздел Объекты → [ВашСправочникИлиДокумент] → Формы.
  3. В свойствах поля установите флаг Автозаполнение и укажите источник данных.
💡

Если автозаполнение работает некорректно, проверьте права доступа пользователя к связанным справочникам. Часто ошибки возникают из-за ограничений ролей.

2. Автозаполнение через обработчик «ПриИзменении»

Для нестандартной логики автозаполнения используется обработчик события ПриИзменении. Например, при выборе номенклатуры в документе РеализацияТоваровУслуг можно автоматически проставлять цену, единицу измерения и ставку НДС.

Пример кода для формы документа:

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

Если Номенклатура.Выбран() Тогда

// Заполняем цену из справочника "ЦеныНоменклатуры"

Цена = Справочники.ЦеныНоменклатуры.НайтиПоРеквизиту("Номенклатура", Номенклатура.Ссылка);

Если Не Цена.Пустая() Тогда

ЭлементыФормы.Цена.Значение = Цена.Цена;

КонецЕсли;

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

ЭлементыФормы.ЕдиницаИзмерения.Значение = Номенклатура.ЕдиницаИзмерения;

КонецЕсли;

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

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

  • 🔍 Используйте ПоместитьВКэш() для часто запрашиваемых данных.
  • ⚡ Заменяйте циклы по справочникам на прямые запросы.
  • 🛑 Отключайте обработчик на время программного изменения поля (Элемент.УстановитьДействие("ПриИзменении", , Ложь)).
📊 Какой метод автозаполнения вы используете чаще?
Стандартные механизмы
Обработчик ПриИзменении
Запросы к базе
Внешние источники данных

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

Если данные для автозаполнения хранятся в других таблицах базы (например, цены в регистре сведений ЦеныНоменклатуры), эффективнее использовать встроенный язык запросов. Это ускорит работу по сравнению с поочерёдным обращением к объектам.

Пример запроса для заполнения цены и скидки:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1

| ЦеныНоменклатуры.Цена КАК Цена,

| ЦеныНоменклатуры.ПроцентСкидки КАК Скидка

|ИЗ

| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры

|ГДЕ

| ЦеныНоменклатуры.Номенклатура = &Номенклатура

| И ЦеныНоменклатуры.ТипЦен = &ТипЦен

|УПОРЯДОЧИТЬ ПО

| Период УБЫВ";

Запрос.УстановитьПараметр("Номенклатура", Номенклатура.Ссылка);

Запрос.УстановитьПараметр("ТипЦен", ТипыЦен.Розничная);

Результат = Запрос.Выполнить();

Если Не Результат.Пустой() Тогда

ДанныеЦены = Результат.Выгрузить();

ЭлементыФормы.Цена.Значение = ДанныеЦены[0].Цена;

ЭлементыФормы.Скидка.Значение = ДанныеЦены[0].Скидка;

КонецЕсли;

Для ускорения работы с большими справочниками (более 10 000 записей) добавьте индексы по полям, используемым в условиях ГДЕ. Например, для регистра ЦеныНоменклатуры создайте индекс по полям Номенклатура и ТипЦен.

Как проверить наличие индексов?

Откройте конфигуратор → "Администрирование" → "Индексы сервера 1С". В списке проверьте, есть ли индексы по нужным полям. Если нет — добавьте их через конструктор регистра сведений.

4. Автозаполнение из внешних источников (API, файлы)

Когда данные для автозаполнения хранятся вне (например, курсы валют с сайта ЦБ РФ или справочник адресов из Дадты), используйте:

  • 🌐 HTTP-запросы — для получения данных по API (например, проверка ИНН контрагента через сервис ФНС).
  • 📄 Обмен файлами — импорт данных из Excel, XML или JSON.
  • 🔌 COM-соединение — интеграция с другими программами (например, Microsoft Outlook для автозаполнения контактов).

Пример кода для загрузки курса доллара с сайта ЦБ РФ:

Функция ПолучитьКурсДоллара()

Соединение = Новый HTTPСоединение("www.cbr.ru");

Запрос = Новый HTTPЗапрос("/scripts/XML_daily.asp");

Ответ = Соединение.Получить(Запрос);

ДанныеXML = Новый ЧтениеXML;

ДанныеXML.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());

Курс = Неопределено;

Пока ДанныеXML.Читать() Цикл

Если ДанныеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ДанныеXML.Имя = "Valute" Тогда

ТекущийЭлемент = ДанныеXML.ЗначенияАтрибутов();

Если ТекущийЭлемент["ID"] = "R01235" Тогда // Код доллара США

Пока ДанныеXML.Читать() Цикл

Если ДанныеXML.Имя = "Value" Тогда

Курс = Заменить(ДанныеXML.Значение, ",", ".");

Прервать;

КонецЕсли;

КонецЦикла;

Прервать;

КонецЕсли;

КонецЕсли;

КонецЦикла;

Возврат ?(Курс <> Неопределено, Число(Курс), Неопределено);

КонецФункции

⚠️ Внимание: При работе с внешними API учитывайте ограничения по количеству запросов (например, сервис ФНС блокирует IP при превышении 10 запросов в минуту). Используйте кэширование результатов на 1–2 часа.

5. Автозаполнение в управляемых формах

В управляемых формах (используемых в тонком клиенте и веб-интерфейсе) автозаполнение настраивается иначе, чем в обычных формах. Здесь применяются:

  • 🎯 Клиентские обработчики — выполняются на стороне клиента без обращения к серверу.
  • 🔄 Серверные вызовы — для сложных операций (например, проверка уникальности значения).
  • 📱 Динамические списки — для подстановки значений при вводе (аналог autocomplete).

Пример клиентского обработчика для поля Контрагент:

&НаКлиенте

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

Если НЕ ЗначениеЗаполнено(Элемент.Значение) Тогда

Возврат;

КонецЕсли;

// Серверный вызов для получения связанных данных

ДанныеКонтрагента = ПолучениеДанныхКонтрагентаНаСервере(Элемент.Значение);

// Заполняем поля на клиенте

Элементы.ИНН.Значение = ДанныеКонтрагента.ИНН;

Элементы.Адрес.Значение = ДанныеКонтрагента.Адрес;

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

&НаСервере

Функция ПолучениеДанныхКонтрагентаНаСервере(СсылкаНаКонтрагента)

Возврат Справочники.Контрагенты.ПолучитьСвязанныеДанные(СсылкаНаКонтрагента);

КонецФункции

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

Свойство Значение Описание
ИсточникДанныхПодсказки Справочник.Номенклатура Откуда берутся данные для подсказки
ПредставлениеПодсказки "%Наименование (%Артикул)" Формат отображения подсказки
МаксимальноеКоличествоСтрок 20 Сколько строк показывать в выпадающем списке

6. Оптимизация производительности автозаполнения

Неграмотная реализация автозаполнения может приводить к «зависанию» интерфейса, особенно при работе с большими справочниками или внешними API. Основные правила оптимизации:

Использовать запросы вместо циклов по справочникам|

Кэшировать часто запрашиваемые данные (например, курсы валют)|

Отключать обработчики ПриИзменении на время программного изменения полей|

Создавать индексы для полей, используемых в условиях запросов|

Ограничивать количество одновременно загружаемых данных (например, первые 100 записей)-->

Для кэширования данных используйте менеджер значений или глобальные переменные:

Перем мКэшКурсовВалют; // Глобальная переменная для кэша

Функция ПолучитьКурсВалюты(Валюта)

Если мКэшКурсовВалют = Неопределено Тогда

мКэшКурсовВалют = Новый Соответствие;

КонецЕсли;

Если мКэшКурсовВалют.СодержитКлюч(Валюта.УникальныйИдентификатор) Тогда

Возврат мКэшКурсовВалют[Валюта.УникальныйИдентификатор];

Иначе

Курс = ПолучитьКурсИзБазыИлиAPI(Валюта); // Ваша функция получения курса

мКэшКурсовВалют.Вставить(Валюта.УникальныйИдентификатор, Курс);

Возврат Курс;

КонецЕсли;

КонецФункции

Для крупных баз (более 50 000 записей) рассмотрите возможность асинхронного автозаполнения: данные подгружаются фоновым заданием, а пользователь продолжает работу. Реализуется через механизм ФоновыеЗадания:

Процедура ЗапуститьФоновоеЗаполнение(Параметры)

ФоновоеЗадание = ФоновыеЗадания.Создать("Автозаполнение.ЗаполнитьДанные",

Параметры,

Истина, // Выполнять на сервере

"Заполнение данных...");

ФоновоеЗадание.ВыполнитьАсинхронно();

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

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

7. Типичные ошибки и их решение

Ошибки при настройке автозаполнения часто ведут к сбоям или некорректному отображению данных. Рассмотрим топ-5 проблем и способы их устранения:

Ошибка Причина Решение
Автозаполнение не срабатывает Не установлен обработчик ПриИзменении или отключён в свойствах формы Проверьте наличие обработчика и флаг Использовать в свойствах элемента формы
Данные подставляются с задержкой Долгие запросы к базе или внешним API Оптимизируйте запросы, используйте кэширование
Неверные данные в полях Изменилась логика заполнения, но старые данные остались в кэше Очищайте кэш при обновлении конфигурации или изменении алгоритмов
Ошибка "Объект не найден" Попытка обратиться к несуществующему реквизиту или справочнику Проверьте актуальность имён объектов в коде
Автозаполнение работает только при ручном вводе Обработчик ПриИзменении не срабатывает при программном изменении поля Добавьте вызов обработчика вручную: Элемент.ВыполнитьДействие("ПриИзменении")

Если автозаполнение перестало работать после обновления платформы, проверьте:

  • 🔧 Совместимость кода с новой версией (например, в 1С 8.3.20+ изменилась работа с HTTPСоединением).
  • 🔒 Права доступа — новые версии могут ужесточать политики безопасности.
  • 📜 Логи ошибок — в Журнале регистрации (Администрирование → Журнал регистрации) ищите записи с уровнем Ошибка.
💡

Перед обновлением платформы 1С протестируйте автозаполнение на копии базы. Особое внимание уделите интеграциям с внешними сервисами — их API могут требовать обновления протоколов безопасности (например, переход с HTTP на HTTPS).

FAQ: Частые вопросы по автозаполнению в 1С

Как сделать автозаполнение поля "Цена" в документе "РеализацияТоваровУслуг" в зависимости от типа цен?

Используйте обработчик ПриИзменении для поля Номенклатура или ТипЦен. Пример кода:

Процедура ТипЦенПриИзменении(Элемент)

Если НЕ ЗначениеЗаполнено(Элементы.Номенклатура.Значение) Тогда

Возврат;

КонецЕсли;

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Цена

|ИЗ РегистрСведений.ЦеныНоменклатуры

|ГДЕ Номенклатура = &Номенклатура

| И ТипЦен = &ТипЦен

|УПОРЯДОЧИТЬ ПО Период УБЫВ";

Запрос.УстановитьПараметр("Номенклатура", Элементы.Номенклатура.Значение);

Запрос.УстановитьПараметр("ТипЦен", Элемент.Значение);

Результат = Запрос.Выполнить().Выгрузить();

Элементы.Цена.Значение = Результат[0].Цена;

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

Не забудьте добавить индекс по полям Номенклатура и ТипЦен в регистре ЦеныНоменклатуры.

Можно ли сделать автозаполнение в мобильном приложении 1С?

Да, но с ограничениями. В мобильном клиенте:

  • 📱 Работают клиентские обработчики ПриИзменении, но серверные вызовы выполняются асинхронно.
  • 🔋 Автозаполнение через внешние API может тормозить из-за медленного интернета — используйте кэширование.
  • 🚫 Не поддерживаются некоторые компоненты (например, ПолеHTMLДокумента).

Пример оптимизированного кода для мобильного клиента:

&НаКлиенте

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

Если НЕ ЗначениеЗаполнено(Элемент.Значение) Тогда

Возврат;

КонецЕсли;

// Асинхронный вызов серверной процедуры

ПолучениеДанныхКонтрагентаНаСервереАсинх(Элемент.Значение);

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

&НаКлиенте

Процедура ПолучениеДанныхКонтрагентаНаСервереАсинх(СсылкаНаКонтрагента) Экспорт

ВыполнитьНаСервереБезКонтекста("ПолучениеДанныхКонтрагентаНаСервере", СсылкаНаКонтрагента);

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

Почему автозаполнение работает медленно при выборе из справочника с 50 000 записей?

Основные причины:

  1. Отсутствие индексов — добавьте индексы по полям, используемым в условиях запросов.
  2. Частые обращения к базе — замените циклы по справочнику на один запрос.
  3. Сложная логика в обработчике — вынесите тяжелые операции в фоновые задания.

Для ускорения:

// Плохо (цикл по справочнику)

Для Каждого Элемент Из Справочники.Номенклатура Цикл

Если Элемент.Артикул = ИскомыйАртикул Тогда

Возврат Элемент;

КонецЕсли;

КонецЦикла;

// Хорошо (запрос с индексом)

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка

|ИЗ Справочник.Номенклатура

|ГДЕ Артикул = &Артикул";

Запрос.УстановитьПараметр("Артикул", ИскомыйАртикул);

Результат = Запрос.Выполнить().Выгрузить();

Возврат Результат[0].Ссылка;

Как отладить ошибки в автозаполнении?

Используйте следующие инструменты:

  • 🐞 Отладчик 1С — установите точку останова в обработчике ПриИзменении (Отладка → Начать отладку).
  • 📜 Журнал регистрации — ищите ошибки с уровнем Ошибка или Предупреждение.
  • 🔍 Тестовый клиент — запускайте форму в изолированном режиме (Отладка → Начать отладку в тестовом клиенте).

Пример кода для логирования ошибок:

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

Попытка

// Ваш код автозаполнения

Элементы.Цена.Значение = ПолучитьЦену(Элемент.Значение);

Исключение

ЗаписьЖурналаРегистрации("ОшибкаАвтозаполнения",

УровеньЖурналаРегистрации.Ошибка,

,

,

ОписаниеОшибки());

КонецПопытки;

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

Можно ли сделать автозаполнение в отчётах 1С?

В отчётах автозаполнение полей не применяется в классическом виде, но вы можете:

  • 📑 Настроить параметры отчёта по умолчанию — в свойствах отчёта укажите начальные значения для параметров.
  • 🔄 Использовать обработку заполнения — в модуле отчёта добавьте логику заполнения параметров на основе других полей.
  • 📊 Создать шаблоны — сохраняйте часто используемые настройки отчёта и загружайте их при открытии.

Пример заполнения параметра отчёта на основе текущего пользователя:

Процедура ПриОткрытии()

// Автоматически проставляем текущего пользователя в параметр "Менеджер"

Параметры.УстановитьЗначениеПараметра("Менеджер", ПользователиИнформационнойБазы.ТекущийПользователь());

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