- v7: Справочники: связь по владельцу
- Связь по владельцу не работает
- Вопрос Как программно установить связь по владельцу в форме
- Как программно добавить новый элемент справочника, если у него есть владелец
- admin
- 6 thoughts on “ Как программно установить связь по владельцу в форме. Как программно добавить новый элемент справочника, если у него есть владелец (1С: Программисту) ”
- Управляемая форма. Добавляем связанный элемент-«владелец» на форму.
v7: Справочники: связь по владельцу
Добрый день.
Не работал с 7.7 последние лет 5. Тут появилась необходимость поработать.
Не могу понять, как мне сделать элементарную вещь: связать поле ввода с формой по владельцу.
Собственно, сделать надо следующее: в конфигурации Торговля + Склад добавил в справочник Номенклатура реквизит – «ЕдиницаОтчетности», тип «Справочник.Единицы» (подчинен справочнику Номенклатура). Добавил реквизит в форму. Остается связать по владельцу, чтобы при выборе значения реквизита сразу открывался список единиц измерения для данной номенклатуры. Не могу понять, как мне это сделать.
Это вставь в модуль формы и наслаждайся.
(18) не понял вас.
Сделал как в (15). Работает. Спасибо всем.
P.S. v7 — это просто нечто. Я думал, что с добавлением нужных реквизитов точно проблем не будет, а тут такое. Что будет когда дело дойдет до отчета по всей это фигне — просто боюсь представить. Как писать отчет с итогами без нормального языка запросов — даже не хочу пока думать.
(28) нет опыта использования ни первого ни второго. надеюсь все же удастся обойтись без этих премудростей. тем более, что как-то оно уже работает, хоть и не идеально, судя по (17) и (22). а там глядишь и еще чего добрые люди подскажут.
и все же еще раз повторю волнующий меня вопрос: неужели до сих пор нет готовых решений для сдачи «декларации об объемах розничной продажи алкогольной и спиртосодержащей продукции». ее же в скором времени придется сдавать всем розничным магазинам, торгующим алкоголем. в первую очередь интересует версия 7.7, при чем желательно типовые конфигурации фирмы 1С, не отраслевые решения партнеров (как уже выше писал для восьмерки нашел отраслевое решение, но это не вариант в моем случае)
Источник
Связь по владельцу не работает
Предположим, что где-то, например, в форме списка регистра, требуется дать пользователю возможность интерактивно указать единицу хранения номенклатуры.
«Номенклатура» — это справочник.
«Единица хранения» — справочник, подчиненный номенклатуре.
Справочник «Номенклатура» обычно содержит очень много элементов.
Если мы в форме списка регистра просто добавим две графы — «Номенклатура» и «Единица хранения», то при попытке интерактивно выбрать «единицу хранения» будет происходить зависание.
Мы уже писали об этом в статье «Как установить выбор подчиненного элемента справочника»
А тут рассмотрим задачу немного в другом ракурсе.
Чтобы не происходило зависания, обычно назначают «Связь по владельцу».
См. рисунок. Слева на рисунке — форма списка регистра, справа на рисунке — свойства поля ввода «ех»(того самого, что отмечено слева в форме списка регистра красными буквами «ех»).
Чтобы однозначно определить владельца (не программным путем), для поля ввода «ex» заполняется поле, отмеченное на рисунке цифрой «1» — «Связь по владельцу», где указывается связь с полем «Номенклатура».
Вопрос Как программно установить связь по владельцу в форме
Однако, бывает так, что владельца нужно установить программно, в зависимости от какого-то условия.
Допустим, поле «ЕХ» списка регистра нужно связать с владельцем-полем «Транспортная единица» (которое тоже является элементом справочника «Номенклатура»), если транспортная единица заполнена, а если не заполнена, то владелецем нужно считать значение в поле «Номенклатура» — см. указатель №3 на рисунке.
Как это реализовать?
Дело в том, что в таком случае поле 1 «Связь по владельцу» заполнять не нужно.
Зато нужно в поле 2 «Начало выбора» указать процедуру, в которой будет программно определяться связь по владельцу с помощью директивы «ВыборПоВладельцу».
Как программно добавить новый элемент справочника, если у него есть владелец
Допустим, требуется создать программным путем новый элемент справочника «Единицы хранения», у которого во владельцах — справочник «Номенклатура»
Это делается так:
admin
6 thoughts on “ Как программно установить связь по владельцу в форме. Как программно добавить новый элемент справочника, если у него есть владелец (1С: Программисту) ”
Статья не отвечает на вопрос «Как программно установить связь по владельцу?», а только показывает как открыть форму с отбором по владельцу.
Алексей, уточните, что именно нужно. Вероятно, действительно стоит добавить какую-то информацию, но не понятно, что именно осталось непонятным 🙂
Вы внимательно прочитали вторую часть, то, что написано после картинки? Там поясняется, как программно задать владельца по какому-то условию. Обратили внимание на слова, выделенные жирным шрифтом? Поняли приведенную процедуру?
Т.е. при программном создании элемента формы нельзя программно установить для колонки ТП _имя_ реквизита формы / объекта (как в конфигураторе в редакторе формы), в котором хранится ссылка на владельца, а нужно каждый раз при вызове в обработчике подсовывать эту ссылку, непосредственно в экземпляр элемента управления
Воспрос остался непонятен.
При создании элемента формы (спасибо Евгении за подсказку) Вы назначаете ему Тип.
Допустим, Тип — это Справочник, у которого есть Владелец.
Если мы правильно поняли, вопрос в том, как назначить конкретного Владельца этому содаваемому элементу формы, чтобы при попытке выбора пользователем, открывался список, подчиненный заданному Владельцу?
Вообще, выбор по владельцу задается в процедуре «ПриНачалеВыбора» командой вида
Элемент.ВыборПоВладельцу = Владелец;
Мы пок ане придумали, как именно это сделать для программно создаваемого элемента формы (если у кого-то возникнут мысли, просим помочь).
Быть может, поможет назначить процедуру-обработчик используя метод «УстановитьДействие»:
Расширение элементов управления, расположенных в форме
УстановитьДействие (SetAction)
Синтаксис:
УстановитьДействие( , )
Параметры:
(обязательный)
Тип: Строка. Имя события.
(обязательный)
Тип: Действие, Неопределено. Устанавливаемое действие.
В случае установки значения Неопределено при получении от элемента управления указанного события никакого действия выполнено не будет.
Описание:
Устанавливает новую процедуру-обработчик (действие) для указанного события.
Недоступен на сервере 1С:Предприятие. Не используется в модуле внешнего соединения.
Примечание:
Процедура должна быть экспортируемой и располагаться в модуле формы, при этом количество параметров должно совпадать с необходимым количеством параметров события, инициирующего вызов действия.
Или вопрос в том, как программно добавить новый элемент справочника, если у него есть владелец?
Допустим, требуется создать программным путем новый элемент справочника «Единицы хранения»,
у которого во владельцах — справочник «Номенклатура».
Это делается так:
Команда программного добавления элемента формы:
ЭлементыФормы (Controls)
Добавить (Add)
Синтаксис:
Добавить( , , , )
Параметры:
(обязательный)
Тип: Тип. Тип добавляемого элемента управления
Индикатор
ПолеКалендаря
Кнопка
КоманднаяПанель
Надпись
Панель
Переключатель
ПолеТабличногоДокумента
ПолеHTMLДокумента
ПолеТекстовогоДокумента
ПолеВвода
ПолеВыбора
ПолеСписка
ПолеКартинки
ПолосаРегулирования
Разделитель
РамкаГруппы
ТабличноеПоле
Флажок
ПолеГрафическойСхемы
ПолеГеографическойСхемы
(обязательный)
Тип: Строка. Имя создаваемого элемента управления. Имя должно быть указано в соответсвии с правилами написания имен системы 1С:Предприятие 8. В противном случае выполнение метода вызовет исключение.
(необязательный)
Тип: Булево. Определяет, создавать новый элемент управления формы видимым или нет. Истина — элемент создается видимым.
Значение по умолчанию: Истина
(необязательный)
Тип: Панель, ПолеТабличногоДокумента. Определяет, какой панели формы или какому табличному документу принадлежит создаваемый элемент. Если указана панель, то добавляемый элемент размещается на текущей странице панели. Если не указан, создаваемый элемент будет принадлежать непосредственно форме.
Возвращаемое значение:
Элемент управления формы.
Описание:
Добавляет элемент управления на форму.
Недоступен на сервере 1С:Предприятие. Не используется в модуле внешнего соединения.
Пример:
// Расположим на странице табличное поле
ПолеРегистра = ЭлементыФормы.Добавить(Тип(«ТабличноеПоле»),
СтрокаТаблицы.Имя,
Истина,
ЭлементыФормы.ОсновнаяПанель);
ПолеРегистра.Данные = «ДокументОбъект.Движения.» + СтрокаТаблицы.Имя;
Если НЕ ЭтоНовый() Тогда
ПолеРегистра.Значение.Прочитать();
КонецЕсли;
ПолеРегистра.Верх = 30;
ПолеРегистра.Лево = 6;
ПолеРегистра.Ширина = ЭлементыФормы.ОсновнаяПанель.Ширина — 14;
ПолеРегистра.Высота = ЭлементыФормы.ОсновнаяПанель.Высота — 56;
ПолеРегистра.ТолькоПросмотр = Ложь;
ПолеРегистра.ИзменятьПорядокСтрок = Истина;
ПолеРегистра.ИзменятьСоставСтрок = Истина;
ПолеРегистра.УстановитьПривязку(ГраницаЭлементаУправления.Верх,
КоманднаяПанельРегистра,
ГраницаЭлементаУправления.Низ);
ПолеРегистра.УстановитьПривязку(ГраницаЭлементаУправления.Низ,
ЭлементыФормы.ОсновнаяПанель,
ГраницаЭлементаУправления.Низ);
ПолеРегистра.УстановитьПривязку(ГраницаЭлементаУправления.Право,
ЭлементыФормы.ОсновнаяПанель,
ГраницаЭлементаУправления.Право);
Если Метаданные.РегистрыНакопления[СтрокаТаблицы.Имя].ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки Тогда
КолонкаВидДвижения = ПолеРегистра.Колонки.Вставить(1, «Вид движения»);
КолонкаВидДвижения.Имя = «ВидДвиженияРегистраНакопления»;
КолонкаВидДвижения.УстановитьЭлементУправления(Тип(«ПолеВвода»));
КолонкаВидДвижения.Данные = «ВидДвижения»;
КолонкаВидДвижения.ЭлементУправления.КнопкаВыбора = Истина;
КолонкаВидДвижения.ЭлементУправления.ВыбиратьТип = Ложь;
ПолеРегистра.Колонки.Регистратор.Видимость = Ложь;
ПолеРегистра.Колонки.Период.Видимость = Ложь;
ПолеРегистра.Колонки.НомерСтроки.Видимость = Ложь;
Источник
Управляемая форма. Добавляем связанный элемент-«владелец» на форму.
| Пример владельца в метаданных справочника «районы» |
| Реализация: для элемента «Район» добавлен связанный Регион-владелец |
Задача
- На форму программно добавляется реквизит и связанное с ним ПолеВвода
- Тип значения добавляемого может быть подчиненный справочник
- Для удобства ввода для таких реквизитов необходимо добавить на форму связанное ПолеВвода «Владелец».
- У «Владельца» в свою очередь может быть так же владелец, и тд.
- Заголовок для ПоляВвода «Владелец» берётся из его метаданных для первого заполненного из: РасширенноеПредставлениеОбъекта, ПредставлениеОбъекта, Имя.
- Если у справочника (тип значения целевого элемента) несколько типов владельцев — будет использоваться первый.
- Владелец размещается перед целевым элементов в том же (его же) элементе размещения (форма или группа).
// Будет добавлено на форму ,
// связанное с переданным , ПолеВвода Владелец (первый владелец из возможных).
// Будет размещён в
// — будут найдены Владелец Владельца и тд.
Процедура ДобавитьСвязанныйЭлементВладельцаНаФорму ( Форма , Элемент , НайтиВсехВладельцев = Истина, МассивПодчиненных = Неопределено) Экспорт
Выполнить (» ЗначениеРеквизита = Форма.» + Элемент . ПутьКДанным) ;
Если Справочники . ТипВсеСсылки (). СодержитТип ( ТипЗнч ( ЗначениеРеквизита )) Тогда
// Размещение элемента
Родитель = Элемент . Родитель ;
Для Каждого Владелец Из ЗначениеРеквизита . Метаданные (). Владельцы Цикл
ЗаголовокВладельца = Владелец . РасширенноеПредставлениеОбъекта ;
ЗаголовокВладельца = ?( ПустаяСтрока ( ЗаголовокВладельца ), Владелец . ПредставлениеОбъекта , ЗаголовокВладельца );
ЗаголовокВладельца = ?( ПустаяСтрока ( ЗаголовокВладельца ), Владелец . Имя , ЗаголовокВладельца );
ПреффиксТипаСсылки = ?( Метаданные . Справочники . Содержит ( Владелец ), «СправочникСсылка.» , «ПланВидовХарактеристикСсылка.» );
ОписаниеТипаВладельца = Новый ОписаниеТипов ( ПреффиксТипаСсылки + Владелец . Имя );
ИмяРеквизитаВладельца = Элемент . Имя + «__Владелец» ;
// добавим реквизит формы и связанный с ним элемент
РеквизитВладельца = ДобавитьВРеквизитыФормы ( Форма , ИмяРеквизитаВладельца , ОписаниеТипаВладельца ,, ЗаголовокВладельца ,Истина);
ЭлементВладельца = ДобавитьЭлементНаФорму ( Форма , ИмяРеквизитаВладельца , Тип ( «ПолеФормы» ), Родитель , ИмяРеквизитаВладельца );
// значение нового реквизита
Форма [ РеквизитВладельца . Имя ] = ЗначениеРеквизита . Владелец ;
// переместим «вперёд» элемент владельца
Форма . Элементы . Переместить ( ЭлементВладельца , Родитель , Элемент );
// установим связь с
ЗадатьСвязьЭлементаФормы ( Элемент , «Отбор.Владелец» , РеквизитВладельца . Имя );
Если ТипЗнч ( МассивПодчиненных ) <> Тип ( «Массив» ) Тогда МассивПодчиненных = Новый Массив КонецЕсли;
Для Каждого ЗаписьМассива Из МассивПодчиненных Цикл
ЗадатьСвязьЭлементаФормы ( Форма . Элементы [ ЗаписьМассива ], РеквизитВладельца . Имя , РеквизитВладельца . Имя );
КонецЦикла;
МассивПодчиненных . Добавить ( Элемент . Имя );
Если НайтиВсехВладельцев = Истина Тогда
ДобавитьСвязанныйЭлементВладельцаНаФорму ( Форма , ЭлементВладельца , НайтиВсехВладельцев , МассивПодчиненных );
КонецЕсли;
Прервать;
КонецЦикла;
КонецЕсли;
Функция ДобавитьВРеквизитыФормы ( Форма , Имя , Тип , Путь = Неопределено, Заголовок = Неопределено, СохраняемыеДанные = Неопределено) Экспорт
Реквизит = Новый РеквизитФормы ( Имя , Тип , Путь , Заголовок , СохраняемыеДанные );
МассивРеквизитов = Новый Массив ;
МассивРеквизитов . Добавить ( Реквизит );
Форма . ИзменитьРеквизиты ( МассивРеквизитов );
Функция ДобавитьЭлементНаФорму ( Форма , Имя , ТипЭлемента , Родитель = Неопределено, ПутьКДанным = Неопределено) Экспорт
Элемент = Форма . Элементы . Добавить ( Имя , ТипЭлемента , Родитель );
Элемент . Вид = ВидПоляФормы . ПолеВвода ;
Элемент . ПутьКДанным = ПутьКДанным ;
Процедура ЗадатьСвязьЭлементаФормы ( Элемент , Имя , ПутьКДанным , ИзменениеЗначения = Неопределено, ЗамещатьРанееУстановленные = Истина) Экспорт
МассивСвязи = Новый Массив ;
Если ТипЗнч ( ИзменениеЗначения ) <> Тип ( «РежимИзмененияСвязанногоЗначения» ) Тогда
ИзменениеЗначения = РежимИзмененияСвязанногоЗначения . Очищать ;
КонецЕсли;
Если ЗамещатьРанееУстановленные <> Истина Тогда
СкопироватьМассив ( Элемент . СвязиПараметровВыбора , МассивСвязи );
КонецЕсли;
МассивСвязи . Добавить (Новый СвязьПараметраВыбора ( Имя , ПутьКДанным , ИзменениеЗначения ));
Элемент . СвязиПараметровВыбора = Новый ФиксированныйМассив ( МассивСвязи );
Процедура СкопироватьМассив ( Источник , Приемник ) Экспорт
Для Каждого ЗаписьМассива Из Источник Цикл Приемник . Добавить ( ЗаписьМассива ) КонецЦикла;
Источник