Последние сообщения

#1
Дружественные проекты / Re: Табличное поле в 1С++
Последний ответ от victuan - 11 июля 2024, 18:52
Похожее я тоже сделал, но без КОПов ;)

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

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


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

Сохраняет/восстанавливает ширину, видимость и положение колонок.
#2
Дружественные проекты / Re: Табличное поле в 1С++
Последний ответ от trad - 11 июля 2024, 09:09
Использование:

Процедура ФормаПриСоздании(_Форма)
	
	ТП = _Форма.СоздатьЭлементУправления("ТабличноеПолеСериализуемое", Форма.ТП);
	
	// Добавление колонок
	
	ТП.Сериализация("Контрагенты_Список");
		
КонецПроцедуры
#3
Дружественные проекты / Re: Табличное поле в 1С++
Последний ответ от trad - 11 июля 2024, 09:03
Есть у меня такой КОП
Сохраняет/восстанавливает ширину, видимость, положение колонок

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

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

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

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

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


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

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


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


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


//*******************************************
Процедура Конструктор()
	
	мСериализоватьПриУничтожении=0;
	
КонецПроцедуры
#4
Дружественные проекты / Re: Табличное поле в 1С++
Последний ответ от victuan - 10 июля 2024, 11:07
Цитата: trad от 10 июля 2024, 08:37В общем случае, при перемещении разделителя колонок, изменяется ширина не одной колонки.
Вот оно что... Не подумал, что ширина остальных колонок меняется.
Но всё равно знать колонку, которую меняют, имеет смысл, т.к. ее ширину надо сохранить, а остальные колонки получают свою ширину по автоматическому распределению.
При повторном открытии формы, восстанавливаем из сохраненных настроек ширину измененной ранее колонки, ширина остальных установится также автоматически.
В целом идея была такая, но поскольку не удалось отловить имя колонки - "инициатора" изменений, то пришлось тупо сохранять ширИны всех колонок из тп.
#5
Дружественные проекты / Re: Табличное поле в 1С++
Последний ответ от trad - 10 июля 2024, 08:41
Можно хранить ширины всех колонок и, при изменении ширины, сравнивать у каких колонок ширина изменилась
#6
Дружественные проекты / Re: Табличное поле в 1С++
Последний ответ от trad - 10 июля 2024, 08:37
В общем случае, при перемещении разделителя колонок, изменяется ширина не одной колонки. Поэтому нельзя сказать что изменяется одна конкретная колонка.
#7
Дружественные проекты / Re: Табличное поле в 1С++
Последний ответ от victuan - 09 июля 2024, 17:31
Был вопрос или решение следующего вопроса?
Событие тп_ПриИзмененииШириныКолонки(тп) не дает узнать имя колонки, ширину которой по данному событию меняют.
Можно узнать имя АКТИВНОЙ колонки, но активная и изменяемая колонки не обязаны совпадать.

До кучи: есть события тп_ПриПеремещенииКолонки() и тп_ПриИзмененииВидимостиКолонки().
Но мне не хватило отсутствующих событий тп_ПослеПеремещенииКолонки() и тп_ПослеИзмененииВидимостиКолонки().
Но тут удалось выкрутиться через "ложное" закрытие формы.
#8
FormEx / Как понять, что сейчас активно...
Последний ответ от alyuev - 08 июля 2024, 16:31
Задумал по ESC закрывать активную таблицу. Для этого определяю, что это именно Таблица как:

Табл=Сервис.активныйконтекст(л_текОкно)
Если ТипЗначенияСтр(Табл)="Таблица" Тогда 
   флаг=0;
   СистемнаяКоманда(32800);
   Перейти ~Выход;
КонецЕсли;

Т.е. собственно закрытие через СистемнаяКоманда(32800).

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

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

Вот я и подумал, а можно как-то определить, что сейчас активным является системное окно ввода? Чтобы это использовать уже в момент перехвата ESC.


#9
7.7 / Re: Запуск 1С 7.7 по расписани...
Последний ответ от MadDAD - 08 июля 2024, 15:55
Цитата: АЛьФ от 29 марта 2024, 13:48Ха! А вот еще тайна природы.
Если код запроса запустить не в задании, а просто в запросе, то запускается и начинает работу. Но валится в исключение на выполнении метода глСервис.ПолучитьСписокАктивныхПользователей().

Так а что за исключение? Может проблема в правах доступа к папкам пользователей?
Вообще на сколько я помню с семерошных времен - для корректной работы семерки сессия под которой запускается платформа должна быть открыта интерактивно хотя бы один раз после перезапуска сервера, иначе получаются такие спецеффекты. Там какой-то затык с контекстом.
#10
7.7 / Re: Изменить размер шрифта на ...
Последний ответ от Злоп - 06 июля 2024, 16:19
Конопочку на форму тсд положить хочешь?
Что будет делать кнопочка?
.
Как ее будут тыкать сборщики в перчатках? Продублируй кнопку горячей клавишей.
.
Процесс на тсд должен быть построен так чтобы альтернатив на экране тсд было как можно меньше. Система должна тащить сборщика по процессу сама.