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

В данный момент реализую разработку в системе ERP, цель которой создания инструмента для корректировки в системе документов "Производство Без Заказа" на предмет изменения количественных показателей израсходованных материалов .

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

Документы создаются с комментарием "Создан автоматически" и доступны пользователям только на просмотр. Но производственные реалии иногда идут в разрез с выгружаемой контролерами информации (не работал насос и пластификатор 'Реламикс' отлили с бетономешалки №3 бетон В20 и долили в №4 бетон В30 ведром) соответственно в документах выпуска этот материал подлежит коррекции в двух местах.

Вот тут то и вступит в работу моя обработка корректировки! И эти действия не пройдут бесследно как если бы документ был поправлен в ручную а оставят записи в специально созданном регистре.

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

  1. Обработка "Корректировка документов 'Производство Без Заказа'".

    Нам необходимо будет работать с списком документов, и табличной частью этих документов, для этой цели в 1С везде применяется динамические списки, будем их использовать!

Рис 1. Добавляем на форму динамический список
Рис 1. Добавляем на форму динамический список

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

&НаСервере
Функция ТекстЗапросаДокументы() Экспорт
	
	ТекстЗапроса = "ВЫБРАТЬ
	|	ДокументПроизводствоБезЗаказа.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.ПроизводствоБезЗаказа КАК ДокументПроизводствоБезЗаказа
	|ГДЕ
	|	ДокументПроизводствоБезЗаказа.ПометкаУдаления = &Ложь
	|	И ДокументПроизводствоБезЗаказа.Проведен = &Истина
	|{ГДЕ
	|	(ДокументПроизводствоБезЗаказа.Подразделение = &ПодразделениеВыпуска),
	|	(ДокументПроизводствоБезЗаказа.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаДокумента, ДЕНЬ)),
	|	И КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ))}";		
	
	Возврат ТекстЗапроса;
	
КонецФункции

В произвольном запросе добавляем два параметра (Подразделение выпуска и Дату документа) , как же при открытие формы передать эти параметры первый самый простой способ - это когда наша форма будет открываться из другой формы с уже переданными в форму параметрами. Но мы что бы не останавливаться на этом распространенном способе жестко назначим параметры при открытии формы для этого используется метод - ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) и ниже его код и форма при открытие.

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

Фильтры на форме в виде управляемых параметров динамического списка (тихие параметры).

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

Модернизируем форму добавив фильтры (Подразделение выпуска и Дата выпуска) которые быстро позволят отобрать нужные документы рис 4.

Рис 4. Форма с управлением динамическим списком
Рис 4. Форма с управлением динамическим списком

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

рис 5
рис 5

Вот тут то и вступает в действие волшебство тихих параметров! Заключаем выражение ГДЕ и параметры в фигурные скобки ..

{ГДЕ
	(ДокументПроизводствоБезЗаказа.Подразделение = &ПодразделениеВыпуска),
	(ДокументПроизводствоБезЗаказа.Дата >= НАЧАЛОПЕРИОДА(&ДатаДокумента, ДЕНЬ)),
	(ДокументПроизводствоБезЗаказа.Дата <= КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ))}

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

Рис 6. Открытие формы с ДС без ограничения по параметрам
Рис 6. Открытие формы с ДС без ограничения по параметрам

Для программного управления параметрами создадим процедуры создадим процедуры "При изменении" для реквизитов которые будут управлять параметрами код ниже.

&НаКлиенте
Процедура ПодразделениеВыпускаПриИзменении(Элемент)	
	
	ОбновлениеПараметровСписка(ПодразделениеВыпуска,ДатаДокумента);	
	
КонецПроцедуры 

&НаКлиенте
Процедура ДатаДокументаПриИзменении(Элемент)

	ОбновлениеПараметровСписка(ПодразделениеВыпуска,ДатаДокумента);
	
КонецПроцедуры

Эти процедуры будут вызывать процедуру на сервере "ОбновлениеПараметровСписка(ПодразделениеВыпуска, ДатаДокумента)" которая и будет управлять параметрами динамического списка код ниже.

&НаСервере
Процедура ОбновлениеПараметровСписка(ПодразделениеВыпуска,ДатаДокумента); 
	
	Если ЗначениеЗаполнено(ПодразделениеВыпуска) = Ложь И ДатаДокумента = '00010101' Тогда	
		СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Ложь;
		СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Ложь;
		//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",Подразделение);
		//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаДокумента);
		
	ИначеЕсли ЗначениеЗаполнено(ПодразделениеВыпуска) = Истина   И ДатаДокумента = '00010101'  Тогда
		СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Ложь;
		СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Истина; 
		СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеВыпуска);
		//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаВыпуска);
		
	ИначеЕсли ЗначениеЗаполнено(ПодразделениеВыпуска) = Истина   И НЕ ДатаДокумента = '00010101'  Тогда
		СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Истина;
		СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Истина; 
		СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеВыпуска);
		СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаДокумента);
		
	ИначеЕсли ЗначениеЗаполнено(ПодразделениеВыпуска) = Ложь   И НЕ ДатаДокумента = '00010101'  Тогда
		СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Истина;
		СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Ложь; 
		//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеВыпуска);
		СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаДокумента);
		
	КонецЕсли;

	Элементы.СписокДокументовДляРедактирования.Обновить();
	
