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

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

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

Решение задачи через модуль объекта

Наиболее эффективным и простым способом реализации данной логики является использование событийного программирования в модуле объекта. Мы воспользуемся обработчиком ПередЗаписью. Это позволит системе «подтягивать» данные из справочника непосредственно в момент совершения операции записи.

Для реализации этой задачи проделаем следующие шаги:

  1. Откройте конфигуратор вашей базы данных 1С.
  2. Найдите нужный документ в дереве конфигурации.
  3. Откройте «Модуль объекта» этого документа.
  4. Вставьте приведенный ниже код в процедуру ПередЗаписью.

Разберем логику нашего кода. Нам важно, чтобы заполнение происходило только в том случае, если реквизит еще пуст, иначе мы рискуем перезаписать данные, которые пользователь мог внести вручную:


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

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

Почему этот метод эффективен?

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

Дополнительные рекомендации по оптимизации

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

1. Групповые операции: Если вы планируете заполнять данными тысячи документов за один раз, помните, что обращение к реквизитам через точку в цикле вызывает множественные запросы к СУБД. В таких случаях лучше использовать механизм запросов для предварительного получения данных всех водителей и их подстановки в документы через МенеджерОбъекта.

2. Место вызова логики: Подумайте, нужно ли вам это именно в ПередЗаписью. Если вы загружаете данные из внешних файлов (Excel, JSON, XML), правильнее выполнять заполнение в ОбработкаЗаполнения или непосредственно в алгоритме загрузки. Это позволит избежать лишних вызовов кода при обычном редактировании документов пользователем.

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

Используя данный подход, вы сможете значительно сократить время на рутинную работу и повысить точность данных в системе!

← На главную