1с динамический список дополнительные реквизиты


Добавление доп. реквизита в динамический список программно

Добавление доп. реквизита в динамический список программно

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

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

Как добавить дополнительный реквизит в динамический список:

Получившейся код модуля:

&НаКлиенте
Процедура dev_ПриОткрытииПосле(Отказ)
	
	ОтображениеДополнительныхРеквизитов();
	
КонецПроцедуры

&НаСервере
Процедура ОтображениеДополнительныхРеквизитов()
		
	// Получаем набор свойств объекта по пустой ссылке объекта метаданных.
	НаборСвойств = УправлениеСвойствамиСлужебный.ПолучитьНаборыСвойствОбъекта(Справочники.Номенклатура.ПустаяСсылка());
		
	// Инициализируем имя набора свойств. 
	ИмяНабора = НаборСвойств[0].Набор.Наименование;     
	Свойства  = НаборСвойств[0].Набор.ДополнительныеРеквизиты.Выгрузить().ВыгрузитьКолонку("Свойство");
	
	// Наполняем массив именами доп.реквизитов, которые мы хотим отобразить в списке формы. 
	// Можно создать отдельную настроку, например регистр где будем хранить выводимые поля,
	// для конкретных объектов метаданных или даже в зависимости от роли.
	МассивОтображаемыхСвойств = Новый Массив;
	МассивОтображаемыхСвойств.Добавить("Краткое описание");
	// и т.д.
	
	// Если например у нас полные права то выведем все доп.реквизиты.
	Если РольДоступна("ПолныеПрава") Тогда   
		МассивОтображаемыхСвойств = ПолучитьМассивНаименованийСвойств(Свойства);
	КонецЕсли;
	
	// Квадратные скобки обязательны.
	// Именно так платформа понимает что мы обращаемся к реквизиту ТЧ "ДополнительныеРеквизиты" 
	ШаблонПутьКДанным = "Список.Ссылка.[%1 (%2)]";	 
	
	// Обход циклом свойств для вывода в список.
	Для каждого ТекущееСвойство Из Свойства Цикл
		
		НаименованиеСвойства = ТекущееСвойство.Наименование; 
		ИмяЭлемента = ТекущееСвойство.ИдентификаторДляФормул; 
		
		Если  МассивОтображаемыхСвойств.Найти(НаименованиеСвойства) <> Неопределено Тогда
			СтрокаДанные = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонПутьКДанным, НаименованиеСвойства, ИмяНабора); 					
			НовыйЭлемент = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), Элементы.Список);
			НовыйЭлемент.Вид 			= ВидПоляФормы.ПолеВвода;
			НовыйЭлемент.ПутьКДанным 	= СтрокаДанные;
			НовыйЭлемент.Заголовок 		= НаименованиеСвойства;	  
		КонецЕсли;  
		
	КонецЦикла; 
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьМассивНаименованийСвойств(МассивСвойств) 

	МассивНаименований = Новый Массив;
	Для каждого Свойство Из МассивСвойств Цикл	
		МассивНаименований.Добавить(Свойство.Наименование);
	КонецЦикла;
	
	Возврат МассивНаименований;
	
КонецФункции;

Данный код проверялся на конфигурации «Бухгалтерия предприятия 3.0», но он подойдет для любой конфигурации.

Как результат работы нашего кода прикладываем скриншот и тестовое расширение конфигурации:

6.png - ITsale

Как видим все доп. реквизиты появились в нашем списке.

Для подключения расширения использовались такие надстройки:

7.png - ITsale

Скачать расширение

Оставить заявку на бесплатную консультацию прямо сейчас!


Добавление доп. реквизита в динамический список

Я
   AceVi

13.08.21 — 15:46

Приветствую всех.

подымалась мне такая задача.

Как добавить в динамический список доп реквизит программно? и условное оформление по нему.

все мы знаем что в клиенте можно через еще — изменить форму добавить доп реквезит(например в справочнике подразделения организаций у нас есть доп рек. цех) на форму списка.

а как сделать то же самое программно? я так и не смог найти.

а потом сделать по нем условное оформление.( но думаю при решении 1 вопроса решиться и 2).

если у нас динамический список произвольныйЗАПРОС = ИСТИНА. то все понятно — меняем запрос добавляя туда данные

но в нашем случае ЛОЖЬ и просто задана основная таблица и все.

как в нашем случае вывести доп рек программно на управляемую форму?

  

Партнерская программа EFSOL Oblako

   AceVi

1 — 16.08.21 — 15:18

ап

пока в голову пришло только разворотить все через расширение и поставить произвольныйЗАПРОС = ИСТИНА и дальше от этого плясать

   DrShad

2 — 16.08.21 — 15:24

создай поле и пропиши ПутьКДанным типа «ПодразделениеОрганизации.Цех»

делов то

   AceVi

3 — 16.08.21 — 15:38

(2) Неверно!

Доп рек -ты лежат в таблице привязанной к объекту. это не просто реквизит объекта.

   hhhh

4 — 16.08.21 — 15:41

(3) а зачем программно? добавляйте непрограммно. поставьте галку Произвольный запрос и вперед.

   DrShad

5 — 16.08.21 — 15:42

(3) ты про Характеристики что-то слышал?

   AceVi

6 — 16.08.21 — 15:47

(4) ну вот разве что так, но хотелось бы программно. нельзя?

