Связь по владельцу программно

При работе в формах с подчиненных справочниками имеется ряд особенностей.

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

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

Свойство ПараметрВыборПоВладельцу используется для инициализации формы выбора. В этом случае выбор будет выполняться только для элементов с указанным владельцем. Этот параметр используется системой при инициализации выбора значения подчиненного справочника в поле ввода из формы выбора.

Расширение поля ввода для подчиненного справочника предоставляет специальные средства для организации выбора из элементов подчиненных определенному владельцу. При нажатии кнопки выбора система открывает формы выбора подчиненного справочника, установив в ней значения описанных выше свойств на основании имеющегося значения владельца. Поле ввода может получать информацию о владельце либо на основании установленной связи по владельцу, либо из значения владельца, явно установленного в свойстве поля ввода ВыборПоВладельцу . Значение владельца используется полем ввода не только при выборе из формы, но и при быстром выборе (выборе из выпадающего списка) и при вводе по строке.

В 1С:Предприятии 8 выбор в поле ввода значения подчиненного справочника не производит предварительного выбора владельца (такое поведение было реализовано в 1С:Предприятии 7.7). Если в момент выбора в поле ввода значение владельца для поля ввода не установлено (ни через связь по владельцу, ни через значение свойства ВыборПоВладельцу ), то форма будет открыта без установленного владельца. Таким образом, необходимо в форме выбора подчиненного справочника предусмотреть возможность выбора владельца.

Читайте также:  Зонты из сатина отзывы

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

Может использоваться возможность просмотра справочника по всем владельцам. В этом случае следует вставить в список колонку для отображения владельца. Однако такой вариант тоже может быть неудобен для выбора.

Эффективным решением может быть размещение в форме выбора поля ввода, связанного с данными отбора по владельцу ("Отбор.Владелец.Значение"). В этом случае пользователь сможет быстро установить отбор по владельцу и выбрать необходимый элемент.

Допустим, что в форме списка регистра, необходимо предоставить пользователю возможность интерактивно указать единицу хранения номенклатуры. «Номенклатура» — это справочник. «Единица хранения» — справочник, подчиненный номенклатуре. Справочник «Номенклатура» обычно содержит много элементов. Если мы в форме списка регистра, просто добавим две графы — «Номенклатура» и «Единица хранения», то при попытке интерактивно выбрать «единицу хранения» будет происходить зависание.

Рассмотрим задачу немного в другом ракурсе.

Чтобы избежать зависания, обычно назначают «Связь по владельцу». См. рисунок. Слева на рисунке — форма списка регистра, справа на рисунке — свойства поля ввода «ИСТ» (того самого, что отмечено слева в форме списка регистра красными буквами «ИСТ»). Чтобы однозначно определить владельца (не программным путем), для поля ввода «ИСТ» заполняется поле, отмеченное на рисунке цифрой «1» — «Связь по владельцу», где указывается связь с полем «Номенклатура».

Как программно установить связь по владельцу на форме?

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

К примеру, поле «ИСТ» списка регистра нужно связать с владельцем-полем «Транспортная единица» (которое тоже является элементом справочника «Номенклатура»), если транспортная единица заполнена, а если не заполнена, то владелецем нужно считать значение в поле «Номенклатура» — см. указатель №3 на рисунке.
Каким образом это реализовывается.
В данном случае поле 1 «Связь по владельцу» заполнять не нужно. Но при этом необходимо в поле 2 «Начало выбора» указать процедуру, в которой будет программно определяться связь по владельцу с помощью директивы «ВыборПоВладельцу».
Пример процедуры:

Процедура РегистрСведенийСписокЕдиницаХраненияНачалоВыбора(Элемент, СтандартнаяОбработка)

Владелец = ЭлементыФормы.РегистрСведенийСписок.ТекущиеДанные.Номенклатура;
Если ЗначениеЗаполнено(ЭлементыФормы.РегистрСведенийСписок.ТекущиеДанные.ТранспортнаяЕдиница) Тогда
Если ЭлементыФормы.РегистрСведенийСписок.ТекущиеДанные.ТранспортнаяЕдиница.ТипНоменклатуры = Перечисления.усТипыНоменклатуры.Груз Тогда
Владелец = ЭлементыФормы.РегистрСведенийСписок.ТекущиеДанные.ТранспортнаяЕдиница
КонецЕсли;
КонецЕсли;

