Клиентский алгоритм изменения операции
Алгоритм служит для обработки события изменения операции в таблице операций журнала. Ссылка на алгоритм задается в менеджере настроек отображения.
Параметры алгоритма:
ВЫЧИСЛИТЬ(ПЕРЕМ ОПЕР_КОНТЕКСТ: контекст; ПЕРЕМ <ТИП>: оп; ПЕРЕМ МОДИФ_ПАРАМ: мп; ПЕРЕМ ПУБЛ_ПАРАМ: публ; ПЕРЕМ СТРОКА: рез) // ... КОНЕЦ
- контекст - входной параметр. Имя журнала + имя режима настроек.
- оп - входной параметр. Добавляемая операция. Вместо идентификатора <ТИП> задается: для типовых операций - имя типа операции, одного из родительских типов или ОПЕРАЦИЯ, для ручных операций - ОПЕРАЦИЯ, для операций исходного остатка - ОСТАТОК.
- мп - входной параметр. Параметр типа МОДИФ_ПАРАМ позволяет реализовать механизм сквозной передачи параметров между клиентским и серверными алгоритмами модификации. Серверный алгоритм может изменить полученные параметры, соответственно, следующему алгоритму будет передаваться изменный набор параметров. Тип МОДИФ_ПАРАМ включает в себя набор параметров и правила их передачи. То есть помимо параметров можно указать пути их передачи: логические поля "до", "после" и "возврат" задают условия передачи параметров серверным алгоритмам ДО_ИЗМЕНЕНИЯ и ПОСЛЕ_ИЗМЕНЕНИЯ и условие передачи параметров обратно в клиентский метод. Если передача параметров запрещена - в алгоритм передается пустой контейнер параметров (пустая переменная типа АЛГ_ПАРАМ).
- публ - выходной параметр. Параметр типа ПУБЛ_ПАРАМ позволяет реализовать механизм публикации измененной операции. Публикация может включать печать необходимых документов, посылку почты и др. Алгоритм заполняет параметры публикации. Значение поля "публикация" определяет будет ли вызван алгоритм печати. В алгоритм печати передаются необходимые параметры публикации в виде поля "парам" типа АЛГ_ПАРАМ.
- рез - выходной параметр. Результат выполнения алгоритма.
- OK - возвращается в случае успешного выполнения алгоритма
- CANCEL - возвращается в случае ошибки
- CONTINUE - возвращается в случае, если по завершении работы алгоритма запускается стандартный диалог
Коды навигации NEXT, PREV, FIRST, LAST возвращаются при активации редактирования следующей, предыдущей, первой и последней операции в списке с сохранением изменений в текущей операции. Если редактирование операции невозможно или в списке операции больше нет операций, то коды NEXT и PREV эквивалентны коду OK.
Основные коды возврата и коды навигации можно сочетать между собой, например OK,NEXT возвращается при успешном выполнении алгоритма редактирования операции , после чего происходит переход на следующую операцию в выборке или CONTINUE,PREV возвращается в случае запуска стандартного диалога редактирования операции, а затем происходит перемещение на предыдущую операцию в в выборке. Если код навигации указан без основного кода, например NEXT, то указанный код соответствует коду CANCEL,NEXT. При сочетании кода навигации и кода возврата порядок указания неважен.
Существует код возврата CLOSE, который возвращается при закрытии родительского диалога, из которого был вызван диалог редактирования, и самого диалога редактирования. Данный код возврата имеет более высокий приоритет, чем у кодов навигации, то есть он подавляет команды NEXT, PREV, FIRST, LAST.
Пример
Пример иллюстрирует использование алгоритма редактирования операции. В ходе работы алгоритма происходит вызов диалогового окна для изменения значений признаков и параметров проводки. В качетсве признаков операции выступают номер накладной и признак, указывающий на то, оплачена ли накладная, а параметрами проводки являются в дебете и кредите - коды выбранных организаций, в единицах - код валюты, в количестве - сумма проводки.
В настройке отображения в узле "Изменение" для нужного типа операции задается алгоритм редактирования операции.
ТИП ДобОпер(ДИАЛОГ)
[
РАДИОГРУППА: Радиогруппа1 = [
левый = 215,
верхний = 75,
ширина = 70,
высота = 65,
табиндекс = 2,
элементы = ( "ДА", "НЕТ" ) ];
ТЕКСТ: Текст2 = [
левый = 30,
верхний = 80,
ширина = 165,
высота = 25,
текст = "Оплата товара произведена" ];
ВВОД_ЦЕЛОГО: Ввод_целого1 = [
левый = 145,
верхний = 40,
ширина = 150,
высота = 20,
табиндекс = 1 ];
ТЕКСТ: Текст1 = [
левый = 30,
верхний = 45,
ширина = 100,
высота = 20,
текст = "номер накладной" ];
КНОПКА: Кнопка2 = [
левый = 240,
верхний = 345,
ширина = 85,
высота = 30,
табиндекс = 4,
текст = "Отмена",
нажатие = {наж_отмена} ];
КНОПКА: Кнопка1 = [
левый = 135,
верхний = 345,
ширина = 85,
высота = 30,
табиндекс = 3,
текст = "OK",
нажатие = {наж_ок} ];
ВВОД_КОДА: Ввод_кода3 = [
левый = 230,
верхний = 280,
ширина = 110,
высота = 20,
табиндекс = 8 ];
ТЕКСТ: Текст6 = [
левый = 40,
верхний = 280,
ширина = 80,
высота = 15,
текст = "Единицы" ];
ВВОД_ЧИСЛА: Ввод_числа1 = [
левый = 230,
верхний = 240,
ширина = 115,
высота = 20,
табиндекс = 7 ];
ТЕКСТ: Текст5 = [
левый = 35,
верхний = 245,
ширина = 105,
высота = 15,
текст = "Сумма операции" ];
ВВОД_КОДА: Ввод_кода2 = [
левый = 230,
верхний = 195,
ширина = 115,
высота = 20,
табиндекс = 6 ];
ВВОД_КОДА: Ввод_кода1 = [
левый = 235,
верхний = 160,
ширина = 110,
высота = 20,
табиндекс = 5 ];
ТЕКСТ: Текст4 = [
левый = 35,
верхний = 200,
ширина = 180,
высота = 15,
текст = "Код организации покупателя" ];
ТЕКСТ: Текст3 = [
левый = 35,
верхний = 165,
ширина = 180,
высота = 15,
текст = "Код организации продавца" ];
ФУНКЦИЯ наж_ок(ПЕРЕМ КНОПКА: кнопка)
ЗАКРЫТЬ("OK")
КОНЕЦ_ФУНКЦИИ
ФУНКЦИЯ наж_отмена(ПЕРЕМ КНОПКА: кнопка)
ЗАКРЫТЬ("")
КОНЕЦ_ФУНКЦИИ
]
ВЫЧИСЛИТЬ(ПЕРЕМ ОПЕР_КОНТЕКСТ: контекст; // вход
ПЕРЕМ ОПЕРАЦИЯ: оп; // вход/выход
ПЕРЕМ МОДИФ_ПАРАМ: мп; // вход/выход
ПЕРЕМ ПУБЛ_ПАРАМ: публ; // вход/выход
ПЕРЕМ СТРОКА: рез) // вход/выход
// OK - CANCEL - CONTINUE
ПЕРЕМ ДобОпер: длг
ПЕРЕМ ПРОВОДКА: пров
длг.Ввод_целого1.значение = оп.признаки["номер_накл"].значение
ЕСЛИ оп.признаки["оплачена"].значение = ДА ТО
длг.Радиогруппа1.выбор = 1
ИНАЧЕ
длг.Радиогруппа1.выбор = 2
КОНЕЦ_ЕСЛИ
длг.Ввод_кода2.текст = оп.проводки[1].дебет.код
длг.Ввод_кода1.текст = оп.проводки[1].кредит.код
длг.Ввод_кода3.текст = оп.проводки[1].единицы.код
длг.Ввод_числа1.значение = оп.проводки[1].количество
ЕСЛИ длг.ПОКАЗАТЬ_МОДАЛЬНЫЙ = "OK" ТО
оп.комментарий = "Данные накладной"
оп.признаки["номер_накл"].значение = длг.Ввод_целого1.значение
ПЕРЕМ элемент = СТР(длг.Радиогруппа1.выбор)
ВЫБОР(элемент)
#"1":
оп.признаки["оплачена"].значение = ДА
рез = "OK"
#"2":
оп.признаки["оплачена"].значение = НЕТ
рез = "OK"
КОНЕЦ_ВЫБОРА
пров.дебет.код = длг.Ввод_кода2.текст
пров.кредит.код = длг.Ввод_кода1.текст
пров.единицы.код = длг.Ввод_кода3.текст
пров.количество = длг.Ввод_числа1.значение
оп.проводки[1] = пров
ИНАЧЕ
рез = "CANCEL"
КОНЕЦ_ЕСЛИ
КОНЕЦ