Программное добавление колонки в динамический список с помощью объекта "Схема запроса"

20.09.24

Разработка - Работа с интерфейсом

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

Введение

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

В чем суть

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

Как решить задачу? Казалось бы, использовать "СтрЗаменить(Список.ТекстЗапроса...", но ведь текст запроса может сильно отличаться, имя списка может быть разным и еще куча других нюансов. 

После недолгих поисков я выяснил, что в 1С есть такой объект - СхемаЗапроса. Можно загрузить в него текст запроса методом УстановитьТекстЗапроса(<Текст>) и работать с нашим запросом динамического списка как с отдельным объектом. 

С данной информацией я пошел писать свою процедуру модификации динамического списка.

 

// Модифицировать запрос динамического списка
//
// Параметры:
//  Форма - Форма клиентского приложения
//  ИмяДинамическогоСписка - Строка
//
Процедура МодифицироватьЗапросДинамическогоСписка(Форма, ИмяДинамическогоСписка)
	
	СхемаЗапроса = Новый СхемаЗапроса;
	СхемаЗапроса.УстановитьТекстЗапроса(Форма[ИмяДинамическогоСписка].ТекстЗапроса);
	
    //Данный цикл нужен чтобы найти последний пакет запросов, чтобы не брать ВТ
	Для Каждого ПакетЗапросов ИЗ СхемаЗапроса.ПакетЗапросов Цикл
		Если ПакетЗапросов.ТаблицаДляПомещения = "" Тогда	
			ЗапросВыбора = ПакетЗапросов;
		КонецЕсли;
	КонецЦикла;
	       
	ОператорВыбора = ЗапросВыбора.Операторы[0];
	
    //Тут добавляем регистр сведений, из которого берем значение.
	НашРегистр = ОператорВыбора.Источники.Добавить("РегистрСведений.ИмяРегистра", "ПсевдонимТаблицы");
	
    //Прописываем соединение, по умолчанию тип соединения ЛЕВОЕ
	ОператорВыбора.Источники[0].Соединения.Добавить(НашРегистр , "ПсевдонимТаблицы.Ссылка = " + 
	ОператорВыбора.Источники[0].Источник.Псевдоним + ".Ссылка");
	
    //Добавляем поля выбора, т.е. то что в ВЫБРАТЬ обычно пишем.
	ОператорВыбора.ВыбираемыеПоля.Добавить("ПсевдонимТаблицы.ВашеЗначение"); 
	
	Форма[ИмяДинамическогоСписка].ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
	
КонецПроцедуры

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

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

После модификации запроса списка, необходимо добавить еще колонку - элемент формы, в чем нам поможет очередная процедура

// Отрисовать элементы отображения нового элемента на форме 
//
// Параметры:
//  Форма - Форма клиентского приложения 
//  СписокНаФорме - Элемент формы динамического списка
//
Процедура ОтрисоватьЭлементыНаФорме(Форма, СписокНаФорме)
	
	НовыйЭлемент = Форма.Элементы.Добавить("ИмяВашегоСтолбца", Тип("ПолеФормы"), СписокНаФорме);
	НовыйЭлемент.ПутьКДанным = СписокНаФорме.Имя + ".ВашеЗначение";
	НовыйЭлемент.Заголовок = "Имя вашего столбца";
	
КонецПроцедуры

Ну и финальный этап - используем все наши методы в одном месте.


//Проверяем является ли данная форма формой списка		
ЭтоФормаСписка = Найти(Форма.ИмяФормы, "ФормаСписка") > 0;
		
Если ЭтоФормаСписка Тогда
			
	ИмяДинамическогоСписка = ИмяРеквизитаДинамическогоСписка(Форма);
	СписокНаФорме = Форма.Элементы.Найти(ИмяДинамическогоСписка);	
			
	Если СписокНаФорме <> Неопределено Тогда
				
		МодифицироватьЗапросДинамическогоСписка(Форма, ИмяДинамическогоСписка);
				
		ОтрисоватьЭлементыНаФорме(Форма, СписокНаФорме);
				
	КонецЕсли;
КонецЕсли;

 

Динамический список Метод добавления колонки

См. также

Работа с интерфейсом Системный администратор Программист Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    55604    17    23    

43

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

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

2400 руб.

29.06.2020    19918    28    6    

44

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

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

20.08.2024    23341    mrXoxot    44    

130

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    11896    smielka    37    

105

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    18327    1228    elcoan    53    

125

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

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

3 стартмани

10.04.2023    12857    167    acces969    31    

126

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    7911    kalyaka    6    

33

Работа с интерфейсом Программист Пользователь Платформа 1С v8.3 8.3.14 1C:Бухгалтерия 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Абонемент ($m)

Ещё с времен платформы 8.3.13 можно изменять цвет стилей интерфейса главного окна. Данное расширение позволит вам выбрать из подготовленных десятка стилей на свой вкус.

1 стартмани

01.07.2022    26818    422    rpgshnik    69    

101
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. RocKeR_13 1381 20.09.24 13:44 Сейчас в теме
А можно было и тут поискать))
Поручик; Xershi; ASHkins; bossikd; +4 Ответить
2. ASHkins 16 20.09.24 14:22 Сейчас в теме
(1) Классная статья, но к сожалению не нашел её когда искал решение своей задачи. Спасибо за ссылку!

Так же в решении задачи мне помогла публикация - https://infostart.ru/1c/articles/307045/
3. RocKeR_13 1381 20.09.24 14:59 Сейчас в теме
(2)
Так же в решении задачи мне помогла публикация - https://infostart.ru/1c/articles/307045/


Все с неё начинают, когда дело касается схемы запроса)
7. G_108408780541402684893 3 04.12.24 13:30 Сейчас в теме
(3) Что-то не получается, не выводится мой столбец... Нужно писать в расширении в ПриСозданиинаСервереПосле?
8. VachKirp 410 09.12.24 15:07 Сейчас в теме
9. G_108408780541402684893 3 09.12.24 20:57 Сейчас в теме
(8) Не мой случай. Разобрался сам шагая по отладке. У меня в общем модуле запрос в динамическом списке переписывается, пришлось подправлять через расширение.
4. Xershi 1262 23.09.24 10:08 Сейчас в теме
Я думаю в заголовке публикации нужно указать про схему запроса иначе можно не читая сразу написать используй шпаргалку, зачем ещё один баян.
5. fancy 36 01.10.24 08:34 Сейчас в теме
Еще наверное лучше заменить конструкцию
ОператорВыбора.Источники[0]
на
ОператорВыбора.Источники.НайтиПоИмени(..)
иначе могут в исходном запросе поменять порядок источников и добавленное соединение сломается
6. G_108408780541402684893 3 04.12.24 10:23 Сейчас в теме
10. ASHkins 16 13.12.24 21:36 Сейчас в теме
(6) Процедуры были написаны для общего модуля. В общий модуль передается Форма как параметр и далее обрабатывается. Можно наверное и в модуле формы все это делать, но изначальная задача была сделать универсальную процедуру для форм списков разных типов документов.
Оставьте свое сообщение