(5) что то слышал — но при чем тут они? как они связаны с доп рек-ми?

   DrShad

7 — 16.08.21 — 15:49

(6) самым тесным образом

   AceVi

8 — 16.08.21 — 15:57

(7) простите, но вы не помогаете решить проблему.

дайте ссылку что ли хотя бы — где характеристики делают как доп рек-ты и программно выводят на динамический список где роизвольныйЗАПРОС = лЛожь.

   Жан Пердежон

9 — 16.08.21 — 15:59

(8) как по-твоему, откуда дин.список узнает откуда ему брать доп.реквизиты, если они лежат в другой таблице?

   AceVi

10 — 16.08.21 — 16:04

(9) Через запрос . а уж как он там платформе его формирует — то мне не ведомо.

   hhhh

11 — 16.08.21 — 16:09

(6) если программно это в 10 раз дольше. А результат, если что-то поменяется в динамическом списке, то программное еще быстрее рухнет. Так что то же самое, что и не программно. В случае динамического списка без разницы.

   DrShad

12 — 16.08.21 — 16:10

   DrShad

13 — 16.08.21 — 16:10

(10) через характеристики )))

   AceVi

14 — 16.08.21 — 16:11

(11) не поныл вас.

ну может не в 10 а в 3 раза дольше. ну что жеш.

насчет «рухнет» не согласен.

   AceVi

15 — 19.08.21 — 10:20

Короче может кому пригодиться

1. Сделать все красиво не получилось(т.е. добавить програмно доп рек на форму и отбор по нему)

2. Начало процедуры в расширении при создании на сервере

2.1 Выбираем своим запросом ссылки с этим доп рек-ом

2.2 делаем условное оформление где выделяем цветом строку с нужным значением доп рек-та(не отбор, но видимо выделяем для пользователя)

2.3 при изменении(а значит кто то записал элемент справочника) — обновляем список из 2.1 и обновляем его в отборе условного оформления из 2.2.

Итого получаем — рек-та нет на форме, но форма реагирует цветным выделением строки для нужного значения доп рек-та.

Да, это только условное выполнение конкретной задачи для доп рек-ты у которого ограниченное(заранее заданное) кол-во значений.

Как можно сделать лучше?

   runoff_runoff

16 — 19.08.21 — 12:09

Поле.ПутьКДанным = «Список.Ссылка.[наименование доп реквизита]»;

при условии, что в метаданных заданы характеристики для этого объекта..

   runoff_runoff

17 — 19.08.21 — 12:11

(16) метаданные из (12).. квадратные скобки обязательны..

   Pro-tone

18 — 19.08.21 — 12:12

(0) никак кроме как добавлением поля в запрос демонического списка, условное оформление не имеет отношения к данным списка, оно всего лишь его разукрашивает

  

AceVi

19 — 19.08.21 — 12:51

(18) еще как имеет.

1. Отбор по данным списка( что именно разукрашиваем)

2. Оформляемые поля- сиречь колонки списка для рзукрашивания.

как видим оформление — напрямую зависит от данных.

(16) это не спортивно — стандартную конфу менять нельзя а в  расширении характеристики добавлять нельзя.

отклонено.

Для того, чтобы добавить новые реквизиты в динамический список на управляемой форме можно восльзоваться следующим программным кодом:

СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(ДинамическийСписок.ТекстЗапроса);ЗапросВыбора = СхемаЗапроса.ПакетЗапросов[0];ОператорВыбора = ЗапросВыбора.Операторы[0];
ОператорВыбора.ВыбираемыеПоля.Добавить(«ИмяСправочника.ИмяРеквизита1»);
ОператорВыбора.ВыбираемыеПоля.Добавить(«ИмяСправочника.ИмяРеквизита2»);ДинамическийСписок.ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();

По материалам документации БСП 2.4

Данная статья написана по материалам документации библиотеки стандартных подсистем 2.4.

Подсистема «Свойства» позволяет создавать и редактировать в режиме 1С:Предприятие дополнительные свойства произвольных объектов конфигурации (не внося изменения в саму конфигурацию).
Для того чтобы использовать дополнительные свойства, необходимо включить флажок Дополнительные реквизиты и сведения в разделе Администрирование – Общие настройки.

Дополнительные свойства объектов могут быть двух видов:

  • дополнительные реквизиты – это свойства, которые хранятся в самом объекте (в специализированной табличной части). Дополнительные реквизиты являются неотъемлемой частью объекта, вводятся при его редактировании и доступны для редактирования тем же пользователям, которым доступен и сам объект со свойствами. Например, реквизиты вес, размеры, цвет справочника товары.
  • дополнительные сведения – не являются неотъемлемыми свойствами объекта. Они, как правило, доступны для редактирования тем пользователям, которые не имеют доступа к самому объекту. При внедрении подсистемы совместно с подсистемой «Управление доступом» имеется возможность ограничивать доступ пользователей к отдельным дополнительным сведениям. Например, дата ближайшей поставки товара.

Входящие объекты в подсистему “свойства”

Общие модули

  • УправлениеСвойствами
  • УправлениеСвойствамиКлиент
  • УправлениеСвойствамиПереопределяемый
  • УправлениеСвойствамиСлужебный

Роли

  • Добавление и изменение дополнительных реквизитов и сведений
  • Изменение дополнительных сведений
  • Чтение дополнительных сведений

Подписки на событие

  • СвойстваПередУдалениемСсылочногоОбъекта – Обработчик события выполняет поиск ссылок на удаляемые объекты в таблице зависимостей дополнительных реквизитов

Функциональные опции ( Константы)

  • ИспользоватьДополнительныеРеквизитыИСсведения
  • ИспользоватьОбщиеДополнительныеЗначения
  • ИспользоватьОбщиеДополнительныеРеквизитыИСведения

Определяемые типы данных

  • ВладелецДополнительныхСведений

Общие формы

  • РедактированиеГиперссылки
  • РедактированиеДополнительныхСведений – Предназначен для просмотра и ввода значений дополнительных сведений. Ввод значений дополнительных сведений, как правило, осуществляется в отдельном окне, в отличие от дополнительных реквизитов. Открывается с помощью кнопки Дополнительные сведения из окон объектов программы, для которых были настроены дополнительные сведения..В списке выводится Наименование и Значение дополнительного сведения.

Общие команды ( Командная панель)

  • ДополнительныеСведенияКоманднаяПанель

Справочники

  • ЗначенияСвойствОбъектов ( Дополнительные значения )-В списке задаются значения дополнительных реквизитов и сведений.
  • ЗначенияСвойствОбъектовИерархия (Дополнительные значения иерархия)- В списке можно использовать иерархию значений. Элементы в таком списке имеют одинаковые свойства, но могут иметь подчиненные элементы. При этом иерархия может быть довольно сложной. Можно выбрать любой элемент иерархии, в отличие от сгруппированного списка дополнительных значений, в котором наименования групп выбрать в качестве значения невозможно.
  • НаборыДополнительныхРеквизитовИСведений – Предназначен для настройки наборов дополнительных свойств. Можно настроить наборы дополнительных свойств для определенных объектов программы.

Планы видов характеристик

  • ДополнительныеРеквизитыИСведения

Регистры сведений

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

Программный интерфейс подсистемы “Свойства”

Программный интерфейс БСП включает в себя все экспортные процедуры и функции, которые размещены в областях кода ПрограммныйИнтерфейс.

Для удобства поиска и изучения программный интерфейс сгруппирован по подсистемам и разделен на две основные категории:

Интерфейс – экспортные процедуры и функции, которые предназначены для вызова из прикладного кода;

Переопределение – экспортные процедуры переопределяемых модулей, содержимое которых может или должно быть изменено в конфигурации-потребителе. С их помощью решаются задачи изменения поведения библиотечной функциональности, ее параметризации спецификой конфигурации-потребителя, а также для подключения библиотечной функциональности к объектам конфигурации-потребителя. Они не предназначены для вызова из прикладного кода.

Экспортные процедуры и функции, которые предназначены для вызова из прикладного кода

  1. ВыполнитьКоманду – Обработчик команд с форм, к которым подключены дополнительные свойства.
  2. ЗаписатьСвойстваУОбъекта – Записывает дополнительные реквизиты и сведения владельцу свойств. Изменения происходят в транзакции
  3. ЗаполнитьДополнительныеРеквизитыВФорме – Создает/пересоздает дополнительные реквизиты и элементы в форме владельца свойств.
  4. ЗначениеСвойства – Возвращает значение дополнительного свойства объекта.
  5. ЗначенияСвойств – Возвращает значения дополнительных свойств объектов.
  6. ИспользоватьДопРеквизиты – Проверяет, используются ли дополнительные реквизиты с объектом.
  7. ИспользоватьДопСведения – роверяет, используются ли дополнительные сведения объектом.
  8. ОбновитьЗависимостиДополнительныхРеквизитов
    Обновляет видимость, доступность и обязательность заполнения дополнительных реквизитов
  9. ОбновитьНаименованияНаборовИСвойств – Обновляет наименования предопределенных наборов свойств, если они отличаются от текущих представлений соответствующих им объектам метаданных со свойствами. . Обновляет наименования не общих свойств, если у них уточнение отличается от наименования их набора. Устанавливает пометку удаления у не общих свойств, если установлена пометка удаления их наборов.
  10. ОбновитьЭлементыДополнительныхРеквизитов – Обновляет отображаемые данные на форме объекта со свойствами.
  11. ОбрабатыватьОповещения – Определяет, что указанное событие – это событие об изменении набора свойств.
  12. ОбработкаПроверкиЗаполнения – Проверяет заполненность реквизитов обязательных для заполнения.
  13. ПередЗаписьюВидаОбъекта – Обновляет наборы дополнительных реквизитов и сведений для вида объектов со свойствами. Используется при записи элементов справочников, которые являются видами объектов со свойствами. Например, если есть справочник Номенклатура к которому применяется подсистема Свойства, для него создан справочник ВидыНоменклатуры, то при записи элемента ВидНоменклатуры необходимо вызывать эту процедуру
  14. ПередЗаписьюНаСервере – Заполняет объект из реквизитов, созданных в форме. Вызывается из обработчика ПередЗаписьюНаСервере формы объекта со свойствами.
  15. ПеренестиЗначенияИзРеквизитовФормыВОбъект – Переносит значения свойств из реквизитов формы в табличную часть объекта
  16. ПослеЗагрузкиДополнительныхРеквизитов – Проверяет наличие зависимых дополнительных реквизитов на форме и, при необходимости, подключает обработчик ожидания проверки зависимостей реквизитов.
  17. ПриСозданииНаСервере – Создает основные реквизиты и поля формы, необходимые для работы. Заполняет дополнительные реквизиты, если используются. Вызывается из обработчика ПриСозданииНаСервере формы объекта со свойствами.
  18. ПриЧтенииНаСервере – Заполняет объект из реквизитов, созданных в форме. Вызывается из обработчика ПередЗаписьюНаСервере формы объекта со свойствами.
  19. ПроверитьСвойствоУОбъекта — Проверяет, есть ли у объекта свойство.
  20. СвойстваОбъекта – Возвращает дополнительные реквизиты и сведения у указанного объекта.
  21. СтруктураПараметровНабораСвойств – Получает структуру параметров для набора свойств.
  22. УдалитьСтарыеРеквизитыИЭлементы – Удаляет старые реквизиты и элементы формы.
  23. УстановитьПараметрыНабораСвойств – Устанавливает параметры набора свойств.

