1с программно перенести в группу
Программная модификация формы может потребоваться в нескольких случаях:
- При доработке типовых конфигураций для облегчения процедуры последующего обновления. В этом случае будет изменен только модуль формы. Модули намного проще обновлять, чем форму.
- При реализации некоторых общих алгоритмов. Например, в подсистеме БСП «Запрет редактирования реквизитов объектов» для всех подключенных к подсистеме объектов предусмотрено программное создание кнопки для включения возможности редактирования реквизитов.
- При реализации некоторых специфических алгоритмов. Например, в справочнике Номенклатура создаются поля для редактирования дополнительных реквизитов.
В управляемой форме можно программно добавить, изменить и удалить:
Все указанные операции возможны только на сервере.
Программное изменение формы имеет ограничения:
- Удалить можно только программно добавленные реквизиты/команды/элементы. Нельзя программно удалить объекты, созданные в конфигураторе.
- Нельзя назначить реквизит основным.
Изменение команд формы
Для управления составом команд у объекта УправляемаяФорма есть коллекция Команды . У коллекции есть несколько методов:
Коллекция Команды доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Добавить () и Удалить () ) можно только на сервере. Искать и получать количество элементов (методы Найти () и Количество () ) можно как на клиенте, так и на сервере.
В качестве примера работы с командами формы создадим новую команду ИсторияИзменений с заголовком «История изменений…», которая будет вызвать обработчик ОтобразитьИсторию () . Создание выполняется при открытии формы.
&НаСервере
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка )
Команда = Команды . Добавить ( «ИсторияИзменений» );
Команда . Действие = «Подключаемый_ОтобразитьИсторию» ;
Команда . Заголовок = «История изменений…» ;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОтобразитьИсторию ( Команда )
// действия команды
КонецПроцедуры
Обработчик команды должен располагаться в форме и иметь директиву компиляции &НаКлиенте .
Изменение реквизитов формы
Чтение состава реквизитов формы выполняется функцией ПолучитьРеквизиты ( Путь >) , возвращающей массив типа РеквизитФормы . Параметр функции указывает путь к родительскому реквизиту (в виде строки). Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.
Изменение реквизитов выполняется методом ИзменитьРеквизиты ( ДобавляемыеРеквизиты >, УдаляемыеРеквизиты >) объекта УправляемаяФорма . В параметры ДобавляемыеРеквизиты и УдаляемыеРеквизиты передаются массивы с элементами типа РеквизитФормы .
Внимание!
Процесс изменения состава реквизитов является достаточно ресурсоемким. Фактически выполняется пересоздание формы. В связи с этим работа с реквизитами формы выполняется в пакетном режиме.
Создадим новый реквизит формы с именем Покупатель:
// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив ;
ДобавляемыеРеквизиты . Добавить(Новый РеквизитФормы («Покупатель», Новый ОписаниеТипов ( «СправочникСсылка.Контрагенты» ), , «Клиент» ));
// Изменения состава реквизитов
ИзменитьРеквизиты ( ДобавляемыеРеквизиты );
Изменение элементов формы
Для управления составом элементов у объекта УправляемаяФорма есть коллекция Элементы . У коллекции есть несколько методов:
Коллекция Элементы доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Вставить () , Добавить () , Переместить () и Удалить () ) можно только на сервере. Искать и получать количество элементов (методы Найти () и Количество () ) можно как на клиенте, так и на сервере. Элементами коллекции могут быть:
Элементам формы можно программно назначить обработчики событий. Для этих целей предназначен метод УстановитьДействие ( ИмяСобытия >, Действие >) .
Рассмотрим несколько наиболее распространенных на практике примеров работы с командами, реквизитами и элементами формы.
Добавление команды и связанной с ней кнопки:
// Создание команды
Команда = Команды . Добавить ( «ИсторияИзменений» );
Команда . Действие = «Подключаемый_ОтобразитьИсторию» ; // В форме должна быть процедура с указанным наименованием
Команда . Заголовок = «История изменений…» ;
// Создание кнопки и связь ее с командой
Элемент = Элементы . Добавить ( «ИсторияИзменений» , Тип ( «КнопкаФормы» ));
Элемент.ИмяКоманды = «ИсторияИзменений» ;
Добавление реквизита и связанного с ним поля ввода:
// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты . Добавить (Новый РеквизитФормы ( «Покупатель» , Новый ОписаниеТипов ( «СправочникСсылка.Контрагенты» ), , «Клиент» ));
// Изменение состава реквизитов
ИзменитьРеквизиты ( ДобавляемыеРеквизиты );
// Создание поля ввода и связь с реквизитом
Элемент = Элементы . Добавить ( «Покупатель» , Тип ( «ПолеФормы» ));
Элемент . Вид = ВидПоляФормы . ПолеВвода ;
Элемент . ПутьКДанным = «Покупатель» ;
Назначение элементу формы обработчика события:
ЭлементПокупатель . УстановитьДействие ( «ПриИзменении» , «Подключаемый_ПокупательПриИзменении» );
&НаКлиенте
Процедура Подключаемый_ПокупательПриИзменении ( Элемент )
// Действия события
КонецПроцедуры
Внимание!
Процедурам, которые устанавливаются в качестве обработчиков событий из кода с помощью метода УстановитьДействие () , рекомендуется задавать префикс Подключаемый_.
Внимание!
Остались вопросы?
Спросите в комментариях к статье.
Для оптимизации рутинной процедуры «отрисовки» внешнего вида формы, была написана небольшая процедура.
Применение
В примере кода для вновь созданной формы отчета на СКД добавляются группы-колонки и существующие стандартные реквизиты перемещаются (Результат — в левую, настройки в правую колонку).
Следует обратить внимание на установку свойства «Вид».
До его установки часть свойств элемента (расширения данного вида) будет недоступна, и при их установке вызывать ошибку.
Пример кода
Не экономьте на рекламе, охране и страховании.
Guesto notes
При доработке типовых решений для упрощения дальнейшей поддержки и обновления использую программное создание динамического списка и вывод его на форму.
Задача
Считаем, что есть типовая форма списка номенклатуры с динамическим списком. На форму необходимо добавить страницы: на первой выводить типовой список, а на второй список номенклатуры и данные РС «Данные для обработки». На текущий момент форма выглядит так:
Решение
План работ следующий:
- Создать страницы на форме;
- Переместить типовой динамический список на нужную страницу;
- Создать динамический список и вывести его на нужную страницу.
Далее будет показан код по логическим блокам, в конце статьи будет представлен итоговый код
Создание страниц
Программное формирование реквизитов и элементов формы можно в статье 1С. Программное добавление и удаление реквизитов формы
Перемещение элементов формы
Для перемещения типового динамического списка воспользуемся методом коллекции элементов формы Переместить()
Программное создание динамического списка
Добавляем реквизит формы с типом Динамический список и определяем основные свойства.
Теперь создадим элементы формы относящиеся к динамическому списку
Небольшая хитрость
Как видно из кода, на форме не отображается поле «Ссылка», если на клиенте программно обратиться к текущим данным нашего списка, то свойства ссылка в полученной коллекции не будет. Для предотвращения такой ситуации необходимо указать обязательность использования поля, тогда свойство будет передаваться на клиент всегда
Результат
Теперь проверяем, что у нас получилось. Первая страница, на которую мы перенесли типовой список
А что же на "мисте" этот вариант не выложил?
"А зачем:<br>> Спис.ДобавитьЗначение(Спр.Код);<br>> Код = Спис.ПолучитьЗначение(С,Ст);<br>> Спр.НайтиПоКоду(Код);<br>Если можно:<br>Спис.ДобавитьЗначение(Спр.ТекущийЭлемент());<br>и далее: <br>Для С = 1 По Спис.РазмерСписка() Цикл<br>Элемент=Спис.ПолучитьЭлемент(С);<br>Элемент.Родитель=ВотЭтаГруппа;<br>Спр.Записать();<br>КонецЦикла;<br><br>Но проще вообще:<br>Спр.ВыбратьЭлементы(1); <br>Пока Спр.ПолучитьЭлемент(0) = 1 Цикл<br>Если Спр.ЭтоГруппа() = 1 Тогда Продолжить; КонецЕсли;<br>Спр.Родитель=ВотЭтаГруппа;<br>Спр.Записать();<br>КонецЦикла;<br><br>Если я не прав спецы меня поправят. :)"
"> Но проще вообще:<br>> Спр.ВыбратьЭлементы(1); <br>> Пока Спр.ПолучитьЭлемент(0) = 1 Цикл<br>> Если Спр.ЭтоГруппа() = 1 Тогда Продолжить; КонецЕсли;<br>> Спр.Родитель=ВотЭтаГруппа;<br>> Спр.Записать();<br>> КонецЦикла;<br>> <br>> Если я не прав спецы меня поправят. <br><br>выборка собьётся!"
"> (перемещаю только элементы справочника, не входящие ни в одну из групп):<br> <br><br>Процедура Сформировать()<br><br>Спр = СоздатьОбъект("Справочник.Контрагенты"); <br><br>Спр.НайтиПоНаименованию("Наша группа");<br><br>ВотЭтаГруппа = Спр.ТекущийЭлемент(); <br><br>Спис = СоздатьОбъект("СписокЗначений");<br><br><br>Спр.ВыбратьЭлементы(0); <br><br>Пока Спр.ПолучитьЭлемент(0) = 1 Цикл<br><br>Если (Спр.ЭтоГруппа() = 1) или (спр.Уровень()>0) Тогда Продолжить; КонецЕсли;<br><br>Спис.ДобавитьЗначение(Спр.ТекущийЭлемент());<br> <br>КонецЦикла;<br><br>Спр = СоздатьОбъект("Справочник.Контрагенты"); <br><br>Для С = 1 По Спис.РазмерСписка() Цикл<br><br>Код = Спис.ПолучитьЗначение(С);<br><br>Если Спр.НайтиЭлемент(Код)=1 тогда<br><br>Спр.Родитель=ВотЭтаГруппа; <br><br>Спр.Записать(); <br>КонецЕсли;<br>КонецЦикла;<br><br>КонецПроцедуры<br><br>соточку на тел )))))))"
1c 7.7 Программно Создать Новый Элемент В Формесписка Справочника
День добрый! Снова нужен совет профессионалов, бьюсь уже не один день. Проблема в следующем: .
Открыть группу иерархического справочника
Как можно открыть форму с отбором по группе, чтобы открылась только необходимая группа.
Загрузка контрагентов в конкретную группу справочника
Здравствуйте! Как создать правило обмена, согласно которому контрагенты одной базы (БП 2.0).
Как программно определить тип формы справочника
Как определить, с какой формой в данный момент работает пользователь: формой элемента или формой.
Как получить значение реквизита одного справочника и перенести их в реквизит табличной части другого
Добрый день, очень сильно нужна помощь. Есть справочник "ВидыУслуг", реквизит "Тариф" .
Как при изменении данных в одном справочнике перенести некоторые данные в него из другого справочника?
Подскажите пожалуйста! Возможно ли такое? Есть справочник "База контрагентов" так скажем.
Во введенной символьной строке группу символов заменить на другую группу символов
Sub zamena() Dim s, snew, c As String Dim n, i As Integer s = InputBox("введите строку") n =.
Во введенной символьной строке группу символов заменить на другую группу символов
Задача : Во введенной символьной строке группу символов НН заменить на группу символов Нижний.
Особенности реализации перетаскивания в формах
В 1С:Предприятии реализован механизм поддержки операций перетаскивания. С его помощью возможно осуществлять перенос данных между разными элементами управления. Например, можно переносить элементы списка справочника из одной группы в другую, переносить данные из табличного поля в поле табличного документа или перенести список выделенных файлов из проводника MS Windows в какой-либо элемент управления.
Операции перетаскивания поддерживают следующие элементы управления:
- табличное поле;
- поле табличного документа;
- поле календаря;
- поле картинки.
При операциях перетаскивания используются следующие понятия:
- источник данных - элемент управления из которого можно перетаскивать данные;
- <приемник данных - элемент управления в который можно перетаскивать данные.
Существует возможность разрешать или запрещать элементам управления предоставлять или принимать данные, т.е. быть источником или приемником данных. Для этого у элементов управления существуют следующие свойства: “Разрешить начало перетаскивания” – разрешает элементу управления предоставлять данные и “Разрешить перетаскивание” – разрешает элементу управления принимать данные. Эти свойства можно устанавливать из палитры свойств или из встроенного языка .
Последовательность событий при перетаскивании
При нажатии кнопки мыши на выделенной области элемента управления (это может быть строка, группа строк табличного поля, область поля табличного документа, дата календаря или картинка) у элемента управления – источника данных вызывается обработчик события НачалоПеретаскивания . В качестве параметров данного события передаются объект типа “ ПараметрыПеретаскивания ” и “ СтандартнаяОбработка ”. Параметр ПараметрыПеретаскивания имеет следующие свойства:
- Значение - содержит перетаскиваемое значение, например, для табличного поля это может быть ссылка на объект, для табличного документа – область табличного документа, для календаря – дата. Можно присвоить этому свойству свое значение (например, какую-нибудь структуру), тогда это значение будет являться перетаскиваемым объектом.
- Действие – указывает действие перетаскивания и является значением типа ДействиеПеретаскивания ( Копирование , Перемещение , Выбор или Отмена ).
- ДопустимыеДействия – указывает допустимые действия перетаскивания и является значением типа ДопустимыеДействияПеретаскивания ( Копирование , Перемещение , КопированиеИПеремещение , H еОбрабатывать ). При помощи этого свойства можно указать какие операции возможны с данными источника данных (например, только копирование).
Параметр СтандартнаяОбработка позволяет разрешить или запретить стандартную обработку операции перетаскивания из данного элемента управления. Для события НачалоПеретаскивания стандартной обработкой является начало перетаскивания данных .
Далее, у элемента управления – приемника данных вызывается обработчик события ПроверкаПеретаскивания . Данный обработчик вызывается всякий раз, когда курсор попадает на новый объект в элементе управления – приемнике данных (например, в новую ячейку табличного поля или поля табличного документа, при попадании в новую дату в поле календаря). Набор параметров данного события зависит от элемента управления – приемника данных, но первые два параметра у всех одинаковы. Это объект типа ПараметрыПеретаскивания и СтандартнаяОбработка . Остальные параметры описывают объект под курсором. Для табличного поля это Строка и Колонка , для поля табличного документа – Область , для календаря – Дата , а для поля картинки дополнительных параметров нет. При обработке данного события можно управлять видом курсора, т.е. например указывать что перетаскивание в данный элемент управления запрещено или возможно только копирование. Для этого необходимо установить необходимое действие в свойстве Действие параметра ПараметрыПеретаскивания. Необходимо учитывать , что устанавливаемое действие перетаскивания должно быть разрешенным , т . е . не вступать в противоречие с значением свойства ДопустимыеДействия . Например, действие Копирование не вступает в противоречие со значением допустимых действий КопированиеИПеремещение , а значение Перемещение вступает в противоречие со значением допустимых действий Копирование . Параметр СтандартнаяОбработка используется для указания возможности стандартной обработки элементом управления данного события. Стандартная обработка перетаскивания зависит от типа элемента управления :
Для табличного поля проверяется возможность вставки значения, т.е. проверяется тип значения, и если он совпадает с типом отображаемых данных, то производятся стандартные действия. Стандартные действия для иерархических динамических списков – перемещение в группу, для табличных полей , отображающих наборы записей или табличные части изменение порядка строк и копирование.
Для поля табличного документа – проверка возможности вставить передаваемое значение.
Для поля картинки и календаря стандартной обработки нет.
При отпускании клавиши мыши в элементе управления – приемнике данных вызывается обработчик события Перетаскивание . Набор параметров этого события тот же, что и у события ПроверкаПеретаскивания . Параметр СтандартнаяОбработка позволяет разрешить или запретить стандартную обработку события элементом управления. Стандартные действия перетаскивания описаны выше .
Затем в элементе управления – источнике данных вызывается обработчик события ОкончаниеПеретаскивания . При обработке этого события элемент управления – приемник данных может, например, удалить перемещенные данные или очистить какие – либо переменные.
В демонстрационную конфигурацию ИТС помещен пример , показывающий основные приемы при реализации перетаскивания в формах . Описание примера см. в разделе Пример реализации перетаскивания в формах.
Читайте также: