Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как оптимально выбрать остатки на указанные дни?
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.3
Vofka
Привет!

Есть регистр остатков с измерением Договор, ресурс Сумма.

Есть некоторые данные, допустим, в таблице значений:

Дата - Договор
01.11 - Договор1
02.11 - Договор2
05.11 - Договор3
10.11 - Договор4
29.11 - Договор5

Мне надо к этой таблице значений добавить Сумму из регистра. В таблице значений могут быть любые даты и договора.

Наверное, я мог бы написать 1 запрос, который это сделает. Но я не уверен, что он будет лучше работать, чем если я просто сделаю по одному отдельному запросу для каждой Даты и Договора.

Как бы вы это сделали?
sava1
типо так необходимо зарегистрироваться для просмотра ссылки
Vofka
sava1 @ Вчера, 20:43 необходимо зарегистрироваться для просмотра ссылки ,
Та это ж не то. Мне не на каждый день остатки надо, а остатки на разные даты по разным измерениям.
sava1
сначала получаем остатки на каждую дату по каждому измерению. потом прицепляем к основной таблице левым(правым) соединением.
Ссылку показал потому, что в регистре на нужную дату может не быть остатков
daveal
Получить остатки на минимальную дату + обороты (развернутые до дня) до максимальной. Дальше соединится по дате меньше или меньше или равно в зависимости от того, нужен остаток на начало или конец дня
Batchir
Если на входе таблица значений и на выходе тоже должна быть таблица значений и не принципиально использовать именно запрос, тогда можно и с помощью СКД сделать

        
        // создаем схему
    СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;

        // Добавляем Источник данных.
    ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
    ИсточникДанных.Имя = "ИсточникДанных";
    ИсточникДанных.ТипИсточникаДанных = "Local";
    
    // Добавляем наборы данных.
    // тз - это наша таблица значений с колонками ДатаОстатков и Договоры, используем в качестве внешнего набора данных
    НаборДанныхОбъектСхемыКомпоновкиДанных1 = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
    НаборДанныхОбъектСхемыКомпоновкиДанных1.Имя = "НаборДанных1";
    НаборДанныхОбъектСхемыКомпоновкиДанных1.ИмяОбъекта = "тз";
    НаборДанныхОбъектСхемыКомпоновкиДанных1.ИсточникДанных = "ИсточникДанных";

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

    // добавляем связи наборов с передачей параметров
    СвязьНабораДанных = СхемаКомпоновкиДанных.СвязиНаборовДанных.Добавить();
    СвязьНабораДанных.НаборДанныхИсточник = "НаборДанных1";
    СвязьНабораДанных.НаборДанныхПриемник = "НаборДанных2";
    СвязьНабораДанных.ВыражениеИсточник = "Договор";
    СвязьНабораДанных.ВыражениеПриемник = "Договор";
    
    СвязьНабораДанных = СхемаКомпоновкиДанных.СвязиНаборовДанных.Добавить();
    СвязьНабораДанных.НаборДанныхИсточник = "НаборДанных1";
    СвязьНабораДанных.НаборДанныхПриемник = "НаборДанных2";
    СвязьНабораДанных.ВыражениеИсточник = "ДатаОстатков";
    СвязьНабораДанных.ВыражениеПриемник = "ДатаОстатков";
    СвязьНабораДанных.Параметр = "ДатаОстатков";

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