Изменить родителя элемента формы 1с программно
Есть справочник код в котором не проверяется на уникальность(т.е есть много объектов с кодом 1); Некоторые из них являются группами. Поэтому чтобы найти нужную группу я сохраняю и код и наименование. Теперь вопрос, чтобы новому элементу присвоить родителя нужно сделать поиск по 2м реквизитам. Сделать можно через запрос, но я делаю перебором.
Но почему-то Спр.Родитель = СпрПоискРод не записывает, хотя СпрПоискРод объект с которым спокойной могу работать, в чём проблема?
При том что Спр.Родитель = СпрПоискРод.НайтиПоКоду(213) спокойной срабатывает, хотя и там и там я к Спр.Родителю присваиваю объект.
Назначить родителя формы
Как указать, чтобы Form2 была родителем Form1? Пробовал через owner, но что то не очень понял.
Как назначить поля объекту прямо из строки?
мне нужно из строки где через запятую лежат поля обьектов собрать массив обьектов. пока могу.
Как назначить класс к существующему объекту на сцене?
Есть MovieClip с инстанс именем obj_mc. Он расположен на сцене. И есть класс item.as, в котором.
Как назначить объекту 'Поле со списком' в MS Word значения из листа?
Не подскажет ли кто-нибудь как назначить объекту 'Поле со списком' в MS Word значения из листа.
Решение
Скорей всего, возможна ситуация, когда с одним кодом и именем будет группа и элемент, и в этом случае, если новому элементу присваивается родитель элемент, а не группа, то будет непойми что.
Добавь проверку родителя на группу.
Добавлено через 4 минуты
Выше я указал возможную дырку в механизме присвоения, а так тебе надо брать не элемент выборки, а ссылку на объект, т.е.
Да-да это именно группа. Проверка есть да и сам вручную данные проверял. Если вот это СпрПоискРод.НайтиПоКоду(213)
не является группой, то он пишет ошибку
Добавлено через 1 час 13 минут
Да всё верно, спасибо
Пожалуйста, не плодите говнокод, сделайте поиск запросом. Также в условия запроса, кроме кода и наименования, надо добавить еще условие на равенство истине свойства ЭтоГруппа, иначе рано или поздно получите ошибку, когда элементу справочника попробуйте назначить родителем дрйгой элемент справочника, а не группу.
Как каждому объекту класса из списка назначить свою процедуру?
как каждому объекту класса в списке назначить свою процедуру при заполнении списка объектами, со.
Как узнать родителя элемента? При клике по какому объекту появилось контекстное меню?
Здравия всем! К примеру, при клике по компоненту RichTextBox вылезает контекстное меню, в.
Вывод поста, который содержит id категории, её родителя, родителя родителя
Есть 2 таблицы, первая - категории ( category_id, parent_id и т.д), вторая - посты (post_id.
Как при клике взять ID родителя и скрыть дивы с классом взятого ранее родителя?
Здравствуйте друзья, столкнулся с задачкой для решения которой у меня не хватает опыта JS.
Как прикрепить линию к объекту и провести к другому объекту?
Привет. Вот вариант с помощью метода Gizmos.DrawLine. Как видите линия проходит с центра одного.
Форма в 1С 8.3 - это визуальное отображение информации для работы пользователя с объектами информационной базы данных 1С. В платформе 1С 8.3 помимо устаревших обычных форм, используются управляемые формы (УФ), на которых реализуются все современные типовые конфигурации. Существенным отличием управляемых форм является их самостоятельное формирование структуры. Формы могут быть как в составе объектов, так и существовать отдельно от них и использоваться всеми объектами конфигурации в целом. Элементы формы служат для работы с данными формами. Также как и форма, элементы связаны с данными формы при помощи её реквизитов.
Основная форма объекта (открывается по умолчанию) //ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта");
Вспомогательная форма объекта (не основная, нужно указывать) //ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаЭСЧФ");
Произвольная форма (не привязана к конкретному объекту) //так же ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаЭСЧФ");
Обычное, Свертываемая и Всплывающая. Первые два используются довольно часто, а вот последняя встречается редко. Такая группа скрывает внутри себя все помещенные в неё элементы. А когда пользователь нажимает на её заголовок, то содержимое "всплывает". Выглядит похоже на открытие новой формы с блокировкой владельца. Но элементы не появляются в отдельном окне, а просто перекрывают основные данные.
✔ Программно открыть форму
Процедура ПоказатьФорму ( ОповещениеОЗакрытие = Неопределено, ПарФормы = Неопределено, ПарОткрытия = Неопределено) Экспорт
ПараметрыОткрытияФормы = Новый Структура ( "УУИД, ОкноФормы, СсылкаФормы, ВладелецФормы" , Ложь);
Если ПарОткрытия <> Неопределено Тогда
//( , , необяз., необяз.)
ЗаполнитьЗначенияСвойств ( ПараметрыОткрытияФормы , ПарОткрытия );
КонецЕсли;
ОткрытьФорму ( "РегистрСведений.КлассификаторСтранМира.Форма.ЗагрузкаКлассификатора" ,
ПарФормы , ПараметрыОткрытияФормы . ВладелецФормы , ПараметрыОткрытияФормы . УУИД ,
ПараметрыОткрытияФормы . ОкноФормы , ПараметрыОткрытияФормы . СсылкаФормы , ОповещениеОЗакрытие );
Процедура ПоказатьФормуСОтбором ( ОповещениеОЗакрытие = Неопределено, ПарФормы = Неопределено, ПарОткрытия = Неопределено)
ПараметрыОтбора = Новый Структура ( "Спелый" , Истина);
ПарФормы = Новый Структура ( "Отбор" , ПараметрыОтбора );
ОткрытьФорму ( "Справочник.Фрукты.Форма.ФормаВыбора" , ПарФормы );
&НаСервереБезКонтекста
Функция ПолучитьИмяФормыПоСсылке ( Ссылка )
ИмяФормы = "ФормаУправленияНастройками" ;
Возврат Ссылка . Метаданные (). ПолноеИмя () + "." + ИмяФормы ;
&НаКлиенте
Процедура Подбор ( Команда )
//Открытие формы выбора с отбором по цвету(равно), массе(равно или больше) и периоду (в пределах)
НастройкиКД = Новый НастройкиКомпоновкиДанных ;
ОтборКД = НастройкиКД . Отбор . Элементы . Добавить ( Тип ( "ГруппаЭлементовОтбораКомпоновкиДанных" ));
ОтборКД . ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных . ГруппаИ ;
// 1)
Если ЗначениеЗаполнено ( Объект . Цвет ) И НЕ Объект . Цвет . Пустая () Тогда
ОтборКД = ОтборКД . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ОтборКД . ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( "Цвет" );
ОтборКД . ВидСравнения = ВидСравненияКомпоновкиДанных . Равно ;
ОтборКД . Использование = Истина;
ОтборКД . ПравоеЗначение = Объект . Цвет ;
КонецЕсли;
// 2)
Если ЗначениеЗаполнено ( Объект . Масса ) И НЕ Объект . Масса . Пустая () Тогда
ОтборКД = ОтборКД . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ОтборКД . ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( "Масса" );
ОтборКД . ВидСравнения = ВидСравненияКомпоновкиДанных . БольшеИлиРавно ;
ОтборКД . Использование = Истина;
ОтборКД . ПравоеЗначение = Объект . Масса ;
КонецЕсли;
// 3)
Если ЗначениеЗаполнено ( Объект . Период ) Тогда
ОтборКД = ОтборКД . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ОтборКД . ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( "Дата" );
ОтборКД . ВидСравнения = ВидСравненияКомпоновкиДанных . БольшеИлиРавно ;
ОтборКД . Использование = Истина;
ОтборКД . ПравоеЗначение = Объект . Период . ДатаНачала ;
ОтборКД = ОтборКД . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ));
ОтборКД . ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( "Дата" );
ОтборКД . ВидСравнения = ВидСравненияКомпоновкиДанных . МеньшеИлиРавно ;
ОтборКД . Использование = Истина;
ОтборКД . ПравоеЗначение = Объект . Период . ДатаОкончания ;
КонецЕсли;
//Настройки
фПараметры = Новый Структура ;
фПараметры . Вставить ( "ФиксированныеНастройки" , НастройкиКД );
фПараметры . Вставить ( "РежимВыбора" ,Истина);
фПараметры . Вставить ( "МножественныйВыбор" ,Истина);
// Элементы.СписокПроизвДок - Табличная часть формы, в которой будет отрабатывать событие "ОбработкаВыбора"
// после того как будут выбраны документы из формы выбора.
ОткрытьФорму ( "Документ.Производство.ФормаВыбора" , фПараметры , Элементы . СписокПроизвДок );
Одним из требований для прохождения аудита расширения в модели сервиса является программная модификация управляемых форм без заимствования самой формы в расширение.
Мы рассмотрим основные составляющие этой задачи: добавление реквизитов, добавление элементов формы и назначение обработчиков событий элементов формы.
Добавление реквизитов
Для добавления реквизитов используется метод объекта ФормаКлиентскогоПриложения
Реквизиты формы, добавленные через конфигуратор, удалить невозможно, поэтому второй аргумент процедуры можно не указывать.
Переменная ДобавляемыеРеквизиты является массивом объектов типа РеквизитФормы .
Например, если мы создаем таблицу значений из двух колонок, то программный код для их создания будет выглядеть следующим образом:
К добавленным реквизитам верхнего уровня из модуля можно обращаться только с помощью конструкции ЭтотОбъект. ˂Имя реквизита˃ .
Процедуру ИзменитьРеквизиты логично вызывать из обработчика ПриСозданииНаСервере , но т.к. мы не заимствуем форму в расширение, то следует найти другую точку входа. Для конфигураций УТ 11, КА 2 и ERP 2 существует типовой механизм упрощенного изменения конфигураций. Нас интересует модуль МодификацияКонфигурацииПереопределяемый , в состав которого входит процедура
Данную процедуру можно заимствовать в расширение, добавить проверку имени формы и вставить код изменения реквизитов:
Для остальных конфигураций придется переопределять другие процедуры. Например
Использование той или иной процедуры следует проверить в модуле редактируемой формы.
Изменение элементов формы
Управление элементами формы производится через коллекцию Элементы объекта ФормаКлиентскогоПриложения , с помощью которой можно добавлять, удалять, изменять свойства элементов формы, а также перемещать элементы формы между родителями.
Для добавления нового элемента формы требуется передать в функцию Добавить данной коллекции имя элемента, его тип и родителя (при необходимости). Например:
По аналогии с добавлением реквизитов, данный код можно выполнять в функциях МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере (УТ, КА, ERP) , ПодключаемыеКоманды.ПриСозданииНаСервере или ВерсионированиеОбъектов.ПриСозданииНаСервере .
При создании новых элементов формы старайтесь добавлять к их именам префикс своего расширения, чтобы избежать конфликтов с элементами формы типовой конфигурации. Этот же совет следует применять к именованию реквизитов формы, процедур, функций и глобальным переменным.
Обработка событий формы
Выполнить код по событию элемента формы можно двумя способами:
- Создать команду, указать для этой команды имя обработчика события и назначить эту команду элементу формы
- Выполнить метод УстановитьДействие элемента формы, чтобы указать имя обработчика события в модуле формы
Оба метода предполагают наличие в модуле формы процедуры с сигнатурой, соответствующей обработчику события. Для первого способа в модуле формы должна быть клиентская процедура, принимающая единственный аргумент - Команда. Для второго - всё зависит от события, для которого выполняется обработчик. Так, например, для события ПриИзменении элемента формы с типом ПолеВвода будет требоваться процедура, принимающая единственный аргумент - ЭлементФормы . А для события ПередНачаломДобавления таблицы формы - целых 6 аргументов ( ЭлементФормы , Отказ , Копирование , Родитель , ЭтоГруппа , Параметр ). Поэтому для некоторых событий попросту невозможно подобрать соответствующие клиентские методы в модуле формы и заимствования формы в расширение не избежать.
Для самых простых случаев (команда или событие без параметров) можно использовать следующие комбинации обработчиков и переопределяемых процедур:
- обработчик Подключаемый_ВыполнитьПереопределяемуюКоманду с переопределением процедуры МодификацияКонфигурацииКлиентПереопределяемый.ВыполнитьПереопределяемуюКоманду для УТ, КА и ERP;
- обработчик Подключаемый_ВыполнитьКоманду с переопределением процедуры ПодключаемыеКомандыКлиент.ВыполнитьКоманду
При этом в предопределенной процедуре обязательно проверять имя команды (или имя элемента формы) и имя самой формы.
Либо вариант с использованием команд:
Обратите внимание, что при использовании процедур, не предназначенных для программной обработки команд, следует возвращать поток выполнения методом глобального контекста ПродолжитьВыполнение , чтобы не нарушить работу типовых механизмов.
Полезные советы
Работа с динамическими списками
Довольно частой задачей является модификация в расширении текста запроса динамического списка. Многие разработчики просто копируют текст запроса из конфигуратора, редактируют его и заменяют стандартный в свойстве ТекстЗапроса объекта Динамический список .
Для небольших изменений гораздо лучше воспользоваться объектом СхемаЗапроса , появившемся в версии платформы 8.3.5. Он позволит всегда иметь актуальный текст запроса, если он поменяется при обновлении конфигурации.
Переопределение открываемой формы
В некоторых случаях, когда требуется кардинальное изменение формы, следует не забывать о возможности переопределения открываемой формы в модуле менеджера объекта метаданных.
Для этого следует реализовать новую форму (не заимствовать её, а написать с нуля) и в модуле менеджера переопределить процедуру ОбработкаПолученияФормы .
Данный метод следует использовать с осторожностью или ограничивать его использование ключами открытия формы, т.к. в этом случае мы делаем недоступной типовую форму.
В связи с развитием системы расширений многие разработчики 1С сталкиваются с проблемой: если форма захвачена и на ней произведены изменения, то после обновления в основной конфигурации формы, эти изменения не будут отражены на захваченной форме. Получается, что форму после обновления надо каждый раз проверять. Это трудно и "убивает" все плюсы расширения. Но из любой непростой ситуации есть выход, если знать, где его искать. Можно захватить форму в расширение и не изменять её, а все новые реквизиты добавить программно. Тогда при обновлении формы в основной конфигурации 1С 8.3, форма измениться в расширении, и добавленные реквизиты будут корректно отображаться в ней.
В этой статье я постараюсь собрать все основные методы создания реквизитов на форме.
1. Добавляем реквизит
Начнем с самого простого. Мы добавили реквизит "МоеРасширение_НаименованиеНаАнглийском" в справочник контрагентов.
Для того, чтобы вывести его на форму програмно, пишем код процедуры "МоеРасширение_ПриСозданииНаСервереПосле" (Отказ, Стандартная Обработка).
НовыйЭлемент = Элементы.Добавить ("МоеРасширение_НаименованиеНаАнглийском", Тип("ПолеФормы"));
НовыйЭлемент.ПутьКДанным = "Объект. МоеРасширение_НаименованиеНаАнглийском";
Теперь мы добавим на форму реквизит, которого нет в конфигурации. Например, выведем на форму текущую задолженность: реквизит "МоеРасширение_ТекущаяЗадолженность".
Сначала создадим реквизит:
ДобавляемыеРеквизиты = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы("МоеРасширение_ТекущаяЗадолженность"), Новый ОписаниеТипов ("Число", "Текущая задолженность");
Затем выведем его на форму таким же образом, как и добавленный в конфигурацию реквизит, разница только в поле "ПутьКДанным" – здесь мы пишем наименование только что созданного реквизита:
НовыйЭлемент = Элементы.Добавить("МоеРасширение_НаименованиеНаАнглийском", Тип("ПолеФормы"));
Теперь переместим наши реквизиты под поле "Полное наименование". Для этого надо определить на форме место добавления, в нашем случаем – над группой "ГруппаКолонки":
Для того, чтобы отрабатывались процедуры событий для этих реквизитов, можем указать действия:
Элементы. МоеРасширение_ТекущаяЗадолженность.УстановитьДействие("ПриИзменении", "МоеРасширение_РасшифроватьЗадолженность").
2. Добавление кнопки
Для того, чтобы произвести добавление кнопки на форму, сначала надо програмно добавить команду.
НоваяКоманда.Заголовок = "Показать ОСВ".
ВАЖНО!! В поле действие пишется имя процедуры.
Теперь добавляем саму кнопку:
НоваяКнопка = Элементы.Добавить("МоеРасширение_Кнопка_ПоказатьОСВ", Тип("КнопкаФормы"));
3. Добавление группы
Для добавления группы переместим кнопку к полю "Текущая задолженность". На этом этапе нам надо создать группу и переместить в нее уже созданные наши элементы.
Создаем группу и помещаем ее под наименованием. Затем переносим в нее реквизит "Текущая задолженность" и кнопку "Показать ОСВ":
НоваяГруппа =Элементы.Добавить("МоеРасширение_ГруппаЗадолженность", Тип("ГруппаФормы"));
4. Добавляем табличную часть 1С
Добавим к контрагенту табличную часть 1С "МоеРасширение_Номенклатура" с реквизитом "Номенклатура" и выведем ее на форму.
Сначала мы добавляем табличную часть на форму, после чего описываем все колонки, которые должны отображаться на форме.
ВАЖНО! При создании реквизитов таблицы родителем указывается реквизит формы "Табличная часть".
НоваяТабличнаяЧасть = Элементы.Добавить("МоеРасширение_ТаблицаНоменклатура", Тип("ТаблицаФормы"));
НовыйРеквизитТабличнойЧасти = Элементы.Добавить("МоеРасширение_Номенклатура", Тип("ПолеФормы"),НоваяТабличнаяЧасть);
Используя этот базовый набор, можно изменить любую форму программно. И при обновлениях форма всегда будет подстраиваться под выбранный алгоритм. Если форма поменяется глобально, то расширение выдаст ошибку. Тогда, переписав несколько строчек кода, мы снова получим рабочую форму. Это быстрее и проще, чем каждый раз анализировать диалоговую форму.
Специалист компании «Кодерлайн»
Вас могут заинтересовать следующие статьи:
Всем привет, помогите с одним моментом
Никак разобраться не могу, что бы при проставлении флажков(Поставщиик1, Покупатель1) в определённых реквизитах на форме менялся автоматически "Родитель" и запись попадала в соответствующую группу
и при снятии флажка поле "родитель" очищалось
Поле "родитель" скрыто от пользователя
Заполнение реквизитов справочника Номенклатура программно в 1С
Здравствуйте. Помогите решить задачку. Необходимо заполнить реквизит Брэнд в справочнике.
1С 8.2 Заполнение табличной части программно
Добрый день! есть проблема , конфигурация самописная на 1С 8.2, интерфейс управляемый. Есть.
1с 8.2: Заполнение табличной части программно
здравствуйте, помогите пожалста с таким вопросом: в моей конфигурации на 1с 8.2 есть регистр.
Вывод поста, который содержит id категории, её родителя, родителя родителя
Есть 2 таблицы, первая - категории ( category_id, parent_id и т.д), вторая - посты (post_id.
ну уж какой смог написать, я только учусь работать с 1с и не такой профессионал, как вы, видимо
я выложил код в котором мне надо это описать, что бы примерно можно было понять как это всё работает
как мне в событии "ПриИзменении" описать изменение поля Родитель в зависимости от проставленного определённого флажка?
Что касается Родитель, то мало инфы для конкретного ответа. Родитель - это реквизит (поле)? Кому принадлежит Родитель? (ну надо же знать какой справочник вызывать и т.д.) Уточните вопрос. Но ответ уже завтра
Да, Родитель - стандартный реквизит справочника Контрагенты
Вопрос следующий:
Как сделать так, что бы когда пользователь проставлял флажок в Форме элемента на одном из полей(Поставщик1 или Покупатель1) реквизит Родитель автоматически заполнялся значением предопределённых данных(Группы: Поставщики(000000001) или Покупатели(000000002)) и запись попадала в соответствующую группу
а при снятии всех флажков реквизит Родитель очищался
и извините заранее, если непонятно как то описываю свой вопрос
и спасибо за совет выше
Решение
Как сделать так, что бы когда пользователь проставлял флажок в Форме элемента на одном из полей(Поставщик1 или Покупатель1) реквизит Родитель автоматически заполнялся значением предопределённых данных(Группы: Поставщики(000000001) или Покупатели(000000002)) и запись попадала в соответствующую группу
НО! В условии мог бы фигурировать еще флажок "Покупатели". Просто зачем вам два взаимоисключающих флажка? Сделайте один реквизит - "Вид взаимоотношений(с контрагентом)" с вариантами значения Покупатель/Поставщик + переключатель на форме и не надо будет автоматом снимать один флажок, если проставили другой и что-то очищать
Читайте также: