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

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

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

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

1c7. черный запрос

  • Автор темы KiR
  • Дата начала
K

KiR

Пожалуйста помогите - всю голову поламал!
Есть запорос
Код:
ТекстЗапроса = "//{{ЗАПРОС(ЗапросСчет)
|Период с ТЗ_ДатаДок по ТЗ_ДатаДок;
|ОбрабатыватьДокументы все;
|Без итогов;
|ДатаДок = Документ.Счет.ДатаДок;
|Контрагент = Документ.Счет.Контрагент;
|Всего = Документ.Счет.Всего;
|Условие(ДатаДок = ТЗ_ДатаДок);
|Условие(Контрагент = ТЗ_Контрагент);
|Условие(Всего = ТЗ_суммаДокумента + ТЗ_Сумма2);
|"//}}ЗАПРОС; 
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
Запрос.Выгрузить(ТаблицаЗапроса,0,0);
Если ТаблицаЗапроса.КоличествоСтрок() <> 0 Тогда 
Сообщить("Счет для "+ТЗ_Контрагент+" на сумму: "+Строка(ТЗ_СуммаДокумента)+" уже есть в системе!");
Иначе
СоздатьДокумент(ТЗ_ДатаДок, ТЗ_Сумма2, ТЗ_СуммаДокумента, ТЗ_Контрагент, ТЗ_Товар);	
КонецЕсли;
КонецЕсли;
По идее должен отобрать существующие Счета и выгрузить их потом в табличку и вывалить ошибку. Табличка получается пустая. Хотя после этого создается документ с такой же датой, суммой на того же контрагента, что были переданны в запрос. Такое происходит только в случае если в документе есть 2 и более строчки. где я ошибся?
 
L

LSH

Или вот так:
Запрос.Выгрузить(ТаблицаЗапроса,1,0);
 
K

KiR