КонецПроцедуры	

Разберем этот код вот эта конструкция сбрасывает параметры :

СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Ложь;
СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Л��жь;

а эта устанавливает и затем обновляет список как "Данные Коллекции Формы" (используем "Элементы.СписокДокументовДляРедактирования.Обновить():

СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеСсылка);
СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаВыпуска);	

Устанавливаем вначале один параметр Рис 7, а затем и второй рис 8 видим результат.

Рис 7. Параметр (Подразделение)
Рис 7. Параметр (Подразделение)
Рис 8. Два парметра
Рис 8. Два парметра

Программное управление динамическим списком на "Лету"

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

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

На это первую часть разработки обработки заканчиваем , ��е забыв упомянуть что динамический список на форме, может также управляться встроенными командами я добавил стандартную команду "Найти" с ее помощью также можно отфильтровать список рис 9

Рис 9. Стандартная команда списка Еще-Найти
Рис 9. Стандартная команда списка Еще-Найти
Рис 10. Результат выполнения команды
Рис 10. Результат выполнения команды

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

весь код (Модуль формы):

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СписокМатериалов.Параметры.УстановитьЗначениеПараметра("ДокументРедактирования",Документы.ПроизводствоБезЗаказа.ПустаяСсылка());
КонецПроцедуры

&НаСервере
Функция ТекстЗапросаДокументы() Экспорт
	
	ТекстЗапроса = "ВЫБРАТЬ
	|	ДокументПроизводствоБезЗаказа.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.ПроизводствоБезЗаказа КАК ДокументПроизводствоБезЗаказа
	|{ГДЕ
	|	(ДокументПроизводствоБезЗаказа.Подразделение = &ПодразделениеВыпуска),
	|	(ДокументПроизводствоБезЗаказа.Дата >= НАЧАЛОПЕРИОДА(&ДатаДокумента, ДЕНЬ)),
	|	(ДокументПроизводствоБезЗаказа.Дата <= КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ))}";		
	
	Возврат ТекстЗапроса;
	
КонецФункции

&НаКлиенте
Процедура ПодразделениеВыпускаПриИзменении(Элемент)	
	
	ОбновлениеПараметровСписка(ПодразделениеВыпуска,ДатаДокумента);	
	
КонецПроцедуры 

&НаКлиенте
Процедура ДатаДокументаПриИзменении(Элемент)

	ОбновлениеПараметровСписка(ПодразделениеВыпуска,ДатаДокумента);
	
КонецПроцедуры


&НаСервере
Процедура ОбновлениеПараметровСписка(ПодразделениеВыпуска,ДатаДокумента); 
	
	Если ЗначениеЗаполнено(ПодразделениеВыпуска) = Ложь И ДатаДокумента = '00010101' Тогда	
		СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Ложь;
		СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Ложь;
		//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",Подразделение);
		//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаДокумента);
		
	ИначеЕсли ЗначениеЗаполнено(ПодразделениеВыпуска) = Истина   И ДатаДокумента = '00010101'  Тогда
		СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Ложь;
		СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Истина; 
		СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеВыпуска);
		//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаВыпуска);
		
	ИначеЕсли ЗначениеЗаполнено(ПодразделениеВыпуска) = Истина   И НЕ ДатаДокумента = '00010101'  Тогда
		СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Истина;
		СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Истина; 
		СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеВыпуска);
		СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаДокумента);
		
	ИначеЕсли ЗначениеЗаполнено(ПодразделениеВыпуска) = Ложь   И НЕ ДатаДокумента = '00010101'  Тогда
		СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Истина;
		СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Ложь; 
		//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеВыпуска);
		СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаДокумента);
		
	КонецЕсли;

	Элементы.СписокДокументовДляРедактирования.Обновить();
	
КонецПроцедуры	


&НаСервере
Функция ТекстЗапросаДокументы() Экспорт
	ТекстЗапроса = "ВЫБРАТЬ
	               |	ДокументПроизводствоБезЗаказа.Ссылка КАК Ссылка
	               |ИЗ
	               |	Документ.ПроизводствоБезЗаказа КАК ДокументПроизводствоБезЗаказа
	               |ГДЕ
	               |	ДокументПроизводствоБезЗаказа.Подразделение = &ПодразделениеВыпуска
	               |	И ДокументПроизводствоБезЗаказа.Проведен = &Истина
	               |	И ДокументПроизводствоБезЗаказа.ПометкаУдаления = &Ложь";		
	
	Возврат ТекстЗапроса;
	
КонецФункции

Всем спасибо! кто почитал, кому то возможно поможет в разработке!

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

До новым встреч ! и Удачного кодирования !

SPS Липецк.