Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ПередЗаписью создать элемент подчиненного справочника.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
logist
В модуле справочника пишу такое: (спр.БлаБла является подчиненным текущему)
Процедура ПередЗаписью()
   Если ЭтоНовый() Тогда
      Спр = Справочники.БлаБла.СоздатьЭлемент();
      Спр.Владелец = Ссылка;
      ...
      Спр.Записать();
   КонецЕсли
КонецПроцедуры

Выдает ошибку что "Владелец" не заполнено или заполнено не верно.
Я так догадываюсь, что ПередЗаписью - Ссылка еще пустая? (пробовал ПриЗаписи, но тогда ЭтоНовый = Ложь).
Как тогда такое можно соорудить - при создании элемента справочника нужно создать еще и элемент подчиненного справочника. Хотя бы ткните пальцем где курить, а то я чето догадываюсь что ответ рядом smile.gif)
Спасибо.
MATEVI
Цитата
MaxMart пишет:
А ссылку на владельца можно получить только после записи элемента. То есть нужно использовать обработчик события ПриЗаписи, когда контрагент уже записан! Но в нем не получается установить Основное контактное лицо


Оказывается, платформа 8.2 предоставляет средства, позволяющие обойти это препятствие. Основное контактное лицо можно установить "по частям".
СправочникМенеджер имеет метод
ПолучитьСсылку()
Этот метод, примененный без параметров, позволяет сформировать новую уникальную ссылку.

В процедуре "ПередЗаписью" справочника "Контрагенты" вызываем этот метод следующим образом:
БудущаяСсылкаКЛ = Справочники.КонтактныеЛицаКонтрагентов.ПолучитьСсылку();


Так получаем ссылку на будущий элемент справочника "Контактные лица". Раз ссылка получена, можно установить реквизит:
ОсновноеКонтактноеЛицо = БудущаяСсылкаКЛ;


Дальнейший код будет располагаться уже в процедуре "ПриЗаписи", поэтому переменная БудущаяСсылкаКЛ должна быть объявлена как переменная модуля.
В процедуре "ПриЗаписи" создаем новый объект-справочник "Контактные лица" и устанавливаем его реквизиты, в т.ч. владельца, т.к. контрагент уже записан:

НовыйКЛОбъект = Справочники.КонтактныеЛицаКонтрагентов.СоздатьЭлемент(); 
НовыйКЛОбъект.Владелец = ЭтотОбъект.Ссылка;

.......................................... (прочие реквизиты)

А теперь "соединяем две части". Для этого используем метод СправочникОбъекта УстановитьСсылкуНового().
Этот метод "Устанавливает значение для нового (созданного и еще не записанного) объекта, которое будет назначено при записи в качестве ссылки" (синтакс-помощник). Т.е. в качестве параметра нужно передать ту самую ссылку, которая была создана ранее:

НовыйКЛОбъект.УстановитьСсылкуНового(БудущаяСсылкаКЛ);


Теперь объект готов для записи:
НовыйКЛОбъект.Записать();


Следует отметить, что если по каким-то причинам запись не удастся, то будет отменена также и запись контрагента, что особенно приятно.

Наконец, последний штрих. Дело в том, что объект ЭтотОбъект (записываемый контрагент) содержит ссылку на контактное лицо, а объект НовыйКЛОбъект в реквизите Владелец содержит ссылку на ЭтотОбъект. Такие связки не очищаются автоматически после окончания процедуры, поэтому вспомогательный объект надо уничтожить принудительно:

НовыйКЛОбъект = Неопределено;


необходимо зарегистрироваться для просмотра ссылки
logist
MATEVI, спасибо. Я пошел путем по проще, в ПередЗаписью записал в переменную ЭтоНовый, и в ПриЗаписи ее проверил. Может это и не научно, но .... smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.