Сетевая на 25 рабочих мест. Контроль изменения хозяйственных операций

пользователь
Регистрация: 26.02.2006

Здравствуйте!

ИБ 8 ОРН, сетевая версия 25 рабочих мест. Инфо-сервера нет

Возникла очень острая необходимость в фиксации того, с какого рабочего места идет изменение уже существующей операции. Подчеркну - именно уже имеющейся. Т.е. в журнале есть операция, её открыли, сделали с ней какие-либо действия (например, что-то поменяли в проводках), нажали ОК.

Нет необходимости фиксировать, что именно поменяли, достаточен факт изменения и рабочее место, с какого именно это сделано.

Как вариант, обычный текстовый файл, в который при изменении операции каждый раз добавляется новая строчка к примеру:

Дата_изменения время_изменения Рабочее_место Дата_операции Название_операции

Чтобы файл не раздувался, каждый месяц приходится создавать новый. Можно, конечно, и в табличку какую-то писать. Единственно, возникает вопрос совместного доступа, если в один момент два разных пользователя изменят две операции, и соответственно, нужно будет обработать два события.

Это мысли вслух. Может кто-то сможет посоветовать другой функционал для решения указанной задачи?

пользователь
Регистрация: 26.02.2006

Хм.. Уважаемые модераторы, вы немного исказили оригинальное сообщение. Функционала такого нет, я прошу помощи, идеи, в его реализации. А из двух последних абзацев следует, что он уже есть, но нужен другой.

модератор
Регистрация: 06.09.2007

Здравствуйте!

Я вижу два пути для решения такой задачи. Причем возможности для таких решений появились в совсем недавних версиях 8.894 и 8.896.

  1. Использование обработчика "Изменение операции". Недостаток: вызывается только при показе стандартного диалога редактирования операции. Для надежной записи log-файла в папке сетевой базы есть новая возможность функции ОТЛАДКА:
    ОТЛАДКА(<<["my.log"] "Здесь любое сообщение").
  2. Включение параметра [Trace] NetBase=1 в файле IB.INI. В сетевой версии все модифицирующие SQL-запросы платформы будут записываться в файл netbase.log в папке базы. Далее надо сделать утилиту (на языке ИБ, питоне и т.д.), которая будет анализировать строки этого лога и собирать информацию об изменении операций. Т.е. нужны запросы UPDATE HOZOP..., INSERT INTO PROVOD..., UPDATE PROVOD..., DELETE FROM PROVOD...
    Операция идентифицируется по полю OPER_NUMB.
    SELECT * FROM HOZOP WHERE OPER_NUMB=... позволит узнать дату, содержание и т.п.

Ротацию логов при достижении некоторого размера надо делать самостоятельно.

Для надежного выполнения действий в многопользовательской среде можно воспользоваться файловой блокировкой отдельного файла. Для этого в платформу был добавлен метод ПОПЫТКА_ОТКРЫТЬ для объекта ТИП_ФАЙЛ. В справке есть примеры. При проверке размера захватываем блокировку на чтение, а при выполнении ротации - на запись.

пользователь
Регистрация: 26.02.2006

Здравствуйте! Спасибо за ответ!

Срабатывание обработчика при стандартном диалоге меня вполне устроит (на данный момент).

При использовании обработчика каким образом в функцию передается номер открытой хозяйственной операции? Я же должен по этому номеру затем получить интересующую меня информацию?

По поводу логов идея такая: создать отдельную папку в папке базы. Логи создавать с именем ГГГГММ.log Вычищать потом вручную что не нужно.

дилер
Регистрация: 01.12.2005
  1. Пользователь хочет редактировать операцию.
    При установке обработчика не показывается диалоговое окно редактирования операции, а вызывается функция следующего вида:

    ФУНКЦИЯ ТИП_ЛОГИКА: <имя> (ТИП_ЧИСЛО: номер)
    где номер – номер выбранной операции в текущем фильтре (если фильтр действует на отчеты) или абсолютный номер (если не действует).

Есть у меня обработчик на удаление счёта

ФУНКЦИЯ АОБР_УД_СЧЕТ(ТИП_СТРОКА:счет)//Обработка удаления счёта
  ИСПОЛЬЗОВАТЬ("ZP\ZP_STR")
  ЕСЛИ СУЩ_ФАЙЛ(табДанныеСотр) ТО
    Т=SQL_ЗАПРОС("SELECT * FROM '"+табДанныеСотр+"' WHERE CODE='"+счет+"'")
    всего=Т.ВСЕГО
    Т.ЗАКРЫТЬ
    ЕСЛИ всего>0 ТО
      ЕСЛИ ВОПРОС("Для этого счёта есть данные в блоке зарплата. Удалить данные в зарплате") ТО
        М_УД_СЧЕТ(счет)
      КОНЕЦ_ЕСЛИ
    КОНЕЦ_ЕСЛИ
  КОНЕЦ_ЕСЛИ
КОНЕЦ_ФУНКЦИИ

Там счёт подставляется.

Кстати, делал для пользователей управление доступом к бланкам. Могу прислать, а можете скачать с обновлением Модуса modus.ru. Как и где находится покажу +79255074282

пользователь
Регистрация: 26.02.2006

Евгений, здравствуйте!

Итак, человек открывает операцию на редактирование. Срабатывает обработчик:

ФУНКЦИЯ ТИП_ЛОГИКА: ИзменениеОпер (ТИП_ЧИСЛО: номер)

//записать в лог-файл какую операцию менял пользователь

КОНЕЦ_ФУНКЦИИ

Этот самый номер система сама определит? Или каким образом я определю операцию, с каким номером он открыл? Фильтра нет, будем считать, что он открыл рандомную операцию в журнале из 15000 операций.

пользователь
Регистрация: 26.02.2006

Посмотрите, пожалуйста, скриншот. Программа не видит функцию в окне подключения обработчика.

ФУНКЦИЯ ТИП_ЛОГИКА: ИзменениеОпер (ТИП_ЧИСЛО: номер)

имяф=СТР(ГОД(ДАТА_ТЕК))+СТР(МЕС(ДАТА_ТЕК)+".log"

строк=СТР(ДАТА_ТЕК)+" "+СТР(ВРЕМЯ_ТЕК)+" "+СТР(РАБ_МЕСТО)+" "+СТР(ОПЕР_ДАТА(номер)+" "+ОПЕР_СОД(номер,1)

ОТЛАДКА(<<[имяф]строк)

ИзменениеОпер=ДА
КОНЕЦ_ФУНКЦИИ

Вложения
функция.jpg292.57 КБ
дилер
Регистрация: 01.12.2005

Думаю, что это нюансы исполнения.

Например, в выборе функции входа, тоже нельзя выбрать функцию Init из библиотеки APP?!

дилер
Регистрация: 01.12.2005

Нюансов куча и маленькая тележка.

Из одной и той же библиотеки выбираются разные функции.

Для диалога редактирования операции

для изменения операции

Очень любопытно, что скажет "начальник транспортного цеха"?