Я конечно понимаю, что "хотеть не вредно, вредно не хотеть" :-)
И совсем не значит, что эти "хотелки" будут толкать Алексея их "исполнять", но, может наведут на мысли, и глядишь - что-то и пригодится...
Предлогаю в эту тему писать, кому, чего не хватает в ФормЕксе... Может что-то и заинтересует автора.
Мне пока хватает всего, ну... Почти :-)
Пока только две:
1. Перехватить сообщение стандартных кнопок панелей инструментов и заменить на свои(ну, Алексей в курсе, я ему подробно об этом писал).
2. Очень хотелось-бы добраться до картинки на табличной части формы. Не той, которая отображает стандартные пиктограммы в первой колонке(метод для этого в Формексе есть, и работает), а той, которая свои, пользовательские пиктограммы в колонках табличной части вывалит. Хотелось бы ее устанавливать программно, а не так, как штатно, интерактивно в конфигураторе. Так-же как картинки просто на форме, не в табличной части.
1. Ой, вот только не надо быть настолько во мне уверенным. Я старенький, у меня внучке уже скоро три года. Так что лучше продублировать или переслать заново письмо, если мы по мэйлу общались.
Есть предопределенная, которая, вроде как, перехватывает сообщения и может их глушить.
Процедура ПриПолученииКомандыГлавнымОкном(wParam, lParam, СтандартнаяОбработка)
Сообщить("Команда главному окну:" + wParam + ", " + lParam);
КонецПроцедуры
2. Гляну.
"Так что лучше продублировать или переслать заново письмо, если мы по мэйлу общались."
Общались по мылу, но, там ничего по делу и не было, просто просьба обратить внимание на тему на Мисте: Перехватить и подменить системные сообщения штатных инструментов справочника... Возможно? (https://forum.mista.ru/topic.php?id=885526) Надеюсь, на чтение, Волшебник не забанил? :)
Хорошо, завтра днем глюну.
Ветка была когда я как раз в больнице прохлаждался в прошлом году.
Ага... Ровно год прошел :-)
Во-первых, спасибо за ваш труд.
Во-вторых, баян длиной в 15 лет: планируется ли допиливание метода РасширениеФормы.ДобавитьАтрибут? Насколько я понимаю, колонку в ТЧ документа не добавить, ЦветФона новосозданному атрибуту не установить.
И да, на dorex.pro в левом меню ссылка FormEx -> Форум ведёт на 1cpp, а не сюда.
Хотелось бы более продвинутого поведения глобализованных предопределенных процедур. "Если в глоабльной процедуре статус возврата установлен в 0, то вызова локальной процедуры не происходит." - этого не хватает. При СтатусВозврата(0) платформой будет инициирована отмена действия. А нужно иногда, чтобы действие выполнилось (выбор значения, например), но не выполнялась локальная процедура формы. Чтобы не вылетало окно выбора дважды, хотя бы.
Цитата: Грузчик от 20 февраля 2024, 14:01Во-первых, спасибо за ваш труд.
Во-вторых, баян длиной в 15 лет: планируется ли допиливание метода РасширениеФормы.ДобавитьАтрибут? Насколько я понимаю, колонку в ТЧ документа не добавить, ЦветФона новосозданному атрибуту не установить.
Этот функционал делал Артур, не я. Боюсь туда даже лезть. Поэтому пока не планируется.
Цитата: Грузчик от 20 февраля 2024, 14:01И да, на dorex.pro в левом меню ссылка FormEx -> Форум ведёт на 1cpp, а не сюда.
Спасибо, это поправил.
Цитата: Chai Nic от 20 февраля 2024, 14:04Хотелось бы более продвинутого поведения глобализованных предопределенных процедур. "Если в глоабльной процедуре статус возврата установлен в 0, то вызова локальной процедуры не происходит." - этого не хватает. При СтатусВозврата(0) платформой будет инициирована отмена действия. А нужно иногда, чтобы действие выполнилось (выбор значения, например), но не выполнялась локальная процедура формы. Чтобы не вылетало окно выбора дважды, хотя бы.
Для реализации этого сделано, чтобы глобализованная предопределенная могла бы быть функцией. Если эта функция вернет 0, то локальная не будет вызвана.
А можно ли как-то перерисовать (растянуть) табличную часть на форме после программного изменения размера модального окна с табличной частью аналогично перерисовке при интерактивном изменении размеров немодального окна? Если есть в платформе такой внутренний метод, может его в РасширениеФормы имплементировать? Методы Обновить() и формы и расширения не помогают.
Цитата: Chai Nic от 20 февраля 2024, 16:09А можно ли как-то перерисовать (растянуть) табличную часть на форме после программного изменения размера модального окна с табличной частью аналогично перерисовке при интерактивном изменении размеров немодального окна? Если есть в платформе такой внутренний метод, может его в РасширениеФормы имплементировать? Методы Обновить() и формы и расширения не помогают.
Так просто измени размер многострочной части так же, как меняешь размер формы. Через АтрибутФормы.УстановитьКоординаты().
Цитата: АЛьФ от 20 февраля 2024, 14:20Этот функционал делал Артур, не я. Боюсь туда даже лезть. Поэтому пока не планируется.
А насколько трудно будет реализовать нечто вроде:
глСервис.ВключитьРаскраскуТаблиц(0);
глСервис.ИспользоватьПланРаскраски(1);
// для таблиц без колонки "FormEx_ПланРаскраски" включим хоть курсор во всю строку
глСервис.ПланРаскраскиПоУмолчанию("(BRUSH_S[255])");
Цитата: Грузчик от 20 февраля 2024, 16:37А насколько трудно будет реализовать нечто вроде:
глСервис.ВключитьРаскраскуТаблиц(0);
глСервис.ИспользоватьПланРаскраски(1);
// для таблиц без колонки "FormEx_ПланРаскраски" включим хоть курсор во всю строку
глСервис.ПланРаскраскиПоУмолчанию("(BRUSH_S[255])");
На первый взгляд это убьет все ускорение, ради которого план раскраски и вводился. Но я попробую посмотреть можно ли будет вписать такой функционал в существующий.
А вот на второй взгляд вроде как вписывается в общую концепцию... Вечером попробую сделать.
Цитата: АЛьФ от 20 февраля 2024, 16:32Так просто измени размер многострочной части так же, как меняешь размер формы. Через АтрибутФормы.УстановитьКоординаты().
Так там и прочие атрибуты придется двигать, которые снизу и справа ТЧ. Нетривиально и возможно не получится повторить штатное поведение.
Цитата: Chai Nic от 20 февраля 2024, 16:52Так там и прочие атрибуты придется двигать, которые снизу и справа ТЧ. Нетривиально и возможно не получится повторить штатное поведение.
Для этого есть замечательный класс Общие.Форма.Привязка. Можно именно как класс 1С++ использовать или надергать оттуда готового кода.
Цитата: АЛьФ от 19 февраля 2024, 22:22...
Есть предопределенная, которая, вроде как, перехватывает сообщения и может их глушить.
Процедура ПриПолученииКомандыГлавнымОкном(wParam, lParam, СтандартнаяОбработка)
Сообщить("Команда главному окну:" + wParam + ", " + lParam);
КонецПроцедуры
...
Дык, в том то и проблема, что не "перехватываются команды тулбаров форм документов/справочников/журналов". Из общих панелей, из меню Действия, Горячие клавиши — перехватываются, а из панели инструментов формы те же действия — нет.
Цитата: Arbuz от 20 февраля 2024, 16:58Цитата: АЛьФ от 19 февраля 2024, 22:22...
Есть предопределенная, которая, вроде как, перехватывает сообщения и может их глушить.
Процедура ПриПолученииКомандыГлавнымОкном(wParam, lParam, СтандартнаяОбработка)
Сообщить("Команда главному окну:" + wParam + ", " + lParam);
КонецПроцедуры
...
Дык, в том то и проблема, что не "перехватываются команды тулбаров форм документов/справочников/журналов". Из общих панелей, из меню Действия, Горячие клавиши — перехватываются, а из панели инструментов формы те же действия — нет.
Понял. Буду смотреть.
Подтверждаю. Когда делал перехват кнопок тулбаров пришлось использовать класс DWX.ToolBar
Сам себе оставлял такой комментарий:
//Правда ПриПолученииКомандыГлавнымОкном() сам по себе почему-то некоторые кнопки панели не перехватывает. А с помощью класса DWX.ToolBar - получается.
//Он перехватывает и далее уже отрабатывает ПриПолученииКомандыГлавнымОкном
//DWX.ToolBar -> ButtonClick() -> ПодменитьСистемноеДействие() -> ОткрытьСистемноеОкно() -> ПриПолученииКомандыГлавнымОкном()
Здесь: ButtonClick() - это событие класса DWX.ToolBar.
ПодменитьСистемноеДействие() и ОткрытьСистемноеОкно() - это мои функции. Из последней вызывается код:
ТекстМодуля = "
|Public Const WM_COMMAND = &h111
|Public Sub GetUsersWindow()
| Set Wrap = CreateObject(""DynamicWrapperX"")
| Wrap.Register ""USER32"", ""GetForegroundWindow"", ""f=s"", ""r=l""
| Wrap.Register ""user32"", ""SendMessage"" , ""i=hull"" , ""r=l""
| Res = Wrap.SendMessage(Wrap.GetForegroundWindow(), WM_COMMAND, "+КодОкна+", 0)
|End Sub";
мScrptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
мScrptCtrl.Language = "vbscript";мScrptCtrl.AddCode(ТекстМодуля);
мScrptCtrl.CodeObject.GetUsersWindow();
И отсюда уже попадает в ПриПолученииКомандыГлавнымОкном().
Решил попробовать "закат солнца вручную" с установкой размеров таблицы на форме при изменении размеров формы. На немодальных формах всё более-менее предсказуемо. А на модальных ересь какая-то происходит. Абсолютно одна и та же форма в немодальном режиме модифицируется корректно, а в модальном - как-то по странному. Такое ощущение, что в модальном режиме применяются какие-то непонятные коэффициенты к значениям высоты и ширины. Что это может быть и как с этим бороться?
Тестовый пример по ссылке. https://disk.yandex.ru/d/EJgyL6r7IZQnFw
Там одна и та же форма открывается в немодальном и модальном режиме, а после открытия происходит модификация размеров таблицы под размеры формы.
Там вроде что-то с шрифтом, который считается стандартным для модального окна.
.
И можно отказаться от модального окна, жмулируя его немодальным, с ко орого нельзя уйти
Ещё иногда хочется ПРОСТЫМ методом положить кнопку (типа как стандартная кнопка с действием на форме) на тулбар формы (по крайней мере для внешних обработок) - это тулбар где кнопки сохранить/восстановить значенмн
Цитата: Chai Nic от 20 февраля 2024, 16:52Цитата: АЛьФ от 20 февраля 2024, 16:32Так просто измени размер многострочной части так же, как меняешь размер формы. Через АтрибутФормы.УстановитьКоординаты().
Так там и прочие атрибуты придется двигать, которые снизу и справа ТЧ. Нетривиально и возможно не получится повторить штатное поведение.
А не надо делать много извращений на форме. Попроще надо...
Цитата: ЗлопТам вроде что-то с шрифтом, который считается стандартным для модального окна.
Ну а при чем тут шрифт, если размеры задаются в пискелах?
Цитата: ЗлопИ можно отказаться от модального окна, жмулируя его немодальным, с ко орого нельзя уйти
Не, нельзя. Модальное окно оно не просто так из вредности, а потому что оно должно при закрытии вернуть некие значения, которые надо обработать. Если открыть обычное окно, то не будет останова выполнения и ожидания результата в вызывающей процедуре.
Цитата: ЗлопА не надо делать много извращений на форме. Попроще надо...
Хочется сделать универсальное глобальное решение "расширятель модальных окон", не ковыряясь в конкретных формах.
А вот так все работает:
Процедура Отрисовка()
Расш=СоздатьОбъект("РасширениеФормы");
АтрТаблица=Расш.ПолучитьАтрибут("Таблица");
АтрТаблица.УстановитьКоординаты(,,Расш.Ширина-50,Расш.Высота-50);
КонецПроцедуры
Процедура Выполнить()
Расш=СоздатьОбъект("РасширениеФормы");
Расш.Высота = 350;
КонецПроцедуры
Процедура ПослеСозданияФормы()
Отрисовка();
КонецПроцедуры // ПослеСозданияФормы
Процедура ПриИзмененииРазмераОкна(ТипСобытия,ШиринаФормы,ВысотаФормы)
Отрисовка();
КонецПроцедуры
Цитата: АЛьФ от 21 февраля 2024, 09:24А вот так все работает:
Да всё равно не работает как положено. Сразу после открытия (ПослеСозданияФормы()) в модальном окне таблица растягивается слишком близко к краю, явно не на 50 пикселей, залезая на кнопки.
Потом, когда нажать на кнопку, то в процедуре Выполнить отрисовывается корректно в немодальной, а в модальной тоже "перебор".
https://disk.yandex.ru/i/qL_IR4UeAidbrg
МодальнаяФорма.png
А мне не надо придавливать таблицу к левому верхнему углу. Там свои элементы управления есть.
Интересно, когда координаты угла 0,0, то в модальном окне не отрисовывается панель инструментов формы, и размеры ставятся верно. Если даже убрать 0,0, но при этом отключить панель галочкой в свойствах формы - тоже нормально.
То есть, панель инструментов виновата в этом глюке модальной формы, получается. Ну и независимо от этого, модальная форма всегда чуток меньше обычной при прочих равных, причем не на толщину рамки обычной формы, а ещё меньше. Как будто платформа при выводе модальной формы реально применяет какой-то "уменьшающий коэффициент". А методы и атрибуты РасширениФормы этого не учитывают.
FormEx возвращает клиентскую область окна. Но выходит, что 1С в модальных окнах рисует тулбар прямо в клиентской области. Из-за этого и получается сдвиг. Я так понимаю.
Непонятно как это учитывать. Если ввести поправочный коэффициент какой-то, то у людей формы поедут, которые уже учитывают такое поведение в возврате координат. Нехорошо.
Поедет, конечно поедет и непредсказуемо поедет и мне кажется не только это.
Есть еще Окна.РазмерОкна(Форма,Ширина,Высота,Стиль,Параметр) и РасширениеФормы.Высота
Высота почти везде немного отличается, насколько я помню.
Я бы не стал менять текущее поведение, кодить не так чтобы много, а вот проверять соответствие высоты во всех возможных сочетаниях довольно муторно.
Кто с этим столкнулся уже какие-то коэффициенты и сдвиги внедрил.
Разве что сделать ТекущийВариантРасчетаФорм = Сервис.ВариантРасчетаКоординатФорм(Вариант)
Где Вариант=ПустоеЗначение,1,2,3...
Вот вот. Проще в доке упомянуть про такое поведение модального окна.
Так, ладно, раз хотелки так хотелки...
Процедура ПриЧтенииНастройки(<?>,) вызывается перед чтением Настройки, т.е. это по факту ПередЧтениемНастройки.
Иногда могут потребоваться некоторые изменения в сохраненных Настройках, но Настройки еще не загружены. Т.е. хочется событие ПослеЧтенияНастройки.
Вариантов костылей для исправления достаточно много, но это дополнительные переменные формы, не так чтобы сложно, но это утомительно и забывается как это работает по факту.
Зачем нужно?
Например баг с загрузкой сохраняемой тз на форму, если еще помните, то это "тз не загружается если фокус на тз"?
Мерд, старый винт унес код костылей с собой, но он не совсем умер, есть шанс восстановить...
Цитата: leov-001 от 21 февраля 2024, 14:10Вот вот. Проще в доке упомянуть про такое поведение модального окна.
Так непонятно, что в результате делать то, какие поправки и коэффициенты нужно применять на координаты и размеры, если форма модальная и с панелькой?
PS Попробовал убирать панель перед обращением к размерам, а потом её восстанавливать. Вот только при этом надо ставить глобальный семафор, чтобы не происходило зацикливания в процедуре Отрисовка, потому что при убирании-восстановлении панели вызывается событие ПриИзмененииРазмераОкна.
БылаПанель=Форма.ПанельИнструментов();
Форма.ПанельИнструментов(0);
// получаем и устанавливаем размеры
Форма.ПанельИнструментов(БылаПанель);
Цитата: Djelf от 21 февраля 2024, 14:25Так, ладно, раз хотелки так хотелки...
Процедура ПриЧтенииНастройки(<?>,) вызывается перед чтением Настройки, т.е. это по факту ПередЧтениемНастройки.
Иногда могут потребоваться некоторые изменения в сохраненных Настройках, но Настройки еще не загружены. Т.е. хочется событие ПослеЧтенияНастройки.
Вариантов костылей для исправления достаточно много, но это дополнительные переменные формы, не так чтобы сложно, но это утомительно и забывается как это работает по факту.
Зачем нужно?
Например баг с загрузкой сохраняемой тз на форму, если еще помните, то это "тз не загружается если фокус на тз"?
Мерд, старый винт унес код костылей с собой, но он не совсем умер, есть шанс восстановить...
В момент вызова этой процедуры настройки уже загружены из файла и готовы для загрузки в форму.
Можно передавать в процедуру список значений с загружаемыми значениями с возможностью его изменить.
Есть хотелка по коллекции атрибутов формы. Нужен какой-то способ, чтобы как-то однозначно идентифицировать полученные атрибуты. В настоящее время нет такого.
То есть, если тебе надо получить сначала какой-то атрибут, а потом ты хочешь выбрать все атрибуты, учитывая первый, способа этого сделать нет. Сравнивать значения типа Атрибут (если ТекущийАтр=ГлавныйАтр Тогда) нельзя - это объекты, а не значения. Два Атрибута, полученных по одному атрибуту формы, всегда будут разными.
Можно какой-нибудь уникальный ИД к атрибуту прицепить, который бы был однозначно связан с атрибутом формы и был повторяем при повторных обращениях к форме? Атр.Идентификатор - не обязательный и не у всех присутствует.
Цитата: Chai Nic от 21 февраля 2024, 15:04Есть хотелка по коллекции атрибутов формы. Нужен какой-то способ, чтобы как-то однозначно идентифицировать полученные атрибуты. В настоящее время нет такого.
То есть, если тебе надо получить сначала какой-то атрибут, а потом ты хочешь выбрать все атрибуты, учитывая первый, способа этого сделать нет. Сравнивать значения типа Атрибут (если ТекущийАтр=ГлавныйАтр Тогда) нельзя - это объекты, а не значения. Два Атрибута, полученных по одному атрибуту формы, всегда будут разными.
Можно какой-нибудь уникальный ИД к атрибуту прицепить, который бы был однозначно связан с атрибутом формы и был повторяем при повторных обращениях к форме? Атр.Идентификатор - не обязательный и не у всех присутствует.
Можно попробовать использовать атр.Дескриптор. Это значение уникально для всех атрибутов. Но меняется при открытии формы.
Цитата: АЛьФ от 21 февраля 2024, 15:11Можно попробовать использовать атр.Дескриптор. Это значение уникально для всех атрибутов. Но меняется при открытии формы.
Спасибо, работает. Тогда хотелка отменяется.
Хочется что-то типа поведения если установить стиль окна без титула - то внизу окна получается внезапно свободное место, и получается некрасиво... Было бы няшно если при установке стиля окна без титула система сама корректировала ВЫСОТУ формы на уменьшение в соответствии с убранным титулом окна. Неудобно дизайнерить в конфигураторе.
Хотелка некритичная, но все же может если это реализуется легко (или сложно т.к. учитывать разное оформление тем в виндах?)?
Еще сталкиваюсь с таким?
Рисуешь формы для одного разрешения экрана.
И надо тот же код, но для форм с другим разрешением экрана.
Без извращений это не сделать или сделать топорно путем нскольких копий обработки под разные разрешения экрана.
Я уже подумывал чтобы как-то типа на лету gcomp'ом собирать обработку для нужного разрешения экрана...
Может можно как-то проще? (не знаю как)
.
Типа хотелось бы что-то типа возможность выгрузить описание формы в файл и при открытии обработки В ЗАВИСИМОСТИ ОТ параметров/разрешения экрана загрузить форму из файла..., то есть контекст остается, и меняется только визуальное отображение формы... как-то так типа...
.
И отсюда хочется (и пригодился бы в других местах) что-то типа
Сервис.ПолучитьРазрешениеЭкрана(Высота,Ширина,тутможетбытьпараметрыдляпанелизадачтипаположениеиразмер); где возвращается Высота и Ширина в пикесляхс учетом того что Экран - это может быть область терминального окна...
Забыл уже формекс. Подскажите, есть ли что-вроде ПриВыделенииСтрокиВТаблицеЗначений? То есть, событие, если просто стрелочками вверх-вниз по тз гляем?
Цитата: dedmoroz777 от 22 февраля 2024, 23:59Забыл уже формекс. Подскажите, есть ли что-вроде ПриВыделенииСтрокиВТаблицеЗначений? То есть, событие, если просто стрелочками вверх-вниз по тз гляем?
Нет, ничего подобного нет.
Цитата: Злоп от 21 февраля 2024, 21:50Еще сталкиваюсь с таким?
Рисуешь формы для одного разрешения экрана.
И надо тот же код, но для форм с другим разрешением экрана.
Без извращений это не сделать или сделать топорно путем нскольких копий обработки под разные разрешения экрана.
Я уже подумывал чтобы как-то типа на лету gcomp'ом собирать обработку для нужного разрешения экрана...
Может можно как-то проще? (не знаю как)
.
Типа хотелось бы что-то типа возможность выгрузить описание формы в файл и при открытии обработки В ЗАВИСИМОСТИ ОТ параметров/разрешения экрана загрузить форму из файла..., то есть контекст остается, и меняется только визуальное отображение формы... как-то так типа...
.
И отсюда хочется (и пригодился бы в других местах) что-то типа
Сервис.ПолучитьРазрешениеЭкрана(Высота,Ширина,тутможетбытьпараметрыдляпанелизадачтипаположениеиразмер); где возвращается Высота и Ширина в пикесляхс учетом того что Экран - это может быть область терминального окна...
Есть такая вот предопределенная процедура можно ее доработать под эти цели, чтобы грузилась не только из внутреннего объекта, но и из внешних обработок:
Процедура ПриЗагрузкеФормы(<?>) КонецПроцедуры
Синтаксис:
Процедура ПриЗагрузкеФормы(<ИмяОбъекта>)КонецПроцедуры
Назначение:
Предопределенная процедура вызывается при загрузке диалога формы.
Параметры:
<ИмяОбъекта> - (Строка) полный путь к объекту, для которого загружается форма
ЗАМЕЧАНИЕ:
В качестве параметра в процедуру передается полный путь к загружаемому объекту внутри md ( список всех форм можно получить с помощью метода СписокВсехФорм / AllFormsList ). Если внутри процедуры изменить значение параметра ИмяОбъекта, то загрузится диалог в соответствии с этим новым путем. Если новый путь задан неверно, то будет загружен тот диалог, который предполагался изначально
"Загрузится диалог" - это значит что загрузится только визуальная форма? а модуль останется от контекста инициировавшего такую загрузку или как?
Цитата: Злоп от 23 февраля 2024, 10:50"Загрузится диалог" - это значит что загрузится только визуальная форма? а модуль останется от контекста инициировавшего такую загрузку или как?
Да, это касается только диалога. Модуль останется тот же. Я так у себя делал как раз для загрузки разных форм для разных уровней прав.
Там только заморочки с атрибутами формы, которые к реквизитом объекта относятся.
Для загрузки модуля формы есть ПриЗагрузкеМодуляФормы().
Цитата: Злоп от 23 февраля 2024, 10:50"Загрузится диалог" - это значит что загрузится только визуальная форма? а модуль останется от контекста инициировавшего такую загрузку или как?
Смотри новую тестовую сборку.
Цитата: dedmoroz777 от 22 февраля 2024, 23:59Подскажите, есть ли что-вроде ПриВыделенииСтрокиВТаблицеЗначений?
Если локально, то через любую формулу любого текстового поля на форме (даже невидимого). Она выполняется при каждом движении курсора, следовательно, в этой формуле можно сделать любые действия.
А глобально действительно нет такого.
Цитата: Chai Nic от 23 февраля 2024, 21:26ПриВыделенииСтрокиВТаблицеЗначений?
.. можно даже кунштюком отловить изменение колонок ТЗ без изменения строки
ПриЗагрузкеФормыВнешнегоОтчета() - это Аналог ПриЗагрузкеФормы(), которая для объектов md?
каков порядок отработки процедур?
сначала ПриЗагрузкеВнешнегоОтчета();
потом ПриЗагрузкеФормыВнешнегоОтчета();
протом начинают отрабатывать локальные процедуры модуля внешнего отчета (с учетом возможного перенаправления, например, Глобальная_ПриОткрытии)
.
глобальная, например, ПослеСозданияФормы - не отрабатывает если ест локальная ПослеСозданияФормы
так?
Цитата: Злоп от 23 февраля 2024, 23:05каков порядок отработки процедур?
сначала ПриЗагрузкеВнешнегоОтчета();
потом ПриЗагрузкеФормыВнешнегоОтчета();
протом начинают отрабатывать локальные процедуры модуля внешнего отчета (с учетом возможного перенаправления, например, Глобальная_ПриОткрытии)
Да, вызываются в таком порядке.
Цитата: Злоп от 23 февраля 2024, 23:05глобальная, например, ПослеСозданияФормы - не отрабатывает если ест локальная ПослеСозданияФормы
так?
Отрабатывает. Сначала глобальная, потом локальная.
Цитата: Djelf от 21 февраля 2024, 14:25Так, ладно, раз хотелки так хотелки...
Процедура ПриЧтенииНастройки(<?>,) вызывается перед чтением Настройки, т.е. это по факту ПередЧтениемНастройки.
Иногда могут потребоваться некоторые изменения в сохраненных Настройках, но Настройки еще не загружены. Т.е. хочется событие ПослеЧтенияНастройки.
Вариантов костылей для исправления достаточно много, но это дополнительные переменные формы, не так чтобы сложно, но это утомительно и забывается как это работает по факту.
Зачем нужно?
Например баг с загрузкой сохраняемой тз на форму, если еще помните, то это "тз не загружается если фокус на тз"?
Мерд, старый винт унес код костылей с собой, но он не совсем умер, есть шанс восстановить...
Сейчас стал ковырять эту тему. Ни списки, ни таблицы в настройках не сохраняются. По-моему, нет смысла передавать в процедуру ПриЧтенииНастройки список настроек, как я предлагал ранее. Лучше, наверное, будет добавить в объект РасширениеФормы метод ЗагрузитьНастройки(ИмяНастройки). Тогда как раз можно будет реализовать что-то типа ПослеЧтенияНастройки как-то так:
Процедура ПриЧтенииНастройки(ИмяНастройки, ФСО)
РФ = СоздатьОбъект("РасширениеФормы");
// загружаем то, что сохранил движой 1С в штатном режиме
РФ.ЗагрузитьНастройки(ИмяНастройки);
//...тут реализация своих корректировок в настройках...//
ФСО = 0;
КонецПроцедуры // ПриЧтенииНастройки
Ну, и СохранитьНастройки(ИмяНастройки) для комплекта.
Как так списки и таблицы не сохраняются? Как бы иначе варианты стандартных отчетов работали?
Но глубоко копать эту тему действительно не стоит.
РФ.ЗагрузитьНастройки(ИмяНастройки); в сочетании с ФСО=0; закроет проблему.
Цитата: Djelf от 25 февраля 2024, 10:56Как так списки и таблицы не сохраняются? Как бы иначе варианты стандартных отчетов работали?
Может я что-то путаю. Мы у себя давно не используем стандартное сохранение. Сделал сейчас себе тестовую внешнюю обработку с таблицей значений и списком значений на форме. Сохранил, в файле сохраненных настроек только реквизиты простых типов:
RH1 {"@",{"Основная",{"НачДата","20240101"},{"КонДата","20240225"},{"ВыбКонтрагенты"," 4 "}}}
Так наскройки 1Cv7.CFG пишутся и он из-за этого распухает, а при достижении большого объема начинает тормозить и глючить.
Цитата: Djelf от 25 февраля 2024, 11:19Так наскройки 1Cv7.CFG пишутся и он из-за этого распухает, а при достижении большого объема начинает тормозить и глючить.
Это встроенные отчеты, наверное.
А, нет. в lst все таки. Вот кусок из внешнего отчета.
},
{""СписокЭлементов"",""СписокЭлементов"",""0"",""0"",""3"",{""U"",""0"",""0"",""0"",""0"",""0""},"""",""0"",
{
{""VL"",{{{""B"",""0"",""0"",""84"",""0"",""0"","" 7785 ""},""1Трехсосенский КЕГА НЕПР. КВАС Баварский 30л/кега б\а""},{{""B"",""0"",""0"",""84"",""0"",""0"","" 8002 ""},""1Трехсосенский КЕГА НЕПР. КВАС Бочковой Дуб и Обруч 30л""}}},
{""VL"",{}},
{""VL"",{}},
{""VL"",{}},
{""VL"",{}},
{""VL"",{}}
}
},
{""ТипМФ"",""ТипМФ"",""0"",""0"",""4"",{""U"",""0"",""0"",""0"",""0"",""0""},"""",""0"",
Цитата: Djelf от 25 февраля 2024, 11:35А, нет. в lst все таки. Вот кусок из внешнего отчета.
Это я дебил. Забыл поставить галку "Сохранять при сохранении настройки" в реквизитах таблицы и списка.
Цитата: Djelf от 25 февраля 2024, 10:56Но глубоко копать эту тему действительно не стоит.
РФ.ЗагрузитьНастройки(ИмяНастройки); в сочетании с ФСО=0; закроет проблему.
Смотри сегодняшнюю тестовую сборку.
Работает. От бага загрузки в СписокЭлементовМФ в стандартных формах не спасает, но хоть простые реквизиты можно подправить. Спасибо!
Цитата: Djelf от 25 февраля 2024, 13:38От бага загрузки в СписокЭлементовМФ
насколько я помню, там тупо лечится кодом.
Напомни, что за проблема, плиз.
Цитата: Злоп от 25 февраля 2024, 16:38Цитата: Djelf от 25 февраля 2024, 13:38От бага загрузки в СписокЭлементовМФ
насколько я помню, там тупо лечится кодом.
Напомни, что за проблема, плиз.
1. Открываем стандартную форму отчета 1С.
2. Во множественном фильтре (вторая закладка) добавляем/изменяем отбор .
3. Сохраняем настройки.
4. Удаляем один элемент отбора справа,
не сходя с позиции типа отбора (
левая часть Формы) пытаемся загрузить и получаем то же состояние отбора что и прежде.
5. Переводим позицию отбора
слева, на другой (пустой) список отбора, загружаем и у нас все прежде сохраненное наконец загрузилось.
Я кодом лечил, типа отложенной процедуры ПослеЗагрузкиНастроек, потом забил и объяснил как загружать, без бага.
ИМХО: Что-то там не так в доступе к реквизитам формы без ее обновления, при загрузке таких реквизитов.
Цитата: Djelf от 25 февраля 2024, 16:53Цитата: Злоп от 25 февраля 2024, 16:38Цитата: Djelf от 25 февраля 2024, 13:38От бага загрузки в СписокЭлементовМФ
насколько я помню, там тупо лечится кодом.
Напомни, что за проблема, плиз.
1. Открываем стандартную форму отчета 1С.
2. Во множественном фильтре (вторая закладка) добавляем/изменяем отбор .
3. Сохраняем настройки.
4. Удаляем один элемент отбора справа, не сходя с позиции типа отбора (левая часть Формы) пытаемся загрузить и получаем то же состояние отбора что и прежде.
5. Переводим позицию отбора слева, на другой (пустой) список отбора, загружаем и у нас все прежде сохраненное наконец загрузилось.
Я кодом лечил, типа отложенной процедуры ПослеЗагрузкиНастроек, потом забил и объяснил как загружать, без бага.
ИМХО: Что-то там не так в доступе к реквизитам формы без ее обновления, при загрузке таких реквизитов.
А сможешь сделать внешний отчет с демонстрацией этого глюка? Я бы посмотрел, раз пока с настройками ковыряюсь.
Использовать "ПоложениеКолонкиТаблицы" с МногострочнойЧастью
Цитата: АЛьФ от 25 февраля 2024, 17:40Цитата: Djelf от 25 февраля 2024, 16:53Цитата: Злоп от 25 февраля 2024, 16:38Цитата: Djelf от 25 февраля 2024, 13:38От бага загрузки в СписокЭлементовМФ
насколько я помню, там тупо лечится кодом.
Напомни, что за проблема, плиз.
1. Открываем стандартную форму отчета 1С.
2. Во множественном фильтре (вторая закладка) добавляем/изменяем отбор .
3. Сохраняем настройки.
4. Удаляем один элемент отбора справа, не сходя с позиции типа отбора (левая часть Формы) пытаемся загрузить и получаем то же состояние отбора что и прежде.
5. Переводим позицию отбора слева, на другой (пустой) список отбора, загружаем и у нас все прежде сохраненное наконец загрузилось.
Я кодом лечил, типа отложенной процедуры ПослеЗагрузкиНастроек, потом забил и объяснил как загружать, без бага.
ИМХО: Что-то там не так в доступе к реквизитам формы без ее обновления, при загрузке таких реквизитов.
А сможешь сделать внешний отчет с демонстрацией этого глюка? Я бы посмотрел, раз пока с настройками ковыряюсь.
Да у тебя же чистая ТиС наверняка есть, там должно проявлятся.
Цитата: Djelf от 25 февраля 2024, 16:534. ...получаем то же состояние отбора что и прежде.
- какое "что и прежде"? мы ожидаем увидеть список элементов обора ПОЛНЫЙ, а видим тот что с удаленным элементом?
А сможешь сделать внешний отчет с демонстрацией этого глюка? Я бы посмотрел, раз пока с настройками ковыряюсь.
Да у тебя же чистая ТиС наверняка есть, там должно проявлятся.
.
На списке элементов отбора никогда не стояло "сохранить настройки" (по крайней мере на 944 откуда скрин, да и потом вряд ли что-то правили разработчики по этому поводу), и было бы странно ожидать восстановления списка элементов МФ штатным сохранить/восстановит настройки...
.
(https://wdfiles.ru/plugins/imageviewer/site/thumb.php?s=28pL6)
.
Плюс к этому сброс перечня элементов текущего отбора в САМ ОТБОР (в ТЗ МФ) происходит при смене строк в ТЗ МФ или при переходе по закладкам отчета. Эту и еще какую-то фигню разбирали подробно на ИСе...
Смотреть мою статью (и читать комменты, там развитие и поправки) https://infostart.ru/1c/articles/13869/
и тут: https://infostart.ru/1c/tools/179431/
Хотелка77: хотелось бы типа
Сервис.ПолучитьСписокШрифтов()
чтобы возвращалось как-то список шрифтов (элемент списка - строка с именем шрифта?) и для каждого шрифта - список допустимых размеров шрифта как-то (например, в виде строки с разделителем "10,12,14")
.
Хотелка больше для отладочных целей, когда майстрячишь фейс - задалбывает править/перебирать в конфигураторе и перезапускать обработку для подбора
Цитата: Djelf от 25 февраля 2024, 21:21Да у тебя же чистая ТиС наверняка есть, там должно проявлятся.
Я уж и забыл когда последний раз типовую 7.7 видел...
Цитата: Злоп от 25 февраля 2024, 22:34и тут: https://infostart.ru/1c/tools/179431/
У меня стандартных отчетов тоже почти не осталось, и я не сильно исследовал этот вопрос...
Точно, глПриСменеСтрокиТаблицыМФ исправляет ситуацию.
Процедура ПриЧтенииНастройки(ИмяНастройки,ФСО)
РФ=СоздатьОбъект("РасширениеФормы");
РФ.ЗагрузитьНастройки(ИмяНастройки);
глПриСменеСтрокиТаблицыМФ( 1, 0, Контекст);
КонецПроцедуры
Ну я конечно редкостно ступил, совсем забыл, а может и не замечал никогда что ВводНового() выполняется при восстановлении настроек отчетов. Это ж надо было так извратиться, что за бредовое название...
Цитата: sau от 25 февраля 2024, 20:16Использовать "ПоложениеКолонкиТаблицы" с МногострочнойЧастью
Посмотрю.
Цитата: Djelf от 26 февраля 2024, 10:22ВводНового() выполняется при восстановлении настроек отчетов.
я вообще когда-то давно обнаружил это как-то чисто случайно, удивлен был сильно....
Ну, вы, блин, даете...
Процедура ВводНового()
КонецПроцедуры
Синтаксис:
ВводНового()
Назначение:
Предопределенная процедура при открытии формы отчета (обработки) и при восстановлении сохраненной настройки отчета (обработки).
Замечание:
Данная процедура может располагаться только в программных модулях отчета или обработки.
Интересно, оказывается есть еще Глобальная Процедура ПриЧтенииНастройки, в als этого нет.
Может стоит сделать отдельную тему - "Недописки и Очепятки в als"?
Так название идиотское: ВводНового(), ну ладно для Справочника или Документа, но какого *** это происходит при восстановлении настроки? Глаз вообще не зацеплялся, в мосх это не проникало...
Новая хотелка такая (поскольку появилось перенаправление процедур в ГМ):
АтрибутФормы = РасширениеФормы.ПолучитьАтрибут(Идентификатор);
Выдает исключение, если АтрибутаФормы нет, через исключение можно, но может вот так стоит дополнить?
АтрибутФормы = РасширениеФормы.ПолучитьАтрибут(Идентификатор,ВыводитьИсключение);
Где ВыводитьИсключение это не обязательное поле, по-умолчанию = 1 (для совместности), при 0 исключение не выдает (для удобства).
При отсутствии АтрибутаФормы видимо должно возвращать ПустоеЗначение().
P.S. Еще бы 1с++ научиться собирать и пошел бы новый виток эволюции...
Цитата: Djelf от 26 февраля 2024, 15:03Интересно, оказывается есть еще Глобальная Процедура ПриЧтенииНастройки, в als этого нет.
Может стоит сделать отдельную тему - "Недописки и Очепятки в als"?
Ну, темы ведь никому создавать не запрещено :)
Цитата: Djelf от 26 февраля 2024, 15:03АтрибутФормы = РасширениеФормы.ПолучитьАтрибут(Идентификатор);
Выдает исключение, если АтрибутаФормы нет, через исключение можно, но может вот так стоит дополнить?
АтрибутФормы = РасширениеФормы.ПолучитьАтрибут(Идентификатор,ВыводитьИсключение);
Где ВыводитьИсключение это не обязательное поле, по-умолчанию = 1 (для совместности), при 0 исключение не выдает (для удобства).
При отсутствии АтрибутаФормы видимо должно возвращать ПустоеЗначение().
Взял в работу.
Цитата: Djelf от 26 февраля 2024, 15:03P.S. Еще бы 1с++ научиться собирать и пошел бы новый виток эволюции...
Это надо трясти тех, кто этим занимался плотно компилированием исходников во времена оные. Может и получится восстановить. У меня так и не получилось настроить компиляцию.
1. Я бы предпочел тему от самого создателя ВК и форума (так будет правильнее).
2. Спасибо, это пригодится (такая хотелка 100% бы возникла через некоторое время).
3. Я Йоксель месяца 3 пытался собрать (я упоротый), без билд-машины все равно не собиралось (Олег билд-машину дал, за что ему низкий поклон).
Какая-то мелочь с 1с++ мешает, но вот какая это не понятно. Сдался...
Цитата: АЛьФ от 26 февраля 2024, 12:58Ну, вы, блин, даете...
- так я ж говорЮ. что не поню как обнаружил, может и чтением на ночь вместо Устава СИП... ;-)
Вообще если СП регулярно чиатть - способствует повышению квалификации...
А может можно незатратно сделать обход/исправление проблемы тупняка при сохранении мокселей штатным вариантом? ВК для этого есть (как минимум две), но если это можно впихнуть незатратно в формекс? если это не противоречит концепции формекса?
Цитата: Злоп от 26 февраля 2024, 17:38А может можно незатратно сделать обход/исправление проблемы тупняка при сохранении мокселей штатным вариантом? ВК для этого есть (как минимум две), но если это можно впихнуть незатратно в формекс? если это не противоречит концепции формекса?
Теоретически можно. Проблема известная и решение ее можно даже готовое стащить. Надо подумать.
Цитата: АЛьФ от 26 февраля 2024, 18:33Цитата: Злоп от 26 февраля 2024, 17:38А может можно незатратно сделать обход/исправление проблемы тупняка при сохранении мокселей штатным вариантом? ВК для этого есть (как минимум две), но если это можно впихнуть незатратно в формекс? если это не противоречит концепции формекса?
Теоретически можно. Проблема известная и решение ее можно даже готовое стащить. Надо подумать.
IMHO не стоит даже пытаться.
1. Патч Ромикса довольно грубый, он портит отображение в 1с (это он сам писал), можно завернуть установку/снятие патча памяти в НачалоСохраненияФайла/ОкончаниеСохраненияФайла, можно и так наверное...
P.S. Ошибка не там где он ее нашел, циклит выше по стеку вызовов, но как костыль это действительно работает.
2. Есть еще MxlBoost (https://www.1cpp.ru/forum/YaBB.pl?num=1215033727), работает корректнее, но исходников нет, декомпиляция даже Гидрой выводит какую-то чушь, а не вменяемый код. Обфускатор детектед.
Скорость сохранения значительно увеличивавется, но все равно она довольно медленная.
Надо копать глубже...
3. Йоксель справляется с этой задачей значительно быстрее.
И... У нас же есть FormEx! Если так сделать - замучаетесь не ждать пока файл сохранится.
Процедура ПриПолученииКомандыГлавнымОкном(wParam, lParam)
Перем Конт;
Если (wParam=57603) ИЛИ (wParam=123139) Тогда // 57603 иконка сохранить, 123139 ctrl+s
Если Сервис.АктивныйКонтекст(Конт)=1 Тогда
Если ТипЗначенияСтр(Конт)="Таблица" Тогда
СтатусВозврата(0);
ИмяФайла = "";
ИмяКаталога = ФС.ТекКаталог();
Заголовок = "Сохранить как";
Фильтр = "Microsoft Excel 97-2003 (*.xls)|*.xls";
Если ФС.ВыбратьФайл(1,ИмяФайла,ИмяКаталога,Заголовок,Фильтр)=1 Тогда
ПолноеИмяФайла = ИмяКаталога+ИмяФайла;
ТабличныйДокумент = СоздатьОбъект("ТабличныйДокумент");
ТабличныйДокумент.ЗагрузитьИзТаблицы(Конт);
ТабличныйДокумент.Записать(ПолноеИмяФайла,"xls");
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры //ПриПолученииКомандыГлавнымОкном
Цитата: Djelf от 28 февраля 2024, 14:131. Патч Ромикса довольно грубый, он портит отображение в 1с (это он сам писал), можно завернуть установку/снятие патча памяти в НачалоСохраненияФайла/ОкончаниеСохраненияФайла, можно и так наверное...
P.S. Ошибка не там где он ее нашел, циклит выше по стеку вызовов, но как костыль это действительно работает.
Это который MXL_DOCTOR? Не знал, что он портит отображение в 1С, а что конкретно портит?
Цитата: Djelf от 28 февраля 2024, 14:13Цитата: АЛьФ от 26 февраля 2024, 18:33Цитата: Злоп от 26 февраля 2024, 17:38А может можно незатратно сделать обход/исправление проблемы тупняка при сохранении мокселей штатным вариантом? ВК для этого есть (как минимум две), но если это можно впихнуть незатратно в формекс? если это не противоречит концепции формекса?
Теоретически можно. Проблема известная и решение ее можно даже готовое стащить. Надо подумать.
IMHO не стоит даже пытаться.
1. Патч Ромикса довольно грубый, он портит отображение в 1с (это он сам писал), можно завернуть установку/снятие патча памяти в НачалоСохраненияФайла/ОкончаниеСохраненияФайла, можно и так наверное...
P.S. Ошибка не там где он ее нашел, циклит выше по стеку вызовов, но как костыль это действительно работает.
2. Есть еще MxlBoost (https://www.1cpp.ru/forum/YaBB.pl?num=1215033727), работает корректнее, но исходников нет, декомпиляция даже Гидрой выводит какую-то чушь, а не вменяемый код. Обфускатор детектед.
Скорость сохранения значительно увеличивавется, но все равно она довольно медленная.
Надо копать глубже...
3. Йоксель справляется с этой задачей значительно быстрее.
И... У нас же есть FormEx! Если так сделать - замучаетесь не ждать пока файл сохранится.
Процедура ПриПолученииКомандыГлавнымОкном(wParam, lParam)
Перем Конт;
Если (wParam=57603) ИЛИ (wParam=123139) Тогда // 57603 иконка сохранить, 123139 ctrl+s
Если Сервис.АктивныйКонтекст(Конт)=1 Тогда
Если ТипЗначенияСтр(Конт)="Таблица" Тогда
СтатусВозврата(0);
ИмяФайла = "";
ИмяКаталога = ФС.ТекКаталог();
Заголовок = "Сохранить как";
Фильтр = "Microsoft Excel 97-2003 (*.xls)|*.xls";
Если ФС.ВыбратьФайл(1,ИмяФайла,ИмяКаталога,Заголовок,Фильтр)=1 Тогда
ПолноеИмяФайла = ИмяКаталога+ИмяФайла;
ТабличныйДокумент = СоздатьОбъект("ТабличныйДокумент");
ТабличныйДокумент.ЗагрузитьИзТаблицы(Конт);
ТабличныйДокумент.Записать(ПолноеИмяФайла,"xls");
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры //ПриПолученииКомандыГлавнымОкном
Этот код не будет работать при программном сохранении.
В принципе, можно попробовать добавить процедуру ПриЗаписиТаблицы(КонтекстТаблицы, ИмяФайла, ФорматФайла, ФлагСтандартнойОбработки).
Вроде как компромисс.
Цитата: АЛьФ от 28 февраля 2024, 15:17В принципе, можно попробовать добавить процедуру ПриЗаписиТаблицы(КонтекстТаблицы, ИмяФайла, ФорматФайла, ФлагСтандартнойОбработки).
Вроде как компромисс.
Событие ПриЗаписиТаблицы будет немного проще и понятнее, чем вылавливать событие по wParam
Поддерживаю.
Цитата: АЛьФ от 28 февраля 2024, 15:17У нас же есть FormEx!
я как-то где-то у кого-то спрашивал, но ввиду редкости использования теряю...
.
Процедура ПриПолученииКомандыГлавнымОкном(wParam, lParam)
.
wParam, lParam - как определить какие занчения чему соответствуют?
Цитата: Djelf от 28 февраля 2024, 15:27проще и понятнее,
Поддерживаю.
А это будет срабатывать при программной записи мокселя?
Цитата: Злоп от 25 февраля 2024, 22:58Сервис.ПолучитьСписокШрифтов()
еще это пригодилось бы весьма для автомасштабирания надписей на форме (все собираюсь допилить пример Альфа, он немного косячит при коротких надписях, когда получается крупноватый размер шрифта). Еще иногда ставиишь, например, шрифт 22 - а он в реальности смотришь показывает типа 21.5...
Цитата: Злоп от 28 февраля 2024, 16:16Цитата: АЛьФ от 28 февраля 2024, 15:17У нас же есть FormEx!
я как-то где-то у кого-то спрашивал, но ввиду редкости использования теряю...
.
Процедура ПриПолученииКомандыГлавнымОкном(wParam, lParam)
.
wParam, lParam - как определить какие занчения чему соответствуют?
Самое простое - определить эмпирическим путем возникает ли сообщение при нужном событии и какие параметры передаются.
Если мало в жизни веселья, то читай документацию WinAPI по поводу WM_COMMAND.
Цитата: Злоп от 28 февраля 2024, 16:17Цитата: Djelf от 28 февраля 2024, 15:27проще и понятнее,
Поддерживаю.
А это будет срабатывать при программной записи мокселя?
Должно.
Хотелка: хочется программно открывать диалог настроек принтера, с указанием имени принтера. Нужно для двустороннего принтера включать/выключать режим двусторонней печати.
В интерфейсе это диалог 'Параметры страницы', кнопочка 'Принтер' в правом нижнем углу.
Цитата: Злоп от 28 февраля 2024, 16:16я как-то где-то у кого-то спрашивал, но ввиду редкости использования теряю...
.
Процедура ПриПолученииКомандыГлавнымОкном(wParam, lParam)
.
wParam, lParam - как определить какие занчения чему соответствуют?
Я вот эмпирическим путем заколлекционировал:
//ОПИСАНИЕ КОДОВ КОМАНД:
//32785 - пометка удаления нажатием кнопки панели инструментов или в контекстном меню
//32786 - новый документ нажатием кнопки панели инструментов
//32790 - копирование документа в журнале из контекстного меню или из панели инструментов
//32854 - команда открытия списка пользователей из конфигуратора
//32875 - изменение времени документа в журнале из контекстного меню
//32865 - команда открытия окна формул
//32876 - меню "Подчиненные документы"
//32877 - ввод документа на основании нажатием кнопки панели инструментов
//32878 - отмена проведения документа в журнале из контекстного меню
//32880 - меню "Движения документа" (Document Movements)
//32886 - меню "История значений" для эл справочника или кнопка панели или контекстное меню
//32912 - окно Операции проводок документа
//32918 - окно проводок документа
//33731 - меню "Изменить период расчета"
//33733 - меню "пометка на удаление" в Журнале расчетов
//33747 - меню "Рассчитать документ"
//33748 - меню "Рассчитать объект"
//33749 - меню "Рассчитать запись"
//33827 - масштаб 125%
//57600 - команда "Новый документ" для открытия текстового окна или таблицы
//57601 - меню "Открыть файл..."
//57603 - Сохранение (напр. печатной формы)
//57664 - кнопка ? на стандартной панели. Или меню "Помощь/О программе..."
//57669 - кнопка Стрелка со знаком вопроса для принудительного вызова подсказки элемента
//57670 - нажата F1
//123170 - копирование в буфер обмена при нажатии Ctrl+C
//98321 - пометка удаления нажатием кнопки Del, или удаление строки в документе
//98322 - ввод нового нажатием Ins или ввод новой строки в документе
//98326 - нажата F9 - копирование документа в журнале или копирование строки в документе
//98413 - Alt+F9 - ввод документа на основании
//98422 - F5 - история значений реквизитов в справочнике. Нажатие кнопки в панели и пункт в меню с помощью Formex почему-то не перехватилось
//70226 - отмена ввода строки в документе?
//99298 - нажата F8 в журнале Операций = отключение проводок
Цитата: Djelf от 28 февраля 2024, 15:27Цитата: АЛьФ от 28 февраля 2024, 15:17В принципе, можно попробовать добавить процедуру ПриЗаписиТаблицы(КонтекстТаблицы, ИмяФайла, ФорматФайла, ФлагСтандартнойОбработки).
Вроде как компромисс.
Событие ПриЗаписиТаблицы будет немного проще и понятнее, чем вылавливать событие по wParam
Поддерживаю.
Взялся за реализацию. С ходу получилось перехватить событие "Сохранить как" (программное и интерактивное). Т.е. обычное сохранение в формате mxl в этот перехват не попадает.
Планирую оставить так. Или все же добить, чтобы и в mxl перехватывало?
Цитата: ADirks от 29 февраля 2024, 10:05Хотелка: хочется программно открывать диалог настроек принтера, с указанием имени принтера. Нужно для двустороннего принтера включать/выключать режим двусторонней печати.
В интерфейсе это диалог 'Параметры страницы', кнопочка 'Принтер' в правом нижнем углу.
Маленько непонятно что этот диалог должен принимать и возвращать. И как вообще его использовать.
Штатный метод Напечатать() показывает же этот диалог.
Сервис.ПолучитьСписокШрифтов() - тут все правильно выдает?
картинка (https://ibb.co/QQ6b1Cf)
Цитата: Злоп от 03 марта 2024, 15:16Сервис.ПолучитьСписокШрифтов() - тут все правильно выдает?
картинка (https://ibb.co/QQ6b1Cf)
Да, все верно. Это доступные наборы символов. Колонка charset.
Цитата: АЛьФ от 03 марта 2024, 15:24Колонка charset.
тогда бы уже колонку с символьным наименованием этого charset..?
информационно:
178, Charset_Arabic = 1256, арабский язык
186, Charset_Baltic = 1257, прибалтийские языки
136, Charset_ChineseBig5 = 950, китайский язык (традиционное письмо)
134, Charset_ChineseGB2312 = 936, китайский язык (упрощенное письмо)
238, Charset_EastEurope = 1250, Windows Latin 2
161, Charset_Greek = 1253, греческий язык
177, Charset_Hebrew = 1255, иврит
128, Charset_JapaneseShiftJIS = 932, японский язык
129, Charset_KoreanHangeul = 949, корейский язык
130, Charset_KoreanJohab = 1361, корейский язык
204, Charset_Russian = 1251, кириллица
222, Charset_Thai = 874, тайский язык
162, Charset_Turkish = 1254, турецкий язык
163, Charset_Vietnamese = 1258, вьетнамский язык
2, Charset_Symbol = 42, Symbol
0, Charset_ANSI = , Зависит от локализации Windows, для русской - 1251
77, Charset_MAC = , Зависит от локализации Windows, для русской - 10007
255, Charset_OEM = , Зависит от локализации Windows, для русской - 866
Цитата: Злоп от 03 марта 2024, 18:33Цитата: АЛьФ от 03 марта 2024, 15:24Колонка charset.
тогда бы уже колонку с символьным наименованием этого charset..?
Слишком объемно получается. И в любом случае, чтобы нормально использовать этот метод, надо будет лезть в описание функции WinAPI.
Цитата: АЛьФ от 03 марта 2024, 09:16Цитата: ADirks от 29 февраля 2024, 10:05Хотелка: хочется программно открывать диалог настроек принтера, с указанием имени принтера. Нужно для двустороннего принтера включать/выключать режим двусторонней печати.
В интерфейсе это диалог 'Параметры страницы', кнопочка 'Принтер' в правом нижнем углу.
Маленько непонятно что этот диалог должен принимать и возвращать. И как вообще его использовать.
Штатный метод Напечатать() показывает же этот диалог.
Команда должна принимать ИмяПринтера, и открывать виндовый диалог настроек печати для этого вот принтера.
Собственно, нашёл, что этот диалог можно открыть из командной строки
rundll32 printui.dll,PrintUIEntry /e /n "ИмяПринтера"
так что уже и не нужно, наверное
Можно ли перехватить нажатие на кнопке панели журнала? Конкретно "Новый документ". Чтобы перехватить, если журнал общий.
Цитата: sau от 06 марта 2024, 22:56Можно ли перехватить нажатие на кнопке панели журнала? Конкретно "Новый документ". Чтобы перехватить, если журнал общий.
Такая хотелка уже принята в работу: 156 (https://forum.dorex.pro/index.php?msg=156)
Чисто плюшкинская хотелка интерфейсная:
- можно ли сделать так, что в ТЗ (на форме), значение в ячейке отображалось не прилепленная к левой/правой границе ячейки, а с отступом(padding-left/padding-right) (в пикселях/символах/кактоиначе)..?
(https://cf.ppt-online.org/files/slide/5/5WKRhBbSOcwaJ3kXp0sz29fdTYENyVx1CIMHuD/slide-18.jpg)
Можно ли штатные чекбоксы сделать увеличенного размера, типа
РасшФормы.РазмерЧекбокса(ИдентификаторЧекбокса,РазмерЧекбокса)
где РазмерЧекбокса - типа множителя, где 1 - штатный, 2 - масштаб x2, 3 - масштаб х3
?
Тупой или не нашел:
Как получить текущий флаг раскраски таблиц?
Цитата: Злоп от 08 марта 2024, 00:13Чисто плюшкинская хотелка интерфейсная:
- можно ли сделать так, что в ТЗ (на форме), значение в ячейке отображалось не прилепленная к левой/правой границе ячейки, а с отступом(padding-left/padding-right) (в пикселях/символах/кактоиначе)..?
Можно добавить в виде макроса раскраски. Пойдет?
Цитата: Злоп от 08 марта 2024, 03:05Тупой или не нашел:
Как получить текущий флаг раскраски таблиц?
Предлагаю сделать, чтобы метод ВключитьРаскраскуТаблиц() возвращал текущее значение. Но тогда придется поменять его поведение. Сейчас без передачи параметра раскраска отключается. Будет без параметра только возвращать, без изменения.
Цитата: Злоп от 08 марта 2024, 02:10Можно ли штатные чекбоксы сделать увеличенного размера, типа
РасшФормы.РазмерЧекбокса(ИдентификаторЧекбокса,РазмерЧекбокса)
где РазмерЧекбокса - типа множителя, где 1 - штатный, 2 - масштаб x2, 3 - масштаб х3
?
Нет, не получится. Надо полностью брать на себя отрисовку и отработку контрола.
Цитата: АЛьФ от 08 марта 2024, 20:46ть в виде макроса раскраски. Пойдет?
это мастеру виднее как
я предполагал что это должно действовать на ТЗ в целом, но пойдет и в виде раскраски еслиэто проще/правильнее для изготовления
Цитата: АЛьФ от 08 марта 2024, 20:51Сейчас без передачи параметра раскраска отключается.
так в ВЛС есть метод вЫклчитьРаскраскуТаблиц... - он тогда зачем?
Цитата: Злоп от 08 марта 2024, 21:47Цитата: АЛьФ от 08 марта 2024, 20:51Сейчас без передачи параметра раскраска отключается.
так в ВЛС есть метод вЫклчитьРаскраскуТаблиц... - он тогда зачем?
Это я тупанул. В метод включения передается флаг частичной раскраски.
Добавлю получение состояния раскраски.
Хочется для ТЗ типа переопределить поведение
НоваяКолонка(<?>,,,,,,,);
Синтаксис:
НоваяКолонка(<Идентификатор>,<Тип>,<Длина>,<Точность>,<Заголовок>,<Ширина>,<Формат>,<Положение>,<Видимость>)
<Видимость> - необязательный параметр. Определяет видимость колонки при визуальном отображении ТЗ. Число: 0 - невидимая, 1 - видимая. По умолчанию - значение = 1 (видимая). После определения структуры ТЗ видимость колонок можно регулировать методом ВидимостьКолонки
Цитата: Злоп от 10 марта 2024, 03:02Хочется для ТЗ типа переопределить поведение
НоваяКолонка(<?>,,,,,,,);
Синтаксис:
НоваяКолонка(<Идентификатор>,<Тип>,<Длина>,<Точность>,<Заголовок>,<Ширина>,<Формат>,<Положение>,<Видимость>)
<Видимость> - необязательный параметр. Определяет видимость колонки при визуальном отображении ТЗ. Число: 0 - невидимая, 1 - видимая. По умолчанию - значение = 1 (видимая). После определения структуры ТЗ видимость колонок можно регулировать методом ВидимостьКолонки
Вообще это, конечно, для 1С++ работа, но раз уж искусство ее компилирования потеряно... Есть такая мысль: добавить метод переопределения типов по аналогии с классами 1С++. Например, так:
ПереопределитьТип("ТаблицаЗначений", КаталогИБ() + "ТЗ.ert");
После этого экспортные функции внешней обработки становятся методами объекта.
Пока не знаю получится ли.
Как чувствовал... Попробовал переопределить тип "ТаблицаЗначений", получил вылет при загрузке 1С++, если грузить FormEx первой и отсутствие подмены, если грузить после 1С++. Без нее все работает. Боюсь, что не получится эту задумку реализовать.
Цитата: АЛьФ от 10 марта 2024, 12:09Боюсь, что не получится эту задумку реализовать.
ну, это некритично совсем. Так, удобство
Цитата: АЛьФ от 08 марта 2024, 20:46Можно добавить в виде макроса раскраски.
Проверил PADDING - вроде работает, визуально (справа/слева) - так как хотелось, теперь можно упростить код с сохранением красоты.
.
Единственно напрягло - что работает только с планом раскраски, а в старом варианте не работает, неудобно..
Раньше писал я, например, для строки
ТЗ.Курсор = "BRUSH_S[0xCCCCCC]"
и потом где-нить
ТЗ.Курсор = ТЗ.Курсор+МаркерЗеленый; // для выделения разных строк по условию зеленым цветом шрифта и все...
А теперь при использовании плана раскраски (для задания стиля на всю строку) надо морочиться с закрывающей скобкой если в стиль добавить что-нибудь надо динамически....
.
Можно ли PADDING сделать и для старого варианта задания раскраски?
.
А использовать план раскраски (новый) выборочно только для конкретной ТЗ/формы - нельзя.., я так понял (повесил отдельную ветку с выборочной раскраской и там же и про выборочное использование плана раскраски)
Цитата: Злоп от 11 марта 2024, 00:17Цитата: АЛьФ от 08 марта 2024, 20:46Можно добавить в виде макроса раскраски.
Проверил PADDING - вроде работает, визуально (справа/слева) - так как хотелось, теперь можно упростить код с сохранением красоты.
.
Единственно напрягло - что работает только с планом раскраски, а в старом варианте не работает, неудобно..
Раньше писал я, например, для строки
ТЗ.Курсор = "BRUSH_S[0xCCCCCC]"
и потом где-нить
ТЗ.Курсор = ТЗ.Курсор+МаркерЗеленый; // для выделения разных строк по условию зеленым цветом шрифта и все...
А теперь при использовании плана раскраски (для задания стиля на всю строку) надо морочиться с закрывающей скобкой если в стиль добавить что-нибудь надо динамически....
.
Можно ли PADDING сделать и для старого варианта задания раскраски?
.
А использовать план раскраски (новый) выборочно только для конкретной ТЗ/формы - нельзя.., я так понял (повесил отдельную ветку с выборочной раскраской и там же и про выборочное использование плана раскраски)
Много думал... Пожалуй, выходом будет убрать в плане раскраски обязательность скобок. Переделаю, чтобы если макрос раскраски задан без скобок и включен план раскраски, то макрос действует на всю строку. При этом COUNT и INDENT будут игнорироваться. И если надо будет как-то сложно строку раскрашивать по ячейкам, то там уже придется использовать план раскраски со скобками.
Цитата: АЛьФ от 11 марта 2024, 08:59Переделаю, чтобы если макрос раскраски задан без скобок и включен план раскраски, то макрос действует на всю строку.
- это норм будет.
.
Возможно, более правильным будет вариант со скобками на всю строку как есть в плане раскраски сейчас, но и чтобы и без скобок на всю строку тоже работало как ты написал. Бо кто юзает план раскраски - придется переделывать возможно много..., например, ту же самую глСервис.ПланРаскраскиПоУмолчанию("(BRUSH_S[255])");
В то же время кто юзал старый вариант раскраски - план без скобок позволит перейти на план раскраски без исправлений существующего...
Цитата: Злоп от 11 марта 2024, 15:15Цитата: АЛьФ от 11 марта 2024, 08:59Переделаю, чтобы если макрос раскраски задан без скобок и включен план раскраски, то макрос действует на всю строку.
- это норм будет.
.
Возможно, более правильным будет вариант со скобками на всю строку как есть в плане раскраски сейчас, но и чтобы и без скобок на всю строку тоже работало как ты написал. Бо кто юзает план раскраски - придется переделывать возможно много..., например, ту же самую глСервис.ПланРаскраскиПоУмолчанию("(BRUSH_S[255])");
В то же время кто юзал старый вариант раскраски - план без скобок позволит перейти на план раскраски без исправлений существующего...
Скобки в плане раскраски показывают с какой колонки начинает действовать макрос и в какой колонке он меняется. Т.е. для плана раскраски макрос "(BRUSH[255])" аналогичен "BRUSH[255]" в первой колонке по старому способу раскраски.
Короче, ничего не поедет у того, кто использовал план раскраски.
И менять я буду только в части работы с планом раскраски. Старый я трогать не буду.
Предлагаю хотелки все же отдельными темами оформлять. Так будет проще их обсуждать до принятия в работу. Да и после можно будет по конкретному функционалу ошибки разбирать.
Цитата: АЛьФ от 11 марта 2024, 15:48Короче, ничего не поедет у того, кто использовал план раскраски.
И менять я буду только в части работы с планом раскраски. Старый я трогать не буду.
- проверил работу плана раскраски/старой раскраски на текущем релизе без скобок. Вроде все нормально работает, на старой раскраске паддинг не работает (как и было обозначено автором ранее), но ничему не мешает..
Можно ли получить событие изменения ширины колонки МногострочнойЧасти (ТаблицыЗначений)? Для реализации возможности сохранения пользовательских настроек.
Можно ли отследить нажатие мышью на заголовке колонки в МногосточнойЧасти (ТаблицеЗначений)?
Цитата: sau от 17 марта 2024, 00:59Можно ли получить событие изменения ширины колонки МногострочнойЧасти (ТаблицыЗначений)? Для реализации возможности сохранения пользовательских настроек.
Для этого не обязательно отслеживать именно изменение ширины, достаточно во время сохранения прочитать ширину.
Или я чего-то не понял.
Цитата: sau от 17 марта 2024, 01:25Можно ли отследить нажатие мышью на заголовке колонки в МногосточнойЧасти (ТаблицеЗначений)?
Если это про сохранение настроек табличной части, то опять же рекомендую посмотреть в сторону ТабличноПоле.
https://www.1cpp.ru/docum/icpp/html/TableField.html
Цитата: АЛьФ от 17 марта 2024, 09:38Цитата: sau от 17 марта 2024, 00:59Можно ли получить событие изменения ширины колонки МногострочнойЧасти (ТаблицыЗначений)? Для реализации возможности сохранения пользовательских настроек.
Для этого не обязательно отслеживать именно изменение ширины, достаточно во время сохранения прочитать ширину.
Или я чего-то не понял.
Ширина колонок "сбивается" (возвращается в первоначальное состояние) даже при простом переключении фокуса между формами. Зачем сохранять настройки, если они не менялись? Возможно (как вторичный эффект) сгенерируется событие, когда "сбивается" (возможно восстановить).
Цитата: АЛьФ от 17 марта 2024, 09:41Цитата: sau от 17 марта 2024, 01:25Можно ли отследить нажатие мышью на заголовке колонки в МногосточнойЧасти (ТаблицеЗначений)?
Если это про сохранение настроек табличной части, то опять же рекомендую посмотреть в сторону ТабличноПоле.
https://www.1cpp.ru/docum/icpp/html/TableField.html
Зачем ломать систему, нужен дополнительный механизм (элемент) управления существующими элементами управления. Заголовки в виде кнопок для этого подходят (та же сортировка, вошедшая "как стандарт"). Возможен вариант изменения порядка колонок, если придумать двузначную логику (например, стрелочки слева и справа). Ну и т.п.
По методу "ГотовностьПринтера". Очень не всегда дает информацию о возможности печати на принтер. Использую проверку на длину очереди (т.е. количество заданий, находящихся в очереди). Как правило (чеки, накладные) задание небольшие по времени выполнения, соответственно, если длина очереди более допустимого значения (например, 2-3), то последующая отправка на печать "подозрительна".
Цитата: sau от 17 марта 2024, 18:52Использую проверку на длину очереди
а длину очереди откуда берешь?
А для чего отслеживать жмак по заголовку таблицы? примерный сценарий использования?
Цитата: Злоп от 17 марта 2024, 18:58Цитата: sau от 17 марта 2024, 18:52Использую проверку на длину очереди
а длину очереди откуда берешь?
Через свою внешнюю компоненту. Код:
numJobs:=0;
PrinterName:=GetNParam(paParams,0);
PrinterToUse:=Printer.Printers.IndexOf(PrinterName);
if PrinterToUse>-1 then
begin
Printer.PrinterIndex:=PrinterToUse;
if OpenPrinter(PChar(PrinterName),hPrinter,nil) then
begin
try
EnumJobs(hPrinter,0,1000,1,nil,0,bytesNeeded,numJobs);
pJ:=AllocMem(bytesNeeded);
if not EnumJobs(hPrinter,0,1000,1, pJ, bytesNeeded,bytesNeeded, numJobs) then
RaiseLastWin32Error;
finally
ClosePrinter(hPrinter);
end;
end;
pVarRetValue:=numJobs;
end
else
pVarRetValue:='Принтер не найден';
Цитата: Злоп от 17 марта 2024, 18:59А для чего отслеживать жмак по заголовку таблицы? примерный сценарий использования?
"Заголовки в виде кнопок для этого подходят (та же сортировка, вошедшая "как стандарт"). Возможен вариант изменения порядка колонок, если придумать двузначную логику (например, стрелочки слева и справа). Ну и т.п."
Меню можно вызвать для операций по всей колонки. Впрочем, вроде такие интерфейсные решения уже почти стандарт.
ну, я сортировку ТЗ по колонкам делаю по грячей клавише, сортируется та колонка, на которой курсор. Порядок сортировки меняется на обратный.
Цитата: sau от 17 марта 2024, 18:52По методу "ГотовностьПринтера". Очень не всегда дает информацию о возможности печати на принтер. Использую проверку на длину очереди (т.е. количество заданий, находящихся в очереди). Как правило (чеки, накладные) задание небольшие по времени выполнения, соответственно, если длина очереди более допустимого значения (например, 2-3), то последующая отправка на печать "подозрительна".
Этот метод - это просто обертка над функцией EnumPrinters() из WinAPI. Тут я вряд ли что смогу исправить. Что винда возвращает, то и передаю.
Цитата: sau от 17 марта 2024, 18:35Цитата: АЛьФ от 17 марта 2024, 09:38Цитата: sau от 17 марта 2024, 00:59Можно ли получить событие изменения ширины колонки МногострочнойЧасти (ТаблицыЗначений)? Для реализации возможности сохранения пользовательских настроек.
Для этого не обязательно отслеживать именно изменение ширины, достаточно во время сохранения прочитать ширину.
Или я чего-то не понял.
Ширина колонок "сбивается" (возвращается в первоначальное состояние) даже при простом переключении фокуса между формами. Зачем сохранять настройки, если они не менялись? Возможно (как вторичный эффект) сгенерируется событие, когда "сбивается" (возможно восстановить).
А если просто отключить автоширину колонок?
Цитата: Злоп от 17 марта 2024, 20:05ну, я сортировку ТЗ по колонкам делаю по грячей клавише, сортируется та колонка, на которой курсор. Порядок сортировки меняется на обратный.
При чем тут это...
Цитата: АЛьФ от 17 марта 2024, 20:49Цитата: sau от 17 марта 2024, 18:52По методу "ГотовностьПринтера". Очень не всегда дает информацию о возможности печати на принтер. Использую проверку на длину очереди (т.е. количество заданий, находящихся в очереди). Как правило (чеки, накладные) задание небольшие по времени выполнения, соответственно, если длина очереди более допустимого значения (например, 2-3), то последующая отправка на печать "подозрительна".
Этот метод - это просто обертка над функцией EnumPrinters() из WinAPI. Тут я вряд ли что смогу исправить. Что винда возвращает, то и передаю.
Вопрос не в исправлении, а в добавлении новой (другой) функции ДлинаОчередиПечати
Цитата: АЛьФ от 17 марта 2024, 20:49Цитата: sau от 17 марта 2024, 18:35Цитата: АЛьФ от 17 марта 2024, 09:38Цитата: sau от 17 марта 2024, 00:59Можно ли получить событие изменения ширины колонки МногострочнойЧасти (ТаблицыЗначений)? Для реализации возможности сохранения пользовательских настроек.
Для этого не обязательно отслеживать именно изменение ширины, достаточно во время сохранения прочитать ширину.
Или я чего-то не понял.
Ширина колонок "сбивается" (возвращается в первоначальное состояние) даже при простом переключении фокуса между формами. Зачем сохранять настройки, если они не менялись? Возможно (как вторичный эффект) сгенерируется событие, когда "сбивается" (возможно восстановить).
А если просто отключить автоширину колонок?
Отключена обязательно.
Т.е. если изменить ширину колонки (мышью), а затем переключиться на любое другое другое окно (дочернее в 1С) и вернуться обратно, то восстанавливается ширина заданная в конфигураторе.
Цитата: sau от 17 марта 2024, 21:37При чем тут это...
это к жмакам по заголовкам колонок. для чего жмакать по заголовкам колонок?
Цитата: sau от 17 марта 2024, 21:40Вопрос не в исправлении, а в добавлении новой (другой) функции ДлинаОчередиПечати
Ок.
В FormEx можно динамически создавать любой controls?
Хотелка в возможности динамически создавать диалоговые формы.
Цитата: Forum123 от 18 марта 2024, 11:58В FormEx можно динамически создавать любой controls?
Хотелка в возможности динамически создавать диалоговые формы.
Есть метод РасширениеФормы::ДобавитьАтрибут()
Вот тут старая тема с обсуждением его работы: https://www.1cpp.ru/forum/YaBB.pl?num=1178269183
Цитата: sau от 17 марта 2024, 01:25Можно ли отследить нажатие мышью на заголовке колонки в МногосточнойЧасти (ТаблицеЗначений)?
Вот как я делал:
ИмяМнЧ="МногострочнаяЧасть";
Если АнглоЯзычныйИнтерфейс=1 Тогда ИмяМнЧ="Multycolumn"; КонецЕсли; //+Al 2019-12-20 11:10:24 Для не русской винды нужно вместо МногострочнаяЧасть использовать Multycolumn, иначе координаты не возвращает
Атр=ФормаРасш.ПолучитьАтрибутПоКоординатам(_X,_Y);
Если ПустоеЗначение(Атр) = 0 Тогда
Если Атр.Идентификатор = "МногострочнаяЧасть" Тогда
СообщитьВОтладке("Попали в МногострочнаяЧасть");
Об=ФормаРасш.ПолучитьАтрибут(ИмяМнЧ);
СообщитьВОтладке("Получили атрибут");
СимволВниз=" v";СимволВверх=" ^"; //СимволВниз=" \/";СимволВверх=" /\";
в="";л="";Ш="";Вы="";Об.ПолучитьКоординаты(Л,В,Ш,Вы);
ВысотаШапки=15;
Если (_Y>В)и(_Y<В+ВысотаШапки)и(_X<(Л+Ш-20)) Тогда // Попали в Шапку (учитывая высоту шапки и не учитываю левый скрол-бар)
СообщитьВОтладке("Попали в шапку");
Если ТипКонтекста="Журнал" Тогда ФлСО=1;Перейти ~Выход;КонецЕсли;
Курсор=65539; //Стрелка
//65539 -> NORMAL;65541 -> INSERT;65543 -> WAIT;65545 -> CROSS;65547 -> UP;65549 -> RESIZE_NW_SE;65551 -> RESIZE_NE_SW;65553 -> RESIZE_EW;65555 -> RESIZE_NS;65557 -> MOVE;65559 -> NOT_ALLOWED;65561 -> PROGRESS;
//65563 -> HELP
//Установить курсор можно через Сервис.УстановитьКурсор();
Попытка Враппер = СоздатьОбъект("DynamicWrapperX");Враппер.Register("USER32.DLL","GetCursor","r=l");Курсор = Враппер.GetCursor(); //Определяем тип курсора
Исключение
КонецПопытки;
Если (Курсор<>65539)и(Курсор<>65541) Тогда СообщитьВОтладке("Код курсора :: "+Курсор);ФлСО=1;Перейти ~Выход;КонецЕсли;
ФормаРасш.УстановитьТекущуюЯчейку(ИмяМнЧ,_X,_Y+ВысотаШапки);
АктЭлемент = КФ.АктивныйЭлемент();
ТекЗаголовок=КФ.ПолучитьАтрибут(АктЭлемент).Заголовок();
НапрСортировки=?(Найти(ТекЗаголовок,СимволВниз)<>0,"-","+");
Если ТипКонтекста="Документ" Тогда Конт.СортироватьСтроки(НапрСортировки+АктЭлемент);СообщитьВОтладке("Отсортировали по полю "+НапрСортировки+АктЭлемент);
ИначеЕсли ТипКонтекста="Справочник" Тогда Конт.Сортировка(АктЭлемент);СимволВверх=СимволВниз;
КонецЕсли;
Таким образом реализована возможность сортировки таблицы по клику левой кнопки в шапке, а по правой - выбор видимости колонок справочника/журнала/табличной части документа
Высота шапки (заголовки ТЗ/многострочной) - получается разной в зависимости от назначенного шрифта...
я тупо проще делал: клал куда-нить кнопку "сортировка" и все. а видимость колонок - это у меня везде где есть ТЧ почти всегда лежит отдельная кнопка с диалогом настройки/сохранения видимости колонок.
То, что я привёл - это выдержка из глобальных перехватов ПриНажатииЛевойКнопки/ПриНажатииПравойКнопки. Т.о. это распространяется на любые перечисленные выше формы.
Цитата: alyuev от 18 марта 2024, 14:30Цитата: sau от 17 марта 2024, 01:25Можно ли отследить нажатие мышью на заголовке колонки в МногосточнойЧасти (ТаблицеЗначений)?
Вот как я делал:
ИмяМнЧ="МногострочнаяЧасть";
Если АнглоЯзычныйИнтерфейс=1 Тогда ИмяМнЧ="Multycolumn"; КонецЕсли; //+Al 2019-12-20 11:10:24 Для не русской винды нужно вместо МногострочнаяЧасть использовать Multycolumn, иначе координаты не возвращает
Атр=ФормаРасш.ПолучитьАтрибутПоКоординатам(_X,_Y);
Если ПустоеЗначение(Атр) = 0 Тогда
Если Атр.Идентификатор = "МногострочнаяЧасть" Тогда
СообщитьВОтладке("Попали в МногострочнаяЧасть");
Об=ФормаРасш.ПолучитьАтрибут(ИмяМнЧ);
СообщитьВОтладке("Получили атрибут");
СимволВниз=" v";СимволВверх=" ^"; //СимволВниз=" \/";СимволВверх=" /\";
в="";л="";Ш="";Вы="";Об.ПолучитьКоординаты(Л,В,Ш,Вы);
ВысотаШапки=15;
Если (_Y>В)и(_Y<В+ВысотаШапки)и(_X<(Л+Ш-20)) Тогда // Попали в Шапку (учитывая высоту шапки и не учитываю левый скрол-бар)
СообщитьВОтладке("Попали в шапку");
Если ТипКонтекста="Журнал" Тогда ФлСО=1;Перейти ~Выход;КонецЕсли;
Курсор=65539; //Стрелка
//65539 -> NORMAL;65541 -> INSERT;65543 -> WAIT;65545 -> CROSS;65547 -> UP;65549 -> RESIZE_NW_SE;65551 -> RESIZE_NE_SW;65553 -> RESIZE_EW;65555 -> RESIZE_NS;65557 -> MOVE;65559 -> NOT_ALLOWED;65561 -> PROGRESS;
//65563 -> HELP
//Установить курсор можно через Сервис.УстановитьКурсор();
Попытка Враппер = СоздатьОбъект("DynamicWrapperX");Враппер.Register("USER32.DLL","GetCursor","r=l");Курсор = Враппер.GetCursor(); //Определяем тип курсора
Исключение
КонецПопытки;
Если (Курсор<>65539)и(Курсор<>65541) Тогда СообщитьВОтладке("Код курсора :: "+Курсор);ФлСО=1;Перейти ~Выход;КонецЕсли;
ФормаРасш.УстановитьТекущуюЯчейку(ИмяМнЧ,_X,_Y+ВысотаШапки);
АктЭлемент = КФ.АктивныйЭлемент();
ТекЗаголовок=КФ.ПолучитьАтрибут(АктЭлемент).Заголовок();
НапрСортировки=?(Найти(ТекЗаголовок,СимволВниз)<>0,"-","+");
Если ТипКонтекста="Документ" Тогда Конт.СортироватьСтроки(НапрСортировки+АктЭлемент);СообщитьВОтладке("Отсортировали по полю "+НапрСортировки+АктЭлемент);
ИначеЕсли ТипКонтекста="Справочник" Тогда Конт.Сортировка(АктЭлемент);СимволВверх=СимволВниз;
КонецЕсли;
Таким образом реализована возможность сортировки таблицы по клику левой кнопки в шапке, а по правой - выбор видимости колонок справочника/журнала/табличной части документа
Набросал с определением высота шапки (с учетом шрифта, многострочности):
Атр=РасширениеФормы.ПолучитьАтрибутПоКоординатам(КоординатаПоГоризонтали,КоординатаПоВертикали);
Если ПустоеЗначение(Атр)=0 Тогда
Если Атр.Идентификатор="МногострочнаяЧасть" Тогда
В=0; ВВ=0; ВВВ=0; Н=0;
Атр.ПолучитьКоординаты(,ВВВ,,);
РасширениеФормы.ПолучитьКоординатыЯчейки("МногострочнаяЧасть",1,1,В,,Н,,0);
РасширениеФормы.ПолучитьКоординатыЯчейки("МногострочнаяЧасть",2,1,ВВ,,,,0);
ШиринаРамки=ВВ-Н+1;
Если (КоординатаПоВертикали<В) и (КоординатаПоВертикали>ВВВ+ШиринаРамки+1) Тогда
ФСО=0;
ВысотаШапки=В-ВВВ+1;
РасширениеФормы.ПолучитьКоординатыТекущейЯчейки("МногострочнаяЧасть",В,,Н,,0);
РасширениеФормы.УстановитьТекущуюЯчейку("МногострочнаяЧасть",КоординатаПоГоризонтали,В+1);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Но это все равно "игра ума". Не учитывается, что первая колонка может быть не видна и т.п.
Но появились хотелки "КоличествоКолонок" и "ИмяКолонкиПоНомеру"
Цитата: sau от 18 марта 2024, 23:11Но появились хотелки "КоличествоКолонок" и "ИмяКолонкиПоНомеру"
тогда уже и ИменаКолонок() - возвращает СЗ/ТЗ с перечнем имен (идентификаторов колонок) в виде "идентификатор колонки" и "заголовок колонки". Учесть что и имя колонки и заголовок колонки могут быть пустой строкой (и в ИмяКолонкиПоНомеру тоже, возвращать имя, а в параметре - заголовок)
Интересный проект https://github.com/Kr00l/VBCCR VB Common Controls Replacement Library (Replacement of the MS common controls)
Цитата: Forum123 от 19 марта 2024, 20:09Интересный проект https://github.com/Kr00l/VBCCR VB Common Controls Replacement Library (Replacement of the MS common controls)
К сожалению, у Крола не все контролы корректно создаются через 1с++, вроде по коду все верно, но по факту не создаются и падают. Некоторые зависят от операционки.
Использовать можно, но проверять на проде стоит очень тщательно.
По следам https://forum.mista.ru/topic/889103#32 - зарегил c:\Windows\SysWOW64\VBCCR17.OCX. Создание объектов происходит:
ОбъектImageListCtrl = СоздатьОбъект("VBCCR17.ImageList");
Сообщить(ТипЗначенияСтр(ОбъектImageListCtrl)); // ==> OLE._ImageList
ЭлементУправления = СоздатьОбъект("VBCCR17.ToolBar");
Сообщить(ТипЗначенияСтр(ЭлементУправления)); // ==> OLE._ToolBar
Но при этом обращение к ЭлементУправления.ImageList - вызывает ошибку:
Incorrect variable type
Цитата: alyuev от 20 марта 2024, 13:05Но при этом обращение к ЭлементУправления.ImageList - вызывает ошибку:
Incorrect variable type
Для использования сторонних ActiveX в 1С иногда требуется создание binding, учитывающий работу 1С с OLE.
Contols интересные.
Допилить бы их для 1С 7.7.
Цитата: alyuev от 20 марта 2024, 13:05VBCCR17
Тестовая обработка, где скриншот был, из той темы на мисте, что ты указал: https://cloud.mail.ru/public/PPfh/2LmTcjF3E
Не зашло. Вроде работает, но не так как хотелось, на WXP больше контролов работают, на W10 меньше, учить язык на котором это создано нет никакого желания и ни времени. А без этого видимо полностью "не взлетит", частично да, это работает...
Надо скинутся на https://codejock.com и всяких костылей будет меньше.
P.S. Было дело, как то на нем сделал интерфейс клюшек как в msoffice, прикольно вышло.
Исходников не осталось.
Ясно. Спасибо.
"Обновлена тестовая сборка.
Теперь свойство Значение объекта АтрибутФормы для дерева папок возвращает текущее значение."
Как раз делал настройку видимости дерева... "Видимость" устанавливается, а вот чтение это свойства всегда пустое.
Интересно установить значение для дерева. Хотя применения пока сразу не вижу.
Цитата: sau от 24 марта 2024, 16:38Интересно установить значение для дерева. Хотя применения пока сразу не вижу.
Установку я не делал, только чтение.
Иногда в документах в табличной части нужна дата и время.
В 1С 7.7 как известно дата не содержит данных о времени.
Как решаете это вопрос?
Может быть есть какая ВК?
Начал разработку API для использования в 1С 7.7 переменной типа дата, содержащая также данные о времени, но немного текучка не позволяет разработать API а-ля как в 1С 8.x.
Вообщем то ничего сложного в разработке такого API нет.
Может быть уже кто-то решил этот вопрос?
Можно этот вопрос решить добавлением в глобальник 1С функций, но лучше бы ВК или ActiveX.
Цитата: Forum123 от 25 марта 2024, 09:57Иногда в документах в табличной части нужна дата и время.
В 1С 7.7 как известно дата не содержит данных о времени.
Как решаете это вопрос?
Может быть есть какая ВК?
Начал разработку API для использования в 1С 7.7 переменной типа дата, содержащая также данные о времени, но немного текучка не позволяет разработать API а-ля как в 1С 8.x.
Вообщем то ничего сложного в разработке такого API нет.
Может быть уже кто-то решил этот вопрос?
Можно этот вопрос решить добавлением в глобальник 1С функций, но лучше бы ВК или ActiveX.
В 1С не записанный документ не имеет времени, а время записанного документа хранится в поле DATE_TIME_IDDOC. Из языка время записанного документа можно получить методом:
ПолучитьВремя(<?>,,)
Синтаксис:
ПолучитьВремя(<Часы>,<Минуты>,<Секунды>)
Назначение:
Прочитать время документа. Возвращает время документа в переданные для этого переменные <Часы>, <Минуты>, <Секунды>.
Возвращает:
Строковое значение времени записи документа в виде 'ЧЧ.ММ.СС'.
Параметры:
<Часы> - переменная для приема часа записи документа;
<Минуты> - переменная для приема минут записи документа;
<Секунды> - переменная для приема секунд записи документа.
Замечание:
Метод можно использовать только для объектов, созданных функцией СоздатьОбъект
Цитата: АЛьФ от 25 марта 2024, 10:33ПолучитьВремя
Спасибо!
Эти функции, как получить/установить время создания документа, ... использую.
В предыдущем посте нужно было говорить не о документе, а например о справочнике.
Реквизит с типом Дата не содержит времени, а бывают конфигурации в которых нужна именно дата, содержащая время.
Пока знаю только один способ как в справочник добавить поле, содержащее дату и время.
Это обычное числовое поле, содержащее юлианскую дату с временем.
Конечно для работы с такой датой нужно разработать API типа а-ля 1С 8x.
Может быть кто нибудь уже разрабатывал такое API или можно как-то иначе решить этот вопрос?
Смотря что с этим полем дата-время делать предполагается...
Цитата: Злоп от 25 марта 2024, 11:44Смотря что с этим полем дата-время делать предполагается...
Чтобы всё было как в 1С 8-x.
Ныне в if приходиться использовать несколько строк в том случае если нужен анализ не только значения даты, но и времени.
Удобней было бы как в 1С 8-x.
Вполне реально реализовать.
Что бы так было (скрин из 7.7)? Тогда ActiveX VBCCR17 (https://www.vbforums.com/showthread.php?841929-VB6-ActiveX-CommonControls-(Replacement-of-the-MS-common-controls))
Прикольнее даже чем на 8ке, колесико цифры уменьшает и увеличивает.
Формат строки смотреть тут (https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.datetimepicker.customformat?view=windowsdesktop-8.0).
(https://i.gyazo.com/283a91b6bbd321396db145e75390b094.png)
Ну и размер календаря чтобы можно было регулировать, а то задалбываешься по всяким мелким элементам целиться...
Встроенный калькулятор, который по педальке числового реквизита вызывается - если на реквизит назначить увеличенный шрифт - то калькулятор тоже получается увеличенный.
Цитата: Forum123 от 25 марта 2024, 10:46...
Реквизит с типом Дата не содержит времени, а бывают конфигурации в которых нужна именно дата, содержащая время.
Пока знаю только один способ как в справочник добавить поле, содержащее дату и время.
Это обычное числовое поле, содержащее юлианскую дату с временем.
Конечно для работы с такой датой нужно разработать API типа а-ля 1С 8x.
Может быть кто нибудь уже разрабатывал такое API или можно как-то иначе решить этот вопрос?
Можно на форме эмулировать строкой с маской "99.99.9999 99:99:99", к атрибуту привязать Сервис.ПоказатьКалендарь(), написать форматирование строки при вводе на предмет корректности даты и времени, и сохранять в реквизиты как уже требует задача, по отдельности дату и время, либо числом/строкой ГГГГММДДЧЧММСС, либо другим скалярным значением.
Лично мне такое не приходилось делать, отдельно работаю с полем Время, а сохраняю пару как число, для индексации и прочего.
Ой, это же хотелки для Альф.
Нужно другой тред создать в "Дружественные проекты".
Добрый день. Подскажите толи не работает толи что-то не то делаю - РасширениеФормы-ДобавитьАтрибут. Нужен листбокс(поле со списком). Делаю ДобавитьАтрибут("Ид1",14). Выходит двойное поле совсем не похожее на листбокс. Версии пробовал разные. А также непонятно как его заполнять из СЗ.
Что за "двойное поле"?
Если один атрибут делать - смысл его извращениями делать? Сделай невидимым и делай видимым когда надо (или на отдельный слой положи)
В том то и дело что их количество динамическое.
В ДобавитьАтрибут очень много чего не доделано, установка стиля после создания Атрибута не всегда приводит к превращению одного типа Атрибута в другой, иногда это возможно, но не в этом случае.
Заполнение это просто...
Список=АтрибутФормы.Значение;
Список.ДобавитьЗначение("Раз");
Список.ДобавитьЗначение("Два")
С клавы вверх/вниз выбирается, но это не то что нужно.
Забей на это. Сделай на резервном слое 10-20 таких атрибутов и вытаскивай их в случае необходимости. Либо перепиши на табличное поле.
Цитата: Djelf от 28 февраля 2024, 14:13Йоксель справляется с этой задачей значительно быстрее.
Это да, проверил МоксельБуст и Йоксель на отчете по партиям ТиС (~10тыс строк), МоксельБуст ~14-16сек, Йоксель - практически мгновенно - моргнул и готово...
Когда-то давно (21 мая 2019) был разговор с вами - о ошибке (цитирую вас)
"Проблема явно с тем, что открывается модальное окно из другого модального. И перехват мыши почему-то сбоит в этом случае. Там сильно перерабатывался перехват мыши и не мною. Попробую разобраться в чем проблема, но только несколько позже."
Раз уж заговорили про хотелки ))))
Если модальное окно открыто из модального - там ещё проблемы с обработкой внешнего события, например сканирования - оно не ловится, проваливается на родительский уровень
Что-то я так и не уяснил для себя: возможно ли как-то организовать неразвёрнутым одно из дочерних окон MDI при развёрнутых остальных? Имитировать разворот окна путём установки ему максимальных размеров это не вариант.
Сомневаюсь
Цитата: Arbuz от 26 июня 2024, 15:52Что-то я так и не уяснил для себя: возможно ли как-то организовать неразвёрнутым одно из дочерних окон MDI при развёрнутых остальных? Имитировать разворот окна путём установки ему максимальных размеров это не вариант.
Невозможно. Только если делать полностью свой тип окна.