Привет!
Есть регистр остатков с измерением Договор, ресурс Сумма.
Есть некоторые данные, допустим, в таблице значений:
Дата - Договор
01.11 - Договор1
02.11 - Договор2
05.11 - Договор3
10.11 - Договор4
29.11 - Договор5
Мне надо к этой таблице значений добавить Сумму из регистра. В таблице значений могут быть любые даты и договора.
Наверное, я мог бы написать 1 запрос, который это сделает. Но я не уверен, что он будет лучше работать, чем если я просто сделаю по одному отдельному запросу для каждой Даты и Договора.
Как бы вы это сделали?
типо так https://pro1c.org.ua/redirect.php?http://www.gilev.ru/%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B8-%D0%BD%D0%B0-%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9-%D0%B4%D0%B5%D0%BD%D1%8C/
sava1 @ Вчера, 20:43
,
Та это ж не то. Мне не на каждый день остатки надо, а остатки на разные даты по разным измерениям.
сначала получаем остатки на каждую дату по каждому измерению. потом прицепляем к основной таблице левым(правым) соединением.
Ссылку показал потому, что в регистре на нужную дату может не быть остатков
Получить остатки на минимальную дату + обороты (развернутые до дня) до максимальной. Дальше соединится по дате меньше или меньше или равно в зависимости от того, нужен остаток на начало или конец дня
Если на входе таблица значений и на выходе тоже должна быть таблица значений и не принципиально использовать именно запрос, тогда можно и с помощью СКД сделать
// создаем схему
СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
// Добавляем Источник данных.
ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "ИсточникДанных";
ИсточникДанных.ТипИсточникаДанных = "Local";
// Добавляем наборы данных.
// тз - это наша таблица значений с колонками ДатаОстатков и Договоры, используем в качестве внешнего набора данных
НаборДанныхОбъектСхемыКомпоновкиДанных1 = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
НаборДанныхОбъектСхемыКомпоновкиДанных1.Имя = "НаборДанных1";
НаборДанныхОбъектСхемыКомпоновкиДанных1.ИмяОбъекта = "тз";
НаборДанныхОбъектСхемыКомпоновкиДанных1.ИсточникДанных = "ИсточникДанных";
// это запрос к нашему регистру для получения остатков на каждую дату таблицы первого набора
НаборДанныхОбъектСхемыКомпоновкиДанных2 = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
НаборДанныхОбъектСхемыКомпоновкиДанных2.Имя = "НаборДанных2";
НаборДанныхОбъектСхемыКомпоновкиДанных2.ИсточникДанных = "ИсточникДанных";
НаборДанныхОбъектСхемыКомпоновкиДанных2.Запрос =
"ВЫБРАТЬ
| &ДатаОстатков КАК ДатаОстатков,
| рнОстатки.Договор,
| рнОстатки.Сумма КАК СуммаОстаток
|ИЗ
| РегистрНакопления.НашРегистрСОстаткамиПоДоговорам.Остатки(&ДатаОстатков, ) КАК рнОстатки";
НаборДанныхОбъектСхемыКомпоновкиДанных2.АвтоЗаполнениеДоступныхПолей = Истина;
// добавляем связи наборов с передачей параметров
СвязьНабораДанных = СхемаКомпоновкиДанных.СвязиНаборовДанных.Добавить();
СвязьНабораДанных.НаборДанныхИсточник = "НаборДанных1";
СвязьНабораДанных.НаборДанныхПриемник = "НаборДанных2";
СвязьНабораДанных.ВыражениеИсточник = "Договор";
СвязьНабораДанных.ВыражениеПриемник = "Договор";
СвязьНабораДанных = СхемаКомпоновкиДанных.СвязиНаборовДанных.Добавить();
СвязьНабораДанных.НаборДанныхИсточник = "НаборДанных1";
СвязьНабораДанных.НаборДанныхПриемник = "НаборДанных2";
СвязьНабораДанных.ВыражениеИсточник = "ДатаОстатков";
СвязьНабораДанных.ВыражениеПриемник = "ДатаОстатков";
СвязьНабораДанных.Параметр = "ДатаОстатков";
// Добавляем поля набора данных
ПолеНабораДанныхСхемыКомпоновкиДанных = НаборДанныхОбъектСхемыКомпоновкиДанных1.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНабораДанныхСхемыКомпоновкиДанных.Поле = "Договор";
ПолеНабораДанныхСхемыКомпоновкиДанных.ПутьКДанным = "Договор";
ПолеНабораДанныхСхемыКомпоновкиДанных.Заголовок = "Договор";
ПолеНабораДанныхСхемыКомпоновкиДанных = НаборДанныхОбъектСхемыКомпоновкиДанных1.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНабораДанныхСхемыКомпоновкиДанных.Поле = "ДатаОстатков";
ПолеНабораДанныхСхемыКомпоновкиДанных.ПутьКДанным = "ДатаОстатков";
ПолеНабораДанныхСхемыКомпоновкиДанных.Заголовок = "ДатаОстатков";
ПолеНабораДанныхСхемыКомпоновкиДанных = НаборДанныхОбъектСхемыКомпоновкиДанных2.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНабораДанныхСхемыКомпоновкиДанных.Поле = "СуммаОстаток";
ПолеНабораДанныхСхемыКомпоновкиДанных.ПутьКДанным = "СуммаОстаток";
ПолеНабораДанныхСхемыКомпоновкиДанных.Заголовок = "СуммаОстаток";
// добавляем ресурс
Ресурс = СхемаКомпоновкиДанных.ПоляИтога.Добавить();
Ресурс.ПутьКДанным = "СуммаОстаток";
Ресурс.Выражение = "Сумма(СуммаОстаток)";
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
// формируем структуру выходящих данных
НастройкиКомпоновки = КомпоновщикНастроек.Настройки;
ГруппировкаКомпоновкиДанных = НастройкиКомпоновки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ГруппировкаКомпоновкиДанных.Использование = Истина;
ПолеГруппировкиКомпоновкиДанных = ГруппировкаКомпоновкиДанных.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировкиКомпоновкиДанных.Использование = Истина;
ПолеГруппировкиКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Договор");
ПолеГруппировкиКомпоновкиДанных = ГруппировкаКомпоновкиДанных.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировкиКомпоновкиДанных.Использование = Истина;
ПолеГруппировкиКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("ДатаОстатков");
АвтоВыбранноеПолеКомпоновкиДанных = ГруппировкаКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоВыбранноеПолеКомпоновкиДанных.Использование = Истина;
ВыбранноеПолеКомпоновкиДанных = НастройкиКомпоновки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("СуммаОстаток");
// инициализируем макет, выполнем в коллекцию
ТипГенератора = Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений");
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновки,,,ТипГенератора);
ВнешниеНаборы = Новый Структура("тз", тз);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборы);
ОбъектДляЗагрузки = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ОбъектДляЗагрузки);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua