Версия для печати темы (https://pro1c.org.ua/index.php?s=587b2029f449909980eae1f67ae68eb4&showtopic=23908)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование управляемых форм 1С 8.2 _ Создать элемент в подчиненном справочнике при копировании

Автор: SV71 01.07.15, 12:55

Всем здравия!

1С 8.2 самописная конфигурация в режиме "Управляемое приложение".

Есть справочник "Номеклатура".
Реквизиты: Наименование, ОбъемПоУмолчанию - СправочникСсылка.Объем.

Ему подчинен справочник "Объем".

При копировании элемента "Номенклатура" нужно создать новый подчиненный элемент в "Объем" и привязать его.

Для этого в модуле объекта создал обработчик ПриКопировании (названия справочников содержат еще префикс "НИС_Спр_Нм_"):

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

    // ============================
    // - Зафиксировать "Владелец" -
    // ============================
    лНовыйОбъемПоУмолчанию.Владелец = ЭтотОбъект;
    
    // ============
    // - Записать -
    // ============
    лНовыйОбъемПоУмолчанию.Записать(); // ЗДЕСЬ ВЫХОДИТ ОШИБКА
    
    
    // ===============================================================
    // = Привязать копию к новому элементу "НИС_Спр_Нм_Номенклатура" =
    // ===============================================================
    ЭтотОбъект.ОбъемПоУмолчанию = лНовыйОбъемПоУмолчанию;
    
КонецПроцедуры // ПриКопировании


При исполнении выдает ошибку:
Цитата
Ошибка при выполнении обработчика - 'ПриКопировании'
по причине:
{Справочник.НИС_Спр_Нм_Номенклатура.МодульОбъекта(63)}: Ошибка при вызове метода контекста (Записать)
лНовыйОбъемПоУмолчанию.Записать();
по причине:
Значение поля "Владелец" не заполнено или заполнено неверно



Помогите решить вопрос

Автор: logist 01.07.15, 13:50

ПриКопировании не подходит, в это время еще не создан новый Владелец. Создать подчиненный элемент можно только после записи нового.

Автор: Petre 01.07.15, 14:02

Владельцем не может быть объект, - только ссылка. Пока объект не записан, ссылки на него нет. Используйте "ПослеЗаписи".

Автор: SV71 02.07.15, 8:15

Цитата(Petre @ 01.07.15, 16:02) http://pro1c.org.ua/index.php?act=findpost&pid=100425.

Из нее следует, что наиболее удобным для решения моей задачи является событие "ПриЗаписи".

Для передачи команды на копирование решил использовать переменную модуля объекта "мСкопироватьОбъемПоУмолчанию":
// **************
// * Переменные *
// **************

/////////////////////////////////////////////////////////////////////////////////////////////
//
// Назначение: передача команды "СкопироватьОбъемПоУмолчанию"
//
// Использование:
//     1) Устанавливается в процедуре "ПриКопировании";
//    2) Считывается в процедуре "ПриЗаписи" (после считывания сбрасывается в "Неопределено")
//
Перем мСкопироватьОбъемПоУмолчанию;




// ****************
// * Подпрограммы *
// ****************


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


///////////////////////////////////////////////////////////////////////////////////////////////
//
// Назначение: Обрабатывает наследование (копирование) "ОбъемПоУмолчанию" источника копирования
//
// Вызов: Событие "ПриЗаписи"
//
Процедура ПриЗаписи(пОтказ)
            
    // ==========================================================================================
    // = Проверить необходимость копирования "ОбъемПоУмолчанию"                                 =
    // =                                                                                        =
    // = В процедуре "ПриКопировании" устанавливается значение мСкопироватьОбъемПоУмолчанию =
    // ==========================================================================================
    Если мСкопироватьОбъемПоУмолчанию <> Неопределено Тогда
        // = Нужно копировать "ОбъемПоУмолчанию"
        // =====================================
            
        // ==================================================
        // - Создать копию в справочнике "НИС_Спр_Нм_Объем" -
        // ==================================================
        лНовыйОбъемПоУмолчанию = ЭтотОбъект.ОбъемПоУмолчанию.Скопировать();
        
        // ============================
        // - Зафиксировать "Владелец" -
        // ============================
        лНовыйОбъемПоУмолчанию.Владелец = ЭтотОбъект;
        
        // ============
        // - Записать -
        // ============
        лНовыйОбъемПоУмолчанию.Записать();
                
        // ===============================================================
        // = Привязать копию к новому элементу "НИС_Спр_Нм_Номенклатура" =
        // ===============================================================
        ЭтотОбъект.ОбъемПоУмолчанию = лНовыйОбъемПоУмолчанию;

        мСкопироватьОбъемПоУмолчанию = Неопределено;
                        
    КонецЕсли; // мСкопироватьОбъемПоУмолчанию <> Неопределено
    
КонецПроцедуры // ПриЗаписи


Проверил: в "ПриКопировании" установка команды "мСкопироватьОбъемПоУмолчанию" в "Истина" происходит нормально.
Однако в "ПриЗаписи" значение "мСкопироватьОбъемПоУмолчанию"="Неопределено".

Подскажите способ передать данные из "ПриКопировании" в "ПриЗаписи".

Автор: Petre 02.07.15, 8:29

Цитата(SV71 @ 02.07.15, 9:15) *
Проверил: в "ПриКопировании" установка команды "мСкопироватьОбъемПоУмолчанию" в "Истина" происходит нормально.
Однако в "ПриЗаписи" значение "мСкопироватьОбъемПоУмолчанию"="Неопределено".

Не может быть.

Автор: SV71 02.07.15, 9:03

Цитата(Petre @ 02.07.15, 10:29) *
Не может быть.


Если не сложно, попробуйте у себя: скопруйте код в любой справочник и оставьте только установку и проверку переменной.

Может глюк среды: у меня 1С:Предприятие 8.3 (8.3.3.721), режим совместимости "Версия 8.2.16".

Автор: Petre 02.07.15, 9:14

Присвоение переменной отрабатывает корректно.
Почему решили, что в "ПриЗаписи" мСкопироватьОбъемПоУмолчанию = Неопределено?

Автор: sava1 02.07.15, 9:38

Цитата(SV71 @ 01.07.15, 13:55) *
При копировании элемента "Номенклатура" нужно создать новый подчиненный элемент в "Объем" и привязать его

А при простом добавлении - не надо?

Автор: SV71 02.07.15, 10:16

Цитата(Petre @ 02.07.15, 11:14) *
Присвоение переменной отрабатывает корректно.
Почему решили, что в "ПриЗаписи" мСкопироватьОбъемПоУмолчанию = Неопределено?


По значению "мСкопироватьОбъемПоУмолчанию" в отладчике.

Автор: Petre 02.07.15, 10:18

Цитата(SV71 @ 02.07.15, 11:16) *
По значению "мСкопироватьОбъемПоУмолчанию" в отладчике.

А где точка останова находится? Поставьте на условие.

Автор: SV71 02.07.15, 10:29

Цитата(Petre @ 02.07.15, 12:18) *
А где точка останова находится? Поставьте на условие.


Так и есть (см. ниже).

В месте выхода из "ПриКопировании" тоже ставил - там все нормально: "Истина".

Процедура ПриЗаписи(пОтказ)
            
    // ==========================================================================================
    // = Проверить необходимость копирования "ОбъемПоУмолчанию"                                 =
    // =                                                                                        =
    // = В процедуре "ПриКопировании" устанавливается значение мСкопироватьОбъемПоУмолчанию =
    // ==========================================================================================
    Если мСкопироватьОбъемПоУмолчанию <> Неопределено Тогда // ТОЧКА ОСТАНОВКИ ЗДЕСЬ

Автор: Petre 02.07.15, 10:48

В таком случае делайте поиск по "мСкопироватьОбъемПоУмолчанию" и смотрите, где еще может меняться ее значение.

Автор: SV71 02.07.15, 10:55

Цитата(Petre @ 02.07.15, 12:48) *
В таком случае делайте поиск по "мСкопироватьОбъемПоУмолчанию" и смотрите, где еще может меняться ее значение.


Сделал глобальный поиск - больше нигде нет.

Думаю тут вопрос вот в чем:
1) После работы "ПриКопировании" управление от "Модуля объекта" передается на управляемую форму.
2) После нажатия "Записать" на форме управление опять передается в "Модуль объекта", но он уже не помнить значение своих переменных, которые были установлены в "ПриКопировании".

Надо как-то по другому передать параметр из "ПриКопировании" в "ПриЗаписи".

Автор: Petre 02.07.15, 11:43

Не обратил внимание, что речь идет об управляемом приложении.
Такой вариант не пройдет.

Автор: SV71 02.07.15, 12:08

Решил вопрос через ПараметрыСеанса.

Сначала в конфигурации создал параметр сеанса "СкопироватьОбъемПоУмолчанию", тип "Булево".

Потом:

Процедура ПриКопировании(пОбъектКопирования)
    
    
    // ========================================
    // = Проверить наличие "ОбъемПоУмолчанию" =
    // ========================================
    Если ЭтотОбъект.ОбъемПоУмолчанию = Справочники.НИС_Спр_Нм_Объем.ПустаяСсылка() Тогда
        // = Нет "ОбъемПоУмолчанию"
        // ========================
        
        // ===================================================
        // = Сбросить команду скопировать "ОбъемПоУмолчанию" =
        // ===================================================
        ПараметрыСеанса.СкопироватьОбъемПоУмолчанию = Ложь;
        
    Иначе
        // = Есть "ОбъемПоУмолчанию"
        // =========================
        
        // ==================================================
        // = Создать команду скопировать "ОбъемПоУмолчанию" =
        // ==================================================
        ПараметрыСеанса.СкопироватьОбъемПоУмолчанию = Истина;
    
    КонецЕсли; // ЭтотОбъект.ОбъемПоУмолчанию = Справочники.НИС_Спр_Нм_Объем.ПустаяСсылка()
    
    
    // ==================================================
    // = Дальше обработка будет в процедуре "ПриЗаписи" =
    // ==================================================
    
        