LSH, такой вариант не сработал(((

vitfil, Zab, а можно поподробнее про группировку? Написал так - не помогло:
Код:
"//{{ЗАПРОС(ЗапросСчет)
|Период с ТЗ_ДатаДок по ТЗ_ДатаДок;
|ОбрабатыватьДокументы все;
|Без итогов;
|ДатаДок = Документ.Счет.ДатаДок;
|Контрагент = Документ.Счет.Контрагент;
|Всего = Документ.Счет.Всего;
|Группировка Всего;
|Условие(ДатаДок = ТЗ_ДатаДок);
|Условие(Контрагент = ТЗ_Контрагент);
|Условие(Всего = СуммаДокумента);
|"//}}ЗАПРОС
 
V

vbs

"//{{ЗАПРОС(ЗапросСчет)
|Период с ТЗ_ДатаДок по ТЗ_ДатаДок;
|ОбрабатыватьДокументы все;
|Без итогов;
|ДатаДок = Документ.Счет.ДатаДок;
|Контрагент = Документ.Счет.Контрагент;
|Всего = Документ.Счет.Всего;
|Группировка Документ;
|Условие(ДатаДок = ТЗ_ДатаДок);
|Условие(Контрагент = ТЗ_Контрагент);
|Условие(Всего = СуммаДокумента);
|"//}}ЗАПРОС
 
K

KiR

Не работает((((
Для проверки поставил ТаблицаЗапроса.выбратьстроку();
 
V

vitfil

"//{{ЗАПРОС(ЗапросСчет)
|Период с ТЗ_ДатаДок по ТЗ_ДатаДок;
|ОбрабатыватьДокументы все;
|Без итогов;
//|ДатаДок = Документ.Счет.ДатаДок; Ересь!

|Документ = Документ.Счет.ТекущийДокумент;

|Контрагент = Документ.Счет.Контрагент;
|Всего = Документ.Счет.Всего;
|Группировка Документ;
//|Условие(ДатаДок = ТЗ_ДатаДок); Это тоже ересь!
|Условие(Контрагент = ТЗ_Контрагент);
|Условие(Всего = СуммаДокумента);
|"//}}ЗАПРОС

И бегом арш читать ЖКК! Там про запросы довольно популярно с примерами написано.
 
V

vbs

Так может, в этом диапазоне просто нет документов ?
Vitfil прав
Период с ТЗ_ДатаДок по ТЗ_ДатаДок; - уже достаточно для отслеживания дат, я как-то невнимательно посмотрел на запрос, только на группировку
 
K

KiR

vitfil прямая ссылка на ЖКК есть?
Код:
	"//{{ЗАПРОС(ЗапросСчет)
|Период с ТЗ_ДатаДок по ТЗ_ДатаДок;
|ОбрабатыватьДокументы все;
|Без итогов;
//	|ДатаДок = Документ.Счет.ДатаДок;
|Контрагент = Документ.Счет.Контрагент;
|Всего = Документ.Счет.Всего;
|ТекущийДокумент = Документ.Счет.ТекущийДокумент;
|Группировка Документ;
//	|Условие(ДатаДок = ТЗ_ДатаДок);
|Условие(Контрагент = ТЗ_Контрагент);
|Условие(Всего = СуммаДокумента);
|"//}}ЗАПРОС
Тоже не отрабатывает. Никак не могу понярть почему счет, в котором есть одна строка - отбирается нормально, а в котором 2 - не отбирается??? Может ли на это влиять как-то номер счета? Счета с одной строкой подобны 00000100, а с двумя 0000010В
Причем со счетами-фактурами все нормально работает, а счета не отбирает
 
V

vitfil

Поставьте 1С++ и напишите прямой запрос.
А у вас итог по колонке "Всего"?

Вообще, с точки зрения банальной эрудиции, запросы 1С ересь полнейшая... Кто-нить когда-нить смотрел, как она их переводит в T-SQL? Хочется обнять и плакать!

Еще смущает условие (Всего = Сумма документа).
Мот документов с такой сумой нетуть.
 
K

KiR

Насколько я понял рассматривая документ Счета - это сумма строк + сумма НДС всех строк. самое удивительное что счетах-фактурах отрабатывает нормально, а со Счетами ни в какую. Где взять 1С++?
 
P

puh14

Ну дык в счете реквизит Всего - табличный, то есть при таком запросе ПОСЛЕДНЕЕ строчное значение табличной части документа сравнивается в суммой документа, что лажа. вариант - суммировать функцией и отлавливать по условию на выходе. Добавить типа |Функция СумВсего = Сумма(Всего);

а отлов пока Запрос.Группировка() = 1 Цикл
Если Запрос.СумВсего = СуммаДокумента тогда
Таб. вывестисекцию - ни или добавить в ТЗ или список - энто уже по желанию;
КонецЕсли;
конецЦикла;

Удачи!
 
K

KiR

puh14, а можешь полностью плиз текст запроса написать, а то я запутался совсем?
 
P

puh14

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

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Пока запрос.Группировка() = 1 Цикл
Если Запрос.СумВсего = СуммаДокумента тогда
\\тут - что делать с строчкой
КонецЕсли;
КонецЦикла;


Кроме того - рекомендую добавить вместо |Контрагент = Документ.Счет.Контрагент;

|Контрагент = Документ.Счет.Контрагент,Справочник.Клиенты.ТекущийЭлемент;
- Тогда выдаст по всем контрагентам, а то пока его не выберешь - ничего не покажет.
синтаксис проверь - мож где ошибся в буквах.
 
K

KiR

НЕ... никак не выходит(((
Как еще кроме запроса можно получить документы Счета с отбором по дате, контрагенту и общей сумме документа?
 
J

jj_mail

А ничего, что нужно сделать выборку с точностью до строки документа ?
 
K

kaa

Код:
ТекстЗапроса = "//{{ЗАПРОС(ЗапросСчет)
|Период с ТЗ_ДатаДок по ТЗ_ДатаДок;
|ОбрабатыватьДокументы все;
//	 |Без итогов;
|Счет = Документ.Счет.ТекущийДокумент;
|Контрагент = Документ.Счет.Контрагент;
|Всего = Документ.Счет.Всего;
//	 |Условие(ДатаДок = ТЗ_ДатаДок);
|Функция ВсегоСумма = Сумма(Всего);
|Условие(Контрагент = ТЗ_Контрагент);
|Условие(ВсегоСумма = ТЗ_суммаДокумента + ТЗ_Сумма2);
|Группировка Счет;
|"//}}ЗАПРОС; 
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
Запрос.Выгрузить(ТаблицаЗапроса,0,0);
Если ТаблицаЗапроса.КоличествоСтрок() <> 0 Тогда 
Сообщить("Счет для "+ТЗ_Контрагент+" на сумму: "+Строка(ТЗ_СуммаДокумента)+" уже есть в системе!");
Иначе
СоздатьДокумент(ТЗ_ДатаДок, ТЗ_Сумма2, ТЗ_СуммаДокумента, ТЗ_Контрагент, ТЗ_Товар);	
КонецЕсли;
КонецЕсли;
 
K

KiR

jj_mail , опиши подробнее плиз.

kaa
ВСЕГОСУММА<<?>>
Переменная не определена (ВСЕГОСУММА)
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
{V:\СЧЕТА.ERT(520)}: Условие(ВсегоСумма <<?>> = ТЗ_суммаДокумента + ТЗ_Сумма2);
Запрос[9] : Ошибка в выражении 'ВсегоСумма'
 
K

kaa

Протупил Я :rolleyes:
Строчку с условием убери

Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
Нашли = 0;
Пока Запрос.Группировка(1)= 1 Цикл
Если Запрос.ВсегоСумма = ТЗ_суммаДокумента + ТЗ_Сумма2 Тогда
Нашли =1;
Прервать;
КонецЕсли;
КонецЦикла;
Если Нашли =1 Тогда
Сообщить("Счет для "+ТЗ_Контрагент+" на сумму: "+Строка(ТЗ_СуммаДокумента)+" уже есть в системе!");
КонецЕсли;
Иначе
СоздатьДокумент(ТЗ_ДатаДок, ТЗ_Сумма2, ТЗ_СуммаДокумента, ТЗ_Контрагент, ТЗ_Товар);
КонецЕсли;
КонецЕсли;
 
Мы в соцсетях:

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