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