Экспортные процедуры переопределяемой модули

  1. ЗаполнитьНаборыСвойствОбъекта – Заполняет наборы свойств объекта. Обычно требуется, если наборов более одного.

Порядок настройки объектов с дополнительными реквизитами

1. Создать табличную часть ДополнительныеРеквизиты с реквизитами:

Имя Тип Подсказка
Свойство ПланВидовХарактеристикСсылка. Дополнительные РеквизитыИ Сведения Дополнительный реквизит
Значение Характеристика. Дополнительные Реквизиты И Сведения Значение дополнительного реквизита
ТекстоваяСтрока Строка неограниченной длины Полный текст строкового дополнительного реквизита

2. Реквизиту Значение в свойстве Связи параметров выбора установить связь: Отбор.Владелец(ДополнительныеРеквизиты.Свойство).

3 . В форме объекта рекомендуется создать специальную группу полей или страницу с наименованием ГруппаДополнительныеРеквизиты для размещения элементов управления, редактирующих свойства объекта.

4. В обработчике события ПриСозданииНаСервере формы объекта необходимо выполнить вызов:

// СтандартныеПодсистемы.Свойства 
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "ГруппаДополнительныеРеквизиты");
УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
// Конец СтандартныеПодсистемы.Свойства

где ГруппаДополнительныеРеквизиты – имя группы формы, созданной на шаге 3, в которой будут располагаться поля формы, предназначенные для редактирования дополнительных реквизитов. Если этот параметр не указывать, то элементы управления для редактирования свойств будут размещаться в нижней части формы.

5. В некоторых случаях возникает необходимость размещать дополнительные реквизиты в разных местах формы, например, когда в форме с несколькими страницами на каждой из них выводится свой набор свойств. В таком случае в параметр ИмяЭлементаДляРазмещения необходимо передать список значений, где значение – ссылка на предопределенный набор свойств, а представление – имя группы формы, в которую выводить его реквизиты. Например, в форме объекта справочника _ДемоКонтрагенты:

Вот фрагмент программного кода обработчика события ПриСозданииНаСервере в этой форме объекта :

СправочникНаборы = Справочники.НаборыДополнительныхРеквизитовИСведений; 
ГруппыДляРазмещения = Новый СписокЗначений;
ГруппыДляРазмещения.Добавить(СправочникНаборы.СправочникДемоКонтрагентыОсновное, Элементы.ГруппаОсновное.Имя);
ГруппыДляРазмещения.Добавить("ВсеОстальные", Элементы.ГруппаПрочее.Имя);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", ГруппыДляРазмещения);
УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект,ДополнительныеПараметры);

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

При использования формы для работы с разными объектами следует передать параметр ПроизвольныйОбъект со значением Истина и в дальнейшем вызывать процедуру ОбновитьЭлементыДополнительныхРеквизитов для разных объектов.

6. В модуле формы каждого объекта со свойствами необходимо добавить процедуру:

#Область ОбработчикиКомандФормы 
...
// СтандартныеПодсистемы.Свойства
&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено) УправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
КонецПроцедуры
// Конец СтандартныеПодсистемы.Свойства #КонецОбласти

7. В обработчике события ОбработкаОповещения добавить код:

// СтандартныеПодсистемы.Свойства 
Если УправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда
ОбновитьЭлементыДополнительныхРеквизитов(); УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
// Конец СтандартныеПодсистемы.Свойства

8. В обработчике события ПриОткрытии добавить код:

 // СтандартныеПодсистемы.Свойства     УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект); // Конец СтандартныеПодсистемы.Свойства 

9. Добавить вспомогательные процедуры:

#Область СлужебныеПроцедурыИФункции 
// СтандартныеПодсистемы.Свойства
&НаСервере Процедура ОбновитьЭлементыДополнительныхРеквизитов() УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект); КонецПроцедуры
&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов() УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент) УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.Свойства
11111111111111111111 #КонецОбласти

10. В обработчике события ПриЧтенииНаСервере добавить код:

// СтандартныеПодсистемы.Свойства УправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); 
// Конец СтандартныеПодсистемы.Свойства

11. В обработчике события  ОбработкаПроверкиЗаполненияНаСервере добавить код:

// СтандартныеПодсистемы.Свойства УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты); // Конец СтандартныеПодсистемы.Свойства

12. В обработчике события ПередЗаписьюНаСервере добавить код:

// СтандартныеПодсистемы.Свойства УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
// Конец СтандартныеПодсистемы.Свойства

