Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
26 июн 2024, 14:54

фейковые записи в регистре

Автор mahaidor, 11 ноя 2016, 06:02

0 Пользователей и 1 гость просматривают эту тему.

mahaidor

Здравствуйте. 1с 8.3 управляемое приложение

Есть документ ОперацииСоСчетами фиксирующий ввод/вывод депозита и ставки.
Соответственно созданы два регистра к документу "ОперацииСДепозитом" и "Ставки". Первый регистр хранит инфу об операциях ввода/вывода депозита, второй - о ставках.

Поскольку, оба регистра подчинены одному регистратору, то возникает такая ситуация, например: создан 1 документ с вводом депозита, и 1 документ с ставками. Так вот, при проведении документа с вводом депозита, в регистр ОперацииДепозита нормально добавляется инфа о вводе депозита, но также добавляются пустые записи, по количеству соответствующие  количеству записей в регистре Ставки. И наооботрот, в регистре Ставки нормально прописана инфа о ставках, но имеются фейковые записи. Описана проблема коряво, поэтому посмотрите скрины во вложении в теме.

Попытался исправит проблему следующим образом:
Если (Операция=Перечисления.ОперацииСоСчетом.ВводДепозита)
Или (Операция=Перечисления.ОперацииСоСчетом.ВыводДепозита) Тогда
   // регистр ВводДепозита Приход
Движения.ОперацииСДепозитом.Записывать = Истина;
Движения.Ставки.Записывать = Ложь;
    Движение = Движения.ОперацииСДепозитом.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
    Движение.Период = Дата;
    Движение.Счет = Счет;
Движение.Операция=Операция;
//если не ставка
Если Операция<>Перечисления.ОперацииСоСчетом.Ставка Тогда
    Движение.Деньги= СуммаОперации;
        КонецЕсли;


Иначе
//регистр Ставки

Движения.Ставки.Записывать = Истина;
Движения.ОперацииСДепозитом.Записывать = Ложь;

   
//если ставка на экспресс
Если Экспресс=Истина Тогда

Движение2 = Движения.Ставки.Добавить();
        Движение2.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение2.Период = Дата;
        Движение2.Счет = Счет;

   Движение2.ФорматСтавки=Перечисления.ФорматСтавки.Экспресс;//формат ставки
   Движение2.Кэф=KэфЭкспресса;//кэф экспресса
   Движение2.Ставка=СуммаОперации;//ставка
   Движение2.Деньги=Прибыль;//результат ставки
   Движение2.РезультатСтавки=РезультатЭкспресса;//результат экспресса
КонецЕсли;


//если ставки на ординары
Если Экспресс=Ложь Тогда
Для каждого ТекСтрока Из Ставки Цикл
Движение2 = Движения.Ставки.Добавить();
        Движение2.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение2.Период = Дата;
        Движение2.Счет = Счет;

Движение2.Период = Дата;
        Движение2.Счет = Счет;

  Движение2.ФорматСтавки=ТекСтрока.ФорматСтавки; //формат ставки
  Движение2.Соревнование=ТекСтрока.Соревнование;//соревнование
  Движение2.Хозяева=ТекСтрока.Хозяева;//хозяева
  Движение2.Гости=ТекСтрока.Гости;//гости
  Движение2.Страна=ТекСтрока.Страна; //страна соревнования
  Движение2.ТипСтавки=ТекСтрока.ТипСтавки;//тип ставки
  Движение2.Кэф=ТекСтрока.КэфСобытия; //кэф ставки
  Движение2.РезультатСтавки=ТекСтрока.СтатусСтавки;//рещультат ставки
  Движение2.Ставка=ТекСтрока.Ставка; //ставка
  Движение2.Деньги=ТекСтрока.Профит;//профит
  КонецЦикла;
КонецЕсли;

КонецЕсли;


mahaidor

Хм лучше удалять ненужные записи регистра через НаборЗаписей, или это лишние телодвижения будут?

Kironten

Цитата: mahaidor от 11 ноя 2016, 08:41
Хм лучше удалять ненужные записи регистра через НаборЗаписей, или это лишние телодвижения будут?
Некорректно написан блок движений в коде.
А что вы именно хотите добиться то? Сейчас вы предлагаете бороться с последствиями, а не с причинами возникновения.
Если регистры закрываются, то в принципе уже неважно. Можете оставить все как есть, пусть этот "Франкенштейн" доживает свою жизнь.
Или вы это детище сами разрабатываете?

mahaidor

Цитата: Kironten от 11 ноя 2016, 09:51
Цитата: mahaidor от 11 ноя 2016, 08:41
Хм лучше удалять ненужные записи регистра через НаборЗаписей, или это лишние телодвижения будут?
Некорректно написан блок движений в коде.
А что вы именно хотите добиться то? Сейчас вы предлагаете бороться с последствиями, а не с причинами возникновения.
Если регистры закрываются, то в принципе уже неважно. Можете оставить все как есть, пусть этот "Франкенштейн" доживает свою жизнь.
Или вы это детище сами разрабатываете?
Сам для себя разрабатываю, и я не профи, поэтому для вас код как "Франкштейн":lol:
Если есть некорректность кода, то она в чем заключается?

Kironten

Навскидку два варианта:
1. Делаете в соответствующем регистре записи только соответствующего вида операции.
2. Пишите всё в один регистр, различаете видом операции.
В любом случае, логика такова, что выводом депозита/ставки, вы закрываете регистр (в вашем случае делаете записи расхода). Так как вы делаете это одним документом, то надо различать приход и расход.

У вас же например:
Если (Операция=Перечисления.ОперацииСоСчетом.ВводДепозита)
        Или (Операция=Перечисления.ОперацииСоСчетом.ВыводДепозита) Тогда
       // регистр ВводДепозита Приход
        Движения.ОперацииСДепозитом.Записывать = Истина;
        Движения.Ставки.Записывать = Ложь;
        Движение = Движения.ОперацииСДепозитом.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
...

Согласно этому куску кода, неважно кладете ли вы на депозит или снимаете с него, вы добавляете приход в регистр - это неправильно с точки зрения учета.

Или вот:
//если ставки на ординары
Если Экспресс=Ложь Тогда
    Для каждого ТекСтрока Из Ставки Цикл
    Движение2 = Движения.Ставки.Добавить();
    Движение2.ВидДвижения = ВидДвиженияНакопления.Приход;
    Движение2.Период = Дата;

Та же ерунда. Регистр не закроется.

Т.е. логика такова:
Определитесь приход это или расход, а затем определяйтесь что именно вы приходуете/расходуете (ставку, депозит, или и то и то), и делайте соответствующие движения в соответствующих регистрах.

mahaidor

Цитата: Kironten от 11 ноя 2016, 10:46
Навскидку два варианта:
1. Делаете в соответствующем регистре записи только соответствующего вида операции.
2. Пишите всё в один регистр, различаете видом операции.
В любом случае, логика такова, что выводом депозита/ставки, вы закрываете регистр (в вашем случае делаете записи расхода). Так как вы делаете это одним документом, то надо различать приход и расход.

У вас же например:
Если (Операция=Перечисления.ОперацииСоСчетом.ВводДепозита)
        Или (Операция=Перечисления.ОперацииСоСчетом.ВыводДепозита) Тогда
       // регистр ВводДепозита Приход
        Движения.ОперацииСДепозитом.Записывать = Истина;
        Движения.Ставки.Записывать = Ложь;
        Движение = Движения.ОперацииСДепозитом.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
...

Согласно этому куску кода, неважно кладете ли вы на депозит или снимаете с него, вы добавляете приход в регистр - это неправильно с точки зрения учета.

Или вот:
//если ставки на ординары
Если Экспресс=Ложь Тогда
    Для каждого ТекСтрока Из Ставки Цикл
    Движение2 = Движения.Ставки.Добавить();
    Движение2.ВидДвижения = ВидДвиженияНакопления.Приход;
    Движение2.Период = Дата;

Та же ерунда. Регистр не закроется.

Т.е. логика такова:
Определитесь приход это или расход, а затем определяйтесь что именно вы приходуете/расходуете (ставку, депозит, или и то и то), и делайте соответствующие движения в соответствующих регистрах.
Спасибо , че-то действительно накошмарил я против логики :trhregerhg:

mahaidor

ну проблему решил , создав в конфигураторе документы "ВводДепозита", "ВыводДепозита" "СтавкиНаОрдинары","СтавкиНаЭкспрессы", таким образом становится все логично при проведении. Только для вывода депозита новый регистр создам типа расход. А для ставок тип регистраприход, потому что в случае проигрыша профит пишется в виде отрицательного числа, а в случае выигрыша, профит выглядит как положительное число.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск