Есть документ "Операция" - по сути ручная операция, но созданная программно.
Заполняю её из ТЗ. Т.е., например так:
Опер.НоваяПроводка();
Опер.Дебет.Счет=ТЗ2.Счет;
Опер.Кредит.Счет=Счет00;
Для контроля сделал вывод сообщения
Сообщить("1 "+НомПров+" Дт "+ТЗ2.Счет+" Кт "+Счет00);
а также заполняю котрольную ТЗПров, которую вывожу для отладки
ТЗПров.Дт=Опер.Дебет.Счет;
ТЗПров.Кт=Опер.Кредит.Счет; //т.е. по сути тут то, что уже в проводке.
Так вот после
Опер.Записать();
в документе в некоторых проводках теряются счета! В моем случае все потери были для Кредита.
По статистике - из 1600 записанных строк - в 10ти строках потери.
При этом в Сообщить и в ТЗПров - всё заполнено корректно!
Потери были как для нулевого счета, так и для нормальных счетов.
Потери видны, когда вручную открываешь операцию или программно, если найти Документ.Вид()="Операция" и далее из него циклом перебрать проводки
ДокОпер=НайтиОперациюКТ();
Опер=ДокОпер.Операция;
Опер.ВыбратьПроводки();
Пока Опер.ПолучитьПроводку()=1 Цикл
НомПров = Опер.НомерПроводки();
Если (ПустоеЗначение(Опер.Кредит.Счет)=1)или(Опер.Кредит.Счет.Выбран()=0) Тогда
Сообщить(" "+НомПров+" ВНИМАНИЕ! ПУСТОЕ КТ","!!!");
Я сначала подумал, может перехватчик что-то перехватывает, но запись делается только как Опер.Записать()! Не Провести()! Следовательно такое не перехватывается. В общем ума не приложу, откуда может взяться потеря..
Может у кого-то появятся мысли по этому поводу..... Как еще проверить.
Немножко в сторону: а для чего
Если (ПустоеЗначение(Опер.Кредит.Счет)=1)или(Опер.Кредит.Счет.Выбран()=0)
Первое условие при наличии второго - смысла не имеет...
Та это просто уже не знаешь, что и придумать для проверки. Простое дублирование проверки, на всякий случай...
У меня обычно проводки начинают теряться, причина - ssd доходит.
Если проблема актуальна, я бы взглянул на модуль целиком.
Поигрался в .текущийсчет(), .забалансовый=0, .плансчетов() - везде стоит защита на запись проводки с пустым/невалидным счетом.
Значит самый правдоподобный вариант, что используются забалансовые счета, при этом есть огрехи в алгоритме заполнения.
к 1) Нелепица типа Сч.НайтиСчет(СчетПоКоду("00")) вернет Сч.Выбран()=1, при этом ПустоеЗначение(Сч)=1.
Правда Операция.Дебет.Счет=Сч выдаст ошибку "Неверное присвоение значения. Используйте ..ТекущийСчет()" сразу в момент присвоения.