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

20.09.24

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

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

Введение

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

В чем суть

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

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

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

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

 

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

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

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

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

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

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


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

 

Вступайте в нашу телеграмм-группу Инфостарт

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

См. также

Работа с интерфейсом Анализ учета Мониторинг 1С:Предприятие 8 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Библиотека стандартных подсистем 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)

Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!

28800 руб.

27.03.2025    62144    37    29    

51

Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)

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

36000 руб.

28.08.2025    4538    1    2    

4

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

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

6000 руб.

14.01.2016    58840    20    25    

46

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

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

5160 руб.

29.06.2020    23332    33    6    

52

Консолидация данных Работа с интерфейсом Программист Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 1C:ERP Узбекистан Беларусь Кыргызстан Россия Казахстан Платные (руб)

Знакомая ситуация? Пользователи, особенно менеджеры, уверены: отборов много не бывает. Идут пожелания добавить в форму списка еще один быстрый фильтр, еще два, еще пять... В итоге интерфейс превращается в нагромождение полей отбора, а потребность в «самом главном» отборе, который «вот прямо сейчас нужен», все равно не закрыта. Универсальное расширение, которое решает эту проблему элегантно и технологично. С его помощью в любую форму списка можно легко добавить панель настраиваемых кнопок-закладок, каждая из которых применяет сложный фильтр-запрос, а так же показывает актуальное количество элементов в реальном времени.

5988 руб.

17.10.2025    1222    1    0    

1

Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

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

20.08.2024    45045    mrXoxot    44    

138

Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

27.05.2024    25356    smielka    38    

112

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

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

3 стартмани

10.04.2023    16756    179    acces969    31    

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

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


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

СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст);
13. Cito-PRO 22.08.25 13:18 Сейчас в теме
Тут поправка после этой фурнкции
//Тут добавляем регистр сведений, из которого берем значение.
	НашРегистр = ОператорВыбора.Источники.Добавить("РегистрСведений.ИмяРегистра", "ПсевдонимТаблицы");


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

НашРегистр.Соединения.Очистить();


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

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