Управляемая форма и динамический список как ее один из самых эффективных реквизитов, позволяющий быструю реализацию различной списочной информации.
В данный момент реализую разработку в системе ERP, цель которой создания инструмента для корректировки в системе документов "Производство Без Заказа" на предмет изменения количественных показателей израсходованных материалов .
Может возникнуть сразу вопрос для чего это надо? а надо для того что документы по выпуску бетона создаются ботом на основании данных выгружаемых с программы обслуживающий бетономешалки.
Документы создаются с комментарием "Создан автоматически" и доступны пользователям только на просмотр. Но производственные реалии иногда идут в разрез с выгружаемой контролерами информации (не работал насос и пластификатор 'Реламикс' отлили с бетономешалки №3 бетон В20 и долили в №4 бетон В30 ведром) соответственно в документах выпуска этот материал подлежит коррекции в двух местах.
Вот тут то и вступит в работу моя обработка корректировки! И эти действия не пройдут бесследно как если бы документ был поправлен в ручную а оставят записи в специально созданном регистре.
Создаем обработку с использование динамических списков
-
Обработка "Корректировка документов 'Производство Без Заказа'".
Нам необходимо будет работать с списком документов, и табличной частью этих документов, для этой цели в 1С везде применяется динамические списки, будем их использовать!

На рис 2. Производим его настройку выбрав произвольный запрос , и основную таблицу с видом необходимого нам документа.

В произвольном запросе добавляем два параметра (Подразделение выпуска и Дату документа) , как же при открытие формы передать эти параметры первый самый простой способ - это когда наша форма будет открываться из другой формы с уже переданными в форму параметрами. Но мы что бы не останавливаться на этом распространенном способе жестко назначим параметры при открытии формы для этого используется метод - ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) и ниже его код и форма при открытие.
//Это если бы открывали форму с передачей в нее параметров
//СписоковДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаВыпуска", Параметры.ДатаРедактирования);
СписоковДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",Дата(2025,09,01));
СписоковДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",
Справочники.СтруктураПредприятия.НайтиПоНаименованию("Бетоносмесительный цех"))

Фильтры на форме в виде управляемых параметров динамического списка (тихие параметры).
Перейдем к более реальному для наших целей проектированию формы для этого изменим произвольный запрос так чтобы при открытии в списке отражались все документы за все даты для этого будем использовать "тихие параметры".
Модернизируем форму добавив фильтры (Подразделение выпуска и Дата выпуска) которые быстро позволят отобрать нужные документы рис 4.

Запрос списка также изменим..

Вот тут то и вступает в действие волшебство тихих параметров! Заключаем выражение ГДЕ и параметры в фигурные скобки ..
{ГДЕ
(ДокументПроизводствоБезЗаказа.Подразделение = &ПодразделениеВыпуска),
(ДокументПроизводствоБезЗаказа.Дата >= НАЧАЛОПЕРИОДА(&ДатаДокумента, ДЕНЬ)),
(ДокументПроизводствоБезЗаказа.Дата <= КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ))}
это позволит отработать списку при первоначальном открытие без назначение параметров если бы они были не "тихими" мы бы получили ошибку!. В дальнейшем будем передавать например один или два параметра , очищать какой то и выполнять другие манипуляции .

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


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


