Имя: Пароль:
1C
1С v8
Обеспечение возможности ручной корректировки проводок в самописном документе
0 lighthead9288
 
10.02.14
22:52
Доброго времени суток, уважаемые эксперты. Стоит задача: обеспечить возможность ручной корректировки проводок созданного документа ПриходТовара(имеющего соответствующий реквизит РучнаяКорректировка).
Для этого на кнопку ДтКт на форме документа подцеплена стандартная обработка КорректировкаДвижений.

Содержание модуля объекта следующее:
Процедура ОбработкаПроведения(Отказ, Режим)
    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
        
        // ПОДГОТОВКА ПРОВЕДЕНИЯ ПО ДАННЫМ ДОКУМЕНТА
    ПроведениеСервер.ПодготовитьНаборыЗаписейКПроведению(ЭтотОбъект);
    Если РучнаяКорректировка Тогда            
        Возврат;
    КонецЕсли;

          
    // регистр ПРОБА_движения_товаров Приход
    Движения.ПРОБА_движения_товаров.Записывать = Истина;
    Для Каждого ТекСтрокаПриходТовара Из ПриходТовара Цикл
        Движение = Движения.ПРОБА_движения_товаров.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
        Движение.Период = Дата;
        Движение.Дата = Дата;
        Движение.Партия = Ссылка;
        Движение.Товар = ТекСтрокаПриходТовара.Товар;
        Движение.Склад = Склад;
        Движение.Организация = Организация;
        Движение.Количество = ТекСтрокаПриходТовара.Количество;
        Движение.Стоимость = ТекСтрокаПриходТовара.Сумма;
    КонецЦикла;

    //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
                                

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

    // Посчитать суммы документа и записать ее в соответствующий реквизит шапки для показа в журналах
    //СуммаДокумента = Товары.Итог("Сумма");
    
КонецПроцедуры



Запустил отладку, установил флажок "Корректировка движений", попробовал провести - вылезла ошибка
"Данные были изменены или удалены другим пользователем".
Решил данную проблему обновлением формы документа:
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    ЭтаФорма.Прочитать();
        
КонецПроцедуры


Всё чудесно проводится,но появилась новая проблема - при изменении значений табличной части или реквизитов формы и последующем проведении сохраняются старые значения.(К примеру, был приход на Склад1 5 единиц Товара1;  изменяешь 5 единиц на 4 - всё равно остаётся 5).
Очевидно, что это связано с этим:
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    ЭтаФорма.Прочитать();
        
КонецПроцедуры


Возникает вопрос: как правильно обновить форму? В правильном ли месте(на клиенте) я это делаю?
Заранее спасибо.
1 Анютик
 
10.02.14
22:59
где сохраняются старые значения? в проводках?
2 lighthead9288
 
10.02.14
23:00
И в проводках, и на форме
3 Анютик
 
10.02.14
23:03
так, действия на форме , которые передзаписью - бред
посмотрите, как в типовых.
4 Анютик
 
10.02.14
23:05
чтобы разрешить ручную корректировку проводок
добавляем реквизит РучнаяКорректировка
о какой конфигурации идет речь непонятно...потому смотрим БУ:) включаем наш документ в подписку
5 lighthead9288
 
10.02.14
23:07
Конфигурация Бухгалтерия предприятия, редакция 3.0 (3.0.28.7)

Реквизит РучнаяКорректировка уже добавлен; документ в подписку уже включен
6 Анютик
 
10.02.14
23:12
в общую команду ПоказатьДвиженияДокумента включен?
7 Анютик
 
10.02.14
23:14
отмена проведения как написана?
8 Анютик
 
10.02.14
23:14
вообще проще взять любой типовой документ, хоть поступление, хоть реализацию и по ним проверить
9 Анютик
 
10.02.14
23:15
и еще, нет ли у вас реквизита "Движение" на форме?:))
10 lighthead9288
 
10.02.14
23:18
В общую команду документ включен.


Отмена проведения:
Процедура ОтменаПроведенияМО() ЭКСПОРТ
    
ЭтотОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);    
    ПроведениеСервер.ПодготовитьНаборыЗаписейКОтменеПроведения(ЭтотОбъект);
Движения.Записать();
    
КонецПроцедуры


Реквизита "Движение" на форме нет=)
11 lighthead9288
 
12.02.14
16:37
Спасибо большое за ответы! Я разобрался )
Дело вот в чём: в стандартной обработке "КорректировкаДвижений", к которой "подцеплен" документ, есть такой участок:


////-----------------Изменяем значение реквизита формы-------
    //  ЗаписатьЗначениеРучнойКорректировки();
    ////---------------------------------------------------------

    ЗаписатьДвижения(Отказ);

    Если НЕ Отказ Тогда

        Если ИзмененаРучнаяКорректировка Тогда
            ОповеститьОбИзменении(ДокументСсылка);
        КонецЕсли;

        ЭтаФорма.Модифицированность = Ложь;
        
        Оповестить("ВыполненаЗаписьДокумента",Новый Структура("ДокументСсылка",ДокументСсылка));

        Закрыть();

    КонецЕсли;

Следовательно, на форме надо было просто обработать это оповещение в событии ОбработкаОповещения:


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