Всем здравия!
1С 8.2 самописная конфигурация в режиме "Управляемое приложение".
Есть справочник "Номеклатура".
Реквизиты: Наименование, ОбъемПоУмолчанию - СправочникСсылка.Объем.
Ему подчинен справочник "Объем".
При копировании элемента "Номенклатура" нужно создать новый подчиненный элемент в "Объем" и привязать его.
Для этого в модуле объекта создал обработчик ПриКопировании (названия справочников содержат еще префикс "НИС_Спр_Нм_"):
////////////////////////////////////////////////////////////////////////////
//
// Назначение: Наследует (копирует) "ОбъемПоУмолчанию" источника копирования
//
// Вызов: Событие "ПриКопировании"
//
Процедура ПриКопировании(пОбъектКопирования)
// ========================================
// = Проверить наличие "ОбъемПоУмолчанию" =
// ========================================
Если ЭтотОбъект.ОбъемПоУмолчанию = Справочники.НИС_Спр_Нм_Объем.ПустаяСсылка() Тогда
// = Нет "ОбъемПоУмолчанию"
// ========================
// ==========================
// = Ничего делать не нужно =
// ==========================
Возврат;
КонецЕсли; // ЭтотОбъект.ОбъемПоУмолчанию = Справочники.НИС_Спр_Нм_Объем.ПустаяСсылка()
// ===============================================================================
// = Дальше идем если есть "ОбъемПоУмолчанию" =
// = Нужно сделать копию с подчинением новому элементу "НИС_Спр_Нм_Номенклатура" =
// ===============================================================================
// ==================================================
// - Создать копию в справочнике "НИС_Спр_Нм_Объем" -
// ==================================================
лНовыйОбъемПоУмолчанию = ЭтотОбъект.ОбъемПоУмолчанию.Скопировать();
ЭтотОбъект.Записать();
// ============================
// - Зафиксировать "Владелец" -
// ============================
лНовыйОбъемПоУмолчанию.Владелец = ЭтотОбъект;
// ============
// - Записать -
// ============
лНовыйОбъемПоУмолчанию.Записать(); // ЗДЕСЬ ВЫХОДИТ ОШИБКА
// ===============================================================
// = Привязать копию к новому элементу "НИС_Спр_Нм_Номенклатура" =
// ===============================================================
ЭтотОбъект.ОбъемПоУмолчанию = лНовыйОбъемПоУмолчанию;
КонецПроцедуры // ПриКопировании
ПриКопировании не подходит, в это время еще не создан новый Владелец. Создать подчиненный элемент можно только после записи нового.
Владельцем не может быть объект, - только ссылка. Пока объект не записан, ссылки на него нет. Используйте "ПослеЗаписи".
// **************
// * Переменные *
// **************
/////////////////////////////////////////////////////////////////////////////////////////////
//
// Назначение: передача команды "СкопироватьОбъемПоУмолчанию"
//
// Использование:
// 1) Устанавливается в процедуре "ПриКопировании";
// 2) Считывается в процедуре "ПриЗаписи" (после считывания сбрасывается в "Неопределено")
//
Перем мСкопироватьОбъемПоУмолчанию;
// ****************
// * Подпрограммы *
// ****************
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Назначение:
// Подготавливает обработку наследования (копирования) "ОбъемПоУмолчанию" источника копирования;
//
// Вызов: Событие "ПриКопировании"
//
Процедура ПриКопировании(пОбъектКопирования)
// ========================================
// = Проверить наличие "ОбъемПоУмолчанию" =
// ========================================
Если ЭтотОбъект.ОбъемПоУмолчанию = Справочники.НИС_Спр_Нм_Объем.ПустаяСсылка() Тогда
// = Нет "ОбъемПоУмолчанию"
// ========================
// ===================================================
// = Сбросить команду скопировать "ОбъемПоУмолчанию" =
// ===================================================
мСкопироватьОбъемПоУмолчанию = Неопределено;
Иначе
// = Есть "ОбъемПоУмолчанию"
// =========================
// ==================================================
// = Создать команду скопировать "ОбъемПоУмолчанию" =
// ==================================================
мСкопироватьОбъемПоУмолчанию = Истина;
КонецЕсли; // ЭтотОбъект.ОбъемПоУмолчанию = Справочники.НИС_Спр_Нм_Объем.ПустаяСсылка()
// ==================================================
// = Дальше обработка будет в процедуре "ПриЗаписи" =
// ==================================================
КонецПроцедуры // ПриКопировании
///////////////////////////////////////////////////////////////////////////////////////////////
//
// Назначение: Обрабатывает наследование (копирование) "ОбъемПоУмолчанию" источника копирования
//
// Вызов: Событие "ПриЗаписи"
//
Процедура ПриЗаписи(пОтказ)
// ==========================================================================================
// = Проверить необходимость копирования "ОбъемПоУмолчанию" =
// = =
// = В процедуре "ПриКопировании" устанавливается значение мСкопироватьОбъемПоУмолчанию =
// ==========================================================================================
Если мСкопироватьОбъемПоУмолчанию <> Неопределено Тогда
// = Нужно копировать "ОбъемПоУмолчанию"
// =====================================
// ==================================================
// - Создать копию в справочнике "НИС_Спр_Нм_Объем" -
// ==================================================
лНовыйОбъемПоУмолчанию = ЭтотОбъект.ОбъемПоУмолчанию.Скопировать();
// ============================
// - Зафиксировать "Владелец" -
// ============================
лНовыйОбъемПоУмолчанию.Владелец = ЭтотОбъект;
// ============
// - Записать -
// ============
лНовыйОбъемПоУмолчанию.Записать();
// ===============================================================
// = Привязать копию к новому элементу "НИС_Спр_Нм_Номенклатура" =
// ===============================================================
ЭтотОбъект.ОбъемПоУмолчанию = лНовыйОбъемПоУмолчанию;
мСкопироватьОбъемПоУмолчанию = Неопределено;
КонецЕсли; // мСкопироватьОбъемПоУмолчанию <> Неопределено
КонецПроцедуры // ПриЗаписи
Присвоение переменной отрабатывает корректно.
Почему решили, что в "ПриЗаписи" мСкопироватьОбъемПоУмолчанию = Неопределено?
Процедура ПриЗаписи(пОтказ)
// ==========================================================================================
// = Проверить необходимость копирования "ОбъемПоУмолчанию" =
// = =
// = В процедуре "ПриКопировании" устанавливается значение мСкопироватьОбъемПоУмолчанию =
// ==========================================================================================
Если мСкопироватьОбъемПоУмолчанию <> Неопределено Тогда // ТОЧКА ОСТАНОВКИ ЗДЕСЬ
В таком случае делайте поиск по "мСкопироватьОбъемПоУмолчанию" и смотрите, где еще может меняться ее значение.
Не обратил внимание, что речь идет об управляемом приложении.
Такой вариант не пройдет.
Решил вопрос через ПараметрыСеанса.
Сначала в конфигурации создал параметр сеанса "СкопироватьОбъемПоУмолчанию", тип "Булево".
Потом:
Процедура ПриКопировании(пОбъектКопирования)
// ========================================
// = Проверить наличие "ОбъемПоУмолчанию" =
// ========================================
Если ЭтотОбъект.ОбъемПоУмолчанию = Справочники.НИС_Спр_Нм_Объем.ПустаяСсылка() Тогда
// = Нет "ОбъемПоУмолчанию"
// ========================
// ===================================================
// = Сбросить команду скопировать "ОбъемПоУмолчанию" =
// ===================================================
ПараметрыСеанса.СкопироватьОбъемПоУмолчанию = Ложь;
Иначе
// = Есть "ОбъемПоУмолчанию"
// =========================
// ==================================================
// = Создать команду скопировать "ОбъемПоУмолчанию" =
// ==================================================
ПараметрыСеанса.СкопироватьОбъемПоУмолчанию = Истина;
КонецЕсли; // ЭтотОбъект.ОбъемПоУмолчанию = Справочники.НИС_Спр_Нм_Объем.ПустаяСсылка()
// ==================================================
// = Дальше обработка будет в процедуре "ПриЗаписи" =
// ==================================================
КонецПроцедуры // ПриКопировании
///////////////////////////////////////////////////////////////////////////////////////////////
//
// Назначение: Обрабатывает наследование (копирование) "ОбъемПоУмолчанию" источника копирования
//
// Вызов: Событие "ПриЗаписи"
//
Процедура ПриЗаписи(пОтказ)
// ===============================================
// = Получить флаг "СкопироватьОбъемПоУмолчанию" =
// ===============================================
// Получить значение
лСкопироватьОбъемПоУмолчанию = ПараметрыСеанса.СкопироватьОбъемПоУмолчанию;
// Обработать на отсутствие данных
Если лСкопироватьОбъемПоУмолчанию = Неопределено Тогда
лСкопироватьОбъемПоУмолчанию = Ложь;
КонецЕсли;
// ======================================================================================
// = Проверить необходимость копирования "ОбъемПоУмолчанию" =
// = =
// = В процедуре "ПриКопировании" устанавливается значение СкопироватьОбъемПоУмолчанию =
// ======================================================================================
Если лСкопироватьОбъемПоУмолчанию Тогда
Я бы все-таки предложил уйти от модуля объекта и делать все в форме.
В "ПриСозданииНаСервере" среди параметров формы есть "ЗначениеКопирования". Дальше, думаю, разобраться не сложно.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua