СКД. Как передать тз как параметр в запрос?
Есть внешняя тз, как добавить ее в скд разобрался, как связать с запросом в скд разобрался, но проблема в том, что после связи надо еще раз свернуть получившийся результат и часть полей просуммировать. Собственно, как это сделать, или как передать внешнюю тз в запрос в скд? Вариант с запросом в модуле объекта и дальнейшей передачей результата в скд рассматривал, просто интересно, можно ли без особых танцев с бубном передать внешнюю тз в запрос.
По теме из базы знаний
- Передача объекта ТаблицаЗначений в СКД в качестве параметра
- "Меньше копипаста!", или как Вася универсальную процедуру писал
- Как сдать экзамен 1С:Специалист по платформе?
- По-настоящему свои макеты в отчетах СКД. Исследование процесса компоновки и генерация кода отчета
- Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP
Найденные решения
(1) пока нельзя тз передать в запрос СКД без извращений.
посему
Откройте навороченные отчеты в ЗУП или УТ и в схеме компоновки в качестве источника увидите некий "скелет", который задает поля, а затем в общих модулях при компоновке этот каркас обрастает "мясом" реального запроса.
Для простых тз я тоже делаю примерно так
посему
Вариант с запросом в модуле объекта и дальнейшей передачей результата в скд рассматривал
это единственный способ, который активно используют в современных конфигурациях.
Откройте навороченные отчеты в ЗУП или УТ и в схеме компоновки в качестве источника увидите некий "скелет", который задает поля, а затем в общих модулях при компоновке этот каркас обрастает "мясом" реального запроса.
Для простых тз я тоже делаю примерно так
Функция ПриКомпоновке_НаборДанных_Показатели_Запрос_Периоды_ПолучитьТекстВставки(ПармВставки)
ТзПериоды = ПармВставки.ТзПериоды;
Если НЕ ТзПериоды.Количество() Тогда
ТекстИсключения = "Таблицу периодов получить не удалось!" + Символы.ПС + "Обратитесь к разработчику!";
ВызватьИсключение ТекстИсключения;
КонецЕсли;
// ТзПериоды.Колонки = {"ДатаНачала", "ДатаОкончания", "ДнейПериода", "ДнейРабочих"}
// Для гарантиии, что в пакете не будет дублей периодов свернем исходную тз по всем колонкам
мКолонки = Новый Массив;
Для каждого тКолонка Из ТзПериоды.Колонки Цикл
мКолонки.Добавить(тКолонка.Имя);
КонецЦикла;
СтрокаИменКолонок = СтрСоединить(мКолонки, ",");
ТзПериодыУник = ТзПериоды.Скопировать();
ТзПериодыУник.Свернуть(СтрокаИменКолонок);
ТзПериодыУник.Сортировать("ДатаНачала,ДатаОкончания");
// Текст первой секции и пример второй из запроса-объединения в СКД.
// Первая секция предоставляет поля для СКД даже когда динамически запрос не расширен, т.е. есть в СКД изначально.
// Вторая сециия с ОБЪЕДИНИТЬ ВСЕ и последующие отсутствуют в исходной схеме - эти секции
// формируются динамически в этом методе. Недоступный &ПараметрПериоды служит для поиска секции
// шаблона и имет значение ЛОЖЬ. Таким образом, первая секция не будет иметь данных и это именно шаблон.
//
// |.... голова пакетов запроса
// |
// |ВЫБРАТЬ
// | ДАТАВРЕМЯ(1, 1, 1) КАК ДатаНачала,
// | ДАТАВРЕМЯ(1, 1, 1) КАК ДатаОкончания,
// | 0 КАК ДнейПериода,
// | 0 КАК ДнейРабочих
// |ПОМЕСТИТЬ ВтПериоды
// |ГДЕ
// | &ПараметрПериоды
// |
// |ОБЪЕДИНИТЬ ВСЕ
// |
// |ВЫБРАТЬ
// | ДАТАВРЕМЯ(2017, 11, 1),
// | ДАТАВРЕМЯ(2017, 11, 30, 23, 59, 59),
// | 30,
// | 22";
ЗапросТекстВставка = "";
ЗапросТекстШаблон1 = "
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ДАТАВРЕМЯ(%1, %2, %3),
| ДАТАВРЕМЯ(%4, %5, %6, %7, %8, %9),";
ЗапросТекстШаблон2 = "
| %1,
| %2";
мУжеОбработано = Новый Массив; // Для контроля дублей интервалов, если есть даты начала и окончания в один день, но разное время
Для каждого СтрокаТз Из ТзПериодыУник Цикл
НачалоДняДатаНчл = НачалоДня(СтрокаТз.ДатаНачала);
НачалоДняДатаОкн = НачалоДня(СтрокаТз.ДатаОкончания);
КлючИнтервала = Формат(НачалоДняДатаНчл, "ДЛФ=Д")+"_"+Формат(НачалоДняДатаОкн, "ДЛФ=Д");
Если мУжеОбработано.Найти(КлючИнтервала) = Неопределено Тогда
мУжеОбработано.Добавить(КлючИнтервала);
Иначе
Продолжить; // Уже был такой интервал по дате начала и окончания без учета времени
КонецЕсли;
ПараметрыЗамены1 = Новый Структура;
ПараметрыЗамены1.Вставить("_1", Формат(Год (НачалоДняДатаНчл), "ЧГ="));
ПараметрыЗамены1.Вставить("_2", Формат(Месяц(НачалоДняДатаНчл), "ЧГ="));
ПараметрыЗамены1.Вставить("_3", Формат(День (НачалоДняДатаНчл), "ЧГ="));
ПараметрыЗамены1.Вставить("_4", Формат(Год (НачалоДняДатаОкн), "ЧГ="));
ПараметрыЗамены1.Вставить("_5", Формат(Месяц(НачалоДняДатаОкн), "ЧГ="));
ПараметрыЗамены1.Вставить("_6", Формат(День (НачалоДняДатаОкн), "ЧГ="));
ПараметрыЗамены1.Вставить("_7", "23");
ПараметрыЗамены1.Вставить("_8", "59");
ПараметрыЗамены1.Вставить("_9", "59");
ПараметрыЗамены2 = Новый Структура;
ПараметрыЗамены2.Вставить("_1", Формат(СтрокаТз.ДнейПериода, "ЧГ="));
ПараметрыЗамены2.Вставить("_2", Формат(СтрокаТз.ДнейРабочих, "ЧГ="));
ЗапросТекстСекция1 = СтрШаблон(ЗапросТекстШаблон1,
ПараметрыЗамены1._1,
ПараметрыЗамены1._2,
ПараметрыЗамены1._3,
ПараметрыЗамены1._4,
ПараметрыЗамены1._5,
ПараметрыЗамены1._6,
ПараметрыЗамены1._7,
ПараметрыЗамены1._8,
ПараметрыЗамены1._9);
ЗапросТекстСекция2 = СтрШаблон(ЗапросТекстШаблон2,
ПараметрыЗамены2._1,
ПараметрыЗамены2._2);
ЗапросТекстВставка = ЗапросТекстВставка + ЗапросТекстСекция1 + ЗапросТекстСекция2;
КонецЦикла;
Возврат ЗапросТекстВставка;
КонецФункции
Функция ПриКомпоновке_НаборДанных_Показатели_Запрос_ОстаткиНаДатаК_П олучитьТекстВставки(ПармВставки)
ТзПериоды = ПармВставки.ТзПериоды;
Если НЕ ТзПериоды.Количество() Тогда
ТекстИсключения = "Таблицу периодов получить не удалось!" + Символы.ПС + "Обратитесь к разработчику!";
ВызватьИсключение ТекстИсключения;
КонецЕсли;
// ТзПериоды.Колонки = {"ДатаНачала", "ДатаОкончания", "ДнейПериода", "ДнейРабочих"}
ИмяКолонкиГраницыПериода = "ДатаОкончания";
ТзПериодыДатаК = ТзПериоды.Скопировать(, ИмяКолонкиГраницыПериода);
ТзПериодыДатаК.Свернуть(ИмяКолонкиГраницыПериода);
ТзПериодыДатаК.Сортировать(ИмяКолонкиГраницыПериода);
// Текст первой секции и пример второй из запроса-объединения в СКД.
// Первая секция предоставляет поля для СКД даже когда динамически запрос не расширен, т.е. есть в СКД изначально.
// Вторая сециия с ОБЪЕДИНИТЬ ВСЕ и последующие отсутствуют в исходной схеме - эти секции
// формируются динамически в этом методе. Недоступный &ПараметрОстатки служит для поиска секции
// шаблона и имет значение ЛОЖЬ. Таким образом, первая секция не будет иметь данных и это именно шаблон.
//
// Обратите внимание, что
// - в качестве поля ДатаОкончания - выступает конец дня,
// - в качестве параметра остатков - выступает начало следующего дня, что аналогично
// ДОБАВИТЬКДАТЕ(&ДатаОкончания, СЕКУНДА, 1), но избавляет запрос от лишнего вычисления.
//
// |
// |.... тут может быть выборка вложенных полей
// | ПОМЕСТИТЬ ВтОстатки
// |.... тут может быть соединение с другими таблицами
// |
// |ВЫБРАТЬ
// | ДАТАВРЕМЯ(1, 1, 1) КАК ДатаОкончания,
// | СбТвОстатки.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
// | СбТвОстатки.ВидЗапасов КАК ВидЗапасов,
// | СбТвОстатки.КоличествоОстаток КАК КоличествоОстаток,
// | СбТвОстатки.СтоимостьОстаток КАК СтоимостьОстаток
// | ИЗ
// | РегистрНакопления.СебестоимостьТоваров.Остатки(, ЛОЖЬ) КАК СбТвОстатки
// | ГДЕ
// | &ПараметрОстатки
// |
// |ОБЪЕДИНИТЬ ВСЕ
// |
// |ВЫБРАТЬ
// | ДАТАВРЕМЯ(2017, 7, 31, 23, 59, 59),
// | СбТвОстатки.АналитикаУчетаНоменклатуры,
// | СбТвОстатки.ВидЗапасов,
// | СбТвОстатки.КоличествоОстаток,
// | СбТвОстатки.СтоимостьОстаток
// |ИЗ
// | РегистрНакопления.СебестоимостьТоваров.Остатки(
// | ДАТАВРЕМЯ(2017, 8, 1),
// | АналитикаУчетаНоменклатуры В
// | (ВЫБРАТЬ
// | ВтАналитикаУчетаНоменклатуры.КлючАналитики
// | ИЗ
// | ВтАналитикаУчетаНоменклатуры)
// | И ВидЗапасов В
// | (ВЫБРАТЬ
// | ВтВидыЗапасов.ВидЗапасов
// | ИЗ
// | ВтВидыЗапасов)) КАК СбТвОстатки";
ЗапросТекстВставка = "";
ЗапросТекстШаблон = "
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ДАТАВРЕМЯ(%1, %2, %3, %4, %5, %6),
| СбТвОстатки.АналитикаУчетаНоменклатуры,
| СбТвОстатки.ВидЗапасов,
| СбТвОстатки.КоличествоОстаток,
| СбТвОстатки.СтоимостьОстаток
|ИЗ
| РегистрНакопления.СебестоимостьТоваров.Остатки(
| ДАТАВРЕМЯ(%7, %8, %9),
| АналитикаУчетаНоменклатуры В
| (ВЫБРАТЬ
| ВтАналитикаУчетаНоменклатуры.КлючАналитики
| ИЗ
| ВтАналитикаУчетаНоменклатуры)
| И ВидЗапасов В
| (ВЫБРАТЬ
| ВтВидыЗапасов.ВидЗапасов
| ИЗ
| ВтВидыЗапасов)) КАК СбТвОстатки";
мУжеОбработано = Новый Массив; // Для контроля дублей дней даты окончания, если есть даты окончания в один день, но разное время
Для каждого СтрокаТз Из ТзПериодыДатаК Цикл
НачалоДняДатаОкончания = НачалоДня(СтрокаТз.ДатаОкончания);
Если мУжеОбработано.Найти(НачалоДняДатаОкончания) = Неопределено Тогда
мУжеОбработано.Добавить(НачалоДняДатаОкончания);
Иначе
Продолжить; // Уже был такой день даты окончания
КонецЕсли;
НачалоСледующегоДня = КонецДня(НачалоДняДатаОкончания) + 1;
ПараметрыЗамены = Новый Структура;
ПараметрыЗамены.Вставить("_1", Формат(Год (НачалоДняДатаОкончания), "ЧГ="));
ПараметрыЗамены.Вставить("_2", Формат(Месяц(НачалоДняДатаОкончания), "ЧГ="));
ПараметрыЗамены.Вставить("_3", Формат(День (НачалоДняДатаОкончания), "ЧГ="));
ПараметрыЗамены.Вставить("_4", "23");
ПараметрыЗамены.Вставить("_5", "59");
ПараметрыЗамены.Вставить("_6", "59");
ПараметрыЗамены.Вставить("_7", Формат(Год (НачалоСледующегоДня), "ЧГ="));
ПараметрыЗамены.Вставить("_8", Формат(Месяц(НачалоСледующегоДня), "ЧГ="));
ПараметрыЗамены.Вставить("_9", Формат(День (НачалоСледующегоДня), "ЧГ="));
ЗапросТекстСекция = СтрШаблон(ЗапросТекстШаблон,
ПараметрыЗамены._1,
ПараметрыЗамены._2,
ПараметрыЗамены._3,
ПараметрыЗамены._4,
ПараметрыЗамены._5,
ПараметрыЗамены._6,
ПараметрыЗамены._7,
ПараметрыЗамены._8,
ПараметрыЗамены._9);
ЗапросТекстВставка = ЗапросТекстВставка + ЗапросТекстСекция;
КонецЦикла;
Возврат ЗапросТекстВставка;
КонецФункции
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) пока нельзя тз передать в запрос СКД без извращений.
посему
Откройте навороченные отчеты в ЗУП или УТ и в схеме компоновки в качестве источника увидите некий "скелет", который задает поля, а затем в общих модулях при компоновке этот каркас обрастает "мясом" реального запроса.
Для простых тз я тоже делаю примерно так
посему
Вариант с запросом в модуле объекта и дальнейшей передачей результата в скд рассматривал
это единственный способ, который активно используют в современных конфигурациях.
Откройте навороченные отчеты в ЗУП или УТ и в схеме компоновки в качестве источника увидите некий "скелет", который задает поля, а затем в общих модулях при компоновке этот каркас обрастает "мясом" реального запроса.
Для простых тз я тоже делаю примерно так
Функция ПриКомпоновке_НаборДанных_Показатели_Запрос_Периоды_ПолучитьТекстВставки(ПармВставки)
ТзПериоды = ПармВставки.ТзПериоды;
Если НЕ ТзПериоды.Количество() Тогда
ТекстИсключения = "Таблицу периодов получить не удалось!" + Символы.ПС + "Обратитесь к разработчику!";
ВызватьИсключение ТекстИсключения;
КонецЕсли;
// ТзПериоды.Колонки = {"ДатаНачала", "ДатаОкончания", "ДнейПериода", "ДнейРабочих"}
// Для гарантиии, что в пакете не будет дублей периодов свернем исходную тз по всем колонкам
мКолонки = Новый Массив;
Для каждого тКолонка Из ТзПериоды.Колонки Цикл
мКолонки.Добавить(тКолонка.Имя);
КонецЦикла;
СтрокаИменКолонок = СтрСоединить(мКолонки, ",");
ТзПериодыУник = ТзПериоды.Скопировать();
ТзПериодыУник.Свернуть(СтрокаИменКолонок);
ТзПериодыУник.Сортировать("ДатаНачала,ДатаОкончания");
// Текст первой секции и пример второй из запроса-объединения в СКД.
// Первая секция предоставляет поля для СКД даже когда динамически запрос не расширен, т.е. есть в СКД изначально.
// Вторая сециия с ОБЪЕДИНИТЬ ВСЕ и последующие отсутствуют в исходной схеме - эти секции
// формируются динамически в этом методе. Недоступный &ПараметрПериоды служит для поиска секции
// шаблона и имет значение ЛОЖЬ. Таким образом, первая секция не будет иметь данных и это именно шаблон.
//
// |.... голова пакетов запроса
// |
// |ВЫБРАТЬ
// | ДАТАВРЕМЯ(1, 1, 1) КАК ДатаНачала,
// | ДАТАВРЕМЯ(1, 1, 1) КАК ДатаОкончания,
// | 0 КАК ДнейПериода,
// | 0 КАК ДнейРабочих
// |ПОМЕСТИТЬ ВтПериоды
// |ГДЕ
// | &ПараметрПериоды
// |
// |ОБЪЕДИНИТЬ ВСЕ
// |
// |ВЫБРАТЬ
// | ДАТАВРЕМЯ(2017, 11, 1),
// | ДАТАВРЕМЯ(2017, 11, 30, 23, 59, 59),
// | 30,
// | 22";
ЗапросТекстВставка = "";
ЗапросТекстШаблон1 = "
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ДАТАВРЕМЯ(%1, %2, %3),
| ДАТАВРЕМЯ(%4, %5, %6, %7, %8, %9),";
ЗапросТекстШаблон2 = "
| %1,
| %2";
мУжеОбработано = Новый Массив; // Для контроля дублей интервалов, если есть даты начала и окончания в один день, но разное время
Для каждого СтрокаТз Из ТзПериодыУник Цикл
НачалоДняДатаНчл = НачалоДня(СтрокаТз.ДатаНачала);
НачалоДняДатаОкн = НачалоДня(СтрокаТз.ДатаОкончания);
КлючИнтервала = Формат(НачалоДняДатаНчл, "ДЛФ=Д")+"_"+Формат(НачалоДняДатаОкн, "ДЛФ=Д");
Если мУжеОбработано.Найти(КлючИнтервала) = Неопределено Тогда
мУжеОбработано.Добавить(КлючИнтервала);
Иначе
Продолжить; // Уже был такой интервал по дате начала и окончания без учета времени
КонецЕсли;
ПараметрыЗамены1 = Новый Структура;
ПараметрыЗамены1.Вставить("_1", Формат(Год (НачалоДняДатаНчл), "ЧГ="));
ПараметрыЗамены1.Вставить("_2", Формат(Месяц(НачалоДняДатаНчл), "ЧГ="));
ПараметрыЗамены1.Вставить("_3", Формат(День (НачалоДняДатаНчл), "ЧГ="));
ПараметрыЗамены1.Вставить("_4", Формат(Год (НачалоДняДатаОкн), "ЧГ="));
ПараметрыЗамены1.Вставить("_5", Формат(Месяц(НачалоДняДатаОкн), "ЧГ="));
ПараметрыЗамены1.Вставить("_6", Формат(День (НачалоДняДатаОкн), "ЧГ="));
ПараметрыЗамены1.Вставить("_7", "23");
ПараметрыЗамены1.Вставить("_8", "59");
ПараметрыЗамены1.Вставить("_9", "59");
ПараметрыЗамены2 = Новый Структура;
ПараметрыЗамены2.Вставить("_1", Формат(СтрокаТз.ДнейПериода, "ЧГ="));
ПараметрыЗамены2.Вставить("_2", Формат(СтрокаТз.ДнейРабочих, "ЧГ="));
ЗапросТекстСекция1 = СтрШаблон(ЗапросТекстШаблон1,
ПараметрыЗамены1._1,
ПараметрыЗамены1._2,
ПараметрыЗамены1._3,
ПараметрыЗамены1._4,
ПараметрыЗамены1._5,
ПараметрыЗамены1._6,
ПараметрыЗамены1._7,
ПараметрыЗамены1._8,
ПараметрыЗамены1._9);
ЗапросТекстСекция2 = СтрШаблон(ЗапросТекстШаблон2,
ПараметрыЗамены2._1,
ПараметрыЗамены2._2);
ЗапросТекстВставка = ЗапросТекстВставка + ЗапросТекстСекция1 + ЗапросТекстСекция2;
КонецЦикла;
Возврат ЗапросТекстВставка;
КонецФункции
Функция ПриКомпоновке_НаборДанных_Показатели_Запрос_ОстаткиНаДатаК_П олучитьТекстВставки(ПармВставки)
ТзПериоды = ПармВставки.ТзПериоды;
Если НЕ ТзПериоды.Количество() Тогда
ТекстИсключения = "Таблицу периодов получить не удалось!" + Символы.ПС + "Обратитесь к разработчику!";
ВызватьИсключение ТекстИсключения;
КонецЕсли;
// ТзПериоды.Колонки = {"ДатаНачала", "ДатаОкончания", "ДнейПериода", "ДнейРабочих"}
ИмяКолонкиГраницыПериода = "ДатаОкончания";
ТзПериодыДатаК = ТзПериоды.Скопировать(, ИмяКолонкиГраницыПериода);
ТзПериодыДатаК.Свернуть(ИмяКолонкиГраницыПериода);
ТзПериодыДатаК.Сортировать(ИмяКолонкиГраницыПериода);
// Текст первой секции и пример второй из запроса-объединения в СКД.
// Первая секция предоставляет поля для СКД даже когда динамически запрос не расширен, т.е. есть в СКД изначально.
// Вторая сециия с ОБЪЕДИНИТЬ ВСЕ и последующие отсутствуют в исходной схеме - эти секции
// формируются динамически в этом методе. Недоступный &ПараметрОстатки служит для поиска секции
// шаблона и имет значение ЛОЖЬ. Таким образом, первая секция не будет иметь данных и это именно шаблон.
//
// Обратите внимание, что
// - в качестве поля ДатаОкончания - выступает конец дня,
// - в качестве параметра остатков - выступает начало следующего дня, что аналогично
// ДОБАВИТЬКДАТЕ(&ДатаОкончания, СЕКУНДА, 1), но избавляет запрос от лишнего вычисления.
//
// |
// |.... тут может быть выборка вложенных полей
// | ПОМЕСТИТЬ ВтОстатки
// |.... тут может быть соединение с другими таблицами
// |
// |ВЫБРАТЬ
// | ДАТАВРЕМЯ(1, 1, 1) КАК ДатаОкончания,
// | СбТвОстатки.АналитикаУчетаНоменклатуры КАК АналитикаУчетаНоменклатуры,
// | СбТвОстатки.ВидЗапасов КАК ВидЗапасов,
// | СбТвОстатки.КоличествоОстаток КАК КоличествоОстаток,
// | СбТвОстатки.СтоимостьОстаток КАК СтоимостьОстаток
// | ИЗ
// | РегистрНакопления.СебестоимостьТоваров.Остатки(, ЛОЖЬ) КАК СбТвОстатки
// | ГДЕ
// | &ПараметрОстатки
// |
// |ОБЪЕДИНИТЬ ВСЕ
// |
// |ВЫБРАТЬ
// | ДАТАВРЕМЯ(2017, 7, 31, 23, 59, 59),
// | СбТвОстатки.АналитикаУчетаНоменклатуры,
// | СбТвОстатки.ВидЗапасов,
// | СбТвОстатки.КоличествоОстаток,
// | СбТвОстатки.СтоимостьОстаток
// |ИЗ
// | РегистрНакопления.СебестоимостьТоваров.Остатки(
// | ДАТАВРЕМЯ(2017, 8, 1),
// | АналитикаУчетаНоменклатуры В
// | (ВЫБРАТЬ
// | ВтАналитикаУчетаНоменклатуры.КлючАналитики
// | ИЗ
// | ВтАналитикаУчетаНоменклатуры)
// | И ВидЗапасов В
// | (ВЫБРАТЬ
// | ВтВидыЗапасов.ВидЗапасов
// | ИЗ
// | ВтВидыЗапасов)) КАК СбТвОстатки";
ЗапросТекстВставка = "";
ЗапросТекстШаблон = "
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ДАТАВРЕМЯ(%1, %2, %3, %4, %5, %6),
| СбТвОстатки.АналитикаУчетаНоменклатуры,
| СбТвОстатки.ВидЗапасов,
| СбТвОстатки.КоличествоОстаток,
| СбТвОстатки.СтоимостьОстаток
|ИЗ
| РегистрНакопления.СебестоимостьТоваров.Остатки(
| ДАТАВРЕМЯ(%7, %8, %9),
| АналитикаУчетаНоменклатуры В
| (ВЫБРАТЬ
| ВтАналитикаУчетаНоменклатуры.КлючАналитики
| ИЗ
| ВтАналитикаУчетаНоменклатуры)
| И ВидЗапасов В
| (ВЫБРАТЬ
| ВтВидыЗапасов.ВидЗапасов
| ИЗ
| ВтВидыЗапасов)) КАК СбТвОстатки";
мУжеОбработано = Новый Массив; // Для контроля дублей дней даты окончания, если есть даты окончания в один день, но разное время
Для каждого СтрокаТз Из ТзПериодыДатаК Цикл
НачалоДняДатаОкончания = НачалоДня(СтрокаТз.ДатаОкончания);
Если мУжеОбработано.Найти(НачалоДняДатаОкончания) = Неопределено Тогда
мУжеОбработано.Добавить(НачалоДняДатаОкончания);
Иначе
Продолжить; // Уже был такой день даты окончания
КонецЕсли;
НачалоСледующегоДня = КонецДня(НачалоДняДатаОкончания) + 1;
ПараметрыЗамены = Новый Структура;
ПараметрыЗамены.Вставить("_1", Формат(Год (НачалоДняДатаОкончания), "ЧГ="));
ПараметрыЗамены.Вставить("_2", Формат(Месяц(НачалоДняДатаОкончания), "ЧГ="));
ПараметрыЗамены.Вставить("_3", Формат(День (НачалоДняДатаОкончания), "ЧГ="));
ПараметрыЗамены.Вставить("_4", "23");
ПараметрыЗамены.Вставить("_5", "59");
ПараметрыЗамены.Вставить("_6", "59");
ПараметрыЗамены.Вставить("_7", Формат(Год (НачалоСледующегоДня), "ЧГ="));
ПараметрыЗамены.Вставить("_8", Формат(Месяц(НачалоСледующегоДня), "ЧГ="));
ПараметрыЗамены.Вставить("_9", Формат(День (НачалоСледующегоДня), "ЧГ="));
ЗапросТекстСекция = СтрШаблон(ЗапросТекстШаблон,
ПараметрыЗамены._1,
ПараметрыЗамены._2,
ПараметрыЗамены._3,
ПараметрыЗамены._4,
ПараметрыЗамены._5,
ПараметрыЗамены._6,
ПараметрыЗамены._7,
ПараметрыЗамены._8,
ПараметрыЗамены._9);
ЗапросТекстВставка = ЗапросТекстВставка + ЗапросТекстСекция;
КонецЦикла;
Возврат ЗапросТекстВставка;
КонецФункции
Показать
(1)
код состряпан из 2 макетов, посмотрите может пригодиться
если выбросить все манипуляции с отбором параметрами и проч.
код состряпан из 2 макетов, посмотрите может пригодиться
если выбросить все манипуляции с отбором параметрами и проч.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
Схема=ПолучитьМакет("НастрокаКолонок");
КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных;
ПроцессорКомпоновки=Новый ПроцессорКомпоновкиДанных;
//-----------------------------------------------------
КомпоновщикНастроек0=Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек0.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
КомпоновщикНастроек0.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);
КомпоновщикНастроек0.ЗагрузитьПользовательскиеНастройки(КомпоновщикНастроек.ПользовательскиеНастройки); // Параметры
// сортировка
ГруппаДетальныеЗаписи=КомпоновщикНастроек0.Настройки.Структура[0].Структура[0];
СтрокаУжеДобавилиВПорядок="";
Для Каждого ЭлементПользовательскихНастроек Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
Если ТипЗнч(ЭлементПользовательскихНастроек)=Тип("ПорядокКомпоновкиДанных") Тогда
Для Каждого ПользовательскийЭлементПорядка Из ЭлементПользовательскихНастроек.Элементы Цикл
ИндексТочки=Найти(Строка(ПользовательскийЭлементПорядка.Поле),".");
ПолеПорядка=Лев(Строка(ПользовательскийЭлементПорядка.Поле),?(ИндексТочки>0,ИндексТочки-1,СтрДлина(Строка(ПользовательскийЭлементПорядка.Поле))));
Если ГруппаДетальныеЗаписи.Порядок.ДоступныеПоляПорядка.Элементы.Найти(ПолеПорядка)<>Неопределено
И ПолеПорядка<>"Контрагент" Тогда
НовыйЭлементПользовательскогоПорядка1=ГруппаДетальныеЗаписи.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
ЗаполнитьЗначенияСвойств(НовыйЭлементПользовательскогоПорядка1,ПользовательскийЭлементПорядка);
СтрокаУжеДобавилиВПорядок=?(ПользовательскийЭлементПорядка.Использование,Строка(ПользовательскийЭлементПорядка.Поле)+";"+СтрокаУжеДобавилиВПорядок,СтрокаУжеДобавилиВПорядок);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Для Каждого ЭлементПорядка Из КомпоновщикНастроек.Настройки.Порядок.Элементы Цикл
ИндексТочки=Найти(Строка(ЭлементПорядка.Поле),".");
ПолеПорядка=Лев(Строка(ЭлементПорядка.Поле),?(ИндексТочки>0,ИндексТочки-1,СтрДлина(Строка(ЭлементПорядка.Поле))));
Если ГруппаДетальныеЗаписи.Порядок.ДоступныеПоляПорядка.Элементы.Найти(ПолеПорядка)<>Неопределено
И ПолеПорядка<>"Контрагент"
И Найти(СтрокаУжеДобавилиВПорядок,Строка(ПользовательскийЭлементПорядка.Поле))=0 Тогда
НовыйЭлементПорядка1=ГруппаДетальныеЗаписи.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
ЗаполнитьЗначенияСвойств(НовыйЭлементПорядка1,ЭлементПорядка);
КонецЕсли;
КонецЦикла;
// отбор
СтрокаУжеДобавилиВОтбор="";
Для Каждого ПользовательскийЭлементОтбора Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
Если ТипЗнч(ПользовательскийЭлементОтбора)=Тип("ЭлементОтбораКомпоновкиДанных") Тогда
Если ПользовательскийЭлементОтбора.ЛевоеЗначение=Неопределено Тогда
// в порядке эксперимента
//ИД=КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьИдентификаторПоОбъекту(ПользовательскийЭлементОтбора);
// Отладчик : КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьИдентификаторПоОбъекту(ПользовательскийЭлементОтбора) bb47871f-b5f6-4246-b6a2-ff32610fde41 ИдентификаторКомпоновкиДанных
// Отладчик :КомпоновщикНастроек.Настройки.Отбор.Элементы[0].ИдентификаторПользовательскойНастройки "bb47871f-b5f6-4246-b6a2-ff32610fde41" Строка
//ТестНужныйЭлементОтбора=КомпоновщикНастроек.Настройки.Отбор.ПолучитьОбъектПоИдентификатору(ИД);
// Отладчик : КомпоновщикНастроек.Настройки.Отбор.ПолучитьОбъектПоИдентификатору(ИД) Неопределено ?????
// Так и не понял как это работает, просто пройдем циклом
НужныйЭлементОтбора=Неопределено;
Для Каждого НужныйЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
Если ПользовательскийЭлементОтбора.ИдентификаторПользовательскойНастройки=НужныйЭлементОтбора.ИдентификаторПользовательскойНастройки Тогда
НовыйЭлементОтбора1=КомпоновщикНастроек0.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЗаполнитьЗначенияСвойств(НовыйЭлементОтбора1,ПользовательскийЭлементОтбора);
НовыйЭлементОтбора1.ЛевоеЗначение=НужныйЭлементОтбора.ЛевоеЗначение;
СтрокаУжеДобавилиВОтбор=?(НовыйЭлементОтбора1.Использование,Строка(НужныйЭлементОтбора.ЛевоеЗначение)+";"+СтрокаУжеДобавилиВОтбор,СтрокаУжеДобавилиВОтбор);
КонецЕсли;
КонецЦикла;
Иначе
ИндексТочки=Найти(Строка(ПользовательскийЭлементОтбора.ЛевоеЗначение),".");
ПолеОтбора=Лев(Строка(ПользовательскийЭлементОтбора.ЛевоеЗначение),?(ИндексТочки>0,ИндексТочки-1,СтрДлина(Строка(ПользовательскийЭлементОтбора.ЛевоеЗначение))));
Если КомпоновщикНастроек0.Настройки.Отбор.ДоступныеПоляОтбора.Элементы.Найти(ПолеОтбора)<>Неопределено
И Найти(СтрокаУжеДобавилиВОтбор,Строка(ПользовательскийЭлементОтбора.ЛевоеЗначение))=0 Тогда
НовыйЭлементОтбора2=КомпоновщикНастроек0.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЗаполнитьЗначенияСвойств(НовыйЭлементОтбора2,ПользовательскийЭлементОтбора);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для Каждого ЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
ИндексТочки=Найти(Строка(ЭлементОтбора.ЛевоеЗначение),".");
ПолеОтбора=Лев(Строка(ЭлементОтбора.ЛевоеЗначение),?(ИндексТочки>0,ИндексТочки-1,СтрДлина(Строка(ЭлементОтбора.ЛевоеЗначение))));
Если КомпоновщикНастроек0.Настройки.Отбор.ДоступныеПоляОтбора.Элементы.Найти(ПолеОтбора)<>Неопределено
И ЗначениеЗаполнено(ЭлементОтбора.ПравоеЗначение)
И Найти(СтрокаУжеДобавилиВОтбор,Строка(ПользовательскийЭлементОтбора.ЛевоеЗначение))=0 Тогда
НовыйЭлементОтбора1=КомпоновщикНастроек0.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЗаполнитьЗначенияСвойств(НовыйЭлементОтбора1,ЭлементОтбора);
КонецЕсли;
КонецЦикла;
Макет=КомпоновщикМакета.Выполнить(Схема,КомпоновщикНастроек0.ПолучитьНастройки(),,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки.Инициализировать(Макет);
ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТаблицаЗаказы=Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаЗаказы);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Ё=ТаблицаЗаказы.Количество()-1;
Пока Ё >= 0 Цикл
Если Не ЗначениеЗаполнено(ТаблицаЗаказы[Ё].Заказ) Тогда
ТаблицаЗаказы.Удалить(Ё);
КонецЕсли;
Ё=Ё-1;
КонецЦикла;
Сообщить("Количество записей в загруженной таблице значений = "+ ТаблицаЗаказы.Количество());
// --------------------------------основная схема
Макет=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.ПолучитьНастройки(),ДанныеРасшифровки);
ПроцессорКомпоновки.Инициализировать(Макет,Новый Структура("ТаблицаЗаказы",ТаблицаЗаказы),ДанныеРасшифровки);
ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Показать
Как-то так
// Данные объекта
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Партнеры", Партнеры);
Запрос.УстановитьПараметр("ТекущаяДата", НачалоДня(ТекущаяДата()));
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Партнеры.Ссылка КАК Партнер,
| МАКСИМУМ(ЕСТЬNULL(СделкиСКлиентами.ПотенциальнаяСуммаПродажи, 0)) КАК СуммаМаксимальнойСделки,
| РАЗНОСТЬДАТ(Партнеры.ДатаРегистрации, &ТекущаяДата, ДЕНЬ) КАК ВозрастПартнера
|ИЗ
| Справочник.Партнеры КАК Партнеры
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СделкиСКлиентами КАК СделкиСКлиентами
| ПО (СделкиСКлиентами.Партнер = Партнеры.Ссылка)
| И (НЕ СделкиСКлиентами.ПометкаУдаления)
| И (СделкиСКлиентами.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСделок.ВРаботе))
|ГДЕ
| &УсловиеПартнеров
|
|СГРУППИРОВАТЬ ПО
| Партнеры.Ссылка";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеПартнеров", ?(Партнеры = Неопределено, "ИСТИНА", "Партнеры.Ссылка В (&Партнеры)"));
ДанныеОбъекта = Запрос.Выполнить().Выгрузить();
// Схема компоновки данных
СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
Источник = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
Источник.Имя = "ДанныеОбъекта";
Источник.СтрокаСоединения = "";
Источник.ТипИсточникаДанных = "Local";
НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
НаборДанных.Имя = "ДанныеОбъекта";
НаборДанных.ИмяОбъекта = "ДанныеОбъекта";
НаборДанных.ИсточникДанных = "ДанныеОбъекта";
Для каждого Колонка из ДанныеОбъекта.Колонки Цикл
ПолеДанных = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеДанных.Поле = Колонка.Имя;
ПолеДанных.ПутьКДанным = Колонка.Имя;
ПолеДанных.ТипЗначения = Колонка.ТипЗначения;
КонецЦикла;
АдресСхемыКомпоновкиДанных = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, Новый УникальныйИдентификатор);
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыКомпоновкиДанных));
// Параметры схемы
НастройкиСхемы = УсловияОтбора.УсловияОтбора.Получить();
Если НастройкиСхемы <> Неопределено Тогда
КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиСхемы);
ДетальныеЗаписи = КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ДетальныеЗаписи.Имя = "Детальные";
ДетальныеЗаписи.Использование = Истина;
ВыбранноеПоле = ДетальныеЗаписи.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Партнер");
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, Новый Структура("ДанныеОбъекта", ДанныеОбъекта));
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТаблицаЗначений = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаЗначений);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
Результат = ТаблицаЗначений.ВыгрузитьКолонку("Партнер");
КонецЕсли;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот