Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
18 апр 2024, 03:21

Запрос на две даты из регистра

Автор 3030, 26 ноя 2012, 11:58

0 Пользователей и 1 гость просматривают эту тему.

3030

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


Вторым запросом заполнил таблицу значений на вторую дату:
ТаблицаЗначенийНаВторуюДату = Новый ТаблицаЗначений;
ЗапросНаВторуюДату = Новый Запрос;
ЗапросНаВторуюДату.Текст = "ВЫБРАТЬ
                           | ЦеныСрезПоследних.Цена,
                           | ЦеныСрезПоследних.Номенклатура,
                           | ЦеныСрезПоследних.Период
                           |ИЗ
                           | РегистрСведений.Цены.СрезПоследних(&Дата2, ) КАК ЦеныСрезПоследних
                           |
                           |УПОРЯДОЧИТЬ ПО
                           | ЦеныСрезПоследних.Период";
ЗапросНаВторуюДату.УстановитьПараметр("Дата2", ЭлементыФормы.Дата2.Значение);
РезультатНаВторуюДату = ЗапросНаВторуюДату.Выполнить();
ТаблицаЗначенийНаВторуюДату = РезультатНаВторуюДату.Выгрузить();


Создал третью таблицу значений и пытаюсь в ней сравнивать первые две таблицы:
ТаблицаЗначенийОбщая = Новый ТаблицаЗначений;

ТаблицаЗначенийНаПервуюДату.ВыбратьСтроку();
ТаблицаЗначенийНаВторуюДату.ВыбратьСтроку();
Для Каждого Строка ИЗ ТаблицаЗначенийНаПервуюДату Цикл
Для Каждого Строка ИЗ ТаблицаЗначенийНаВторуюДату Цикл
Если ТаблицаЗначенийНаПервуюДату.Колонки.Цена <> ТаблицаЗначенийНаВторуюДату.Колонки.Цена ТОГДА
СтрокаТаблицаЗначенийОбщая = ТаблицаЗначенийОбщая.Добавить();
КонецЕсли;
КонецЦикла;
КонецЦикла;


И получается такой вопрос: что-то не получается у меня вывести эту общую таблицу, а второе - я подозреваю, что это можно как то сделать одним запросом с условием, но как, догадаться не могу((
Прикрепляю конфигурацию (1с 8.1), отчет, в котором творится это непотребство - "Выгрузка".

Public_enemy

А что вы хотите  добавлять в вашу общую таблицу значений???

3030

Цитата: Public_enemy от 26 ноя 2012, 12:48
А что вы хотите  добавлять в вашу общую таблицу значений???

Ну вот смотрите: например, на 22 число цены 1, 2, 3, а на 23 число цены уже будут 1, 6, 3. Хочу, чтобы вывелось то, что изменилось, то есть в данном случае цена - 6 и номеклатура, ей соответствующая. Как то так)

Public_enemy

Ну тогда это должно выглядеть как то так

Запрос = Новый Запрос("
   ВЫБРАТЬ
        ЦеныСрезПоследних.Цена,
        ЦеныСрезПоследних.Номенклатура,
        ЦеныСрезПоследних.Период
      Поместить ПерваяДата
    ИЗ
        РегистрСведений.Цены.СрезПоследних(&Дата1, ) КАК ЦеныСрезПоследних
   ;
   /////////////////////////////////////////////////////////////////////////
   ВЫБРАТЬ
        ЦеныСрезПоследних.Цена,
        ЦеныСрезПоследних.Номенклатура,
        ЦеныСрезПоследних.Период
      Поместить ВтроаяДата
    ИЗ
        РегистрСведений.Цены.СрезПоследних(&Дата, ) КАК ЦеныСрезПоследних
   ;
   ///////////////////////////////////////////////////////////////////////
   Выбрать
      ПерваяДата.Цена КАК ПерваяЦена,
        ПерваяДата.Номенклатура,
        ПерваяДата.Период,
      ВтроаяДата.Цена КАК ВтораяЦена
      Поместить ИтоговаяТаблица
   Из
      ПерваяЦена КАК ПерваяЦена
         Полное Соединение ВтораяЦене КАК ВтораяЦена
         По ПерваяЦена.Номенклатура = ВтрораяЦена.Номенклатура
   ;
   ////////////////////////////////////////////////////////
   Выбрать
      ИтоговаяТаблица.ПерваяЦена,
        ИтоговаяТаблица.Номенклатура,
        ИтоговаяТаблица.Период,
      ИтоговаяТаблица.ВтораяЦена
   Где
      ИтоговаяТаблица.ПерваяЦена <> ИтоговаяТаблица.ВтораяЦена   
   
    УПОРЯДОЧИТЬ ПО
        ИтоговаяТаблица.Период";
    ЗапросНаПервуюДату.УстановитьПараметр("Дата1",ЭлементыФормы.Дата1);
   ЗапросНаПервуюДату.УстановитьПараметр("Дата2",ЭлементыФормы.Дата2);
   Результат = Запрос.Выполнить().Выгрузить();
   
   на выходе таблица значений с данными которые вы хотели выводить

3030

или я туплю (что очень высоковероятно), но ругается на слово "поместить"

Public_enemy

Выложи текст выдаваемой ошибки

3030

{Отчет.выгрузка1.Форма.ФормаОтчета(42)}: Ошибка при вызове метода контекста (Выполнить): {(5, 2)}: Синтаксическая ошибка "Поместить"
<<?>>Поместить ПерваяДата
   Результат = Запрос.Выполнить().Выгрузить();
по причине:
{(5, 2)}: Синтаксическая ошибка "Поместить"
<<?>>Поместить ПерваяДата

Добавлено: 26 ноя 2012, 14:25


извиняюсь, это я затупил, просто перепечатал, а не конструктором сделал) Сейчас помучаю конструктор и скажу результат)

Public_enemy

Выложи текст запроса. У тя где то синтакситческая ошикба. Запрос с помощью конструктора делали??

3030

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

вот такая вот ошибка:

{Отчет.выгрузка2.Форма.ФормаОтчета(51)}: Ошибка при вызове метода контекста (Выполнить): {(7, 2)}: Ошибка обработки представления "РегистрСведений.Цены.СрезПоследних:Несоответствие типов (параметр номер ""1"")"
<<?>>РегистрСведений.Цены.СрезПоследних(&Дата1, ) КАК ЦеныСрезПоследних
   Результат = Запрос.Выполнить().Выгрузить();
по причине:
{(7, 2)}: Ошибка обработки представления "РегистрСведений.Цены.СрезПоследних:Несоответствие типов (параметр номер ""1"")"
<<?>>РегистрСведений.Цены.СрезПоследних(&Дата1, ) КАК ЦеныСрезПоследних

mixqn

Цитата: 3030 от 26 ноя 2012, 14:37Новая ошибка нашлась
ну логично. вы пытаетесь вместо даты передать в запрос элемент формы
Цитата: 3030 от 26 ноя 2012, 14:37Запрос.УстановитьПараметр("Дата1", ЭлементыФормы.Дата1);
Запрос.УстановитьПараметр("Дата2", ЭлементыФормы.Дата2);

Добавлено: 26 ноя 2012, 14:44


передавать надо не элемент формы, а его значение. смотрите, что указано в свойствах элементов формы - есть там пункт такой "Данные" - там указано имя реквизита, связанного с элементом формы. вот это самое имя вам и надо использовать в коде. ну или, если уж на то пошло, можно и через элементы формы, как у вас (хотя это через одно место...), но тогда надо еще дописать ".Значение"

Похожие темы (5)

Рейтинг@Mail.ru

Поиск