Как объединить две таблицы значений в одну в 1С?

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

Часто в процессе разработки на платформе 1С возникает задача объединения данных из двух разных таблиц (например, табличной части документа и результатов расчета остатков) в одну итоговую таблицу для вывода на форму или формирования отчета. Многие начинающие разработчики сталкиваются с тем, что при последовательном использовании метода Загрузить() вторая таблица просто заменяет первую, так как этот метод полностью очищает содержимое таблицы-приемника перед вставкой новых данных. Рассмотрим, как правильно решить эту задачу.

Метод 1: Построчное копирование с использованием цикла

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

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

Разберем процесс по шагам:

  1. Инициализируем результирующую таблицу (если она еще не заполнена).
  2. Организуем цикл обхода по строкам таблицы с остатками.
  3. Внутри цикла добавляем новую строку в таблицу-приемник.
  4. Копируем данные методом ЗаполнитьЗначенияСвойств.

Для каждого Стр Из ТаблицаОстатков Цикл
    НоваяСтрока = Объект.Результат.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
КонецЦикла;

Этот подход удобен своей простотой и отсутствием необходимости сложной настройки запросов, однако помните, что все операции должны выполняться на сервере, чтобы избежать лишних обращений к клиентскому контексту.

Метод 2: Объединение через язык запросов 1С

Когда речь идет о больших объемах данных или необходимости выполнения сложных манипуляций (фильтрация, отбор, соединение), лучшим решением будет использование встроенного языка запросов 1С. Запрос позволяет выполнить объединение на стороне СУБД, что значительно быстрее, чем обработка данных циклом в коде 1С.

Чтобы объединить две имеющиеся в памяти таблицы, мы сначала передаем их в запрос в качестве параметров, затем помещаем во временные таблицы с помощью ключевого слова ПОМЕСТИТЬ, а в конце выполняем оператор ОБЪЕДИНИТЬ или ОБЪЕДИНИТЬ ВСЕ.

Рассмотрим пример реализации:


Запрос = Новый Запрос;
Запрос.Параметры.Вставить("ТаблицаДокумент", Объект.ТаблицаДокументов.Выгрузить());
Запрос.Параметры.Вставить("ТаблицаОстатки", Объект.ТаблицаОстатков.Выгрузить());

Запрос.Текст =
"ВЫБРАТЬ * ПОМЕСТИТЬ втДокумент ИЗ &ТаблицаДокумент КАК Док;
|ВЫБРАТЬ * ПОМЕСТИТЬ втОстатки ИЗ &ТаблицаОстатки КАК Ост;
|
|ВЫБРАТЬ * ИЗ втДокумент
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ * ИЗ втОстатки";

Объект.Результат.Загрузить(Запрос.Выполнить().Выгрузить());

Важные замечания по использованию запросов:

Подводим итоги

Мы выяснили, почему метод Загрузить() не подходит для прямого объединения — он стирает текущие данные. Для достижения цели мы рассмотрели два надежных способа: простой перебор в цикле и мощный инструмент объединения через запросы. Выбирайте первый вариант для простых задач с малым количеством записей, а для серьезных, нагруженных бизнес-логикой процессов, используйте запросы — это стандарт индустрии разработки на 1С.

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

← На главную