Как программно добавить новый элемент справочника, если у него есть владелец

Нам требуется создать программным путем новый элемент справочника «Единицы хранения», владельцем которого является — справочник «Номенклатура»

Читайте также:  Openvpn client config file

Это делается так:
// создаем новый элемент справочника "ЕдиницыХранения":
ИСТ = Справочники.ЕдиницыХранения.СоздатьЭлемент();
// записываем ему владельца — сыслку на номенклатуру, где "Номенклатура" — элемент справочника "Номенклатура", определенный ранее
ИСТ.Владелец = Номенклатура.Ссылка;
// определяем наименование и другие реквизиты:
ИСТ.Наименование = "единица АБС";
ИСТ.Коэффициент = 1;
//… заполняем остальные реквизиты
// собственно, записываем созданную единицу хранения в базу:
ИСТ.Записать();

Допустим, требуется создать программным путем новый элемент справочника «Единицы хранения», у которого во владельцах — справочник «Номенклатура»
Это делается так:

Автор 1С

6 thoughts on “ Как программно установить связь по владельцу в форме. Как программно добавить новый элемент справочника, если у него есть владелец (1С: Программисту) ”

Статья не отвечает на вопрос «Как программно установить связь по владельцу?», а только показывает как открыть форму с отбором по владельцу.

Алексей, уточните, что именно нужно. Вероятно, действительно стоит добавить какую-то информацию, но не понятно, что именно осталось непонятным 🙂
Вы внимательно прочитали вторую часть, то, что написано после картинки? Там поясняется, как программно задать владельца по какому-то условию. Обратили внимание на слова, выделенные жирным шрифтом? Поняли приведенную процедуру?

Т.е. при программном создании элемента формы нельзя программно установить для колонки ТП _имя_ реквизита формы / объекта (как в конфигураторе в редакторе формы), в котором хранится ссылка на владельца, а нужно каждый раз при вызове в обработчике подсовывать эту ссылку, непосредственно в экземпляр элемента управления

Воспрос остался непонятен.
При создании элемента формы (спасибо Евгении за подсказку) Вы назначаете ему Тип.
Допустим, Тип — это Справочник, у которого есть Владелец.
Если мы правильно поняли, вопрос в том, как назначить конкретного Владельца этому содаваемому элементу формы, чтобы при попытке выбора пользователем, открывался список, подчиненный заданному Владельцу?

Вообще, выбор по владельцу задается в процедуре «ПриНачалеВыбора» командой вида
Элемент.ВыборПоВладельцу = Владелец;

Мы пок ане придумали, как именно это сделать для программно создаваемого элемента формы (если у кого-то возникнут мысли, просим помочь).
Быть может, поможет назначить процедуру-обработчик используя метод «УстановитьДействие»:

Расширение элементов управления, расположенных в форме
УстановитьДействие (SetAction)
Синтаксис:
УстановитьДействие( , )
Параметры:
(обязательный)
Тип: Строка. Имя события.
(обязательный)
Тип: Действие, Неопределено. Устанавливаемое действие.
В случае установки значения Неопределено при получении от элемента управления указанного события никакого действия выполнено не будет.
Описание:
Устанавливает новую процедуру-обработчик (действие) для указанного события.
Недоступен на сервере 1С:Предприятие. Не используется в модуле внешнего соединения.
Примечание:
Процедура должна быть экспортируемой и располагаться в модуле формы, при этом количество параметров должно совпадать с необходимым количеством параметров события, инициирующего вызов действия.

Читайте также:  Как использовать грибной отвар

Или вопрос в том, как программно добавить новый элемент справочника, если у него есть владелец?
Допустим, требуется создать программным путем новый элемент справочника «Единицы хранения»,
у которого во владельцах — справочник «Номенклатура».
Это делается так:

