Практика доработки динамических списков. Методы, которые вы еще не применяли

14.04.26

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

Представлен ряд примеров по доработке динамических списков на примере конфигурации УНФ. Используются несколько реальных методов.

Введение. Вместо предисловия

Всем привет! По просьбе некоторых пользователей ресурса, я решил опубликовать несколько практических примеров по доработке динамических списков в современных конфигурациях. В качестве базовой конфигурации я буду использовать 1С:Управление нашей фирмы 3.0.12.261 на 1C:Платформе 8.3.27.2074 на примере справочника "Номенклатура".

 

Рис.1. Список значений "Номенклатуры" с колонкой "штрихкод".

 

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

 

Практические подходы

Рассмотрим типовой справочник "Номенклатура" конфигурации 1С:УНФ 3.0.12.261. В данной конфигурации типовое формирование динамического списка происходит "подменой запроса" через процедуру ПереопределитьТекстЗапросаСписокЗапасы формы списка запасы. 

Основной список запроса переопределения выглядит вот так:

 
 Основной текст запроса переопределения

 

В список я буду добавлять колонку "штрихкод" как самый простой пример для понимания работы. Переходим к методам разработки:

 

1. Виртуальные таблицы

Один из самых простых и медленных методов на больших справочниках - это формирование дополнительной виртуальной таблицы.

Первым шагом, что я должен сделать - это доработать сам запрос динамического списка - СписокЗапасы:

 
 Доработка динамического списка "запасы"

 

Здесь я просто добавил в выборку дополнительную "колонку" - штрихкод

"" КАК Штрихкод,

 Далее, я дорабатываю процедуру ПереопределитьТекстЗапросаСписокЗапасы

 
 Полный код процедуры ПереопределитьТекстЗапросаСписокЗапасы (можно скопировать)

 

Метод заключается в том, что я просто добавил дополнительную виртуальную таблицу и сделал соединение с основной. Добился результата как на рисунке 1.

 
 Создание дополнительной виртуальной таблицы 

 

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

 

2. Вложенные запросы

Возможно метод работы со вложенными запросами один из самых распространенных и я рекомендую его к использованию в 90% случаев. По скорости он достаточно приемлем. Хотя, по-моему мнению, в использовании методов "вложенных запросов" - в них достаточно легко запутаться. 

Измененный текст запроса процедуры ПереопределитьТекстЗапросаСписокЗапасы выглядит вот так:

 
 Создание вложенных запросов

 

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

 

3. Постобработка "ПриПолученииДанныхНаСервере"

Вероятно самый тормозной способ получения данных как на рисунке 1 - это постобработка динамического списка "ПриПолученииДанныхНаСервере". В рабочем контуре не рекомендую использовать ну или в крайнем случае... Способ достаточно "молодой" - ему где-то 5-6 лет думаю. Заключается в следующем:

На динамический список СписокЗаказы привязывается событие ПриПолученииДанныхНаСервере,  выглядит это вот так:

 

Рис.2. Использование метода "ПриПолученииДанныхНаСервере".

 

Обработка события такая:

 
 ПриПолученииДанныхНаСервере

 

&НаСервереБезКонтекста
Процедура ШКН1_СписокЗапасыПриПолученииДанныхНаСервереПосле(ИмяЭлемента, Настройки, Строки)
	
	Для Каждого Стр ИЗ Строки Цикл
		 Стр.Значение.Данные["Штрихкод"] = ШКН1_ОбщийМодуль1.ПолучимШтрихКод(Стр.Значение.Данные["Ссылка"]);
	КонецЦикла;	
 	
КонецПроцедуры

 

 

Здесь я еще использую общий модуль:

 
 Использование кода в тексте общего модуля ШКН1_ОбщийМодуль1

 

 &НаСервере
