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

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

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

Суть механизма: от объекта к запросу

Для начала проанализируем ситуацию: данные в табличной части обработки являются объектными данными, которые находятся в оперативной памяти клиента или сервера. Язык запросов 1С работает преимущественно с таблицами базы данных на стороне SQL-сервера. Чтобы «подружить» вашу табличную часть с запросом, необходимо превратить ее во внешнюю таблицу значений, а затем «закачать» ее в запрос как временную таблицу. Рассмотрим этот процесс по шагам.

Шаг 1. Подготовка структуры данных в обработке

Прежде чем писать код, убедимся, что у нас создана обработка и в ней есть табличная часть. Назовем её, например, ТоварыДляОбработки. Согласно заданию, добавим в неё два реквизита:

  1. Номенклатура (Тип: СправочникСсылка.Номенклатура)
  2. Количество (Тип: Число, длина 15, точность 3)

Важно понимать, что для корректной работы запроса данные в табличной части должны быть типизированы. Если тип будет «Любая ссылка», запрос может не отработать ожидаемым образом.

Шаг 2. Выгрузка табличной части в таблицу значений

Рассмотрим код, который выполняется на сервере. Первым делом нам нужно получить данные из экранной формы и преобразовать их в объект ТаблицаЗначений. Выясним причину, почему это важно: метод УстановитьПараметр() в запросе принимает объект ТаблицаЗначений, но не саму табличную часть напрямую.


// Получаем таблицу значений из табличной части обработки
ТаблицаДанных = Объект.ТоварыДляОбработки.Выгрузить();

Важный нюанс: Если вы создаете таблицу значений программно «с нуля», обязательно задавайте типы колонок через ОписаниеТипов. Если вы используете метод Выгрузить() из существующей табличной части, типы колонок будут унаследованы автоматически, что очень удобно.

Шаг 3. Создание запроса и использование временной таблицы

Теперь перейдем к самому интересному — помещению данных во временную таблицу. Проанализируем структуру запроса. Мы используем конструкцию ПОМЕСТИТЬ, чтобы создать временную таблицу в оперативной памяти SQL-сервера (или менеджера временных таблиц).


Запрос = Новый Запрос;
// Устанавливаем таблицу значений как параметр запроса
Запрос.УстановитьПараметр("ВнешнийИсточник", ТаблицаДанных);

Запрос.Текст = 
    "ВЫБРАТЬ
    |	ВнешнийИсточник.Номенклатура КАК Номенклатура,
    |	ВнешнийИсточник.Количество КАК Количество
    |ПОМЕСТИТЬ ВТ_ДанныеПользователя
    |ИЗ
    |	&ВнешнийИсточник КАК ВнешнийИсточник
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	ВТ_ДанныеПользователя.Номенклатура,
    |	СУММА(ВТ_ДанныеПользователя.Количество) КАК ОбщееКоличество
    |ИЗ
    |	ВТ_ДанныеПользователя КАК ВТ_ДанныеПользователя
    |ГРУППИРОВАТЬ ПО
    |	ВТ_ДанныеПользователя.Номенклатура";

РезультатЗапроса = Запрос.Выполнить();

В этом примере мы не просто создали ВТ, но и сразу показали её преимущество: с помощью второго запроса (в том же тексте) мы сгруппировали данные. Если пользователь ввел одну и ту же номенклатуру дважды, система автоматически сложит количество.

Шаг 4. Работа с Менеджером временных таблиц

Рассмотрим ситуацию, когда вам нужно использовать созданную временную таблицу не в одном запросе, а в нескольких разных процедурах. Для этого нам понадобится объект МенеджерВременныхТаблиц. Посмотрим на пример кода:


МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;

// После выполнения запроса с инструкцией ПОМЕСТИТЬ, 
// таблица ВТ_ДанныеПользователя будет «жить» внутри МенеджерВТ.
Запрос.Текст = "ВЫБРАТЬ * ПОМЕСТИТЬ ВТ_Данные ИЗ &ВнешнийИсточник КАК Источник";
Запрос.Выполнить();

// Теперь мы можем создать второй запрос и использовать ту же таблицу
ВторойЗапрос = Новый Запрос;
ВторойЗапрос.МенеджерВременныхТаблиц = МенеджерВТ;
ВторойЗапрос.Текст = "ВЫБРАТЬ * ИЗ ВТ_Данные";
Результат = ВторойЗапрос.Выполнить().Выгрузить();

Практическое применение: зачем это нужно?

Разберем, в каких реальных сценариях этот метод незаменим:

  1. Проверка остатков: Вы помещаете список товаров из обработки во временную таблицу и соединяете её (ЛЕВОЕ СОЕДИНЕНИЕ) с виртуальной таблицей остатков регистра накопления. Это позволяет одним махом проверить наличие всех товаров на складе без использования циклов.
  2. Свертка и очистка: Перед записью данных в базу удобно «схлопнуть» дублирующиеся строки и убрать строки с нулевым количеством, используя СУММА и ГДЕ Количество > 0.
  3. Обогащение данными: Вы можете быстро подтянуть цены, артикулы или другие свойства номенклатуры, соединив вашу ВТ с соответствующими справочниками или регистрами сведений.

Таким образом, использование временных таблиц превращает простую табличную часть в полноценный источник данных для аналитики. Мы рассмотрели базовый цикл: Табличная часть -> Таблица значений -> Параметр запроса -> Временная таблица. Применяйте этот подход для написания производительного и чистого кода в ваших обработках.

← На главную