Табличное поле в 1С++

Автор АЛьФ, 11 марта 2024, 09:07

« назад - далее »

victuan

Был вопрос или решение следующего вопроса?
Событие тп_ПриИзмененииШириныКолонки(тп) не дает узнать имя колонки, ширину которой по данному событию меняют.
Можно узнать имя АКТИВНОЙ колонки, но активная и изменяемая колонки не обязаны совпадать.

До кучи: есть события тп_ПриПеремещенииКолонки() и тп_ПриИзмененииВидимостиКолонки().
Но мне не хватило отсутствующих событий тп_ПослеПеремещенииКолонки() и тп_ПослеИзмененииВидимостиКолонки().
Но тут удалось выкрутиться через "ложное" закрытие формы.

trad

В общем случае, при перемещении разделителя колонок, изменяется ширина не одной колонки. Поэтому нельзя сказать что изменяется одна конкретная колонка.

trad

Можно хранить ширины всех колонок и, при изменении ширины, сравнивать у каких колонок ширина изменилась

victuan

Цитата: trad от 10 июля 2024, 08:37В общем случае, при перемещении разделителя колонок, изменяется ширина не одной колонки.
Вот оно что... Не подумал, что ширина остальных колонок меняется.
Но всё равно знать колонку, которую меняют, имеет смысл, т.к. ее ширину надо сохранить, а остальные колонки получают свою ширину по автоматическому распределению.
При повторном открытии формы, восстанавливаем из сохраненных настроек ширину измененной ранее колонки, ширина остальных установится также автоматически.
В целом идея была такая, но поскольку не удалось отловить имя колонки - "инициатора" изменений, то пришлось тупо сохранять ширИны всех колонок из тп.

trad

Есть у меня такой КОП
Сохраняет/восстанавливает ширину, видимость, положение колонок

// КОП_ТабличноеПолеСериализуемое.ert

//defcls.prm:
//#класс ТабличноеПолеСериализуемое=КОП_ТабличноеПолеСериализуемое.ert : ТабличноеПоле
//#{
//#};

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

Перем мИдентификатор;
Перем мСериализоватьПриУничтожении;

Функция Сам(Конт)
	Возврат Конт;
КонецФункции


//*******************************************
Процедура Сериализовать(Режим)
	
	ТП = Сам(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле");
	ИмяФайла = КаталогПользователя() + "_ТП_" + мИдентификатор + ".tfs";
	
	Если Режим = 0 Тогда
		// Чтение
		Сп = "";
		ЗначениеИзФайла(ИмяФайла, Сп, 1);
		Если ПустоеЗначение(Сп) = 0 Тогда
			ИмяКолонки = "";
			Индекс = 0;
			Для Тек = 1 По Сп.РазмерСписка() Цикл
				СпКолонка = Сп.ПолучитьЗначение(Тек,ИмяКолонки);
				Попытка
					Колонка = ТП.Колонки.Получить(ИмяКолонки);
				Исключение
					Колонка = "";
				КонецПопытки;
				Если ПустоеЗначение(Колонка) = 0 Тогда
					Колонка.Видимость = СпКолонка.Получить("Видимость");
					Колонка.Ширина = СпКолонка.Получить("Ширина");
					ИндексВТП = ТП.Колонки.Индекс(Колонка);
					Если Индекс <> ИндексВТП Тогда
						ТП.Колонки.Сдвинуть(ИндексВТП, Индекс - ИндексВТП);
					КонецЕсли;
					Индекс = Индекс + 1;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	Иначе
		// Запись
		Сп = СоздатьОбъект("СписокЗначений");
		Для Тек = 1 По ТП.Колонки.Количество() Цикл
			Колонка = ТП.Колонки.Получить(Тек - 1);
			СпКолонка = СоздатьОбъект("СписокЗначений");
			Сп.ДобавитьЗначение(СпКолонка, Колонка.Имя);
			СпКолонка.Установить("Видимость", Колонка.Видимость);
			СпКолонка.Установить("Ширина", Колонка.Ширина );
		КонецЦикла;
		ЗначениеВФайл(ИмяФайла, Сп, 1);
	КонецЕсли;

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


//*******************************************
Процедура ПриУничтожении() Экспорт
	
	Если мСериализоватьПриУничтожении = 1 Тогда
		Сериализовать(1);
	КонецЕсли;
	
КонецПроцедуры


//*******************************************
Процедура Сериализация(Идентификатор) Экспорт
	
	Если ПустаяСтрока(Идентификатор) = 0 Тогда
		мИдентификатор = Идентификатор;
		Сериализовать(0);
		мСериализоватьПриУничтожении = 1;
	КонецЕсли;
	
КонецПроцедуры


//*******************************************
Процедура Конструктор()
	
	мСериализоватьПриУничтожении=0;
	
КонецПроцедуры

trad

Использование:

Процедура ФормаПриСоздании(_Форма)
	
	ТП = _Форма.СоздатьЭлементУправления("ТабличноеПолеСериализуемое", Форма.ТП);
	
	// Добавление колонок
	
	ТП.Сериализация("Контрагенты_Список");
		
КонецПроцедуры

victuan

Похожее я тоже сделал, но без КОПов ;)

При чтении настроек:
Настройки = ВосстановитьЗначение("Настройки_АРМотгрузки");
	Если ТипЗначенияСтр(Настройки) <>  "СписокЗначений" Тогда
		Настройки = СоздатьОбъект("СписокЗначений");
	КонецЕсли;

	НастройкиТП = Настройки.Получить(идОбъекта);
	Если ТипЗначенияСтр(НастройкиТП) = "СписокЗначений" Тогда
		Для поз = 1 по НастройкиТП.РазмерСписка() Цикл
			Ширина = Число(НастройкиТП.ПолучитьЗначение(поз, ИмяКолонки));
			инд = Колонки.Индекс(ИмяКолонки);
			Если инд = -1 Тогда
				Продолжить; //нет этой колонки в тп
			ИначеЕсли инд+1 <> поз Тогда //нужно сдвинуть колонку
				Попытка
					Колонки.Сдвинуть(инд, поз-инд-1)
				Исключение
				КонецПопытки;
			КонецЕсли;
			Если Ширина = -1 Тогда //признак невидимости колонки
				Колонки.Получить(ИмяКолонки).Видимость = 0
			ИначеЕсли Ширина > 0 Тогда //изменим ширину
				Колонки.Получить(ИмяКолонки).Ширина = Ширина;
				СпИзмШириныКолонокТпЖурнал.Установить(ИмяКолонки, 1);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;


При записи настроек:
НастройкиТП = СоздатьОбъект("СписокЗначений");
	Колонки = тпЖурнал.Колонки;
	Для инд = 0 По Колонки.Количество()-1 Цикл
		Колонка = Колонки.Получить(инд);
		//НастройкиТП.Установить(Колонка.Имя, ?(Колонка.Видимость=0, -1, ?(СпИзмШириныКолонокТпЖурнал.Получить(Колонка.Имя)=1,Колонка.Ширина,0)));
		НастройкиТП.Установить(Колонка.Имя, ?(Колонка.Видимость=0, -1, Колонка.Ширина));
	КонецЦикла;
	Настройки.Установить("тпЖурнал_", НастройкиТП);
	СохранитьЗначение("Настройки_АРМотгрузки", Настройки);

Сохраняет/восстанавливает ширину, видимость и положение колонок.