Порядок настройки отложенной инициализации дополнительных реквизитов

Дополнительные реквизиты, расположенные на отдельной странице (закладке) формы, необходимо загружать отложенно. Это позволит существенно ускорить открытие форм.

Важно! При отложенной инициализации будет невозможно выполнить перемещение дополнительных реквизитов при помощи команды Изменить форму из группы, в которой они расположены.

1. В обработчике события ПриСозданииНаСервере формы объекта, в блоке кода:

// СтандартныеПодсистемы.Свойства 
ДополнительныеПараметры = Новый Структура; ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "ГруппаДополнительныеРеквизиты"); УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
// Конец СтандартныеПодсистемы.Свойства

дополнить структуру новым параметром ОтложеннаяИнициализация:

ДополнительныеПараметры.Вставить("ОтложеннаяИнициализация", Истина);

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

// СтандартныеПодсистемы.Свойства 
Если ЭтотОбъект.ПараметрыСвойств.Свойство(ТекущаяСтраница.Имя) И Не ЭтотОбъект.ПараметрыСвойств.ВыполненаОтложеннаяИнициализация Тогда СвойстваВыполнитьОтложеннуюИнициализацию(); УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
// Конец СтандартныеПодсистемы.Свойства

3. Добавить вспомогательную процедуру:

#Область СлужебныеПроцедурыИФункции
&НаСервере
Процедура СвойстваВыполнитьОтложеннуюИнициализацию() УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект); КонецПроцедуры
#КонецОбласти

Порядок настройки объектов с дополнительными сведениями

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

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

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

Порядок настройки наборов свойств объектов

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

1. В справочнике НаборыДополнительныхРеквизитовИСведений создать предопределенный элемент с именем Справочник_<ИмяОбъекта>, если объект – справочник, например:
 Справочник__ДемоКонтрагенты, или Документ_<ИмяОбъекта>, если объект – документ, например : Документ_АвансовыйОтчет. Наименование элемента при этом заполнять не требуется (оно будет заполнено автоматически на основании представления списка того объекта, к которому относится данный элемент).

2. Добавить в обработчике обновления информационной базы вызов процедуры УстановитьПараметрыНабораСвойствобщего модуля УправлениеСвойствами для заполнения настроек добавленного набора свойств.

3. В обработчике ПередЗаписью модуля объекта этого справочника выполнить вызов УправлениеСвойствами.ПриЗаписиВидаОбъекта и передать туда в качестве параметров записываемый объект и имя набора свойств, например:

// СтандартныеПодсистемы.Свойства УправлениеСвойствами.ПередЗаписьюВидаОбъекта(ЭтотОбъект, "Справочник_ДемоНоменклатура");
// Конец СтандартныеПодсистемы.Свойства

Если справочник группирует объекты более чем одного типа, следует сделать два или более вызова, указав имена используемых реквизитов, например:

// СтандартныеПодсистемы.Свойства УправлениеСвойствами.ПередЗаписьюВидаОбъекта(ЭтотОбъект, "Справочник_ДемоОшибки","НаборСвойствОшибок"); УправлениеСвойствами.ПередЗаписьюВидаОбъекта(ЭтотОбъект, "Справочник_ДемоЗадачи","НаборСвойствЗадач");
// Конец СтандартныеПодсистемы.Свойства

4. В объекте – владельце свойств создать реквизит, значения которого определяют применение того или иного набора свойств для конкретного экземпляра объекта. Для справочника _ДемоНоменклатура это реквизит ВидНоменклатуры типа  СправочникСсылка._ДемоВидыНоменклатуры.

5. В модуле формы объекта реализовать обработчик ПриИзменении для элемента формы, редактирующего этот реквизит. Для справочника _ДемоНоменклатура это обработчик:

&НаКлиенте
Процедура ВидНоменклатурыПриИзменении(Элемент) ОбновитьЭлементыДополнительныхРеквизитов();
КонецПроцедуры

6. В процедуре ЗаполнитьНаборыСвойствОбъекта общего модуля УправлениеСвойствамиПереопределяемый вставить условие, заполняющее набор свойств для конкретного объекта. Например, для _ДемоНоменклатура это следующее условие:

Процедура ЗаполнитьНаборыСвойствОбъекта(Объект, ТипСсылки, НаборыСвойств, СтандартнаяОбработка, КлючНазначения) Экспорт 
Если ТипСсылки = Тип("СправочникСсылка._ДемоНоменклатура") Тогда ЗаполнитьНаборСвойствПоВидуНоменклатуры( Объект, ТипСсылки, НаборыСвойств);
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьНаборСвойствПоВидуНоменклатуры(Номенклатура, ТипСсылки, НаборыСвойств)
Если ТипЗнч(Номенклатура) = ТипСсылки Тогда Номенклатура = ОбщегоНазначения.ЗначенияРеквизитовОбъекта( Номенклатура, "ЭтоГруппа, ВидНоменклатуры");
КонецЕсли;
Если Номенклатура.ЭтоГруппа = Ложь Тогда
Строка = НаборыСвойств.Добавить();
Строка.Набор = ОбщегоНазначения.ЗначениеРеквизитаОбъекта( Номенклатура.ВидНоменклатуры, "НаборСвойств");
КонецЕсли;
КонецПроцедуры

Если справочник группирует объекты более чем одного типа, следует вписать в условие несколько типов, например:

  Если ТипСсылки = Тип("СправочникСсылка._ДемоОшибки") ИЛИ ТипСсылки = Тип("СправочникСсылка._ДемоЗадачи") Тогда         ЗаполнитьНаборСвойствПоПроекту( Объект, ТипСсылки, НаборыСвойств);     КонецЕсли;

7. В справочнике НаборыДополнительныхРеквизитовИСведений создать предопределенную группу с именем Справочник_<ИмяОбъекта>, если объект – справочник: Документ_<ИмяОбъекта>, если объект – документ, и т. д. Например, для справочника _ДемоНоменклатура создана предопределенная группа Справочник__ДемоНоменклатура. Наименование элемента при этом заполнять не требуется (оно будет заполнено автоматически на основании представления списка того объекта, к которому относится данный элемент).

8. Добавить в обработчике обновления информационной базы вызов процедуры УстановитьПараметрыНабораСвойствобщего модуля УправлениеСвойствами для заполнения настроек добавленного набора свойств.

Порядок настройки объектов с несколькими объединяющимися наборами свойств

Наборы свойств при этом должны объединяться в зависимости от тех или иных реквизитов объекта. Например, в справочнике партнеры могут быть введены клиенты, поставщики, конкуренты и партнеров, с которыми связывают прочие отношения. При этом один и тот же партнер может одновременно быть и тем, и другим, и третьим, а его дополнительные свойства должны динамически выводиться в зависимости от того, каких он типов. 

В демонстрационной конфигурации этот вариант показан на справочнике _ДемоПартнеры. В нем введены реквизиты КлиентПоставщикКонкурентПрочиеОтношения типа Булево, которые и определяют применение одного или сразу нескольких наборов свойств.

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

Последовательность настройки такого объекта:

1. Принять решение по поводу наборов свойств объекта. Например, для справочника _ДемоПартнеры демонстрационной конфигурации это четыре набора свойств: реквизиты КлиентПоставщикКонкурентПрочиеОтношения.

2. Выявить реквизиты объекта, значения которых определяют применение того или иного набора свойств для конкретного экземпляра объекта. Например, для справочника _ДемоПартнеры демонстрационной конфигурации это реквизиты Клиент,ПоставщикКонкурентПрочиеОтношения.

3. В справочнике НаборыДополнительныхРеквизитовИСведений создать предопределенную группу с именем Справочник_<ИмяОбъекта>, если объект – справочник; Документ_<ИмяОбъекта>, если объект – документ, и т. д. Например, Справочник_Контрагенты. Наименование элемента при этом заполнять не требуется (оно будет заполнено автоматически на основании представления списка того объекта, к которому относится данный элемент).

4. В этой предопределенной группе для каждого из наборов свойств создать предопределенный элемент с именами Справочник_<ИмяОбъекта>_<ИмяНабораСвойств>, например Справочник_Партнеры_Клиенты. Прим этом наименование элемента следует задавать краткое, например Клиенты; оно не должно содержать имя и тип объекта метаданных.

5. В этой предопределенной группе создать предопределенный элемент с именем Справочник_<ИмяОбъекта>_Общие и наименованием Общие, который будет содержать общие свойства для всех объектов.

6. В общем модуле УправлениеСвойствамиПереопределяемый в процедуре ЗаполнитьНаборыСвойствОбъекта следует вписать условие для данного типа объектов. Для справочника _ДемоПартнеры это код вида:

Процедура ЗаполнитьНаборыСвойствОбъекта(Объект, ТипСсылки, НаборыСвойств, СтандартнаяОбработка) Экспорт
Если ТипСсылки = Тип("СправочникСсылка._ДемоПартнеры") Тогда ЗаполнитьНаборыСвойствПартнера(Объект, ТипСсылки, НаборыСвойств); КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьНаборыСвойствПартнера(Партнер, ТипСсылки, НаборыСвойств) Если ТипЗнч(Партнер) = ТипСсылки Тогда
Объект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Партнер, "Клиент, Конкурент, Поставщик, ПрочиеОтношения, ЭтоГруппа");
Иначе
Объект = Партнер;
КонецЕсли;
Если Объект.ЭтоГруппа = Ложь Тогда
Строка = НаборыСвойств.Добавить();
Строка.Набор = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Партнеры_Общие;
Строка.Отображение = ОтображениеОбычнойГруппы.Линия; Строка.ОтображатьЗаголовок = Истина;
Строка.Заголовок = НСтр("ru = 'Для всех партнеров'");
Если Объект.Клиент Тогда
Строка = НаборыСвойств.Добавить();
Строка.Набор = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Партнеры_Клиенты;
Строка.Отображение = ОтображениеОбычнойГруппы.Линия; Строка.ОтображатьЗаголовок = Истина;
Строка.Заголовок = НСтр("ru = 'Для клиентов'");
КонецЕсли;
КонецПроцедуры

В приведенном примере проверяются значения реквизитов справочника КлиентПоставщикКонкурентПрочиеОтношения и наборы свойств добавляются в таблицу НаборыСвойств. В поле Набор устанавливается ссылка на набор свойств, а в остальные поля могут быть установлены значения оформления набора в форме.

7. В форме объекта необходимо реализовать обработчики ПриИзменении для тех реквизитов, которые определят состав наборов свойств, применяемых для данного экземпляра объекта. Например, для формы справочника _ДемоПартнеры это обработчики вида:

