Таблица значений как параметр запроса
Перейти к содержимому

Таблица значений как параметр запроса

  • автор:

Таблица значений как параметр запроса

Не могу передать таблицу значений расположенную на форме обработки в запрос параметром. Нужно предварительно её куда то перегрузить?

(0) ну показывай, что ли, что уже сделал
типизировать нужно
Код в студию и дальше будем думать.
МВТ объявил?
(2) скорее всего, конечно, да, но хочется всё-таки посмотреть, что автор уже наваял

(0) Нет.
Нужно предварительно написать по собственному желанию и не заниматься больше 1С. Никогда.

Дайте пожалуйста контакты вашего руководителя, я хочу написать ему письмо.

(6) Ты жесток..

(7) Я.
Жесток автор, который занимается 8-ой уже 3 . года и задает вопросы, вот такие
http://www.forum.mista.ru/index.php?user_id=6293

Жесток, бессмысленен и беспощаден.
К пользователям, руководителям и самому себе.

А потом говорят «Ваша 1 гамно».

(6) + 1 адский прогер задаёт постоянно сильнейшие вопросы.
(7) ни чуть, я боюсь за пользователей, которые потом пользуются его наработками.

(9) «которые потом пользуются его наработками» — вот бы посмотреть, что здесь начнется.
набросились окаянные. может человек консультант, а дядька заставляет прогать ещё
(11) 3 года.
Атъ и Израелъ.
(12) 8 лет — уже из Израеля
(11) за 8 лет уж и консультанту как-то не по консультански
на фото ведь видно, как он с пользователями общается.
(2) что нужно типизировать?

Процедура КоманднаяПанель2ВывестиТаблицу(Кнопка)
Запрос = Новый Запрос;
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст ;
Запрос.УстановитьПараметр(«Данные»,Контрагенты);
Рез = Запрос.Выполнить();
Если Не Рез.Пустой() Тогда
Выборка = Рез.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Контрагент);
КонецЦикла;
КонецЕсли;
КонецПроцедуры

ТЗ = ТЗизФормы.Выгрузить();
ЗапросКбазеДанных.УстановитьПараметр(«ТЗ», ТЗ);
(21) то есть так можно делать не используя менеджер временных таблиц?

естественно необходимо использовать временные таблицы

ЗапросКбазеДанных = Новый Запрос;
МенеджерТаблицыДанных = ЗапросКбазеДанных.МенеджерВременныхТаблиц;
ЗапросКбазеДанных.МенеджерВременныхТаблиц = МенеджерТаблицыДанных;
ЗапросКбазеДанных.Текст ;
ТЗ = ТЗизФормы.Выгрузить();
ЗапросКбазеДанных.УстановитьПараметр(«ТЗ», ТЗ);

(23) можно и без них

Запрос = Новый Запрос;
Запрос.Текст ;
Запрос.УстановитьПараметр(«Тз», Контрагенты.ВыгрузитьКолонку(«Контрагент»));
Рез = Запрос.Выполнить();
Если Не Рез.Пустой() Тогда
Выборка = Рез.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(«Без использования менеджера временных таблиц: » + Выборка.Ссылка);
КонецЦикла;
КонецЕсли;

(23) а вот это не работает ТЗ = ТЗизФормы.Выгрузить();
нет такого метода у таблицы значений в 1с 8.2, это вы из 7.7 ?

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

Если при использовании в запросе таблицы значений, возникает ошибка: «Тип не может быть выбран в запросе», то нужно явно указать Тип значения колонок ТЗ!
Т.е. если мы используем таблицу значений, так же в свою очередь выгруженную из результата запроса или из табличной части документа например — то такой проблемы не возникает, т.к. в таком случае колонки будут типизированными. А если мы сами создаем таблицу значений, то нужно явно указать тип для каждой колонки:
Код 1C v 8.х

 ТЗ = Новый ТаблицаЗначений; 
ТЗ.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));

Аренда 1С в облаке

Запрос к Таблице Значений

Передать в запрос 1С 8.3 таблицу значений

Анна Викулина

Большинство разработчиков 1С знают, что выполнение запроса в цикле крайне нежелательно из-за множественных серверных вызовов базы данных. Однако далеко не все из них понимают, как избежать использования этой неоптимальной конструкции. А помочь в этом разработчикам может использование таблиц значений в качестве параметра запроса 1С. Поняв суть этого решения, программист 1С никогда больше не вернется к выполнению запросов в цикле.

Пример передачи таблицы в запрос

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

Получить ТЗ в 1С можно 2 способами:

  • Выгрузить в нужный тип данных информацию;
  • Программно создать внешнюю таблицу значений и заполнить ее, загрузив данные из файлов или вручную. Учтите, что при создании таблицы значений придется типизировать ее колонки с помощью описания типов.
 ТаблицаАвтомобилей = Новый ТаблицаЗначений; ТаблицаАвтомобилей.Колонки.Добавить("Автомобиль", Новый ОписаниеТипов("СправочникСсылка.АвтомобилиКомпании")); 

Чтобы поместить описанную таблицу в запрос, придется загрузить ее сначала во временную таблицу, а уже потом соединять с нужными данными. Это правило работы платформы, и если проигнорировать его, то при работе кода 1С выдаст ошибку. Если система сообщает, что данные могут быть выбраны исключительно во временную таблицу, то проверяйте, помещаете ли вы ТЗ в нее.

Предупреждение

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

Добавление таблицы из одной колонки в запрос 1С

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

Несмотря на очевидную пользу и простоту, у этой операции есть и определенные правила работы с ТЗ. Опытным путем установлено, что отладка и тестирование использования подобного приема затруднительна. Посмотреть временную таблицу в запросе возможно лишь с помощью типовых функций, заложенных в общие модули, или в консоли запросов. Вторым же правилом является необходимость типизировать колонки таблицы значений при ее объявлении, что зачастую забывают делать разработчики 1С.

Кроме вышеописанного применения программистам 1С приходится загружать таблицу в запрос 1С в сложных участках кода. Это позволяет не выполнять по нескольку раз 1 запрос – его выходной результат сохраняют в таблицу значений. А уже ее используют во всех следующих запросах в коде.

На многих собеседованиях на должность разработчика 1С в крупных компаниях проверяется именно способность грамотно использовать возможности платформы. И если вы продемонстрируете выполнение кода в цикле, а не передадите таблицу значений в запросе 1С, то это будет грубая ошибка.

Передача таблицы значений в запрос

  • Передача таблицы значений в запрос. В качестве внешнего источника могут выступать: Таблица значений, Табличная часть, Результат запроса.

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

    3 3 0 0 2 Скопировано.
    4 года назад

    Недостаточно рейтинга для добавления отрицательного голоса. Шаблон будет скрыт из ваших результатов поиска.

    Шаблоны кода 1С

    Секреты TurboConf

    TurboConf ИР

    Нейросети и AI

    Лайфхаки 1С

    Бубен админа

    1С не всерьез

    Комментарии

    JomInG
    #1, 15 июля 2020 22:36

    Разве не будет ошибки, что колонки таблицы не типизированные?

    2 2 Ответить
    reborn85
    #2, 15 июля 2020 22:48

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

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *