Имя: Пароль:
1C
1С v8
Задвоение движений документа (да-да, снова)
0 IKSparrow
 
08.02.12
12:54
Платформа 8.2.15.289
SQL: 2000

У документа установлено: Удаление движений автоматически
Режим блокировки: Автоматический

В модуле документа, в процедуре ОбработкаПроведения перед записью движений следующий код:


   // получение списка регистров, по которым существуют движения
   ТаблицаДвижений = ОпределитьНаличиеДвиженийПоРегистратору(ДокументОбъект.Ссылка);
   ТаблицаДвижений.Колонки.Добавить("НаборЗаписей");
       
   Для Каждого СтрокаДвижения ИЗ ТаблицаДвижений Цикл
       // имя регистра передается как значение, полученное с помощью
       // функции ПолноеИмя() метаданных регистра
       ПозицияТочки = Найти(СтрокаДвижения.Имя, ".");
       ТипРегистра = Лев(СтрокаДвижения.Имя, ПозицияТочки - 1);
       ИмяРегистра = СокрП(Сред(СтрокаДвижения.Имя, ПозицияТочки + 1));
       
       Если РучнаяКорректировка Тогда
           Набор = ДокументОбъект.Движения[ИмяРегистра];
           Набор.Прочитать();
           Набор.УстановитьАктивность(Ложь);
           
       Иначе
           ЕСли ТипРегистра = "РегистрНакопления" Тогда
               МетаданныеНабора = Метаданные.РегистрыНакопления[ИмяРегистра];
               Набор = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей();
               
           ИначеЕсли ТипРегистра = "РегистрБухгалтерии" Тогда
               МетаданныеНабора = Метаданные.РегистрыБухгалтерии[ИмяРегистра];
               Набор = РегистрыБухгалтерии[ИмяРегистра].СоздатьНаборЗаписей();
               
           ИначеЕсли ТипРегистра = "РегистрСведений" Тогда
               МетаданныеНабора = Метаданные.РегистрыСведений[ИмяРегистра];
               Набор = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей();
               
           ИначеЕсли ТипРегистра = "РегистрРасчета" Тогда
               МетаданныеНабора = Метаданные.РегистрыРасчета[ИмяРегистра];
               Набор = РегистрыРасчета[ИмяРегистра].СоздатьНаборЗаписей();
               
           КонецЕсли;
           
           Если НЕ ПравоДоступа("Изменение", МетаданныеНабора) Тогда
               // отсутствуют права на всю таблицу регистра
               СообщитьОбОшибке("Нарушение прав доступа", Отказ, СтрокаДвижения.Имя);
               Возврат;
           КонецЕсли;
           
           Набор.Отбор.Регистратор.Установить(ДокументОбъект.Ссылка);            
           // набор не записывается сразу, чтобы не откатывать транзакцию, если впоследствии
           // выяснится, что на один из регистров не хватает прав.
       КонецЕсли;
       
       СтрокаДвижения.НаборЗаписей = Набор;        
       
   КонецЦикла;    
   
   Для Каждого СтрокаДвижения ИЗ ТаблицаДвижений Цикл        
       Попытка
           СтрокаДвижения.НаборЗаписей.Записать();
       Исключение
           // возможно «сработал» RLS или механизм даты запрета изменения
           СообщитьОбОшибке(ОписаниеОшибки(), Отказ, СтрокаДвижения.Имя);
           ВызватьИсключение "Операция не выполнена";
       КонецПопытки;
   КонецЦикла;
   
   Если (НЕ Отказ) И (НЕ РучнаяКорректировка) Тогда
       Для Каждого Движение ИЗ ДокументОбъект.Движения Цикл
           Если Движение.Количество() > 0 Тогда
               Движение.Очистить();
           КонецЕсли;
       КонецЦикла;
       Если НЕ ДокументОбъект.ПометкаУдаления Тогда
           ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
       КонецЕсли;
   КонецЕсли;


И всё равно, эта сволочь дублирует движения по регистру. Вообще не понимаю. Что не так делаю?
Погуглил на эту тему. Попробовал код вроде
Движения.Записывать = ИСТИНА
Движения.Очистить()

Системе монопенисуально. Движения двоит. Снимаешь с проведения, ставишь обратно - двоит.
1 qeos
 
08.02.12
12:58
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);

убейся
2 IKSparrow
 
08.02.12
13:10
(1) Не понял.
3 korefana
 
08.02.12
13:16
(0) занятная обработка проведения )))
еще и с рекурсивным вызовом самой себя...
4 IKSparrow
 
08.02.12
13:19
(3) С какого перепугу там рекурсия?
Код взят, между прочим, из типовой. В УТ так делается, например.
5 DmitryPavlik
 
08.02.12
13:24
Не любим мы все эти заморочки )
6 IKSparrow
 
08.02.12
13:26
Всё, не актуально. Решил проблему.

(5) :) Да я так и понял
7 Defender aka LINN
 
08.02.12
13:26
(4) Пруф или гтфо
8 korefana
 
08.02.12
13:29
(4) ну ка расскажи куда в типовой глянуть?
где это такие безобразия?
мож я чего не знаю...
9 IKSparrow
 
08.02.12
13:32
Я ж написал - Управление Торговлей. Вот смотрю в версию 10.3.3.3
10 korefana
 
08.02.12
13:36
(9) нету там вызова записи документа из обработки проведения
или потычь пальцем в модуль и номер строки
11 IKSparrow
 
08.02.12
13:40
Ну вот к примеру модуль документа поступление товаров услуг. Такой код аж в двух местах. В ОбработкеПровдения (прям с пятой строки) и ОбработкеУдаленияПроведения - с первой строки. И по всей конфе он раскидан.
12 Defender aka LINN
 
08.02.12
13:43
(11) Не наблюдаю там записи документа.
13 korefana
 
08.02.12
13:44
(11) там запись набора движений есть
а вот записи документа нету
тс чтото попутал
14 korefana
 
08.02.12
13:47
и если не секрет, как проблема то решилась?
интересно очень
15 hhhh
 
08.02.12
14:20
(14) понятно как: ТС пробежался по движениям и поудалял лишнее.
16 IKSparrow
 
08.02.12
14:22
(15) Ну это, батенька, совсем изврат.