Ошибка арифметики серверной 1С

1. saddy 5 03.04.20 20:33 Сейчас в теме
Творится странное - при работе на серверной 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].ПолучитьДанные().Выгрузить();
	Стр = ТЗ.Найти("ТЕСТ","Контрагент");
	сообщить("ТЕСТ, ОплатаТекПериодВТекМесяце: "+Стр.ОплатаТекПериодВТекМесяце);
Показать

Проблема в формуле
ВТ1_4.ДолгНачалоМесяца-ВТ1_4.ОплатаПрошлыхПериодовВТекМесяце+ВТ1_4.ВыписаноРеализацийТекМесяц-ВТ1_4.ДолгКонецМесяца

При этом ДолгНачалоМесяца=ДолгКонецМесяца, а ОплатаПрошлыхПериодовВТекМесяце и ВыписаноРеализацийТекМесяц равны 0.

Так вот в серверной версии итогом этой формулы становится сумма ДолгНачалоМесяца + ДолгКонецМесяца!!
Т.е. в серверной версии результат обработки: 14000 а в файловой: 0.

Единственно что пришло в голову - это тестирование и исправление, но оно не помогло...

p.s. сделал новую, пустую SQL базу (средствами 1С) - запустил обработку в ней - опять ошибка - 14000, переделал обработку под управляемые формы, поигрался с режимом совместимости - все равно ошибка.
По теме из базы знаний
Найденные решения
12. saddy 5 07.04.20 21:29 Сейчас в теме
Обновление на сервере платформы с 8.3.15.1489 на 8.3.15.1869 решило проблему.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. Fox-trot 158 05.04.20 18:30 Сейчас в теме
(1)
_ВТ1_4_врем.ДолгНачалоМесяца > 0

тады и сюды добавь ЕСТЬNULL
2. soft_wind 03.04.20 21:24 Сейчас в теме
бред какой-то,
и еще если у вас по контрагенту, несколько платежей, то их необходимо просуммировать, что бы получить Итог

а так вы получаете только первую/одну строчку платежей!
и еще так как получение данных из базы не происходит, то тестирование и исправление делать не обязательно

и еще дайте нормальные/понятные наименования Реквизитам,полям,таблицам
а то ВТ1_4, _ВТ1_4, ВТ1_4_врем
не очень отличаются друг от друга
и почему имена некоторых полей начинаются на "_"
а другие без "_" - на что это влияет?
4. saddy 5 05.04.20 18:28 Сейчас в теме
(2) Это просто кусок кода чьего-то отчета, такие уже были заданы имена, логика их задания хоть и корява, но к проблеме отношения не имеет. В файле уже сгруппированные суммы по контрагентам.
3. Ruslan2011 04.04.20 09:56 Сейчас в теме
Подозреваю,что код дописан без понимания,как работает код на клиенте,в форме и на сервере.
Не раз на курсах слышал об ошибках доработок при переходе с файловой на серверную....но помочь не могу.
5. saddy 5 05.04.20 18:29 Сейчас в теме
(3)
Подозреваю,что код дописан без понимания,как работает код на клиенте,в форме и на сервере.
Не раз на курсах слышал об ошибках доработок при переходе с файловой на серверную....но помочь не могу.

Скорее всего вы имеете в виду ошибки на 8.3 - на управляемых формах, в данном случае это 8.2 и толстый клиент, все выполняется в одном контексте.
7. Ruslan2011 05.04.20 18:41 Сейчас в теме
(5)
тогда посмотрите, может поможет
https://forum.infostart.ru/forum9/topic52440/
есть интересные для вас комментарии
9. saddy 5 06.04.20 13:09 Сейчас в теме
(7) Спасибо за ссылку, но там про другое.
8. starjevschik 05.04.20 21:27 Сейчас в теме
исходные значения неправильно заданы. Например, в таблице типы неправильно указаны. Что-то такое.
Выгрузи в ТЗ запрос по исходной таблице полностью, посмотри, что там.
Искать ошибки в арифметике у SQL сервера я бы стал в последнюю очередь. В предпоследнюю - у 1с. А начать лгично с себя о)
10. saddy 5 06.04.20 13:18 Сейчас в теме
(8) Естественно я проверял таблицу, даже ссылочные поля менял на строки. Результат не меняется, один и тот же код в файловой и серверной базе выдает разные результаты.
11. saddy 5 07.04.20 15:43 Сейчас в теме
Чуть-чуть поменял код - теперь он независим от файлов на диске, можно запускать на любой, даже пустой базе. Кроме того проверил что и в управляемом режиме и в другой, новой SQL базе этого же сервера на этой же платформе ошибка сохраняется.

Сегодня будут тесты на другой версии платформы сервера 1С и, возможно, на другой версии MS SQL, отпишу о результатах.
12. saddy 5 07.04.20 21:29 Сейчас в теме
Обновление на сервере платформы с 8.3.15.1489 на 8.3.15.1869 решило проблему.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот