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