Функция ПолучимШтрихКод(Наим) Экспорт
	
	ТекШК = "";
    ПоискШК = Новый Запрос("ВЫБРАТЬ
	                       |	МАКСИМУМ(ШтрихкодыНоменклатуры.Штрихкод) КАК Штрихкод
	                       |ИЗ
	                       |	РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
	                       |ГДЕ
	                       |	ШтрихкодыНоменклатуры.Номенклатура = &Номенклатура");
	
	ПоискШК.УстановитьПараметр("Номенклатура", Наим);
	
	Нашли1 = ПоискШК.Выполнить().Выбрать();
	
	Если Нашли1.Следующий() Тогда
		ТекШК = Нашли1.ШтрихКод;
	КонецЕсли;	
	
	Возврат ТекШК;
	
КонецФункции

 

 

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

 

4. Работа со схемой запроса - конструктором

Здесь я буду использовать СхемыЗапроса. Пример кода выглядит вот так:

 
 Использование СхемЗапроса

 

НаСервере
Процедура ШКН1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
	
	Схема = Новый СхемаЗапроса;
    Схема.УстановитьТекстЗапроса(СписокЗапасы.ТекстЗапроса);
	
	Пакет 					= Схема.ПакетЗапросов[1];
    Оператор 				= Пакет.Операторы[0];
    ИсточникНоменклатура 	= Оператор.Источники[0];
 	
    НовыйИсточник = Оператор.Источники.Добавить("РегистрСведений.ШтрихкодыНоменклатуры", "ШтрихкодыНоменклатуры");
    НовыйИсточник.Соединения.Очистить();
    Соединение = ИсточникНоменклатура.Соединения.Добавить(НовыйИсточник, ИсточникНоменклатура.Источник.Псевдоним + ".Ссылка = " + НовыйИсточник.Источник.Псевдоним + ".Номенклатура");

    НовоеПоле = Оператор.ВыбираемыеПоля.Добавить("МАКСИМУМ(" + НовыйИсточник.Источник.Псевдоним + ".Штрихкод)");
    ИндексНовогоПоля = Оператор.ВыбираемыеПоля.Количество() - 1;
    Пакет.Колонки[ИндексНовогоПоля].Псевдоним = "Штрихкод";

    СписокЗапасы.ТекстЗапроса = Схема.ПолучитьТекстЗапроса();    
 	
КонецПроцедуры

 

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

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

Далее, перейдем к заключению и сделаем выводы.

 

Выводы

Я рассмотрел четыре способа доработки динамического списка. Все они приводят к одному результату - отображению колонки "штрихкод" в справочнике. Какой использовать - выбирайте сами, но оценивайте производительность отображения данных в списке. Лично я, последнее время использую вложенные запросы, хотя есть риск в них запутаться). Четвертый способ - достаточно интересный, хотя я его особо не видел в типовых (может плохо смотрел). 

Если вам понравился разбор методов, вы можете ознакомится с нашими практическими публикациями на портале. Ниже вы найдете много практических реальных примеров - начиная от доработок простейшего, но важно функционала и заканчивая всякими методами переносов. Уверен, что вам будет интересно:

 

Полезные ссылки и статьи

Технический перенос "Номенклатуры" (с указанием новых ставок НДС) и "Контрагентов" из УТ 10.3 в УТ 11.5 

Методы доработки динамических списков из моей практики

Редактирование колонки "Цена" в РМК УТ 11.5

Тонкости обновления УТ 11.5 на ставку 22% после наступления 2026 г.

Встроенные сканеры терминалов сбора данных различных производителей 

Набор кастомных выгрузок-загрузок номенклатуры с картинками из старой УТ 10.3 в "новые" программы 

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

динамический список доработка применение структур вложенных запросов

См. также

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

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

31720 руб.

27.03.2025    80406    54    42    

66

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

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

36600 руб.

28.08.2025    7654    2    2    

6

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

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

6100 руб.

14.01.2016    60387    22    25    

47

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

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

6088 руб.

17.10.2025    1977    3    0    

2

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

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

6100 руб.

16.01.2015    68212    46    60    

85

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

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

20.08.2024    49060    mrXoxot    44    

139

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

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

27.05.2024    26405    smielka    39    

116
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dehro 13 14.04.26 11:44 Сейчас в теме
Добавить в запрос полдела. А реквизит на форму ещё же добавить нужно.
2. GrayAlt 14.04.26 12:04 Сейчас в теме
Метод 3 можно оптимизировать, чтобы уйти от запроса в цикле.

1) Обходим все строки и помещаем искомые данные в массив.

Массив = Новый Массив;
Для Каждого Стр ИЗ Строки Цикл
    Массив.Добавить(Стр.Значение.Данные["Ссылка"]);
