Имя: Пароль:
1C
 
УФ Обновление Динамического списка, созданного программно
,
0 spiller26
 
10.10.24
14:37
Есть документ1.
Программно сделаны:
- Реквизит "Динамический список" (произвольный запрос, отображения документов2)
- Элемент "Таблица" для Динамического списка.
- Кнопка создания документа2 из документ1

Всё работает, кроме обновления Динамического списка.
Вопрос: как правильно обновить отображение данных ДС?

&НаКлиенте
Процедура ДобавитьПалетныйЛист(Команда)
	
	Если Параметры.Ключ.Пустая() Тогда
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Документ не записан");
	Иначе
		Если Объект.ПометкаУдаления Тогда
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Документ помечен на удаление");
		Иначе
			ФормаПЛ = ПолучитьФорму("Документ.зн_ПалетныйЛист.ФормаОбъекта");
			ФормаПЛ.ОписаниеОповещенияОЗакрытии = Новый ОписаниеОповещения("ПослеЗакрытияФормыПЛ", ЭтаФорма);		
			ДанныеФормыПЛ = ФормаПЛ.Объект;
			ЗаполнитьПалетныйЛистНаСервере(ДанныеФормыПЛ);
			КопироватьДанныеФормы(ДанныеФормыПЛ, ФормаПЛ.Объект);
			ФормаПЛ.Модифицированность = Истина;
			ФормаПЛ.Открыть();
			//ФормаПЛ.ОткрытьФорму(,, ЭтаФорма,,,, ОповещениеЗакрытияПЛ);
		КонецЕсли;	
	КонецЕсли;	

КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияФормыПЛ(Результат, ДополнительныеПараметры) Экспорт

	Элементы["Таблица_ПЛ"].Обновить();
	//ЭтаФорма.Прочитать();
	//ЭтаФорма.ОбновитьОтображениеДанных();
	Прочитать();
	ОбновитьОтображениеДанных();
	
КонецПроцедуры
1 spiller26
 
