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

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 в "новые" программы 

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

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Работа с интерфейсом Анализ учета Мониторинг 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    84948    60    42    

71

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

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

6100 руб.

16.01.2015    68709    46    60    

85

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

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

5246 руб.

29.06.2020    25029    34    6    

53

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

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

6088 руб.

17.10.2025    2329    3    0    

2

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

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

36600 руб.

28.08.2025    8306    2    2    

6

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

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

20.08.2024    50689    mrXoxot    44    

139

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

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

27.05.2024    26824    smielka    39    

117

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

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

3 стартмани

10.04.2023    17732    182    acces969    31    

132
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dehro 14 14.04.26 11:44 Сейчас в теме
Добавить в запрос полдела. А реквизит на форму ещё же добавить нужно.
12. AntWooD 16 15.04.26 00:38 Сейчас в теме
(1) Реквизит на форму - это старт, а вот корректно поправить запрос это иногда целая проблема.
2. GrayAlt 14.04.26 12:04 Сейчас в теме
Метод 3 можно оптимизировать, чтобы уйти от запроса в цикле.

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

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


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

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


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

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

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


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

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

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

Такое, вроде, сработает, если у динамического списка будет указана основная таблица - справочник Номенклатура.
21. alexey-simf 33 07.05.26 12:18 Сейчас в теме
(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 2692 14.04.26 12:39 Сейчас в теме
(4) не соединяем «срез последних» на живую.. срез последних соединять как на итс - это вообще дичь… надо вт обходить этот момент
8. SweetSweetLoot 14.04.26 13:36 Сейчас в теме
(4) у них в типовых, через раз так же как у автора в коде запрос построен.
16. olezhe 22 19.04.26 19:37 Сейчас в теме
(8) Поясните суть ошибки, пожалуйста. Чтоб не повторять самому
6. gybson 13 14.04.26 12:44 Сейчас в теме
"ПриПолученииДанныхНаСервере" значительно старше конечно, просто раньше он был "ПриПолученииДанных"
10. RocKeR_13 1478 14.04.26 14:27 Сейчас в теме
Уверен, что многие и не знали об этом подходе

Знаем, практикуем)
11. shostatsky 14.04.26 17:18 Сейчас в теме
https://wonderland.v8.1c.ru/blog/obrabotka-i-oformlenie-dannykh-dinamicheskogo-spiska/
Автору на изучение.
3ий метод самый быстрый, если его правильно использовать. единственное ограничение - нет возможности устанавливать отборы по полям, заполняемым таким способом.
13. AntWooD 16 15.04.26 00:45 Сейчас в теме
В целом не плохо. Всё зависит от того что хотим добавить. В конкретном случае скорее всего вложенка будет самым оптимальным. Единственно , мне кажется чем &Вместо лучше использовать &ИзменениеИКонтроль. Что там поменяют или "исправят" в очередном релизе?
14. diman jah 16.04.26 09:03 Сейчас в теме
здравствуйте. спрошу здесь
как на форме в табличную часть документа программно добавить колонку с дополнительным реквизитом справочника?

через "изменить форму - добавить поле" в списке доступных реквизитов нет дополнительных реквизитов

в НСИ доступность "везде" включена
в динамических списках (нси - номенклатура, подбор товаров в документ) через "изменить форму - добавить поле" дополнительные реквизиты добавляются

нашел, что надо в ТЧ добавить реквизит "Ссылка", тогда через "изменить форму" будет доступен выбор дополнительных реквизитов... но дополнительных реквизитов так же нет

&После("ПриСозданииНаСервере")
Процедура доп_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
	МассивРеквизитов = Новый Массив;
    МассивРеквизитов.Добавить(Новый РеквизитФормы("Ссылка", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"), "Объект.Товары", "Ссылка", Ложь));
    ИзменитьРеквизиты(МассивРеквизитов);
    
    Эл = Элементы.Вставить("Ссылка", Тип("ПолеФормы"), Элементы.Товары);
    Эл.ПутьКДанным = "Объект.Товары.Ссылка"; 
    Эл.Вид = ВидПоляФормы.ПолеВвода;
КонецПроцедуры
Показать
20. korvintorson 88 20.04.26 09:45 Сейчас в теме
(14) Ссылка должна быть одиночного типа. Если ссылка составного типа, то реквизиты недоступны.
Я в таких случаях просто добавлял отдельные ссылки одиночных типов - это если нужно дать возможность пользователю самому настраивать.
Если же достаточно фиксированного поля, то проще добавить программно реквизит и поле, и запрос для чтения значений в ПриЧтенииНаСервере.
15. kuzyara 2252 17.04.26 07:46 Сейчас в теме
Кто-нибудь объясните почему автор называет таблицу виртуальной? Это же временная таблица!
Прикрепленные файлы:
0x00; binx; MrFlanker; +3 Ответить
17. olezhe 22 19.04.26 19:40 Сейчас в теме
Спасибо автору за поднятую тему. Нередкая задача, и, действительно, легко запутаться
18. binx 176 20.04.26 08:15 Сейчас в теме
насчет ПриПолученииДанныхНаСервере я бы не сказал что это по определению тормозной способ. Зависит от реализации и поставленной задачи. Если удается добиться условно одного обращения к СУБД и постобработка данных запроса не приводит к вызову субд неявно, при этом сам код достаточно быстрый, то заметного ухудшения производительности заметить трудно. Был опыт реализации, увеличение времени задержки при прокрутки списка на какие то ничтожные сотые доли секунды. Зато на мой взгляд часто это более предсказуемый вариант чем в случае вложенных запросов и тем более временных таблиц.
kuzyara; VyacheslavShilov; +2 Ответить
19. korvintorson 88 20.04.26 09:40 Сейчас в теме
1. С чего вдруг временные таблицы стали виртуальными? Такой терминологический косяк портит всё впечатление.
2. ПриПолученииДанныхНаСервере - никто не заставляет делать запрос в цикле, можно обойтись одним запросом, и тогда будет достаточно быстро. Но по таким полям нельзя делать ни отбор, ни сортировку.
3. Если нужно вот прям быстро и с отборами - делайте спец. регистр и складывайте туда нужные данные заранее.
kuzyara; user1244356; Best40000; +3 Ответить
Для отправки сообщения требуется регистрация/авторизация