Команда программного добавления элемента формы:
ЭлементыФормы (Controls)
Добавить (Add)
Синтаксис:
Добавить( , , , )
Параметры:
(обязательный)
Тип: Тип. Тип добавляемого элемента управления
Индикатор
ПолеКалендаря
Кнопка
КоманднаяПанель
Надпись
Панель
Переключатель
ПолеТабличногоДокумента
ПолеHTMLДокумента
ПолеТекстовогоДокумента
ПолеВвода
ПолеВыбора
ПолеСписка
ПолеКартинки
ПолосаРегулирования
Разделитель
РамкаГруппы
ТабличноеПоле
Флажок
ПолеГрафическойСхемы
ПолеГеографическойСхемы
(обязательный)
Тип: Строка. Имя создаваемого элемента управления. Имя должно быть указано в соответсвии с правилами написания имен системы 1С:Предприятие 8. В противном случае выполнение метода вызовет исключение.
(необязательный)
Тип: Булево. Определяет, создавать новый элемент управления формы видимым или нет. Истина — элемент создается видимым.
Значение по умолчанию: Истина
(необязательный)
Тип: Панель, ПолеТабличногоДокумента. Определяет, какой панели формы или какому табличному документу принадлежит создаваемый элемент. Если указана панель, то добавляемый элемент размещается на текущей странице панели. Если не указан, создаваемый элемент будет принадлежать непосредственно форме.
Возвращаемое значение:
Элемент управления формы.
Описание:
Добавляет элемент управления на форму.
Недоступен на сервере 1С:Предприятие. Не используется в модуле внешнего соединения.
Пример:
// Расположим на странице табличное поле
ПолеРегистра = ЭлементыФормы.Добавить(Тип(«ТабличноеПоле»),
СтрокаТаблицы.Имя,
Истина,
ЭлементыФормы.ОсновнаяПанель);
ПолеРегистра.Данные = «ДокументОбъект.Движения.» + СтрокаТаблицы.Имя;

Если НЕ ЭтоНовый() Тогда
ПолеРегистра.Значение.Прочитать();
КонецЕсли;

ПолеРегистра.Верх = 30;
ПолеРегистра.Лево = 6;
ПолеРегистра.Ширина = ЭлементыФормы.ОсновнаяПанель.Ширина — 14;
ПолеРегистра.Высота = ЭлементыФормы.ОсновнаяПанель.Высота — 56;
ПолеРегистра.ТолькоПросмотр = Ложь;
ПолеРегистра.ИзменятьПорядокСтрок = Истина;
ПолеРегистра.ИзменятьСоставСтрок = Истина;

ПолеРегистра.УстановитьПривязку(ГраницаЭлементаУправления.Верх,
КоманднаяПанельРегистра,
ГраницаЭлементаУправления.Низ);
ПолеРегистра.УстановитьПривязку(ГраницаЭлементаУправления.Низ,
ЭлементыФормы.ОсновнаяПанель,
ГраницаЭлементаУправления.Низ);
ПолеРегистра.УстановитьПривязку(ГраницаЭлементаУправления.Право,
ЭлементыФормы.ОсновнаяПанель,
ГраницаЭлементаУправления.Право);

Если Метаданные.РегистрыНакопления[СтрокаТаблицы.Имя].ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки Тогда

КолонкаВидДвижения = ПолеРегистра.Колонки.Вставить(1, «Вид движения»);
КолонкаВидДвижения.Имя = «ВидДвиженияРегистраНакопления»;
КолонкаВидДвижения.УстановитьЭлементУправления(Тип(«ПолеВвода»));
КолонкаВидДвижения.Данные = «ВидДвижения»;
КолонкаВидДвижения.ЭлементУправления.КнопкаВыбора = Истина;
КолонкаВидДвижения.ЭлементУправления.ВыбиратьТип = Ложь;

ПолеРегистра.Колонки.Регистратор.Видимость = Ложь;
ПолеРегистра.Колонки.Период.Видимость = Ложь;
ПолеРегистра.Колонки.НомерСтроки.Видимость = Ложь;