Содержание:
2. Интеграция таблицы значений в запросы 1С через временную таблицу
3. Использование ПостроителяЗапроса для динамического формирования запросов в системе 1С
В платформе 1С: Предприятие 8.3 нередко встречается задача использовать ТаблицуЗначений как источник данных для запросов. Подобный подход позволяет сократить количество явных циклов в коде и повысить быстродействие за счёт оптимизации на стороне сервера СУБД. В этой инструкции поэтапно разберёмся, как сформировать, передать и использовать таблицу значений в запросах 1С.
1. Руководство по созданию и заполнению таблицы значений в 1С для передачи данных в запросы
1. Формирование ТаблицыЗначений и определение колонок
2. Создаём экземпляр таблицы
МояТЗ = Новый ТаблицаЗначений;
3. Описываем структуру столбцов
Обязательно указывать типы данных, чтобы избежать неявных преобразований при выполнении запросов:
МояТЗ.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
МояТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
4. Заполняем строки значениями
НоваяСтрока = МояТЗ.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("0001");
НоваяСтрока.Количество = 10;
При необходимости можно добавить несколько строк в цикле или выборкой из другого источника.
5. Передача таблицы значений в запрос через временную таблицу
2. Интеграция таблицы значений в запросы 1С через временную таблицу
Чтобы обращаться к данным ТЗ из текста запроса, её передают во временную таблицу внутри контекста запроса:
1. Создаём объект запроса и менеджер временных таблиц
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
2. Пишем SQL-текст для помещения данных
Запрос.Текст =
"ВЫБРАТЬ
*
ПОМЕСТИТЬ ВТ_МояТЗ
ИЗ
&ТЗ КАК ТЗ";
3. Привязываем параметр и выполняем
Запрос.УстановитьПараметр("ТЗ", МояТЗ);
РезультатПломещения = Запрос.Выполнить();
После этого во внутреннем хранилище запроса появится временная таблица ВТ_МояТЗ.
4. Объединение временной таблицы с регистрами или справочниками
Теперь можно строить основной запрос, используя ранее созданную ВТ_МояТЗ:
Запрос.Текст =
"ВЫБРАТЬ
ВТ_МояТЗ.Номенклатура КАК Товар,
Остатки.КоличествоОстаток КАК Остаток
ИЗ
ВТ_МояТЗ КАК ВТ_МояТЗ
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрНакопления.ТоварыНаСкладах.Остатки() КАК Остатки
ПО
ВТ_МояТЗ.Номенклатура = Остатки.Номенклатура";
Результат = Запрос.Выполнить().Выбрать();
В результате мы получим набор строк с товаром из таблицы значений и соответствующими остатками по складам.
5. Прямое использование ТаблицыЗначений в конструкторе запросов
3. Использование ПостроителяЗапроса для динамического формирования запросов в системе 1С
Вместо текстового SQL можно воспользоваться объектом-помощником ПостроительЗапроса:
1. Инициализация построителя
ПострЗап = Новый ПостроительЗапроса;
2. Указываем источник данных как таблицу значений
ПострЗап.ИсточникДанных = Новый ОписаниеИсточникаДанных(МояТЗ);
3. Задаём условие отбора
Отбор = ПострЗап.Отбор.Добавить("Номенклатура");
Отбор.Значение = Справочники.Номенклатура.НайтиПоКоду("0001");
Отбор.ВидСравнения = ВидСравнения.Равно;
Отбор.Использование = Истина;
4. Выполняем и выгружаем результат
ПострЗап.Выполнить();
Результат = ПострЗап.Результат.Выгрузить();
Такой приём особенно удобен для динамического построения сложных фильтров без ручного конструирования текста.
Полезные советы и рекомендации
- Явное указание типов столбцов убережёт от ошибок при сравнении или агрегации данных разных типов.
- Избегайте больших объёмов в ТаблицеЗначений, если данных слишком много — лучше загрузить их в обычную базовую таблицу или регистр.
- Именуйте временные таблицы осмысленно, чтобы в сложных запросах не запутаться в алиасах.
- Закрывайте соединение с запросом, если вы создаёте и уничтожаете объекты в цикле, чтобы не расходовать память.
С помощью описанных приёмов вы сможете гибко и быстро обрабатывать наборы данных, используя встроенные возможности платформы 1С: Предприятие 8.3.
Специалист компании ООО "Кодерлайн"
Дмитрий Коваль