Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: А можно ли это сделать запросом?
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
pablo
Имеется таблица значений с полями НомерКарточкиПоБазе (Код справочника Контрагенты) и НомерДоговора (Реквизит Номер справочника Договоры контрагентов). Один номер договора может присутствовать для разных контрагентов. Нужно каждой строке в этой таблице поставить в соответствие ссылку на договор.
Есть вот такой код:
    Для каждого Догов из НомераДоговоров цикл
        Контр=Справочники.Контрагенты.НайтиПоКоду(Догов.НомерКарточкиПоБазе);    
            Договора=Справочники.ДоговорыКонтрагентов.Выбрать(,Контр);                        
            Пока Договора.Следующий() Цикл
                Если Договора.ВидДоговора=Перечисления.ВидыДоговоровКонтрагентов.СПоставщиком
                    И СокрЛП(Договора.Номер)=СокрЛП(ВыборкаНомерПлатежки.НомерДоговора) тогда
                    Догов.СсылкаНаДоговор=Договора.ПолучитьОбъект().Ссылка;
                КонецЕсли;    
            КонецЦикла;    
    КонецЦикла;

А можно ли как-то заменить его неким запросом?
Vofka
Можно. Насколько я понял - как-то так:

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

Но в результате напоролся на ошибку:

{Документ.ЦСМ_КлиентБанк.Форма.ФормаТолстая.Форма(319)}: Ошибка при вызове метода контекста (Выполнить)
РезультатДоговоров=ЗапросДоговора.Выполнить().Выбрать();
по причине:

по причине:
Содержимое объекта данных может быть выбрано только во временную таблицу

Хотя МенеджерВременныхТаблиц мне здесь не нужен... Придется переписывать основной запрос.
Vofka
По-моему надо просто добавить:

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


Ну или смотреть в эту сторону. Там точно есть какой-то нюанс небольшой.
pablo
Проблему уже решил другими путями. А МенеджерВременныхТаблиц не может напрямую данные отдавать sad.gif Он может их просто помещать в другой запрос в качестве источника данных.

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

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

Ну, в принципе, правильно вы сделали, как-то так оно и есть. нО По-моему можно сделать даже так:
Добавлю ещё, что можно сделать всё это так:

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

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

    ЗапросДоговора.Текст = "ВЫБРАТЬ
                           |    *
                           |
                           |ИЗ
                           |    Договора";

    Результат=ЗапросДоговора.Выполнить();
pablo
Тогда самый короткий вариант будет таким smile.gif
ЗапросДоговора = Новый Запрос;
    ЗапросДоговора.Текст = "ВЫБРАТЬ
                           |    НомераДоговоров.НомерКарточкиПоБазе,
                           |    НомераДоговоров.НомерДоговора,
                           |    ДоговорыКонтрагентов.Ссылка КАК Договор
                           |ПОМЕСТИТЬ Договора
                           |ИЗ
                           |    &НомераДоговоров КАК НомераДоговоров
                           |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
                           |        ПО НомераДоговоров.НомерКарточкиПоБазе = ДоговорыКонтрагентов.Владелец.Код
                           |            И НомераДоговоров.НомерДоговора = ДоговорыКонтрагентов.Номер;
                           |ВЫБРАТЬ
                           |    *
                           |
                           |ИЗ
                           |    Договора";
    ЗапросДоговора.Параметры.Вставить("НомераДоговоров", НомераДоговоров);
    ЗапросДоговора.Выполнить();
DartRomanius
Цитата(pablo @ 22.07.11, 14:35) необходимо зарегистрироваться для просмотра ссылки
Тогда самый короткий вариант будет таким smile.gif
ЗапросДоговора = Новый Запрос;
    ЗапросДоговора.Текст = "ВЫБРАТЬ
                           |    НомераДоговоров.НомерКарточкиПоБазе,
                           |    НомераДоговоров.НомерДоговора,
                           |    ДоговорыКонтрагентов.Ссылка КАК Договор
                           |ПОМЕСТИТЬ Договора
                           |ИЗ
                           |    &НомераДоговоров КАК НомераДоговоров
                           |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
                           |        ПО НомераДоговоров.НомерКарточкиПоБазе = ДоговорыКонтрагентов.Владелец.Код
                           |            И НомераДоговоров.НомерДоговора = ДоговорыКонтрагентов.Номер;
                           |ВЫБРАТЬ
                           |    *
                           |
                           |ИЗ
                           |    Договора";
    ЗапросДоговора.Параметры.Вставить("НомераДоговоров", НомераДоговоров);
    ЗапросДоговора.Выполнить();


Эм... а зачем такие сложности?
pablo
Цитата
Эм... а зачем такие сложности?

смотреть пост №3
Vofka
Цитата
Тогда самый короткий вариант будет таким smile.gif

Помимо того, что самый короткий - самый лаконичный и удобно читаемый smile.gif

Цитата
Эм... а зачем такие сложности?

Предложите вариант по проще.
DartRomanius
Цитата(pablo @ 22.07.11, 14:56) необходимо зарегистрироваться для просмотра ссылки
смотреть пост №3


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