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

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

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

« : 30-06-2010 08:14 » 

Всем здравствуйте. Подскажите пожалуйста с таким вопросом.
Каким образом можно сделать выборку по справочнику в котором имеются периодические реквизиты
Например справочник сотрудники. и периодический реквизит долг.
Код:
Перем Запрос, ТекстЗапроса, Таб;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ВыбНачПериода по ВыбКонПериода;
|ОбрабатыватьДокументы все;
|Код = Справочник.Сотрудники.Код;
|Долг = Справочник.Сотрудники.Долг; // это периодический реквизит
|Группировка Код;
|Условие(Остаток>0);
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;

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

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

WWW
« Ответ #1 : 30-06-2010 17:43 » 

Вроде по стандарту - никак. Либо выбирать в запросе Элемент справочника, а потом по нему выбирать значения, либо использовать 1С++.
Записан
Элексир
Помогающий

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

« Ответ #2 : 30-06-2010 19:39 » 

Kivals, спасибо, я думал что все таки есть какой то стандартный путь обхода.
Записан
AndyG
Постоялец

by
Offline Offline

« Ответ #3 : 05-07-2010 06:35 » 

А стоит ли использовать реквизит? Может проще счет забалансовый?
Записан
AndyG
Постоялец

by
Offline Offline

« Ответ #4 : 07-07-2010 08:53 » 

Если обращение именно к Справочнику с целью получить значения периодического реквизита в хронологии
то вот решение задачи:

   ТЗ=СоздатьОбъект("ТаблицаЗначений");
   ТЗ.НоваяКолонка("Объект");
   ТЗ.НоваяКолонка("ДатаРекв");
   ТЗ.НоваяКолонка("Значение");
   НашСпр="МестаХранения";
   НашРекв="МОЛ";
   Спр=СоздатьОбъект("Справочник."+НашСпр);
   Спр.ВыбратьЭлементы();
   Пока Спр.ПолучитьЭлемент()=1 Цикл
       Если Спр.ПометкаУдаления()=1 Тогда
           Продолжить;
      КонецЕсли;
      Периодический=СоздатьОбъект("Периодический");
      Периодический.ИспользоватьОбъект(НашРекв,Спр.ТекущийЭлемент());
      Если Периодический.ВыбратьЗначения()=0 Тогда
          //не установлено значение
         Продолжить;
      КонецЕсли;
       Пока Периодический.ПолучитьЗначение()=1 Цикл
           ТЗ.НоваяСтрока();
         ТЗ.Объект=Спр.ТекущийЭлемент();
         ТЗ.ДатаРекв=Периодический.ДатаЗнач;
         ТЗ.Значение=Периодический.Значение;
       КонецЦикла;
   КонецЦикла;
    ТЗ.ВыбратьСтроку();
Записан
Элексир
Помогающий

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

« Ответ #5 : 17-07-2010 21:28 » 

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

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

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

WWW
« Ответ #6 : 18-07-2010 09:26 » 

Запрос сработает, но выберет только одно значение периодического реквизита. На какую дату - нужно экспериментировать. Возможные варианты: Начало/конец периода запроса, рабочая дата, текущая дата.
Записан
Элексир
Помогающий

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

« Ответ #7 : 18-07-2010 13:51 » new

Kivals, понятно.
Записан
AndyG
Постоялец

by
Offline Offline

« Ответ #8 : 19-07-2010 08:15 » 

Запрос выберет значение на конечную дату
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines