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

Запрос с наложение данных за период

Автор Noobi, 27 апр 2017, 11:41

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

Noobi

Помогите в решении задачи.

Есть определенный документ с табличной частью. В этой табличной части хранятся суммы в разбивке по месяцам за год. Т.е. ТЧ состоит из реквизитов Период(начало месяца) и Сумма. В реальности документ создаётся раз в квартал. Т.е. документ, созданный в январе содержит в ТЧ 12 строк с шагом в месяц, начиная с января. Документ, созданный в апреле содержит в ТЧ 12 строк с шагом в месяц, начиная с апреля и т.д.

Нужно за произвольный период получить реальный данные по этому документу с учётом уже существующих документов. Т.е. если мы выбираем период с 01.01.2017 по 31.12.2017, а в базе у нас есть два документа - один за первый квартал, созданный в январе, а второй за второй квартал, созданный в апреле, то в итоге мы должны получить таблицу, в которой суммы за январь, февраль, март должны браться из документа первого квартала, а суммы за период с 01.04.2017 по 31.12.2017 должны браться из документа за второй квартал.

Кто сможет предложить варианты исполнения такой задачи? В принципе, самым очевидным способом - запрос данных к документу и последующая обработка результата запроса в цикле с использованием условий и последующей записью в результирующую ТЗ - решает задачу, но может есть более "правильное" решение?

    ПериодПоКэш = Неопределено;
          СсылкаКэш = Неопределено;
  Пока Выборка.Следующий() Цикл

// Если наткнулись на запись с другими уникальными значениями,
// значит необходимо заполнить поле ОграничениеПериода в предыдущих записях.
Если ПериодПоКэш <> Неопределено И СсылкаКэш <> Неопределено Тогда
    Если Выборка.ПериодС < ПериодПоКэш И Выборка.Ссылка <> СсылкаКэш Тогда

Отбор = Новый Структура("Ссылка", СсылкаКэш);
НайденныеСтроки = ТаблицаРезультат.НайтиСтроки(Отбор);

Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
НайденнаяСтрока.ОграничениеПериода = Выборка.ПериодС;
КонецЦикла;

    КонецЕсли;
        КонецЕсли;

НоваяСтрока = ТаблицаРезультат.Добавить();
НоваяСтрока.Ссылка = Выборка.Ссылка;
НоваяСтрока.ОграничениеПериода = Выборка.ПериодПо;


ПериодПоКэш = Выборка.ПериодПо;
СсылкаКэш = Выборка.Ссылка;

КонецЦикла; // Детальные записи

ilyay

Это то же самое, как сделать срез последних вручную, а не виртуальной таблицей.

Noobi

Цитата: ilyay от 27 апр 2017, 12:11
Это то же самое, как сделать срез последних вручную, а не виртуальной таблицей.

Вообще, да. Только я почему-то этот вариант не стал реализовывать сразу. А сейчас сделал и всё вышло как надо.

Теги:

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

Рейтинг@Mail.ru Rambler's Top100

Поиск