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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке конфигураций на платформе «1С:Предприятие 8» одной из приоритетных задач является минимизация рутинных действий пользователя. Автоматизация заполнения полей не только ускоряет работу, но и предотвращает ошибки ввода, обеспечивая единообразие данных в системе. В данной статье мы подробно разберем, как реализовать автоматическое формирование наименования элемента справочника и как настроить подстановку зависимых реквизитов в табличных частях.

Автозаполнение наименования по шаблону: номер и дата

Рассмотрим классическую задачу: в справочнике «Договоры» необходимо, чтобы поле Наименование формировалось автоматически по шаблону: «№ [НомерДоговора] от [ДатаДоговора]». Существует два основных подхода к решению этой задачи, и выбор зависит от того, когда именно пользователь должен увидеть результат.

Вариант 1. Использование события ПриИзменении на форме

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

Разберем алгоритм по шагам:

  1. Откроем форму элемента справочника в конфигураторе.
  2. Для реквизитов НомерДоговора и ДатаДоговора в палитре свойств создадим события ПриИзменении.
  3. В модуле формы опишем логику формирования строки.

Проанализируем пример кода:


&НаКлиенте
Процедура НомерДоговораПриИзменении(Элемент)
    СформироватьНаименование();
КонецПроцедуры

&НаКлиенте
Процедура ДатаДоговораПриИзменении(Элемент)
    СформироватьНаименование();
КонецПроцедуры

&НаКлиенте
Процедура СформироватьНаименование()
    // Используем функцию Формат для приведения даты к понятному виду
    // ДЛФ=Д означает длинный локальный формат даты (без времени)
    ТекстДаты = Формат(Объект.ДатаДоговора, "ДЛФ=Д");
    
    // Склеиваем строки, используя СокрЛП для удаления лишних пробелов в номере
    Объект.Наименование = "№ " + СокрЛП(Объект.НомерДоговора) + " от " + ТекстДаты;
КонецПроцедуры

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

Вариант 2. Реализация в модуле объекта через ПередЗаписью

Этот метод считается более профессиональным и надежным, так как он гарантирует заполнение наименования даже в том случае, если данные загружаются программно или через внешние обработки, минуя форму. Однако пользователь увидит результат только после нажатия кнопки «Записать».

Рассмотрим пример кода в модуле объекта:


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

    // Автоматическое формирование наименования
    ТекстДаты = Формат(ДатаДоговора, "ДЛФ=Д");
    Наименование = "№ " + СокрЛП(НомерДоговора) + " от " + ТекстДаты;
КонецПроцедуры

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

Автозаполнение единиц измерения в табличной части

Другой частый вопрос касается работы с табличными частями (ТЧ), например, в документе «Продажа товаров». При выборе товара в строке ТЧ необходимо, чтобы ЕдиницаИзмерения подставлялась автоматически из карточки этого товара. Это критически важно для предотвращения ошибок в учете.

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

Разберем логику работы с ТекущимиДанными:


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

&НаСервереБезКонтекста
Функция ПолучитьЕдиницуИзмеренияНаСервере(СсылкаНаТовар)
    Возврат СсылкаНаТовар.ЕдиницаИзмерения;
КонецФункции

Обратите внимание на использование &НаСервереБезКонтекста. Это оптимизирует работу системы, так как на сервер передается только ссылка на товар, а не вся форма целиком. Платформа 1С эффективно кэширует обращения к реквизитам через точку, что обеспечивает высокую скорость работы даже при больших объемах данных.

Анализ типичных ошибок новичков

В процессе разработки начинающие специалисты часто сталкиваются с ошибками, которые могут поставить в тупик. Выясним основные причины их возникновения:

  1. Смешивание понятий «Имя» и «Синоним». Система 1С работает только с Именами, заданными в конфигураторе. Например, если вы назвали табличную часть в конфигураторе Товары, а пользователь видит заголовок «Список продукции», в коде нужно использовать именно Товары. Ошибка «Поле объекта не обнаружено» чаще всего связана именно с обращением к синониму вместо имени.
  2. Объект против Элементов. В модуле управляемой формы Объект — это данные документа, а Элементы — это визуальное представление на экране. Если вам нужно изменить значение (цену, наименование), работайте с Объект. Если нужно скрыть колонку или сделать ее недоступной — с Элементы.
  3. Типизация данных. При сложении строк (конкатенации) важно убедиться, что все слагаемые являются строками. Например, нельзя просто прибавить дату к строке — возникнет ошибка преобразования типов. Всегда используйте функцию Формат() или Строка() для нетекстовых данных.

Оптимизация пользовательского интерфейса

Чтобы сделать работу пользователя максимально комфортной, рассмотрим дополнительные возможности настройки полей:

Для поля Наименование, которое заполняется автоматически, рекомендуется установить свойство Только чтение на форме. Это даст пользователю понять, что поле формируется системой и его не нужно заполнять вручную. Если же регламент компании допускает исключения, можно добавить рядом кнопку «Разблокировать», которая будет программно менять свойство ТолькоЧтение.

Также не забывайте про событие ПриКопировании в модуле объекта. Когда пользователь копирует существующий договор, 1С по умолчанию копирует и старое наименование. Чтобы избежать путаницы, в этом обработчике можно либо очищать наименование, либо вызывать процедуру его пересчета с учетом новых данных.

Используя приведенные примеры и рекомендации, вы сможете создавать гибкие и надежные механизмы автоматизации, которые сделают работу в системе 1С интуитивно понятной и эффективной.

← На главную