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