Тз с колонкой на две строки

Автор vladmenleo, 10 октября 2024, 11:39

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

vladmenleo

Захотелось вывести в Тз колонки одна под другой. Код простой
Процедура Сформировать()
	Тз = СоздатьОбъект("ТаблицаЗначений");
	Запрос = СоздатьОбъект("ODBCRecordset");
	ТекстЗапроса = "SET NOCOUNT ON
	|Select
	|	2 as Флаг,
	|	Клиент.Id as [Клиент $Справочник.Клиенты],
	|	$Клиент.СфераДеятельности as [Сфера $Справочник.СферыДеятельности],
	|	$Клиент.ОтветственноеЛицо as [Менеджер $Справочник.Сотрудники],
	|	Ltrim(Rtrim($Клиент.Логин)) АдресПочты
	|FROM    
	|	$Справочник.Клиенты  as Клиент WITH (NOLOCK)
	|WHERE
	|	IsNull($Клиент.Логин, '') <> ''
	|	And $Клиент.флСогласиеНаРассылку = 1
	|";
	
	Тз = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
	ТзНаФорме.Загрузить(Тз);
	ТзНаФорме.ВыводитьПиктограммы("Флаг");
	ТзНаФорме.ВидимостьКолонки("Сфера, Менеджер", 0);
	ТзНаФорме.УстановитьПараметрыКолонки("Флаг",,,,"", 3);
	ТзНаФорме.УстановитьПараметрыКолонки("Клиент",,,,, 30);
	ТзНаФорме.УстановитьПараметрыКолонки("АдресПочты",,,,, 30);
	Если ТзНаФорме.КоличествоСтрок() <> 0 Тогда
		ТзНаФорме.ТекущаяСтрока(1);
	КонецЕсли;
	РФорма = СоздатьОбъект("РасширениеФормы");
	РФорма.ПоложениеКолонкиТаблицы("ТзНаФорме","АдресПочты",2);
КонецПроцедуры
И выясняется такая особенность. Запускаем первый раз - все хорошо. Жмем еще раз на кнопку - все, 1с висит. Есть какая-то особенность в выводе на две строки или что?

Злоп

Нет особенностей в выводе ТЗ (по крайней мере я не знаю). Смотри где висит конкретно. И тогда уже сабж в студию.
.
Упрости код для теста.
Тз = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
замени на
ЗначениеВФайл - скинь ТЗ с итогами таблицы в файл
и потом для теста загружай в ТЗ из файла.
ТЗ в файле можно и дать как исходные данные для теста.

Злоп

Запрос для получения тестовой ТЗ - упростить, типизировать поля запроса как строки.

Злоп

АдресПочтвы в Запросе поставить после Клиент.ИД
ибо лучше не надо манипулировать положением колонок ТЗ после невидимых колонок
.
задай явно в ТЗнаФорме положение колонки ИД, потом положение колонки АдресПочты

vk_barnaul

Цитата: vladmenleo от 10 октября 2024, 11:39Захотелось вывести в Тз колонки одна под другой. Код простой
Процедура Сформировать()
    ...
    РФорма = СоздатьОбъект("РасширениеФормы");
    РФорма.ПоложениеКолонкиТаблицы("ТзНаФорме","АдресПочты",2);
КонецПроцедуры
И выясняется такая особенность. Запускаем первый раз - все хорошо. Жмем еще раз на кнопку - все, 1с висит. Есть какая-то особенность в выводе на две строки или что?
Судя по той части кода которая выложена у тебя вызывается создание объекта РасширениеФормы каждый раз при вызове процедуры Сформировать. По идее по окончании выполнения процедуры объект должен уничтожиться если переменная РФорма у тебя где-то явно не заявлена. Либо при создании нового объекта (когда ты вызываешь второй раз) предыдущий должен уничтожиться. Возможно проблема в этом.
Хорошей практикой считается создание объекта РасширениеФормы в процедуре ПослеОткрытия. Тогда он создается один раз.

vladmenleo

Цитата: Злоп от 10 октября 2024, 19:51АдресПочтвы в Запросе поставить после Клиент.ИД
ибо лучше не надо манипулировать положением колонок ТЗ после невидимых колонок
.
задай явно в ТЗнаФорме положение колонки ИД, потом положение колонки АдресПочты
Когда явно задаю колонки в тзнаформе, очищаю строки в ней, потом в цикле заполняю - все работает. Хотелось именно загрузкой из тз, чтобы не бегать в цикле. положение колонок тоже менял, ничего не помогает. Для пробы пробовал
Если ТзНаФорме.КоличествоСтрок() = 0 Тогда
	
	ТзНаФорме.Загрузить(Тз);
	ТзНаФорме.ВыводитьПиктограммы("Флаг");
	ТзНаФорме.ВидимостьКолонки("Сфера, Менеджер", 0);
	ТзНаФорме.УстановитьПараметрыКолонки("Флаг",,,,"", 3);
	ТзНаФорме.УстановитьПараметрыКолонки("Клиент",,,,, 30);
	ТзНаФорме.УстановитьПараметрыКолонки("АдресПочты",,,,, 30);
	КонецЕсли;
т.е. чтобы грузилось только раз - все отрабатывает на ура. Не проходит 2-й раз именно установка положения таблицы

vladmenleo

Цитата: vk_barnaul от 11 октября 2024, 00:55Хорошей практикой считается создание объекта РасширениеФормы в процедуре ПослеОткрытия. Тогда он создается один раз.
пробовал и так
Перем РФорма;

РФорма = СоздатьОбъект("РасширениеФормы");

в сформировать только РФорма.ПоложениеКолонкиТаблицы("ТзНаФорме","АдресПочты",2);
Срабатывает один раз

vladmenleo

Цитата: Злоп от 10 октября 2024, 19:48Запрос для получения тестовой ТЗ - упростить, типизировать поля запроса как строки.
Нафига мне тз со строками

vladmenleo

Цитата: Злоп от 10 октября 2024, 19:47Нет особенностей в выводе ТЗ (по крайней мере я не знаю). Смотри где висит конкретно. И тогда уже сабж в студию.
.
Упрости код для теста.
Тз = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
замени на
ЗначениеВФайл - скинь ТЗ с итогами таблицы в файл
и потом для теста загружай в ТЗ из файла.
ТЗ в файле можно и дать как исходные данные для теста.
То-же самое
Тз = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
	ЗначениеВФайл(КаталогВременныхФайлов() + "тест.тест", Тз, 1);
	Возврат;
Процедура ТзИзФайла()
	Тз = СоздатьОбъект("ТаблицаЗначений");
	ЗначениеИзФайла(КаталогВременныхФайлов() + "тест.тест", Тз, 1);
	ТзНаФорме.Загрузить(Тз);
	ТзНаФорме.ВыводитьПиктограммы("Флаг");
	ТзНаФорме.ВидимостьКолонки("Сфера, Менеджер", 0);
	ТзНаФорме.УстановитьПараметрыКолонки("Флаг",,,,"", 3);
	ТзНаФорме.УстановитьПараметрыКолонки("Клиент",,,,, 30);
	ТзНаФорме.УстановитьПараметрыКолонки("АдресПочты",,,,, 30);
	
	РФорма.ПоложениеКолонкиТаблицы("ТзНаФорме","АдресПочты",2);
	Если ТзНаФорме.КоличествоСтрок() <> 0 Тогда
		ТзНаФорме.ТекущаяСтрока(1);
	КонецЕсли;
КонецПроцедуры // ТзИзФайла
при первом нажатии заполняется, при втором висит

АЛьФ

А если перед перезаполнением таблицы скинуть положение колонки в 0?

vladmenleo

Цитата: АЛьФ от 11 октября 2024, 11:13А если перед перезаполнением таблицы скинуть положение колонки в 0?
Что значит скинуть в 0? Делал тзнаформе.очистить() - не помогло

Злоп

РФорма.ПоложениеКолонкиТаблицы("ТзНаФорме","АдресПочты",0);

vladmenleo

Цитата: Злоп от 11 октября 2024, 11:51РФорма.ПоложениеКолонкиТаблицы("ТзНаФорме","АдресПочты",0);
попробовал, не помогает  :( Сделал вот так
Тз = СоздатьОбъект("ТаблицаЗначений");
	ЗначениеИзФайла(КаталогВременныхФайлов() + "тест.тест", Тз, 1);
	ТзНаФорме.Очистить();
	ТзНаФорме.Загрузить(Тз);
	ТзНаФорме.ВыводитьПиктограммы("Флаг");
	ТзНаФорме.ВидимостьКолонки("Сфера, Менеджер", 0);
	ТзНаФорме.УстановитьПараметрыКолонки("Флаг",,,,"", 3);
	ТзНаФорме.УстановитьПараметрыКолонки("Клиент",,,,, 30);
	ТзНаФорме.УстановитьПараметрыКолонки("АдресПочты",,,,, 30);
	
	РФорма.ПоложениеКолонкиТаблицы("ТзНаФорме","АдресПочты",0);
	РФорма.ПоложениеКолонкиТаблицы("ТзНаФорме","АдресПочты",2);
	Если ТзНаФорме.КоличествоСтрок() <> 0 Тогда
		ТзНаФорме.ТекущаяСтрока(1);
	КонецЕсли;

vladmenleo

Кстати, 0 как параметр в хелпе не упомянут. 0 это сбрасывает все на стандартное расположение?

Злоп

Обновись формексом и ALS - в новом алс должно быть упомянуто