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

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

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

Подготовка к реализации

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

Способ №1: Метод «Загрузить/Выгрузить»

Этот метод является наиболее простым и быстрым в реализации, если структуры табличных частей справочника и документа идентичны (имена колонок совпадают). Мы используем возможности объекта ТаблицаЗначений для прямого копирования данных.

Разберем реализацию этого метода по шагам:

  1. Создаем обработчик события ПриИзменении для поля выбора справочника в форме документа.
  2. В серверной процедуре получаем объект справочника.
  3. Выгружаем данные из табличной части справочника в переменную.
  4. Загружаем полученные данные в табличную часть документа.

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


&НаСервере
Процедура Справочник1ПриИзмененииНаСервере()
    // Получаем данные из табличной части справочника
    ТЗ = Объект.СправочникСсылка.ТабличнаяЧасть1.Выгрузить();
    
    // Загружаем данные в табличную часть документа
    Объект.ТабличнаяЧасть1.Загрузить(ТЗ);
КонецПроцедуры

Важное примечание: Метод Загрузить() полностью очищает текущее содержимое табличной части документа перед вставкой новых строк. Если вам нужно не заменять, а дополнять данные, этот метод не подойдет.

Способ №2: Использование запроса для гибкого переноса

В реальных задачах структура таблиц часто различается, или требуется дополнительная фильтрация данных. В таких случаях использование объекта Запрос является профессиональным и наиболее надежным подходом.

Рассмотрим алгоритм действий при использовании запроса:

  1. Инициализируем объект Запрос.
  2. Составляем текст запроса, выбирая только необходимые поля из табличной части справочника.
  3. Устанавливаем параметры запроса (ссылку на выбранный справочник).
  4. Выполняем запрос и обходим результат выборки в цикле.
  5. Внутри цикла создаем новую строку в табличной части документа и заполняем её свойства.

Пример реализации с использованием Запрос:


&НаСервере
Процедура Справочник1ПриИзмененииНаСервере()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Справочник1ТабличнаяЧасть1.Реквизит1 КАК Реквизит1,
        |	Справочник1ТабличнаяЧасть1.Реквизит2 КАК Реквизит2
        |ИЗ
        |	Справочник.Справочник1.ТабличнаяЧасть1 КАК Справочник1ТабличнаяЧасть1
        |ГДЕ
        |	Справочник1ТабличнаяЧасть1.Ссылка = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", Объект.СправочникСсылка);
    
    Результат = Запрос.Выполнить();
    
    Если Не Результат.Пустой() Тогда
        // Очищаем табличную часть перед заполнением
        Объект.ТабличнаяЧасть1.Очистить();
        
        Выборка = Результат.Выбрать();
        
        Пока Выборка.Следующий() Цикл
            НоваяСтрока = Объект.ТабличнаяЧасть1.Добавить();
            // Метод для автоматического переноса данных между строками
            ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

Почему использование ЗаполнитьЗначенияСвойств() — это лучший выбор?

Метод ЗаполнитьЗначенияСвойств() является стандартным инструментом платформы 1С. Он автоматически сопоставляет значения по именам полей: берет значение из источника (в нашем случае — Выборка) и присваивает его полю с таким же именем в приемнике (НоваяСтрока). Это избавляет от необходимости писать длинные конструкции вида НоваяСтрока.Реквизит = Выборка.Реквизит для каждого отдельного поля, что значительно уменьшает вероятность ошибок при разработке.

Рекомендации по оптимизации

При работе с большими табличными частями всегда старайтесь очищать табличную часть документа перед заполнением методом Объект.ИмяТабличнойЧасти.Очистить(), если только бизнес-логика не подразумевает иного. Также помните, что все манипуляции с данными должны проходить проверку на пустоту результата запроса, как показано в примерах, чтобы избежать ошибок при обработке пустых справочников.

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

← На главную