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