&НаКлиенте
Процедура КлиентПриИзменении(Элемент)
// СтандартныеПодсистемы.Свойства ОбновитьЭлементыДополнительныхРеквизитов();
// Конец СтандартныеПодсистемы.Свойства
КонецПроцедуры

[Практика программирования] Управляемые формы 1С 8: как программно изменить запрос динамического списка и программно вывести колонку добавленного реквизита списка

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

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

В общем информация о том, как программно изменить текст запроса динамического списка, использующего произвольный запрос можно найти на странице сайта ИТС 1С, если у Вас есть доступ. Но если доступа нет, то можете сильно не расстраиваться — информация на странице как и во многих случаях методологической информации от 1С носит условно практический характер. А это означает, что мелочи и нюансы, о которых бы было неплохо упомянуть на указанной странице ИТС, не упомянуты никак. И их понимание будет происходить на практике. Вот часть такой практики изложена ниже на прикладной задаче.

Нажатие на изображении увеличит его
1С 8, код, управляемый интерфейс, программное изменение запроса динамического списка реквизита формы
Рис. 1. Пример теоретического кода для программного изменения текста произвольного динамического списка для управляемой формы в 1С 8. 

Прикладная задача заключалась в том, чтобы выводить программно в управляемую форму списка документов «Реализация товаров и услуг» колонку добавленного реквизита документа. Реквизит с именем «ДопМФ_Отгружено» тип «Булево», в данном примере добавлен в расширении, но может быть и добавлен в основной конфигурации, если она на частичной поддержке. Как вывести программно элемент формы, содержащей флажок, добавленного реквизита, повторимся, можно изучить в соответствующей статье, о которой уже упоминалось в начале страницы.

1С 8, как программно изменить запрос динамического списка, чтобы вывести добавленный реквизит объекта конфигурации

Рис. 2. Пример добавленного реквизита объекта конфигурации (документа) в 1С 8 для дальнейшего программного вывода колонки в управляемую форму списка объекта.

Прежде чем перейти непосредственно к программному добавлению колонки элемента таблицы формы нужно добавить его выбор в текст запроса динамического списка. Таким образом подготовительный рабочий исполняемый код получается примерно следующим:

1 | СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка();
2 | СвойстваСписка.ОсновнаяТаблица = «Документ.РеализацияТоваровУслуг»;
3 | СвойстваСписка.ДинамическоеСчитываниеДанных = Истина;
4 | ИсхТекстаЗапроса = СписокРеализацииТоваровУслуг.ТекстЗапроса;
5 |
|
СвойстваСписка.ТекстЗапроса = СтрЗаменить(ИсхТекстаЗапроса, «ВЫБРАТЬ», «ВЫБРАТЬ»+Символы.ПС+«РеализацияТоваровУслуг.ДопМФ_Отгружено КАК ДопМФ_Отгружено,»);
6 |
|
ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.СписокРеализацииТоваровУслуг, СвойстваСписка);
7 | //СписокРеализацииТоваровУслуг.Параметры.УстановитьЗначениеПараметра(«Параметр1», 42);

Прокомментируем его основные моменты. В строке 1 происходит получение структуры через функцию «СтруктураСвойствДинамическогоСписка()» общего модуля «ОбщегоНазначения» для заполнения ее значений и передачи для заполнения свойств динамического списка. Для ключа «ОсновнаяТаблица» структуры в строке 2 указывается название основной таблицы, которая используюется для динамического списка, в примере это «Документ.РеализацияТоваровУслуг». Значение ключа структуры в строке 3 «ДинамическоеСчитываниеДанных» в значении «Истина». В строках 4 и 5 ведется произвольная модификация запроса.

Нажатие на изображении увеличит его
1С 8, пример исходного текста произвольного запроса динамического списка, как изменить программно,
Рис. 3. Пример исходного текста произвольного запроса динамического списка реквизита управляемой формы списка документов.

Можно просто подготовить новый или измененный исходный текст запроса для указания его в ключе «ТекстЗапроса» структуры. В данном же случае была использована хитрость, чтобы минимизировать зависимость от изменений разработчиков. Происходит модификация исходного текста запроса, который определили разработчики, за счет замены подстроки «ВЫБРАТЬ», которая есть в любом запросе, на подстроку так же содержащее это обязательное слово текста запроса и текст для выборки значения добавленного реквизита документа «ДопМФ_Отгружено». Таким образом, доработка в расширении может сломаться тогда, когда разработчики существенным образом изменять исходный текст запроса. И на примере строки 5 помещаем новый вариант текста запроса в структуру. В данном примере получилось, что запрос содержит одну дополнительную строчку, чтобы выбирать значения добавленного реквизита. Порядок следования полей выборки в запросе для динамического списка не имеет значения.

Т.е. в практической задаче начало запроса программно изменялось:

С:

ВЫБРАТЬ

    РеализацияТоваровУслуг.Ссылка,

На:

ВЫБРАТЬ

    РеализацияТоваровУслуг.ДопМФ_Отгружено КАК ДопМФ_Отгружено,

    РеализацияТоваровУслуг.Ссылка,

