Форум Кладовочки АЛьФ`а

Обсуждение проектов => FormEx => Тема начата: vladmenleo от 10 октября 2024, 11:39

Название: Тз с колонкой на две строки
Отправлено: vladmenleo от 10 октября 2024, 11:39
Захотелось вывести в Тз колонки одна под другой. Код простой
Процедура Сформировать()
Тз = СоздатьОбъект("ТаблицаЗначений");
Запрос = СоздатьОбъект("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с висит. Есть какая-то особенность в выводе на две строки или что?
Название: Re: Тз с колонкой на две строки
Отправлено: Злоп от 10 октября 2024, 19:47
Нет особенностей в выводе ТЗ (по крайней мере я не знаю). Смотри где висит конкретно. И тогда уже сабж в студию.
.
Упрости код для теста.
Тз = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
замени на
ЗначениеВФайл - скинь ТЗ с итогами таблицы в файл
и потом для теста загружай в ТЗ из файла.
ТЗ в файле можно и дать как исходные данные для теста.
Название: Re: Тз с колонкой на две строки
Отправлено: Злоп от 10 октября 2024, 19:48
Запрос для получения тестовой ТЗ - упростить, типизировать поля запроса как строки.
Название: Re: Тз с колонкой на две строки
Отправлено: Злоп от 10 октября 2024, 19:51
АдресПочтвы в Запросе поставить после Клиент.ИД
ибо лучше не надо манипулировать положением колонок ТЗ после невидимых колонок
.
задай явно в ТЗнаФорме положение колонки ИД, потом положение колонки АдресПочты
Название: Re: Тз с колонкой на две строки
Отправлено: vk_barnaul от 11 октября 2024, 00:55
Цитата: vladmenleo от 10 октября 2024, 11:39Захотелось вывести в Тз колонки одна под другой. Код простой
Процедура Сформировать()
    ...
    РФорма = СоздатьОбъект("РасширениеФормы");
    РФорма.ПоложениеКолонкиТаблицы("ТзНаФорме","АдресПочты",2);
КонецПроцедуры
И выясняется такая особенность. Запускаем первый раз - все хорошо. Жмем еще раз на кнопку - все, 1с висит. Есть какая-то особенность в выводе на две строки или что?
Судя по той части кода которая выложена у тебя вызывается создание объекта РасширениеФормы каждый раз при вызове процедуры Сформировать. По идее по окончании выполнения процедуры объект должен уничтожиться если переменная РФорма у тебя где-то явно не заявлена. Либо при создании нового объекта (когда ты вызываешь второй раз) предыдущий должен уничтожиться. Возможно проблема в этом.
Хорошей практикой считается создание объекта РасширениеФормы в процедуре ПослеОткрытия. Тогда он создается один раз.
Название: Re: Тз с колонкой на две строки
Отправлено: vladmenleo от 11 октября 2024, 06:16
Цитата: Злоп от 10 октября 2024, 19:51АдресПочтвы в Запросе поставить после Клиент.ИД
ибо лучше не надо манипулировать положением колонок ТЗ после невидимых колонок
.
задай явно в ТЗнаФорме положение колонки ИД, потом положение колонки АдресПочты
Когда явно задаю колонки в тзнаформе, очищаю строки в ней, потом в цикле заполняю - все работает. Хотелось именно загрузкой из тз, чтобы не бегать в цикле. положение колонок тоже менял, ничего не помогает. Для пробы пробовал Если ТзНаФорме.КоличествоСтрок() = 0 Тогда

ТзНаФорме.Загрузить(Тз);
ТзНаФорме.ВыводитьПиктограммы("Флаг");
ТзНаФорме.ВидимостьКолонки("Сфера, Менеджер", 0);
ТзНаФорме.УстановитьПараметрыКолонки("Флаг",,,,"", 3);
ТзНаФорме.УстановитьПараметрыКолонки("Клиент",,,,, 30);
ТзНаФорме.УстановитьПараметрыКолонки("АдресПочты",,,,, 30);
КонецЕсли;
т.е. чтобы грузилось только раз - все отрабатывает на ура. Не проходит 2-й раз именно установка положения таблицы
Название: Re: Тз с колонкой на две строки
Отправлено: vladmenleo от 11 октября 2024, 06:20
Цитата: vk_barnaul от 11 октября 2024, 00:55Хорошей практикой считается создание объекта РасширениеФормы в процедуре ПослеОткрытия. Тогда он создается один раз.
пробовал и так
Перем РФорма;

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

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

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

РФорма.ПоложениеКолонкиТаблицы("ТзНаФорме","АдресПочты",0);
РФорма.ПоложениеКолонкиТаблицы("ТзНаФорме","АдресПочты",2);
Если ТзНаФорме.КоличествоСтрок() <> 0 Тогда
ТзНаФорме.ТекущаяСтрока(1);
КонецЕсли;
Название: Re: Тз с колонкой на две строки
Отправлено: vladmenleo от 11 октября 2024, 12:01
Кстати, 0 как параметр в хелпе не упомянут. 0 это сбрасывает все на стандартное расположение?
Название: Re: Тз с колонкой на две строки
Отправлено: Злоп от 11 октября 2024, 12:39
Обновись формексом и ALS - в новом алс должно быть упомянуто
Название: Re: Тз с колонкой на две строки
Отправлено: vladmenleo от 11 октября 2024, 12:58
Точно, als поменялся
Название: Re: Тз с колонкой на две строки
Отправлено: sau от 20 октября 2024, 02:04
Да с этим вопросы есть. Я пользуюсь с МногострочнойЧастью.
Изменение положения не срабатывает в ПослеОткрытия (использую ВнешнееСобытие)
Переключение туда/сюда, если Форма не максимизирована, делает МногострочнуюЧасть просто "белой" без колонок, без ничего (использую "передергивание" Окна.Восстановить(Форма); Окна.Максимизировать(Форма);)
Тогда работает, но небольшим миганием :)
Название: Re: Тз с колонкой на две строки
Отправлено: sau от 20 октября 2024, 02:10
И еще делаю ЗапретитьОбновлениеОкна до 1 после 0. Меньше "мигает" :)