Творится странное - при работе на серверной 1С арифметика в запросах работает как-то странно.
Есть серверная КА 1.1 на платформе 8.3.15.1489, пару дней назад переехали с файловой версии на серверную (MS SQL) и пользователи начали жаловаться на странные цифры в отчетах, после чего я локализовал такую ситуацию:
беру готовую таблицу с данными, запускаю запрос по этой таблице (не по таблицам данных в базе) и арифметика не работает на серверной и работает на файловой...
Вот код обработки:
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Организация",Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("Контрагент",Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("ТипУслуг",Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("ДолгНачалоМесяца",Новый ОписаниеТипов("Число"));
ТЗ.Колонки.Добавить("_АвансНачалоМесяца",Новый ОписаниеТипов("Число"));
ТЗ.Колонки.Добавить("ВыписаноРеализацийТекМесяц",Новый ОписаниеТипов("Число"));
ТЗ.Колонки.Добавить("_ПриходВТекМесяцеАванс",Новый ОписаниеТипов("Число"));
ТЗ.Колонки.Добавить("_ПриходВТекМесяцеНеАванс",Новый ОписаниеТипов("Число"));
ТЗ.Колонки.Добавить("_ЗачетАвансовМинусЗаказыТекМесяц",Новый ОписаниеТипов("Число"));
ТЗ.Колонки.Добавить("ДолгКонецМесяца",Новый ОписаниеТипов("Число"));
ТЗ.Колонки.Добавить("АвансКонецМесяца",Новый ОписаниеТипов("Число"));
ТЗ.Колонки.Добавить("ОплатаИскл",Новый ОписаниеТипов("Число"));
НовСтр = ТЗ.Добавить();
НовСтр.Контрагент = "ТЕСТ";
НовСтр.ДолгНачалоМесяца = 7000;
НовСтр.ДолгКонецМесяца = 7000;
Запрос= Новый Запрос;
Запрос.МенеджерВременныхТаблиц =Новый МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ
| _ВТ1_4_врем.Организация,
| _ВТ1_4_врем.Контрагент,
| _ВТ1_4_врем.ТипУслуг,
| _ВТ1_4_врем.ДолгНачалоМесяца,
| _ВТ1_4_врем._АвансНачалоМесяца,
| _ВТ1_4_врем.ВыписаноРеализацийТекМесяц,
| _ВТ1_4_врем._ПриходВТекМесяцеАванс,
| _ВТ1_4_врем._ПриходВТекМесяцеНеАванс,
| _ВТ1_4_врем._ЗачетАвансовМинусЗаказыТекМесяц,
| _ВТ1_4_врем.ДолгКонецМесяца,
| _ВТ1_4_врем.АвансКонецМесяца,
| _ВТ1_4_врем.ОплатаИскл,
| 0 КАК ОплатаТекПериодВТекМесяце,
| ВЫБОР
| КОГДА _ВТ1_4_врем.ДолгНачалоМесяца > 0
| ТОГДА ВЫБОР
| КОГДА _ВТ1_4_врем._ПриходВТекМесяцеНеАванс >= _ВТ1_4_врем.ДолгНачалоМесяца
| ТОГДА ЕСТЬNULL(_ВТ1_4_врем.ДолгНачалоМесяца, 0)
| КОГДА _ВТ1_4_врем._ПриходВТекМесяцеНеАванс < _ВТ1_4_врем.ДолгНачалоМесяца
| ТОГДА ЕСТЬNULL(_ВТ1_4_врем._ПриходВТекМесяцеНеАванс, 0)
| ИНАЧЕ ЕСТЬNULL(_ВТ1_4_врем._ПриходВТекМесяцеАванс, 0)
| КОНЕЦ
| ИНАЧЕ 0
| КОНЕЦ КАК ОплатаПрошлыхПериодовВТекМесяце
|ПОМЕСТИТЬ _ВТ1_4
|ИЗ
| &_ВТ1_4_врем КАК _ВТ1_4_врем
|;
|ВЫБРАТЬ
| ВТ1_4.Организация,
| ВТ1_4.Контрагент,
| ВТ1_4.ТипУслуг,
| ВТ1_4.ДолгНачалоМесяца КАК ДолгНачалоМесяца,
| ВТ1_4.ВыписаноРеализацийТекМесяц КАК ВыписаноРеализацийТекМесяц,
| ВТ1_4.ОплатаПрошлыхПериодовВТекМесяце КАК ОплатаПрошлыхПериодовВТекМесяце,
| ВТ1_4._АвансНачалоМесяца КАК _АвансНачалоМесяца,
| ВТ1_4._ПриходВТекМесяцеАванс КАК _ПриходВТекМесяцеАванс,
| ВТ1_4.ДолгКонецМесяца КАК ДолгКонецМесяца,
| ВТ1_4.ОплатаИскл КАК ОплатаИскл,
| ВЫБОР
| КОГДА (ВТ1_4.ОплатаИскл=0)
| ТОГДА (ВТ1_4.ДолгНачалоМесяца-ВТ1_4.ОплатаПрошлыхПериодовВТекМесяце+ВТ1_4.ВыписаноРеализацийТекМесяц-ВТ1_4.ДолгКонецМесяца)
| КОГДА (ВТ1_4.ОплатаИскл>0)
| ТОГДА 0
| ИНАЧЕ 0
| КОНЕЦ КАК ОплатаТекПериодВТекМесяце
|
|
|ПОМЕСТИТЬ ВТ1_4
|ИЗ
| _ВТ1_4 КАК ВТ1_4";
Запрос.УстановитьПараметр("_ВТ1_4_врем", ТЗ);
Запрос.Выполнить();
ТЗ = Запрос.МенеджерВременныхТаблиц.Таблицы[1].ПолучитьДанные().Выгрузить();
Стр = ТЗ.Найти("ТЕСТ","Контрагент");
сообщить("ТЕСТ, ОплатаТекПериодВТекМесяце: "+Стр.ОплатаТекПериодВТекМесяце);
При этом ДолгНачалоМесяца=ДолгКонецМесяца, а ОплатаПрошлыхПериодовВТекМесяце и ВыписаноРеализацийТекМесяц равны 0.
Так вот в серверной версии итогом этой формулы становится сумма ДолгНачалоМесяца + ДолгКонецМесяца!!
Т.е. в серверной версии результат обработки: 14000 а в файловой: 0.
Единственно что пришло в голову - это тестирование и исправление, но оно не помогло...
p.s. сделал новую, пустую SQL базу (средствами 1С) - запустил обработку в ней - опять ошибка - 14000, переделал обработку под управляемые формы, поигрался с режимом совместимости - все равно ошибка.
бред какой-то,
и еще если у вас по контрагенту, несколько платежей, то их необходимо просуммировать, что бы получить Итог
а так вы получаете только первую/одну строчку платежей!
и еще так как получение данных из базы не происходит, то тестирование и исправление делать не обязательно
и еще дайте нормальные/понятные наименования Реквизитам,полям,таблицам
а то ВТ1_4, _ВТ1_4, ВТ1_4_врем
не очень отличаются друг от друга
и почему имена некоторых полей начинаются на "_"
а другие без "_" - на что это влияет?
(2) Это просто кусок кода чьего-то отчета, такие уже были заданы имена, логика их задания хоть и корява, но к проблеме отношения не имеет. В файле уже сгруппированные суммы по контрагентам.
Подозреваю,что код дописан без понимания,как работает код на клиенте,в форме и на сервере.
Не раз на курсах слышал об ошибках доработок при переходе с файловой на серверную....но помочь не могу.
Подозреваю,что код дописан без понимания,как работает код на клиенте,в форме и на сервере.
Не раз на курсах слышал об ошибках доработок при переходе с файловой на серверную....но помочь не могу.
Скорее всего вы имеете в виду ошибки на 8.3 - на управляемых формах, в данном случае это 8.2 и толстый клиент, все выполняется в одном контексте.
исходные значения неправильно заданы. Например, в таблице типы неправильно указаны. Что-то такое.
Выгрузи в ТЗ запрос по исходной таблице полностью, посмотри, что там.
Искать ошибки в арифметике у SQL сервера я бы стал в последнюю очередь. В предпоследнюю - у 1с. А начать лгично с себя о)
(8) Естественно я проверял таблицу, даже ссылочные поля менял на строки. Результат не меняется, один и тот же код в файловой и серверной базе выдает разные результаты.
Чуть-чуть поменял код - теперь он независим от файлов на диске, можно запускать на любой, даже пустой базе. Кроме того проверил что и в управляемом режиме и в другой, новой SQL базе этого же сервера на этой же платформе ошибка сохраняется.
Сегодня будут тесты на другой версии платформы сервера 1С и, возможно, на другой версии MS SQL, отпишу о результатах.