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

Вопрос Как установить связь по владельцу в форме?
Ответ
Предположим, что где-то, например, в форме списка регистра, требуется дать пользователю возможность интерактивно указать единицу хранения номенклатуры. «Номенклатура» — это справочник. «Единица хранения» — справочник, подчиненный номенклатуре. Справочник «Номенклатура» обычно содержит очень много элементов. Если мы в форме списка регистра, просто добавим две графы — «Номенклатура» и «Единица хранения», то при попытке интерактивно выбрать «единицу хранения» будет происходить зависание. Мы уже писали об этом в статье «Как установить выбор подчиненного элемента справочника» А тут рассмотрим задачу немного в другом ракурсе.
Чтобы не происходило зависания, обычно назначают «Связь по владельцу». См. рисунок. Слева на рисунке — форма списка регистра, справа на рисунке — свойства поля ввода «ех»(того самого, что отмечено слева в форме списка регистра красными буквами «ех»). Чтобы однозначно определить владельца (не программным путем), для поля ввода «ex» заполняется поле, отмеченное на рисунке цифрой «1» — «Связь по владельцу», где указывается связь с полем «Номенклатура».

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

Допустим, поле «ЕХ» списка регистра нужно связать с владельцем-полем «Транспортная единица» (которое тоже является элементом справочника «Номенклатура»), если транспортная единица заполнена, а если не заполнена, то владелецем нужно считать значение в поле «Номенклатура»  — см. указатель №3 на рисунке.

Как это реализовать?

Дело в том, что в таком случае поле 1 «Связь по владельцу» заполнять не нужно. Зато нужно в поле 2 «Начало выбора» указать процедуру, в которой будет программно определяться связь по владельцу с помощью директивы «ВыборПоВладельцу».
Пример процедуры:

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

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

	// зададим выбор по владельцу
	Элемент.ВыборПоВладельцу = Владелец;

КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      ПолеРегистра.СоздатьКолонки();

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

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

      КонецЕсли;

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.