10.10.24
16:49
Формирование ДС на форме
&НаСервере
&После("ПриЧтенииСозданииНаСервере")
Процедура дит_ПриЧтенииСозданииНаСервере()
	
	Если ЗначениеЗаполнено(Объект.Ссылка) И Объект.Статус = Перечисления.СтатусыЗаданийНаПеревозку.Отправлено Тогда
		Если ЭтаФорма.Элементы.Найти("СтраницаПалетныеЛисты") = Неопределено Тогда
			//ГруппаСтраницы
			СтраницаПалетныеЛисты = ЭтаФорма.Элементы.Добавить("СтраницаПалетныеЛисты", Тип("ГруппаФормы"), Элементы.ГруппаСтраницы);
			СтраницаПалетныеЛисты.Вид = ВидГруппыФормы.Страница;
			СтраницаПалетныеЛисты.Заголовок = "Палетные листы";
			
			//Панель
			ГруппаПанель_ПЛ = ЭтаФорма.Элементы.Добавить("ГруппаОбычная", Тип("ГруппаФормы"), СтраницаПалетныеЛисты);
			ГруппаПанель_ПЛ.Вид = ВидГруппыФормы.ОбычнаяГруппа;
			ГруппаПанель_ПЛ.Отображение = ОтображениеОбычнойГруппы.Нет;
			ГруппаПанель_ПЛ.ОтображатьЗаголовок = Ложь; 
			ГруппаПанель_ПЛ.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
			//Команда
			КомандаДобавить_ПЛ = ЭтаФорма.Команды.Добавить("ДобавитьПалетныйЛист");
			КомандаДобавить_ПЛ.Заголовок = "Добавить Палетный лист";
			КомандаДобавить_ПЛ.Действие = "ДобавитьПалетныйЛист"; //указываем только имя процедуры
			//Кнопка
			КнопкаДобавить_ПЛ = ЭтаФорма.Элементы.Добавить("ДобавитьПалетныйЛист", Тип("КнопкаФормы"), ГруппаПанель_ПЛ);
			КнопкаДобавить_ПЛ.Заголовок = "Добавить Палетный лист";
			КнопкаДобавить_ПЛ.ИмяКоманды = "ДобавитьПалетныйЛист";
			//Таблица для динамического списка Палетных листов
			//ТаблицаДС_ПЛ = Элементы.Добавить("ДС_ПЛ", Тип("ТаблицаФормы"), СтраницаПалетныеЛисты);
			//Запрос с параметрами для динамического списка Палетных листов
			#Область Запрос_для_Динамического_Списка
			Массив_ПЛ = СформироватьМассивПЛ(Объект.Ссылка);
			ТекстЗапроса_ПЛ = 
			"ВЫБРАТЬ
			|	зн_ПалетныйЛист.Ссылка КАК ПалетныйЛист,
			|	зн_ПалетныйЛист.Статус КАК Статус,
			|	ВЫБОР
			|		КОГДА зн_ПалетныйЛист.ПометкаУдаления
			|			ТОГДА 6
			|		ИНАЧЕ ВЫБОР
			|				КОГДА зн_ПалетныйЛист.Статус = ЗНАЧЕНИЕ(Перечисление.зп_СтатусыПалетныйЛистов.Отпралено)
			|					ТОГДА 1
			|				ИНАЧЕ ВЫБОР
			|						КОГДА зн_ПалетныйЛист.Статус = ЗНАЧЕНИЕ(Перечисление.зп_СтатусыПалетныйЛистов.Принято)
			|							ТОГДА 3
			|						ИНАЧЕ ВЫБОР
			|								КОГДА зн_ПалетныйЛист.Статус = ЗНАЧЕНИЕ(Перечисление.зп_СтатусыПалетныйЛистов.Подготовлено)
			|									ТОГДА 4
			|								ИНАЧЕ ВЫБОР
			|										КОГДА зн_ПалетныйЛист.Статус = ЗНАЧЕНИЕ(Перечисление.зп_СтатусыПалетныйЛистов.ПринятоСОтклонениями)
			|											ТОГДА 2
			|									 	ИНАЧЕ 0
			|								  КОНЕЦ	 	
			|							КОНЕЦ
			|					КОНЕЦ
			|			КОНЕЦ
			|	КОНЕЦ КАК КартинкаСтатус		
			|ИЗ
			|	Документ.зн_ПалетныйЛист КАК зн_ПалетныйЛист
			|ГДЕ
			|	зн_ПалетныйЛист.Ссылка В(&МассивПЛ)"; 
			#КонецОбласти
			МассивКолонок_ПЛ = Новый Массив;
			МассивКолонок_ПЛ.Добавить("ПалетныйЛист"); 
			МассивКолонок_ПЛ.Добавить("Статус"); 
			МассивКолонок_ПЛ.Добавить("КартинкаСтатус"); 
			ПараметрыЗапроса_ПЛ = Новый Структура;
			ПараметрыЗапроса_ПЛ.Вставить("МассивПЛ",Массив_ПЛ);
			СписокДействий_ПЛ = Новый Структура;
			СписокДействий_ПЛ.Вставить("Выбор", "Таблица_ПЛ_Выбор");	
			//
			СозданиеДинамическогоСписка("Таблица_ПЛ", ТекстЗапроса_ПЛ, МассивКолонок_ПЛ, СписокДействий_ПЛ,,"СтраницаПалетныеЛисты",, Истина, ПараметрыЗапроса_ПЛ);
			//Картинка отображения статуса "Палетный лист"
			Элементы["Таблица_ПЛ"].ПутьКДаннымКартинкиСтроки = "Таблица_ПЛ.КартинкаСтатус";
			Элементы["Таблица_ПЛ"].КартинкаСтрок = БиблиотекаКартинок.зн_КоллекцияСостоянийОбъекта;
			Элементы["Таблица_ПЛКартинкаСтатус"].Видимость = Ложь; //скрываем колонку
		КонецЕсли;	
	КонецЕсли;

