Странная ситуация с заполнением документа Операция. Теряется счет.

Автор alyuev, 26 июня 2024, 11:50

« назад - далее »

alyuev

Есть документ "Операция" - по сути ручная операция, но созданная программно.
Заполняю её из ТЗ. Т.е., например так:

Опер.НоваяПроводка();
Опер.Дебет.Счет=ТЗ2.Счет;
Опер.Кредит.Счет=Счет00;

Для контроля сделал вывод сообщения
Сообщить("1 "+НомПров+" Дт "+ТЗ2.Счет+" Кт "+Счет00);

а также заполняю котрольную ТЗПров, которую вывожу для отладки
ТЗПров.Дт=Опер.Дебет.Счет;
ТЗПров.Кт=Опер.Кредит.Счет; //т.е. по сути тут то, что уже в проводке.

Так вот после

Опер.Записать();

в документе в некоторых проводках теряются счета! В моем случае все потери были для Кредита.
По статистике - из 1600 записанных строк - в 10ти строках потери.

При этом в Сообщить и в ТЗПров - всё заполнено корректно!

Потери были как для нулевого счета, так и для нормальных счетов.

Потери видны, когда вручную открываешь операцию или программно, если найти Документ.Вид()="Операция" и далее из него циклом перебрать проводки

ДокОпер=НайтиОперациюКТ();	
			Опер=ДокОпер.Операция;
			Опер.ВыбратьПроводки();
			Пока Опер.ПолучитьПроводку()=1 Цикл
				НомПров = Опер.НомерПроводки();
				Если (ПустоеЗначение(Опер.Кредит.Счет)=1)или(Опер.Кредит.Счет.Выбран()=0) Тогда
					Сообщить(" "+НомПров+" ВНИМАНИЕ! ПУСТОЕ КТ","!!!");

Я сначала подумал, может перехватчик что-то перехватывает, но запись делается только как Опер.Записать()! Не Провести()! Следовательно такое не перехватывается. В общем ума не приложу, откуда может взяться потеря..

Может у кого-то появятся мысли по этому поводу..... Как еще проверить.


Злоп

Немножко в сторону: а для чего
Если (ПустоеЗначение(Опер.Кредит.Счет)=1)или(Опер.Кредит.Счет.Выбран()=0)
Первое условие при наличии второго - смысла не имеет...

alyuev

Та это просто уже не знаешь, что и придумать для проверки. Простое дублирование проверки, на всякий случай...

Пиит

У меня обычно проводки начинают теряться, причина - ssd доходит.

Харлампий Дымба

Если  проблема актуальна, я бы взглянул на модуль целиком.
Поигрался в .текущийсчет(), .забалансовый=0, .плансчетов() - везде стоит защита на запись проводки с пустым/невалидным счетом.
Значит самый правдоподобный вариант, что используются забалансовые счета, при этом есть огрехи в алгоритме заполнения.

к 1) Нелепица типа Сч.НайтиСчет(СчетПоКоду("00")) вернет Сч.Выбран()=1, при этом ПустоеЗначение(Сч)=1.
Правда Операция.Дебет.Счет=Сч выдаст ошибку "Неверное присвоение значения. Используйте ..ТекущийСчет()" сразу в момент присвоения.