Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Создать элемент в подчиненном справочнике при копировании          
SV71 Подменю пользователя
сообщение 01.07.15, 12:55
Сообщение #1

Говорящий
***
Группа: Пользователи
Сообщений: 80
Спасибо сказали: 3 раз
Рейтинг: 0

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

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

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

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

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

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

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


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



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

logist Подменю пользователя
сообщение 01.07.15, 13:50
Сообщение #2

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

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


Signature
Личные бесплатные консультации не даю, для этого есть форум!

Petre Подменю пользователя
сообщение 01.07.15, 14:02
Сообщение #3

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2902
Из: Київ, Україна
Спасибо сказали: 1144 раз
Рейтинг: 1225

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


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

SV71 Подменю пользователя
сообщение 02.07.15, 8:15
Сообщение #4

Говорящий
***
Группа: Пользователи
Сообщений: 80
Спасибо сказали: 3 раз
Рейтинг: 0

Цитата(Petre @ 01.07.15, 16:02) *
Владельцем не может быть объект, - только ссылка. Пока объект не записан, ссылки на него нет. Используйте "ПослеЗаписи".


Нашел информацию о порядке событий при записи: [необходимо зарегистрироваться для просмотра ссылки].

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

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

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




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


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


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

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


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

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

Petre Подменю пользователя
сообщение 02.07.15, 8:29
Сообщение #5

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2902
Из: Київ, Україна
Спасибо сказали: 1144 раз
Рейтинг: 1225

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

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


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

SV71 Подменю пользователя
сообщение 02.07.15, 9:03
Сообщение #6

Говорящий
***
Группа: Пользователи
Сообщений: 80
Спасибо сказали: 3 раз
Рейтинг: 0

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


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

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

Petre Подменю пользователя
сообщение 02.07.15, 9:14
Сообщение #7

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2902
Из: Київ, Україна
Спасибо сказали: 1144 раз
Рейтинг: 1225

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


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

sava1 Подменю пользователя
сообщение 02.07.15, 9:38
Сообщение #8

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

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

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

SV71 Подменю пользователя
сообщение 02.07.15, 10:16
Сообщение #9

Говорящий
***
Группа: Пользователи
Сообщений: 80
Спасибо сказали: 3 раз
Рейтинг: 0

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


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

Petre Подменю пользователя
сообщение 02.07.15, 10:18
Сообщение #10

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2902
Из: Київ, Україна
Спасибо сказали: 1144 раз
Рейтинг: 1225

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

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


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

SV71 Подменю пользователя
сообщение 02.07.15, 10:29
Сообщение #11

Говорящий
***
Группа: Пользователи
Сообщений: 80
Спасибо сказали: 3 раз
Рейтинг: 0

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


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

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

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

Petre Подменю пользователя
сообщение 02.07.15, 10:48
Сообщение #12

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2902
Из: Київ, Україна
Спасибо сказали: 1144 раз
Рейтинг: 1225

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


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

SV71 Подменю пользователя
сообщение 02.07.15, 10:55
Сообщение #13

Говорящий
***
Группа: Пользователи
Сообщений: 80
Спасибо сказали: 3 раз
Рейтинг: 0

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


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

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

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

Petre Подменю пользователя
сообщение 02.07.15, 11:43
Сообщение #14

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2902
Из: Київ, Україна
Спасибо сказали: 1144 раз
Рейтинг: 1225

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


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

SV71 Подменю пользователя
сообщение 02.07.15, 12:08
Сообщение #15

Говорящий
***
Группа: Пользователи
Сообщений: 80
Спасибо сказали: 3 раз
Рейтинг: 0

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

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

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


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


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

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

Всех благ!!!

Petre Подменю пользователя
сообщение 02.07.15, 12:51
Сообщение #16

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2902
Из: Київ, Україна
Спасибо сказали: 1144 раз
Рейтинг: 1225

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


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

SV71 Подменю пользователя
сообщение 08.07.15, 8:21
Сообщение #17

Говорящий
***
Группа: Пользователи
Сообщений: 80
Спасибо сказали: 3 раз
Рейтинг: 0

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


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

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

Petre Подменю пользователя
сообщение 08.07.15, 8:38
Сообщение #18

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2902
Из: Київ, Україна
Спасибо сказали: 1144 раз
Рейтинг: 1225

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


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

Спасибо сказали: SV71,

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 12:00
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!