Имя: Пароль:
1C
1С v8
Запись движений при записи документа
0 Vladislava-smile
 
22.06.24
09:44
При записи реализации должна проходить запись в регистр накопления. УТ10.3

Движения автоматически не удаляются, запись идет модифицированных. Движения соответсвенно удаляются при перепроведении и отмене проведения, а мне этого не нужно, должны удалятся при пометке удаления.

Не хочется городить лишний документ, не хочется сильно менять   конфигурацию. Есть мысль при удалении движений делать исключения. Не могу понять  немного суть процедуры.

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

        Если МассивИсключений <> Неопределено и МассивИсключений.Найти(ИмяРегистра) <> Неопределено тогда
            Продолжить;    
        КонецЕсли;
        
        МассивОбрабатываемыхСтрокТаблицыДвижений.Добавить(СтрокаДвижения);
        
        Если ТипРегистра = "РегистрНакопления" Тогда
            Набор = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей();
                
        ИначеЕсли ТипРегистра = "РегистрСведений" Тогда
            Набор = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей();              
                
        КонецЕсли;

        Если НЕ ПравоДоступа("Изменение", Набор.Метаданные()) Тогда
            // отсутствуют права на всю таблицу регистра
            СообщитьОбОшибке("Нарушение прав доступа", Отказ, СтрокаДвижения.Имя);
            Возврат;
        КонецЕсли;

        Набор.Отбор.Регистратор.Установить(ДокументОбъект.Ссылка);            

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

КонецПроцедуры

// Процедура очищает коллекцию движений документа

Процедура ОчисткаКоллекцииДвиженийДокумента(ДокументОбъект) Экспорт
        
    Для Каждого Движение ИЗ ДокументОбъект.Движения Цикл
        Если Движение.Количество() > 0 Тогда
            Движение.Очистить();
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры
1 Vladislava-smile
 
22.06.24
09:45
Массив исключений - это моя дописка
2 Vladislava-smile
 
22.06.24
09:47
//ОчисткаКоллекцииДвиженийДокумента(ДокументОбъект);

Когда она закомментирована - то мое исключение срабатывает. Но я не могу понять за что отвечает эта функция. Потому что наборы же мы записываем выше ... Просветите)
3 lEvGl
 
22.06.24
10:15
Движения соответсвенно удаляются при перепроведении и отмене проведения, а мне этого не нужно


👍 🔥 есче
4 Мультук
 
24.06.24
08:28
(0)




Поломать типовое поведение (движения только у проведенного документа) можно.
Пример УТ11.5 и поведение документов "Передача товаров организаций" при отмене проведения.
Но нужно ли ?

Добавьте в реализацию флаг "чуть-чуть беременна".
Флаг вынести в форму, чтобы даже слепой его увидел.
При проведении с этим флагом реализация документ делает движения только по вашему регистру,
без него по вашему и всем остальным "по которым нужно".

Так тоже "ничего хорошего", но имхо всё же лучше.
5 Ненавижу 1С
 
24.06.24
08:12
(4) лучше в регистр сведений измерением, чтобы потом не добавлять реквизит во второй, третий и т.д. документ