Эта команда позволяет выполнять фильтрацию по реквизитам находящемся в списке, по Дате она уже не сможет отфильтровать.
весь код (Модуль формы):
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Вставить содержимое обработчика
//СписоковДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаВыпуска", Параметры.ДатаРедактирования);
//ДатаВыпуска = Дата(2025,09,01);
//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",Дата(2025,09,01));
//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",Справочники.СтруктураПредприятия.НайтиПоНаименованию("Бетоносмесительный цех"));
КонецПроцедуры
&НаСервере
Процедура ОбработкаВыбораОчисткиНаСервере(ПодразделениеНаименование,ДатаВыпуска)
//ТекстЗапроса = ТекстЗапросаДокументы();
ПодразделениеСсылка = Справочники.СтруктураПредприятия.НайтиПоНаименованию(ПодразделениеНаименование);
//СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка();
//СвойстваСписка.ТекстЗапроса = ТекстЗапроса;
//СвойстваСписка.ОсновнаяТаблица = "Документ.ПроизводствоБезЗаказа";
//СвойстваСписка.ДинамическоеСчитываниеДанных = Истина;
//ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.СписоковДокументовДляРедактирования,СвойстваСписка);
//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеСсылка);
Если ЗначениеЗаполнено(ПодразделениеСсылка) И ЗначениеЗаполнено(ДатаВыпуска) И НЕ СокрЛП(ДатаВыпуска) = ". ." Тогда
СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Ложь;
СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Ложь;
Элементы.СписокДокументовДляРедактирования.Обновить();
СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеСсылка);
СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаВыпуска);
ИначеЕсли (ЗначениеЗаполнено(ДатаВыпуска) = Истина ИЛИ СокрЛП(ДатаВыпуска) = ". .")
И (ЗначениеЗаполнено(ПодразделениеСсылка) = истина И ПодразделениеНаименование <> "") Тогда
СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Ложь;
СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеСсылка);
КонецЕсли;
Элементы.СписокДокументовДляРедактирования.Обновить();
КонецПроцедуры
&НаКлиенте
Процедура ДатаДокументаОбработкаВыбора(Элемент, ВыбранноеЗначение, ДополнительныеДанные, ВыборДобавлением, СтандартнаяОбработка)
Если НЕ ВыбранноеЗначение = "" Тогда
Сообщить(Элементы.ПодразделениеВыпуска.ВыделенныйТекст + " за " + ВыбранноеЗначение );
ОбработкаВыбораОчисткиНаСервере(Элементы.ПодразделениеВыпуска.ВыделенныйТекст,ВыбранноеЗначение);
Иначе
КонецЕсли;
ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры
&НаСервере
Функция ТекстЗапросаДокументы() Экспорт
ТекстЗапроса = "ВЫБРАТЬ
| ДокументПроизводствоБезЗаказа.Ссылка КАК Ссылка
|ИЗ
| Документ.ПроизводствоБезЗаказа КАК ДокументПроизводствоБезЗаказа
|ГДЕ
| ДокументПроизводствоБезЗаказа.Подразделение = &ПодразделениеВыпуска
| И ДокументПроизводствоБезЗаказа.Проведен = &Истина
| И ДокументПроизводствоБезЗаказа.ПометкаУдаления = &Ложь";
Возврат ТекстЗапроса;
КонецФункции
&НаКлиенте
Процедура ПодразделениеВыпускаОбработкаВыбора(Элемент, ВыбранноеЗначение, ДополнительныеДанные, ВыборДобавлением, СтандартнаяОбработка)
ДатаДокумента = неопределено;
ЭтаФорма.ОбновитьОтображениеДанных();
Если НЕ ВыбранноеЗначение = "" Тогда
ОбработкаВыбораОчисткиНаСервере(ВыбранноеЗначение,Элементы.ДатаДокумента.ТекстРедактирования);
Иначе
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПодразделениеВыпускаПриИзменении(Элемент)
// Вставить содержимое обработчика.
Сообщить(Элемент.ТекстРедактирования);
Если Элемент.ТекстРедактирования = "" Тогда
СбросПараметровСписка();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СбросПараметровСписка();
СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Ложь;
СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Ложь;
Элементы.СписокДокументовДляРедактирования.Обновить();
КонецПроцедуры
Всем спасибо! кто почитал, кому то возможно поможет в разработке!
Планирую написать вторую часть полностью готовую обработку показать ,там будет заполнение табличной части работа с корзиной и перетаскиванием номенклатуры в нее мышью и другое.
До новым встреч ! и Удачного кодирования !
SPS Липецк.
Комментарии (2)
Temic
25.09.2025 18:43После того как увидел, что автор не использует оператор «МЕЖДУ», для отбора по периоду, закрыл статью.
fosihas
| И ДокументПроизводствоБезЗаказа.Проведен = &Истина
| И ДокументПроизводствоБезЗаказа.ПометкаУдаления = &Ложь";
Такто можно не указывать & для проведения... т.ч. это сказется на производительности.