Особенно обратим внимание на то, к каким объектам ведется обращение в строке 7, когда выполняется установка новой настройки для динамического списка с помощью процедуры «УстановитьСвойстваДинамическогоСписка» общего модуля «ОбщегоНазначения». В этом месте важно не перепутать, т.к. в типовой конфигурации названия элемента формы таблицы-списка и реквизита формы одинаковые. А важно, что первым параметром передается элемент управляемой формы — Таблица реквизита формы. Не перепутать его с названием реквизита формы, к которому ранее обращались для получения текста исходного запроса. Вторым параметром передается заполненная структура. Строка 7 в данном примере закомментирована, т.к. в данной прикладной задаче в тексте запроса не содержится параметров. Но, если параметр  есть, то устанавливается через свойство «Параметры» и метод «УстановитьЗначениеПараметра» реквизита управляемой формы, а не элемента формы. Установка значения по имени параметра по коду как для классического запроса в 1С: первое значение — текстовое имя параметра, второе значение — собственно значение для параметра.

Нажатие на изображении увеличит его
1С 8, как программно изменить текст запроса динамического списка реквизита управляемой формы
Рис. 4. Сравнение одноименных реквизита и элемента управляемой формы 1С 8 для программного изменения текста произвольного запроса динамического списка этого реквизита формы.

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

Нажатие на изображении увеличит его
1С 8, как программно вывести, добавить колонку из запроса динамического списка для добавленного реквизита справочника, документа
Рис. 5. Пример кода в 1С 8 для программного вывода колонки нового реквизита объекта конфигурации, в частности документа, в элемент «Таблица» управляемой формы 

По логике программного вывода в прикладной задачи новая колонка, напомним с флажком, должна выводиться сразу после колонки «Номер», содержащей данные номеров документов списка. Код на скриншоте содержит условие на то, что если колонка «Номер» по каким то причинам, например скрыта пользователем в управляемой форме, что вполне может быть (странно но может быть, ведь номер для документа является ключевым реквизитом для работы пользователей), то тогда новая колонка будет выведена самой первой в списке.

1 | ТаблицаФормы = Элементы.СписокРеализацииТоваровУслуг;
2 | КолонкаВставки = ТаблицаФормы.ПодчиненныеЭлементы.Найти(«Номер»);
3 |  
4 | КолонкаОтгружено = Элементы.Вставить(«_Отгружено», Тип(«ПолеФормы»), ТаблицаФормы, КолонкаВставки);
5 | КолонкаОтгружено.Вид = ВидПоляФормы.ПолеФлажка;
6 | КолонкаОтгружено.Заголовок = «О.»;
7 | КолонкаОтгружено.Подсказка = «Отгружено»;
8 | КолонкаОтгружено.ТолькоПросмотр = Истина;
9 | КолонкаОтгружено.ШиринаЭлемента = 5;
10 | КолонкаОтгружено.ПутьКДанным = «СписокРеализацииТоваровУслуг.ДопМФ_Отгружено»;

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

Отличия заключаются в двух местах кода. Во-первых, это обращение к свойству «ШиринаЭлемента, а не просто «Ширина» как в случае, если колонка — это программно выводимая колонка динамического списка, но у которого указана «Основная таблица» и не используется произвольный запрос. Т.е. для программно добавляемой колонки динамического списка с произвольным запросом указывается свойство «ШиринаЭлемента».

Во-вторых, очень важно правильно указать значение свойства «ПутьКДанным», иначе можно получить ошибку:

Нажатие на изображении увеличит его
1С 8, ошибка, Ошибка при установке значения атрибута контекста (ПутьКДанным) по причине: Недопустимое значение
Рис. 6. Пример ошибки «Недопустимое значение» при указании неверного значения для свойства «ПутьКДанным» элемента управляемой формы .

{Документ.РеализацияТоваровУслуг.Форма.ФормаСписка.Форма(26)}: Ошибка при установке значения атрибута контекста (ПутьКДанным)

КолонкаОтгружено.ПутьКДанным = «Объект.СписокРеализацииТоваровУслуг.ДопМФ_Отгружено»; 

по причине:

Недопустимое значение

Недопустимое значение

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

Нажатие на изображении увеличит его
1С 8, программирование, как программно вывести, добавить элементы управляемой формы, колонку реквизита запроса динамического списка
Рис. 7. Демонстрация того, что данные элемента формы Таблица — это динамический произвольный запрос.

В текущей задаче реквизит формы (он не основной) носит имя «СписокРеализацийТоваровУслуг», а не так, как часто можно встретить в конфигурации, что основной реквизит формы носит имя «Объект». И значения для добавленной колонки берется из реквизита типа «ДинамическийСписок» и для элемента формы. Поэтому строка для «ПутьКДанным» — «СписокРеализацииТоваровУслуг.ДопМФ_Отгружено» с указанием через «.» имени нового реквизита.

Это все условия и нюансы, с которыми пришлось столкнуться на практике для программной модификации произвольного запроса динамического списка реквизита управляемой формы в 1С 8, чтобы потом программно вывести колонку нового реквизита объекта конфигурации базы в элемент «Таблица» формы .

Оцените, оказалась ли эта публикация полезна для Вас?




© www.azhur-c.ru 2013-2020. Все права защищены. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу.

25-11-2021

Журавлев А.С.
(Сайт azhur-c.ru)

Назад

Понравилась статья? Поделить с друзьями:
  • Эльдорадо красноярский рабочий 30а часы работы
  • Актау бизнес курсы валют всех банков на сегодня
  • 1с дополнительные реквизиты весовой коэффициент
  • Vivat group строительно инвестиционная компания
  • Эми стюарт путь розы внутри цветочного бизнеса