КонецЦикла;


2) Одним запросом получаем таблицу из 2 колонок "Ссылка" и "Штрихкод".
Обязательно добавляем индексы на Ссылку, чтобы быстрее искать.

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Номенклатура", Массив);
Запрос.Текст =
"ВЫБРАТЬ
|    ШтрихкодыНоменклатуры.Номенклатура КАК Ссылка,
|    ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод
|ИЗ
|    РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
|    ШтрихкодыНоменклатуры.Номенклатура В (&Номенклатура");
	
Результат = Запрос.Выполнить().Выгрузить();
Результат.Индексы.Добавить("Ссылка");
Показать


3) Снова перебираем все строки, ищем в таблице нужный штрихкод и подставляем в данные.

Отбор = Новый Структура("Ссылка");
Для Каждого Стр ИЗ Строки Цикл
    Отбор.Ссылка = Стр.Значение.Данные["Ссылка"];
    
    НайденныеСтроки = Результат.НайтиСтроки(Отбор);
    Если НайденныеСтроки.Количество() Тогда
        Стр.Значение.Данные["Штрихкод"] = НайденныеСтроки[0].Штрихкод
    КонецЕсли;
КонецЦикла;
Показать
7. bigvik 14.04.26 12:49 Сейчас в теме
(2)
Обходим все строки и помещаем искомые данные в массив.

Массив = Новый Массив;
Для Каждого Стр ИЗ Строки Цикл
Массив.Добавить


Или даже так:
Процедура ТоварыПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
	МассивТоваров = Строки.ПолучитьКлючи();

А потом:
Запрос.УстановитьПараметр("МассивТоваров", МассивТоваров);

И наконец:
Пока Выборка.Следующий() Цикл
		Строка = Строки[Выборка.Номенклатура];
		Строка.Данные["Штрихкод"] = Выборка.Штрихкод;
GrayAlt; comptr; +2 Ответить
9. comptr 57 14.04.26 14:15 Сейчас в теме
(7)
Строка = Строки[Выборка.Номенклатура];

Такое, вроде, сработает, если у динамического списка будет указана основная таблица - справочник Номенклатура.
3. SweetSweetLoot 14.04.26 12:09 Сейчас в теме
(198)
Я рассмотрел четыре способа доработки динамического списка. Все они приводят к одному результату - отображению колонки "штрихкод" в справочнике. Какай использовать - выбирайте сами, но оценивайте производительность отображения данных в списке.

опечатка. Хорошая статья.
P.S. во 2м чистый паттерн "строитель".
4. koln 14.04.26 12:10 Сейчас в теме
|ИЗ
| Справочник.Номенклатура КАК СправочникНоменклатура
| {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НаличиеФайлов КАК НаличиеФайлов
| ПО СправочникНоменклатура.Ссылка = НаличиеФайлов.ОбъектСФайлами}
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| МАКСИМУМ(ШтрихкодыНоменклатуры.Штрихкод) КАК Штрихкод,
| ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура
| ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|
| СГРУППИРОВАТЬ ПО
| ШтрихкодыНоменклатуры.Номенклатура) КАК ВЛ_ШК
| ПО СправочникНоменклатура.Ссылка = ВЛ_ШК.Номенклатура";
Показать
не является ли нарушением стандартов 1С (https://its.1c.ru/db/v8std/content/656/hdoc)?
5. aximo 2637 14.04.26 12:39 Сейчас в теме
(4) не соединяем «срез последних» на живую.. срез последних соединять как на итс - это вообще дичь… надо вт обходить этот момент
8. SweetSweetLoot 14.04.26 13:36 Сейчас в теме
(4) у них в типовых, через раз так же как у автора в коде запрос построен.
6. gybson 6 14.04.26 12:44 Сейчас в теме
"ПриПолученииДанныхНаСервере" значительно старше конечно, просто раньше он был "ПриПолученииДанных"
10. RocKeR_13 1470 14.04.26 14:27 Сейчас в теме
Уверен, что многие и не знали об этом подходе

Знаем, практикуем)
11. пользователь 14.04.26 17:18
Сообщение было скрыто модератором.
...
Для отправки сообщения требуется регистрация/авторизация