Имя: Пароль:
1C
1С v8
Ошибка блокировки объекта
0 altfin
 
06.05.18
10:53
Полдня бьюсь, помогите пжл.
Из формы одного документа создаю другой (созданный док открывается, провожу. закрываю), в итоге оба получаются заблокированными. Закрытие документов и повторное открытие вопрос не решает, только перезапуск базы.

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

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

&НаСервере
Процедура СоздатьРеализацияТоваровУслугНаСервере(ДанныеФормы)

    ДокРТиУ = Документы.РеализацияТоваровУслуг.СоздатьДокумент();              
        
    ДокРТиУ.Дата = Объект.Дата;    

    ДокРТиУ.Организация = Объект.Организация;
    ДокРТиУ.БанковскийСчетОрганизации  = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Организация, "ОсновнойБанковскийСчет");
    ДокРТиУ.СчетУчетаРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.РасчетыСПокупателями;
    ДокРТиУ.СчетУчетаРасчетовПоАвансам = ПланыСчетов.Хозрасчетный.РасчетыПоАвансамПолученным;
    ДокРТиУ.Контрагент = Объект.Контрагент;
    ДокРТиУ.ВалютаДокумента = Константы.ВалютаРегламентированногоУчета.Получить();
    ДокРТиУ.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.Товары;
    ДокРТиУ.Ответственный = ПараметрыСеанса.ТекущийПользователь;    
    ДокРТиУ.ДоговорКонтрагента = Объект.Договор;
    ДокРТиУ.Склад = Объект.Склад;
    ДокРТиУ.СпособЗачетаАвансов = Перечисления.СпособыЗачетаАвансов.Автоматически;
    ДокРТиУ.СуммаВключаетНДС = Истина;
    ДокРТиУ.Комментарий = "#Создан на основании " + Объект.Ссылка;
    ДокРТиУ.Товары.Очистить();
    
    //ТЧ
    НС = ДокРТиУ.Товары.Добавить();
    НС.СчетУчета = Объект.СчетУчета;
    НС.СчетДоходов  = ПланыСчетов.Хозрасчетный.ВыручкаСельХоз;
    НС.Субконто = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию(Объект.Сырье.Наименование);
    НС.СчетРасходов = ПланыСчетов.Хозрасчетный.СебестоимостьПродажСельХоз;
    НС.СчетУчетаНДСПоРеализации = ПланыСчетов.Хозрасчетный.Продажи_НДССельХоз;
    НС.Номенклатура = Объект.Сырье;
    НС.Количество = Объект.Нетто;
    НС.ЕдиницаИзмерения = НС.Номенклатура.ЕдиницаИзмерения;
    НС.СтавкаНДС = Перечисления.СтавкиНДС.НДС10;
    НС.Цена = ПолучитьЦенуПродажи(Объект.Сырье);
    НС.Сумма = Окр(НС.Цена*НС.Количество,2);
    НС.СуммаНДС = ?(ДокРТиУ.СуммаВключаетНДС,НС.Сумма/110*10,НС.Сумма*10/100);
    
    ЗначениеВДанныеФормы(ДокРТиУ, ДанныеФормы);
    
    ДокРТиУ = "";
    
КонецПроцедуры
1 rphosts
 
06.05.18
10:58
1.сохрани исходный документ
2.только после этого создавай-записывай-проводи другой.

оберни всё это в попытку-исключение, перед попыткой начинай транзакцию и если случилось исключение - откат, если нет - коммит
2 altfin
 
06.05.18
11:14
(1) попробовал, но видимо проблема в другом:
Проблема возникает когда добавляю строчки:

ОписаниеОповещ = Новый ОписаниеОповещения("ЗакрытиеФормы", ЭтаФорма, Форма);
Форма.ОписаниеОповещенияОЗакрытии = ОписаниеОповещ;

Кусок кода:

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

И потом:

&НаКлиенте
Процедура ЗакрытиеФормы(Рез, ДопПараметры) Экспорт
    
    Объект.РеализацияТовУслуг = ДопПараметры.Объект.Ссылка;  
    Записать();
    
КонецПроцедуры
3 cons74
 
07.05.18
07:22
Общение форм спасет отца русской демократии: в подчиненной вызов Оповестить(), или тупо Владелец.РТУ=Объект.Ссылка. Без всяких ОписаниеОповещения().

P.s.
А зачем создавать объект через форму? Почему не обычное Объект = Документы.РТУ.Создать и потом ОткрытьФорму(,,...Объект). Ну как-то так.