Имя: Пароль:
1C
1С v8
Уязвимая часть запроса
0 cube033
 
20.11.12
10:43
Не могу найти уязвимое место:
Стандартная конфа Хеликса - салон красоты.
Всегда нормально считала остаток денег на лицевом счете, а тут выдает неадекватные цифры.

Код запроса:


Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ
                         |    ЛицевойСчет.СтруктурнаяЕдиница,
                         |    ЛицевойСчет.Контрагент,
                         |    ЛицевойСчет.СуммаКонечныйОстаток КАК СуммаОстаток
                         |ИЗ
                         |    РегистрНакопления.ДенежныеСредстваНаЛицевыхСчетах.ОстаткиИОбороты(
                         |            ,
                         |            &Дата,
                         |            Авто,
                         |            ,
                         |            Контрагент = &Контрагент
                         |                И СтруктурнаяЕдиница = &СтруктурнаяЕдиница) КАК ЛицевойСчет
                         |ГДЕ
                         |    ЛицевойСчет.Регистратор <> &Регистратор");
   Запрос.УстановитьПараметр("СтруктурнаяЕдиница", СтруктурнаяЕдиница);
   Запрос.УстановитьПараметр("Контрагент", Контрагент);
   Запрос.УстановитьПараметр("Регистратор", Ссылка);
   Запрос.УстановитьПараметр("Дата", Дата);
   Выборка = Запрос.Выполнить().Выбрать();
   Если Выборка.Следующий() Тогда
       Выборка.Следующий();
       Если Выборка.СуммаОстаток < СуммаДокумента Тогда
           Сообщить("Остаток лицевого счета "+ Формат(Выборка.СуммаОстаток,"ЧЦ=15; ЧДЦ=2")+" р. меньше возвращаемой суммы!");
           Отказ = Истина;        
       КонецЕсли;
   Иначе
       Сообщить("Остаток лицевого счета 0 р.");
       Отказ = Истина;
   КонецЕсли;


Стандартный подсчет на калькуляторе говорит, что на сегодня остаток 4025р:
13.06.2012 15:31:33    300,00      +
14.06.2012 20:34:15    300,00      -
16.06.2012 14:06:10    7 200,00    +
16.06.2012 17:22:38    1 200,00    -
17.06.2012 18:31:30    1 470,00    -
18.06.2012 21:11:12    1 200,00    -
19.06.2012 20:52:53    930,00      -
21.06.2012 20:03:21    1 200,00    -
24.06.2012 19:05:25    1 200,00    -
16.10.2012 14:16:02    675,00      -
09.11.2012 19:44:09    225,00      -
10.11.2012 18:24:00    225,00      -
11.11.2012 12:00:00    3 800,00    +

а отладчик пишет, что переменная Выборка.СуммаОстаток выдает то 0, то 300р
1 cube033
 
20.11.12
10:47
Не совсем понимаю, что за "Выбрать разрешенные", что входит в "СуммаКонечныйОстаток" и что за параметр "Авто" у ДенежныеСредстваНаЛицевыхСчетах.ОстаткиИОбороты
2 dmpl
 
20.11.12
10:47
(0) Э--э-э, а что это:


   Если Выборка.Следующий() Тогда
       Выборка.Следующий();


Если оно вообще работает - значит, в результате запроса более 1 строки. А без упорядочивания порядок никто не гарантирует.
3 Cube
 
20.11.12
10:47
(0) Выбери себе другой ник, плагиатчик!))
4 salvator
 
20.11.12
10:48
(0) Вопрос: а зачем использовать таблицу ОстаткиИОбороты, если тебе нужен только остаток?
5 salvator
 
20.11.12
10:49
+(4) А, там проверка на регистратор. Вопрос снимается.
6 cube033
 
20.11.12
10:53
Я тоже кстати не совсем понимаю зачем два раза Выборка.Следующий()
Но раньше код работал

P.S. Мой ник у меня с 2007 (Может 08) года, образован из названия и бортового номера моего автомобиля и я не вижу повода его менять
7 mzelensky
 
20.11.12
10:54
(6) Скорее всего первый "выбрать.следующий" убирает (пропускает) переходящий остаток. Ты же по регистратору делаешь.
8 mzelensky
 
20.11.12
10:56
(0) советую засунуть этот запрос в консоль и посмотреть результат в более полномформате:

регистратор, начальныйОст, приход, расход, конечныйОст

тогда может увидишь почему так.
9 mikecool
 
20.11.12
10:56
блин... я разочарован, думал обнаружилась уязвимость в 1с (
10 НЕА123
 
20.11.12
11:01
(0)
кто это писал?
учитывая условие на дату

ЛицевойСчет.Регистратор <> &Регистратор

лишнее. не?
11 mzelensky
 
20.11.12
11:01
(9) у меня тоже такая мысль была :(
12 Прохожий
 
20.11.12
11:02
(9) Ага, по просьбе РПЦ ввели. Иногда система ссама генерит проводку по кассе и пишет "Бог дал" или "Бог взял" и рублей триста-четыреста сумма обычно.
13 Прохожий
 
20.11.12
11:03
+(12) А к 2015 будет 500 рублей
14 cube033
 
20.11.12
11:12
Писал Хеликс
регистратор -документ, в форме которого нажимаешь провести
дата - дата в Форме этого документа на момент нажатия "Провести"
Но документ мог быть проведен(создать запись в регистре) вчера, а сегодня ты его хочешь перепровести новой датой, тогда при выборке он попал бы под условия, если бы прямым текстом не было сказано про регистратор
15 cube033
 
20.11.12
11:20
Не могу найти консоль под упр формы(
16 Classic
 
20.11.12
11:23
Странно, что оно работало :)
Всего два первых регистратора обрабатывается после запроса
17 cube033
 
20.11.12
11:34
На самом деле не факт, что работало. Смысл данной выборки - получить Остаток, чтобы сравнить его с суммой РКО, нигде и никогда не выводился результат, только Истина либо Ложь.
18 cube033
 
20.11.12
11:36
Беда в том, что отчет по данному регистру показывает нужную сумму, а РКО говорит, что денег не хватает.
19 Classic
 
20.11.12
11:49
(17)
Еще раз. Постобработка запроса(там где выбрать-следующий) выбирает только первых два регистратора регистра. И все.
Дело не в запросе - дело в обработке результата
20 cube033
 
20.11.12
11:58
Спасибо) Увидел. Даже не первых два, а если есть хоть один, тогда выбирает второй - не хватает цикла, оттуда 300р.
И как это раньше работало?!
21 Classic
 
20.11.12
12:01
(20)
Может раньше было всего два регистратора? :)
22 dmpl
 
20.11.12
12:07
(20) Скорее всего, просто никогда не вылезал запрет тогда, когда не надо, вот и не замечали.
23 cube033
 
20.11.12
12:11
Документ не самый распространенный, вполне возможно, что несколько раз случайно проскочил проверку. Главное вроде выяснили, что беда конфы - дальше передам вопрос разработчику.