КонецПроцедуры
2 spiller26
 
10.10.24
16:50
СозданиеДинамическогоСписка
&НаСервере
Процедура СозданиеДинамическогоСписка(
    ИмяСписка = "Список",             //тип строка - имя будущего списка на форме и реквизита
    ТекстЗапроса = "",                 //тип строка - запрос, если он не указан, необходимо указать таблицу
    МассивКолонок,                  //тип массив - массив создаваемых колонок, значения тип строка. Пример: "Д,ДоговораКонтрагента" значит будет создана колонка
                                    //                с заголовком "Д" и колонкой списка "ДоговораКонтрагента". Если указать просто "ДоговораКонтрагента",
                                    //                заголовок будет идентичен заголовку по умолчанию типа "Договор контрагента".
    СписокДействий = Неопределено,  //типа структура - структура содержит действия (свойства) динамического списка, можно указать только те которые необходимы.
                                    //                пример: СписокДействий = Новый Структура("Выбор,ПриАктивизацииСтроки","СписокВыбор","СписокПриАктивизацииСтроки")
    ТаблицаСписка = "",                //тип строка - содержит имя основной таблицы, пример: "Документ.РеализацияТоваровУслуг"    
    ДобавитьВ = "",                 //тип строка - имя элемента на который будет размещен список, если пустое, тогда добавляется на форму
    ВставитьПеред = "",             //тип строка - имя элемента перед которым будет размещен список, если пустое, будет просто добавлен в конец
    СвояКоманднаяПанель = ЛОЖЬ,     //тип булево - если ИСТИНА, скрывает стандартную панель и создает свою пустую для будушего наполнения ИмяСписка+"КоманднаяПанель2"
    ПараметрыЗапроса = Неопределено)//тип структура - содержит перечень параметров, если они используются в запросе.
    
    //Защита от дурака
    Если ТекстЗапроса = "" И ТаблицаСписка = "" Тогда Сообщить("Ошибка формирования динамического списка, укажите запрос или таблицу"); Возврат; КонецЕсли;
                                                                                                    
    //Создаем свою командную панель, тот случай когда я не нашел способа снять галочку "Автозаполнение"
    Если СвояКоманднаяПанель Тогда
        Если ВставитьПеред = "" Тогда
            ГруппаДинамическогоСписка  = Элементы.Добавить("Группа" + ИмяСписка + "CоСвоейКоманднойПанелью",Тип("ГруппаФормы"),?(ДобавитьВ = "",ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ]));
        Иначе
            ГруппаДинамическогоСписка  = Элементы.Вставить("Группа" + ИмяСписка + "CоСвоейКоманднойПанелью",Тип("ГруппаФормы"),?(ДобавитьВ = "",ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ]),ЭтаФорма.Элементы[ВставитьПеред]);            
        КонецЕсли;
        ГруппаДинамическогоСписка.Вид = ВидГруппыФормы.ОбычнаяГруппа;
        ГруппаДинамическогоСписка.ОтображатьЗаголовок = Ложь;
        ГруппаДинамическогоСписка.Отображение = ОтображениеОбычнойГруппы.Нет;
        ГруппаДинамическогоСписка.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
        КоманднаяПанельСписка  = Элементы.Добавить(ИмяСписка + "КоманднаяПанель2",Тип("ГруппаФормы"),ГруппаДинамическогоСписка);
        КоманднаяПанельСписка.Вид = ВидГруппыФормы.КоманднаяПанель;            
    КонецЕсли;
                                    
    //Создаем реквизит формы
    ТипыРеквизита = Новый Массив;                            
    ТипыРеквизита.Добавить(Тип("ДинамическийСписок"));
    ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита);
    ДинамическийСписок = Новый РеквизитФормы(ИмяСписка, ОписаниеТиповДляРеквизита,,"",ЛОЖЬ); //Имя реквизита
    ДобавляемыеРеквизиты = Новый Массив;
    ДобавляемыеРеквизиты.Добавить(ДинамическийСписок);        
    
    //Задаем свойства реквизиту
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);        
    РеквизитДинамическийСписок = ЭтаФорма[ИмяСписка]; //Имя реквизита
    Если ТекстЗапроса = "" Тогда
        РеквизитДинамическийСписок.ПроизвольныйЗапрос = ЛОЖЬ;
        РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка;
    Иначе
        РеквизитДинамическийСписок.ПроизвольныйЗапрос = ИСТИНА;
        РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
        Если ТаблицаСписка <> "" Тогда РеквизитДинамическийСписок.ОсновнаяТаблица = ТаблицаСписка; КонецЕсли;        
    КонецЕсли;
    
    //Заполняем параметры если они были указаны
    Если ПараметрыЗапроса <> Неопределено Тогда
        Для Каждого Параметра из ПараметрыЗапроса Цикл
            РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(Параметра.Ключ,Параметра.Значение);    
        КонецЦикла;        
    КонецЕсли;
    
    //Размещаем реквизит на форме
    Если ЛОЖЬ
        ИЛИ ВставитьПеред = ""
        ИЛИ СвояКоманднаяПанель //Если своя командная панель тогда нет логики уже в параметре ВставитьПеред
        Тогда
        ТаблицаФормы = Элементы.Добавить(ИмяСписка,Тип("ТаблицаФормы"),?(СвояКоманднаяПанель,ГруппаДинамическогоСписка,?(ДобавитьВ = "",ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ])));
    Иначе
        ТаблицаФормы = Элементы.Вставить(ИмяСписка,Тип("ТаблицаФормы"),?(ДобавитьВ = "",ЭтаФорма,ЭтаФорма.Элементы[ДобавитьВ]),ЭтаФорма.Элементы[ВставитьПеред]);    
    КонецЕсли;        
    ТаблицаФормы.ПутьКДанным = ИмяСписка; //Имя реквизита
    
    //Если своя панель тогда скрываем стандартную
    Если СвояКоманднаяПанель Тогда
        Элементы[ИмяСписка].ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
    КонецЕсли;

    //Создание колонок на основание МассивКолонок
    Для Каждого Элемента Из МассивКолонок Цикл
        ПараметрыКолонки = СтрЗаменить(Элемента,",",Символы.ПС);
        Если СтрЧислоСтрок(ПараметрыКолонки) > 1 Тогда
            Заголовок = СтрПолучитьСтроку(ПараметрыКолонки, 1);
            ИмяКолонки = СтрПолучитьСтроку(ПараметрыКолонки, 2);
        Иначе
            Заголовок = "";
            ИмяКолонки = ПараметрыКолонки;
        КонецЕсли;    
        НоваяКолонкаТаблицы = Элементы.Добавить(ИмяСписка + ИмяКолонки, Тип("ПолеФормы"), ТаблицаФормы);
        Если Заголовок <> "" Тогда НоваяКолонкаТаблицы.Заголовок = Заголовок; КонецЕсли;
        НоваяКолонкаТаблицы.ПутьКДанным = ИмяСписка + "." + ИмяКолонки;    
    КонецЦикла;
    
    //Задаем действия (События) на основание СписокДействий, если он определен
    Если СписокДействий <> Неопределено Тогда    
        ПереченьСвойств = "ПриИзменении
                        |Выбор
                        |ПриАктивизацииСтроки
                        |ВыборЗначения
                        |ПриАктивизацииПоля
                        |ПриАктивизацииЯчейки
                        |ПередНачаломДобавления
                        |ПередНачаломИзменения
                        |ПередУдалением
                        |ПриНачалеРедактирования
                        |ПередОкончаниемРедактирования
                        |ПриОкончанииРедактирования
                        |ОбработкаВыбора
                        |ПередРазворачиванием
                        |ПередСворачиванием
                        |ПослеУдаления
                        |ПриСменеТекущегоРодителя
                        |ОбработкаЗаписиНового
                        |ПриСохраненииПользовательскихНастроекНаСервере
                        |ПередЗагрузкойПользовательскихНастроекНаСервере
                        |ПриЗагрузкеПользовательскихНастроекНаСервере
                        |ПриОбновленииСоставаПользовательскихНастроекНаСервере
                        |ОбработкаЗапросаОбновления
                        |ПриПолученииДанныхНаСервере
                        |НачалоПеретаскивания
                        |ПроверкаПеретаскивания
                        |ОкончаниеПеретаскивания
                        |Перетаскивание";
        Для Счетчик = 1 по 28 Цикл
            ИмяСвойства = СтрПолучитьСтроку(ПереченьСвойств, Счетчик);
            Элементы[ИмяСписка].УстановитьДействие(ИмяСвойства,?(СписокДействий.Свойство(ИмяСвойства),СписокДействий[ИмяСвойства],""));
        КонецЦикла;
    КонецЕсли;    

КонецПроцедуры
3 Garykom
 
гуру
10.10.24
15:52
ОповеститьОбИзменении в СП почитай
4 osa1C
 
10.10.24
16:36
(0) Зачем ты эти портянки выложил?
&НаКлиенте
// Обновление динамического списка "Список"
Элементы.Список.Обновить();

// для обновления Реквизитов
ЭтаФорма.Прочитать();

// Обновление данных
ЭтаФорма.ОбновитьОтображениеДанных();
5 AAA
 
10.10.24
16:50
(4) Видимо, думает, что будем вгрызаться взглядом в каждую строчку. Таких портянок и так хватает в типовых, но вот еще и тут)
6 spiller26
 
10.10.24
16:50
(3) Оповестить что?
ОповеститьОбИзменении(Ссылка) Ссылка обязательная.
7 spiller26
 
10.10.24
16:54
(5) Документ "стоковый", доработка в расширении. Сам документ не трогается никак, просто на форме размещен программно Динамический список (запрос), документов с отбором. Из этой же формы создается или меняется документ2, после закрытия документ2 нужно, чтобы в Динамическом списке отобразились изменения.
8 spiller26
 
10.10.24
16:55
вот стоковый
9 spiller26
 
10.10.24
17:04
Страница "Палетные листы" и добавлены элементы, сделана программно.
1. По кнопке создается документ "Палетный лист", в обратку при закрытии стоит оповещение, чтобы обновить отоображаемые данные Таблицы "Палетные листы".
2. В Таблице "Палетные листы" (Динамический список) отображаются "Палетные листы" по связке с этим документом "Задание на перевозку".

Вот при создании и изменении "Палетных листов" из этой формы документа и закрытии не могу обновить Таблицу "Палетные листы"
10 spiller26
 
10.10.24
17:15
(4) Этот код только обновляет, но не добавляет новый созданный.

Элементы.Таблица_ПЛ.Обновить();
ЭтаФорма.Прочитать();
ЭтаФорма.ОбновитьОтображениеДанных();
11 timurhv
 
10.10.24
17:19
Выкиньте уже из написания
"ЭтаФорма." - такого нет, оставили для поддержки
12 spiller26
 
10.10.24
17:20
Всё нашел наконец таки, при записи не отрабатывает оповещение "ПослеЗакрытияФормыПЛ"
13 spiller26
 
10.10.24
17:22
(11) Как допишу код, потом буду "эстетику" наводить.
14 youalex
 
10.10.24
19:28
(6) Дальше прочитай
Вариант синтаксиса: Изменено много объектов
Синтаксис:
ОповеститьОбИзменении(<ИзмененныйТип>)
Параметры:
<ИзмененныйТип> (обязательный)
Тип: Тип.
Тип изменившихся объектов, например "ДокументСсылка.РасходнаяНакладная".
Поведение при очистке кэша - очищается вся информация, которая связана с измененным типом.
2 + 2 = 3.9999999999999999999999999999999...