Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Простой запрос  (Прочитано 10332 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dest
Опытный

ru
Offline Offline

« : 04-05-2008 02:17 » 

Только присел за 1С. Не получается написать простой запрос. Есть два справочника - "товары" подчинен справочнику "склады". Необходимо вывести в отчет наименование всех складов и товаров на них (да вот такая простота) пишу запрос

Запр = СоздатьОбъект("Запрос");
ТекстЗапроса =
"
|Склад = Справочник.Склады.Наименование;
|Товар=Справочник.Товары.Наименование;
|Группировка Склад ;
|Группировка Товар ;
|";
  Если Запр.Выполнить(ТекстЗапроса) = 0 Тогда
   сообщить("Ошибки...");
   КонецЕсли;             
    таб=создатьобъект("Таблица");
    таб.исходнаятаблица("Таблица");
 Пока Запр.Группировка("Склад") = 1 Цикл
    Пока Запр.Группировка("Товар") = 1 Цикл
         Запр.тов.использоватьвладельца(Запр.Склад.Текущийэлемент());   
     тов=Запр.Товар;
    скл=Запр.Склад;     
   Таб.вывестисекцию("Центр");
     КонецЦикла;
КонецЦикла;

      Таб.ТолькоПросмотр(1);
   Таб.Показать();
// В таблице только одна секция(Центр) с выражениями  "тов" "скл" в одной строке
В общем ничего не выводится, что не так?


Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 04-05-2008 11:47 » 

Код:
Склад = Справочник.Склады.Наименование;
- это значит что Запрос.Склад будет объектом строкового типа.
правильно было бы
Код:
Склад = Справочник.Склады.ТекущийЭлемент;
Код:
Запр.тов.использоватьвладельца(...)
кроме того, что в качестве владельца используется не объект Справочника, а строка (см. выше) еще 2 ошибки:
1. тов - нету такого реквизита запроса (есть Товар)
2. ИспользоватьВладельца() смотрим хелп:
Цитата: Синтакс-помощник
Замечание:
Метод  можно использовать для объектов, созданных функцией СоздатьОбъект(), а также для реквизитов формы типа ''справочник'' (например, в форме документа - реквизит документа типа ''справочник'') или реквизитами диалога (например, в форме отчета - реквизит диалога типа ''справочник'').
ВНИМАНИЕ! в этих случаях метод имеет только один параметр!
Вот пример правильного запроса по двоим данным:
Код:
	Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Товар = Справочник.Товар.ТекущийЭлемент;
|Склад = Справочник.Товар.Владелец;
|Группировка Склад;
|Группировка Товар;
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;

// Подготовка к заполнению выходных форм данными запроса
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");
// Заполнение полей "Заголовок"
Таб.ВывестиСекцию("Заголовок");
Состояние("Заполнение выходной таблицы...");
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
Пока Запрос.Группировка(1) = 1 Цикл
Таб.ВывестиСекцию("Склад"); // если нужны итоги по складу
Пока Запрос.Группировка(2) = 1 Цикл
Таб.ВывестиСекцию("Товар");
КонецЦикла;
КонецЦикла;
// Вывод заполненной формы
Таб.ТолькоПросмотр(1);
Таб.Показать("Сформировать", "");
Записан
Dest
Опытный

ru
Offline Offline

« Ответ #2 : 04-05-2008 20:26 » 

Чёт не работает ошибки выдает:

Если Запр.Выполнить(ТекстЗапроса) = 0 Тогда
{Отчет.Переченьтоваров.Форма.Модуль(51)} товар. <<?>>Справочник.Текущийэлемент;
Запрос [2] неверно заданный путь “Товар”


Записан
Dest
Опытный

ru
Offline Offline

« Ответ #3 : 04-05-2008 20:30 » 

Все понял в чем дело. Заработало. Спасибо за помощ. Родина вас не забудет!
Записан
Dest
Опытный

ru
Offline Offline

« Ответ #4 : 05-05-2008 05:39 » 

А вот еще последний вопрос. Есть регистр Остатки - Измерения(склад, товар), ресурсы (к_во)
Необходимо вывести все товары в зависимости от выбранного склада

      СкладВ=создатьОбъект("Справочник.Склады");
   СкладВ.выбрать("","") ; //////Выбираем склад
   Запр = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "         
   |
   |Склад=Регистр.Остатки.Склад;
   |Товар=Регистр.Остатки.Товар;
   |К_во=Регистр.Остатки.К_во;
   |Группировка Склад;
   |Группировка Товар;
   |Группировка К_во;
   |Функция Сум=КонОст(К_во);
   |Условие (Склад=СкладВ); Не понялНе понялНе понялНе понялНе понялНе понялНе понялНе понялНе понялНе понял?? Выбранный склад должен соответствовать складу регистра
   |";

Условие ставлю Условие (Склад=СкладВ);  - ничего не выводит. Убираю выводит все. Я что-то в условии не дописываю?
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 06-05-2008 06:13 » 

Используй ТекущийЭлемент(). И неплохо бы проверить выбрали мы склад или отказались
Код:
	СкладВ=СоздатьОбъект("Справочник.Склады");
// Выбираем склад
Если СкладВ.Выбрать("","")=0 Тогда
Возврат; // Отказались от выбора
КонецЕсли;
Запр = СоздатьОбъект("Запрос");
ТекстЗапроса = "
|Склад=Регистр.Остатки.Склад;
|Товар=Регистр.Остатки.Товар;
|К_во=Регистр.Остатки.К_во;
|Группировка Склад;
|Группировка Товар;
|Группировка К_во;
|Функция Сум=КонОст(К_во);
|Условие (Склад=СкладВ.ТекущийЭлемент());
|";
или присвой какой-то переменной это значение:
Код:
	Если СкладВ.Выбрать("","")=0 Тогда
Возврат; // Отказались от выбора
КонецЕсли;
СкладВыб=СкладВ.ТекущийЭлемент();
...
|Условие (Склад=СкладВыб);
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines