• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Помогите написать запрос

  • Автор темы Hryv
  • Дата начала
H

Hryv

Слабоват я в запросах :(

Даже не знаю можно ли такое сделать

Есть регистр остатков
Надо выбрать движения регистра с условием, что "Рег.ТекущийДокумент().Склад" равен определенному значению
 
K

KiR

конструктором запросов не пытался воспользоваться?
 
P

puh14

Условие (Док.Склад в СписокСкладов);

Док - это объявленый раньше Регистр.Остатки.ТекущийДокумент;
СписокСкладов - либо список значений, либо одно из значений заполненых в модле
 
H

Hryv

Пытался и конструктором и примеры искать
С условием вроде разобрался, но никак не пойму как запросом выбрать движения регистра

Изначально запрос был простейший

Код:
	ТекстЗапроса = 
"//{{ЗАПРОС(Зап)
|Участник = Справочник.УчастникиПрограммы.ТекущийЭлемент;
|ДК = Справочник.УчастникиПрограммы.ДК;
|ДатаЗ = Справочник.УчастникиПрограммы.ДатаЗаполнения;
|Группировка ДК;
|Группировка Участник;
|Группировка ДатаЗ;								  
|Условие((ДатаЗ>=НачДата) И (ДатаЗ<=КонДата)); 
|Условие(Участник в СписокУч); 
|";//}}ЗАПРОС

Далее выполнялся выбор движений по регистру

Код:
	Рег.УстановитьЗначениеФильтра("Дк",СписДк,2);
Рег.ВыбратьДвижения();
Пока Рег.ПолучитьДвижение() = 1 Цикл
"Дк" - измерение регистра
СписДк - все ДК из запроса

При обходе регистра получается ТЗ в которой на каждый ДК (Дисконтная карта - справочник) по несколько строк
После этого надо вывести таблицу с группировкой
- ДК1
- Склад1
- Движение11
....
- Движение1N
- ДК2
- Склад2
- Движение21
....
- Движение2N

Кроме того надо еще и фильтр по складу сделать

Возможно ли в одном запросе?
 
P

puh14

ТекстЗапроса = "//{{ЗАПРОС(Зап)
|Период с ДатаНачала По датаКонца;
|Участник = Справочник.УчастникиПрограммы.ТекущийЭлемент;
|ДК = Справочник.УчастникиПрограммы.ДК, Регистр.КакЕгоТам.ДК;
|ДокРегистра = Регистр.какЕгоТам.ТекущийДокумент;
|ДатаЗ = Справочник.УчастникиПрограммы.ДатаЗаполнения;
|Группировка ДК;
|Группировка Участник;
|Группировка ДатаЗ;
|Группировка ДокРегистра;
|Условие((ДатаЗ>=НачДата) И (ДатаЗ<=КонДата));
|Условие(Участник в СписокУч);

примерно так можно вытащить документы, которые вызвали движение по регистру с использованием ДК. Если тебе нужно отобрать по складу- то скажи где этот склад живет. Если нужны приход, расход, остатки регистра, скажи как называются соответствующие ресурсы.
 
H

Hryv

puh14

Я правильно понял, что благодаря

|ДокРегистра = Регистр.какЕгоТам.ТекущийДокумент;
|Группировка ДокРегистра;

получатся все движения по регистру?

Остальное я сам доделаю
 
P

puh14

Это не движения! В зависимости от регистра движения вычисляются функциями. Если бы у тебя был ресурс сумма в этом регистре

ТекстЗапроса = "//{{ЗАПРОС(Зап)
|Период с ДатаНачала По датаКонца;
|Участник = Справочник.УчастникиПрограммы.ТекущийЭлемент;
|ДК = Справочник.УчастникиПрограммы.ДК, Регистр.КакЕгоТам.ДК;
|Сумм = Регистр.КакЕгоТам.Сумма;
|ДокРегистра = Регистр.какЕгоТам.ТекущийДокумент;
|ДатаЗ = Справочник.УчастникиПрограммы.ДатаЗаполнения;
|Группировка ДК;
|Группировка Участник;
|Группировка ДатаЗ;
|Группировка ДокРегистра;
|Функция НачСум = НачОст(Сумм);
|Функция КонСум = КонОст(Сумм);
|Функция прихСум = приход(Сумм);
|Функция РасхСум = расход(Сумм);
|Условие((ДатаЗ>=НачДата) И (ДатаЗ<=КонДата));
|Условие(Участник в СписокУч);


Это пример для регистра остатков - в оборотах функция только одна - типа Сумма(Сумм)
 
H

Hryv

Фишка в том, что мне не надо приход/расход за период, а надо получить каждое движение по регистру

Или подойдет выбрать все доки, которые двигали регистр
 
P

puh14

ДокРегистра = Регистр.какЕгоТам.ТекущийДокумент;
|Группировка ДокРегистра;

получатся все движения по регистру?

тогда так- получатся все документы изменявшие регистр
 
H

Hryv

Упростил запрос до предела

ТекстЗапроса =
"//{{ЗАПРОС(Зап)
|Период с НачДата По КонДата;
|ДокРегистра = Регистр.Дисконт.ТекущийДокумент;
|СвободныеБаллы = Регистр.Дисконт.СвободныеБаллы;
|Функция СвободныеБаллыКонОст = КонОст(СвободныеБаллы);
|Группировка ДокРегистра;
|";//}}ЗАПРОС

Ни одной строки нет :(
 
P

puh14

А регистр у тебя точно остатков?
Движения по нему точно были?
Проверь посмотрев движения документа, который должен был их вызывать.
НачДату и КонДату поставь побольше.

Запрос написан правильно - были бы движения, обязательно показал-бы.
 
H

Hryv

Пишу следом

Код:
	ТзДк = СоздатьОбъект("ТаблицаЗначений");
ТзДк.НоваяКолонка("Док");
Рег = СоздатьОбъект("Регистр.Дисконт");
Рег.ВыбратьДвижения(НачДата, КонДата);
Пока Рег.ПолучитьДвижение() = 1 Цикл
ТзДк.НоваяСтрока();
ТзДк.Док = Рег.ТекущийДокумент();
КонецЦикла;

Получаю тучу строк

Переделал запрос на
Код:
	ТекстЗапроса = 
"//{{ЗАПРОС(Зап)
|Период с НачДата По КонДата; 
|ДК = Регистр.Дисконт.ДК;
|СвободныеБаллы = Регистр.Дисконт.СвободныеБаллы;
|Функция СвободныеБаллыКонОст = КонОст(СвободныеБаллы);
|Группировка ДК;
|";//}}ЗАПРОС

Так работает

Не работает именно по документу :(
 
P

puh14

Блин -ступил. Конечный остаток не зависит от документа вызвавшего движение (он зависит от измерений) - от документа зависит приход и расход.

|Функция СвободныеБаллыПриход = Приход(СвободныеБаллы);
|Функция СвободныеБаллыРасход = Расход(СвободныеБаллы);

так попробуй
 
H

Hryv

Сегодня почти весь день форум не работал, но я сам разобрался (в книжке нашел), что если делать
|ДокРегистра = Регистр.какЕгоТам.ТекущийДокумент;
|Группировка ДокРегистра;
то нельзя получить остатки, а можно только движения

в итоге написал запрос
Код:
	"//{{ЗАПРОС(Запр)
|Период с НачДата по КонДата;
|ДокРегистра = Регистр.Дисконт.ТекущийДокумент;
|Склад = Регистр.Дисконт.ТекущийДокумент.РеализацияРозницаРБ.Склад, Регистр.Дисконт.ТекущийДокумент.ОтчетПоПодключениям.Склад;
|ДК = Регистр.Дисконт.ДК;
|Товар = Регистр.Дисконт.Номенклатура;
|СвободныеБаллы = Регистр.Дисконт.СвободныеБаллы;
|БаллыНаСкидках = Регистр.Дисконт.БаллыНаСкидках;
|БаллыНаПодарках = Регистр.Дисконт.БаллыНаПодарках;
|Количество = Регистр.Дисконт.Количество;
|Сумма = Регистр.Дисконт.Сумма;
|Группировка Склад;
|Группировка ДокРегистра;
|Группировка ДК;
|Группировка Товар Без Групп;
|Функция СвБаллыПриход = Приход(СвободныеБаллы);
|Функция БаллыСкПриход = Приход(БаллыНаСкидках);
|Функция БаллыПодПриход = Приход(БаллыНаПодарках);
|Функция КолвоПриход = Приход(Количество);
|Функция СуммаПриход = Приход(Сумма);
|Условие(Склад в СписокСк);
|Условие(ДК в СписокДК);
|";//}}ЗАПРОС

А во время формирования печатной формы для каждого ДК рассчитывал остаток по СвободныеБаллы
И по ходу выяснилось, что Справочник.УчастникиПрограммы можно вообще не использовать

Спасибо за помощь, пока делал этот отчет узнал много нового :)

хотел "+" нажать, но получил ответ
Вы не можете изменять репутацию одного и того же пользователя чаще один раз за 7 дней!
:(
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!