Имя: Пароль:
1C
1С v8
После записи объекта элементы формы ведут себя, как будто объект не записан
0 alexa19
 
30.05.16
07:24
Добрый день!
Вопрос связан с управляемыми формами.
Форме элемента справочника добавлен реквизит с типом Динамический список у которого основная таблица Регистр сведений. Динамический список перенесен на форму, т. е. на форме появилась таблица, привязанная к динамическому списку. При этом при перетаскивании динамического списка на форму вместе с таблицей появилась командная панель с кнопкой Создать. При нажатии на эту кнопку открывается форма записи регистра сведений, т. е. из формы элемента справочника можно добавить запись в регистр.
Все работает замечательно.

Попытался обыграть такую ситуацию в форме записи регистра:
при попытке добавить запись в регистр для не записанного элемент справочника выдавать вопрос: "Элемент не записан. Записать?" И если ответ "Да" то записываем элемент справочника и потом продолжаем вводить запись регистра. Опять все сработало хорошо.

Хочу заметить, что элемент справочника был записан программно, но форма элемента еще ни разу не закрывалась.

Следующие действия: еще раз нажимаю на кнопку Создать, чтобы ввести следующую запись в регистр сведений. И опять появляется вопрос "Элемент не записан. Записать?" Хотя элемент уже записан в базу.

Помогите разобраться что я упускаю!

Вот код формы записи регистра:

&НаКлиенте
Процедура ОбработкаОтвета(Результат, ВладелецОбъект) Экспорт

    Если Результат = КодВозвратаДиалога.Нет Тогда
        ЭтаФорма.Закрыть();    
    Иначе
        ЗаписатьОбъект(ВладелецОбъект);
        
        Запись.Контакт = ВладелецОбъект.Ссылка;
        
        ВладелецФормы.Родитель.Родитель.Модифицированность = Ложь;
        
    КонецЕсли;

КонецПроцедуры // ОбработкаОтвета()

&НаСервере
Процедура ЗаписатьОбъект(Объект)

    ОбъектБазы = ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.КонтактныеЛица"));
    ОбъектБазы.Записать();
    
    ЗначениеВДанныеФормы(ОбъектБазы,Объект);


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


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ВладелецОбъект = ВладелецФормы.Родитель.Родитель.Объект;
    Если ТипЗнч(ВладелецОбъект.Ссылка) = Тип("СправочникСсылка.КонтактныеЛица") Тогда
        Если ВладелецОбъект.Ссылка.Пустая() Тогда
            
            Оповещение = Новый ОписаниеОповещения("ОбработкаОтвета", ЭтотОбъект, ВладелецОбъект);
            ПоказатьВопрос(Оповещение, "Элемент не записан. Записать?", РежимДиалогаВопрос.ДаНет);
            
        Иначе
            Запись.КонтактноеЛицо = ВладелецОбъект.Ссылка;
        КонецЕсли;
        
    КонецЕсли;
КонецПроцедуры
1 rifat
 
30.05.16
07:51
в отладчике посмотрите какие значения принимает ВладелецОбъект.Ссылка?
2 alexa19
 
30.05.16
08:17
(1) (1)При первом добавлении записи и повторном - Неопределенно. Хотя на момент записи самого элемента (т. е. после отработки процедуры ЗаписатьОбъект) ВладелецОбъект.Ссылка имеет правильное значение
3 alexa19
 
30.05.16
08:18
(1) А вот если форму элемента справочника закрыть и открыть, то ВладелецОбъект.Ссылка всегда имеет правильную ссылку
4 Mort
 
30.05.16
10:11
Решение через заднее место
5 write
 
30.05.16
10:28
Нужно использовать ОбработкаОповещения() в справочнике, в регистре Оповестить(), после оповещения, форму справочника Прочитать().

Посмотрите в типовые, в них сначала просят записать элемент, а затем работают с регистрами сведений.
6 Mort
 
30.05.16
10:38
(5) - Шедевр, однозначно!

Но я видел решение гораздо круче.
В форме контрагента было поле ДС регистра паспортных данных и поле ввода реквизита "Основные данные". При записи регистра в этом контрагенте изменялся реквизит "Основные данные". А на форме контрагента при изменении поля ДС вызывалось "Перечитать".
7 alexa19
 
30.05.16
11:01
(5) Благодарю!
8 alexa19
 
30.05.16
16:17
(5) Write, сделал как вы сказали, все получилось. Но этот прием почему-то не работает с обновлением динамического списка (КонтактныеДанные). Можете подсказать в чем проблема?

Форма регистра записи:
Процедура ПослеЗаписи(ПараметрыЗаписи)
    Оповестить("КонтактноеЛицо_Обновить");
КонецПроцедуры // ПослеЗаписи()


Форма элемента справочника:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
    Если ИмяСобытия = "КонтактноеЛицо_Записать" Тогда
    
        ЗаписатьОбъект(); //записали объект в базу
        ЭтотОбъект.Прочитать();
        
    ИначеЕсли ИмяСобытия = "КонтактноеЛицо_Обновить" Тогда
        
        УстановитьОтборКонтактныхДанных(); //устанавливаю отбор записей по ссылке текущего элемента справочника
        Элементы.КонтактныеДанные.Обновить();
        
    КонецЕсли;
    
КонецПроцедуры
Независимо от того, куда вы едете — это в гору и против ветра!