КонецПроцедуры // ПриКопировании


///////////////////////////////////////////////////////////////////////////////////////////////
//
// Назначение: Обрабатывает наследование (копирование) "ОбъемПоУмолчанию" источника копирования
//
// Вызов: Событие "ПриЗаписи"
//
Процедура ПриЗаписи(пОтказ)
    
    // ===============================================
    // = Получить флаг "СкопироватьОбъемПоУмолчанию" =
    // ===============================================
    
    // Получить значение
    лСкопироватьОбъемПоУмолчанию = ПараметрыСеанса.СкопироватьОбъемПоУмолчанию;
    
    // Обработать на отсутствие данных
    Если лСкопироватьОбъемПоУмолчанию = Неопределено Тогда
        лСкопироватьОбъемПоУмолчанию = Ложь;
    КонецЕсли;
    
    
    
    // ======================================================================================
    // = Проверить необходимость копирования "ОбъемПоУмолчанию"                             =
    // =                                                                                    =
    // = В процедуре "ПриКопировании" устанавливается значение СкопироватьОбъемПоУмолчанию =
    // ======================================================================================
    Если лСкопироватьОбъемПоУмолчанию Тогда


Тема закрыта.

Всем спасибо за желание помочь!

Всех благ!!!

Автор: Petre 02.07.15, 12:51

Я бы все-таки предложил уйти от модуля объекта и делать все в форме.

Автор: SV71 08.07.15, 8:21

Цитата(Petre @ 02.07.15, 14:51) *
Я бы все-таки предложил уйти от модуля объекта и делать все в форме.


Интересное предложение.

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

Автор: Petre 08.07.15, 8:38

В "ПриСозданииНаСервере" среди параметров формы есть "ЗначениеКопирования". Дальше, думаю, разобраться не сложно.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua