Стоит глобальная задача: с помощью дизайнера (!) изменить абстрактный стандартный интерфейс следующим образом:
1. добавить свою вьюху
2. модифицировать стандартную глобальную вьюху интерфейса
3. добавить собственную таблицу в словарь и в интерфейс
4. попытаться заюзать в обработчиках элементов интерфейса (окно, панель, скрин, брауз) стандартные переменные, определенные разработчиком
5. попытаться вытащить на визуальный элемент интерфейса (окно, брауз, скрин) свои элементы, значения которым самостоятельно буду присваивать
6. попытаться реализовать обработчик данных собственных элементов
Эксперименты провожу на интерфейсе L_Basedoc::VSchet (Основания на продажу)
Ниже буду публиковать, стараясь следовать вышеописанному плану, результаты: что получилось, что не получилось, по ходу будут также свои выкладки кода, вопросы и рассуждения.
К сожалению, не имею возможности прикреплять скрины, посему буду описывать подробно текстом
Соответственно, кто уже юзал, кому интересно - присоединяйтесь к обсуждению.
ИТАК
локализуем задачу:
Допустим,
Необходимо персонализировать ДО на продажу по продавцам-консультантам (выпиской занимается оператор, занимающий галактическую лицензию, а данные по продажам к нему попадают, ну например в устной или письменной форме от N продавцов: пока некий продавец "Дядя Вася" работает непосредственно с клиентом, оператор оформляет док-ты для продавца "дядя Вася").
В дальнейшем, данная персонализация будет, к примеру, будет нужна для оценки работы продавцов с помощью неких аналитических отчетов
Рассуждения на тему "как это можно сделать"
Предварительные рассуждения по хотелками и возможным ограничениям.
Код: Выделить всё
Нужна сущность, где хранились бы продавцы - сотрудники компании.
При этом не хотелось бы использовать
- лицевые счета,
- кадровские карточки сотрудников
Связано с тем, что
Пришлось бы использовать стандартные интерфейсы выбора сотрудников, а следовательно:
- из них можно посмотреть что-то лишнее, а оператору этого нельзя,
- они отжирают зарплатно-кадровские лицензии.
Свой интерфейс выбора писать лениво, да и с точки зрения постановки задачи - дополнительный напряг при дальнейшем сопровождении.
ПОСЕМУ - нужно заюзать стандартные возможности Галактики.
При переборе вариантов остановился на простом решении:
Использую внешнюю классификацию. Этим я убиваю нескольких зайцев:
1. Юзаю стандартные free-интерфейсы, которые и так доступны из стандартного интерфейса ДО
2. Имею возможность сделать иерархию продавцов. Например с группировкой по отделам/филиалам
1. Открываю консоль управления (естественно - текущая система galnet).
2. В интерфейсах нахожу реализацию интерфейса L_Basedoc::VSchetObj и раскрываю его.
3. Затем последовательно перехожу по цепочке VSchetObj->Vschet_Release-VSchet
4. Для объекта Vschet запускаю Мастер докомпиляции (Alt+W)
5. В открывшемся окне перехожу на закладку "Логические таблицы"
6. Создаю логическую таблицу (F7) и задаю ей имя, например vExtClassDoc. Жму Enter. Попадаю в окно логической таблицы
7. Имею 3 закладки Конструктор, Фильтры и SQL. Перехожу на последнюю закладку (ручками мне проще запрос написать - несколько раз пробовал с помощью конструктора строить связи - в итоге сам исходник запроса не в нужном порядке строился).
реализую такую вьюху:
Код: Выделить всё
create view vExtClassDoc
var
cCurDoc : comp; //ссылка на текущий ДО
as
select
*
from
exclassval, // значение классификатора
exclassseg, // название классификатора
exclassseg parseg // ссылка на родителя связанного с ДО классификатора
Where
((
cCurDoc == exclassval.crec and // ссылка на значение
word(КОД)== exclassval.classcode and //КОД - код заведенного классификатора
exclassval.cclassseg == exclassseg.nrec and // ссылка на название
exclassseg.cgroup == parseg.nrec // ссылка на вышестоящий уровень
))
;
8. сохраняю (Alt+S) и компилирую (Alt+C)
9. закрываю окно и перехожу на закладку Обработчики
10. для начала попытаюсь просто протестить - корректно ли работает моя вьюха или нет.
Для этого пробую на cmInit окна WVSCHETZ повешать выдачу мессаг:
Код: Выделить всё
vExtClassDoc.cCurDoc:=Basedoc.NRec;
If vExtClassDoc.GetFirst ExClassVal = tsOk then
{
If vExtClassDoc.GetFirst ExClassSeg = tsOk then
{
If vExtClassDoc.ExClassSeg.cGroup <> 0 then
{
If vExtClassDoc.GetFirst ParSeg = tsOk
Message (vExtClassDoc.ParSeg.Name+ ' - '+vExtClassDoc.ExClassSeg.Name);
}
Else Message (vExtClassDoc.ExClassSeg.Name);
}
Else Message ('Прикладная ошибка - Нет ссылки на сегмент (нарушение целостности данных)');
}
Else Message ('Нет ссылки на продавца');
12. Выхожу из Саппорта, беру ресурсник подкладываю в Галку, запускаю и смотрю.
Все работает ОК.
По сути тест прошел корректно.
Теперь, что НЕ ПОЛУЧИЛОСЬ:
1. В моей логической таблице я так и не смог обратиться к переменным, уже объявленным в стандартном интерфейсе (даже к глобальному параметру BASENREC)
2. Не смог добавить на объект scVSсhet (экран редактирования текущего ДО) никакой своей текстовой переменной, в которую пихал текстовое значение, выводимое в мессаге (код выше).
3. В окне конфигуратора (вызываемом при настройке визуальных элементов) не нашел ни своих переменных, ни логической таблицы. Даже после перезахода в Саппорт, когда мой интерфейс подхватился. Естественно, не смог также в этом окне создать вычисляемого поля, которое брало бы значения из моей логической таблицы.