Вы здесь

Главная

Сообщение об ошибке

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls в функции menu_set_active_trail() (строка 2405 в файле /home/o/oeugeny/spb4plus.ru/public_html/includes/menu.inc).

Плагин для БЭСТ-4+ с нуля

Версия для печатиPDF-версия

Может и правильнее называть такие решения - пользовательскими функциями или программами. Но понятие "плагин" уже закрепилось за программами такого рода.
В 1С такие решения носят название - "Внешняя обработка 1С".
Но в отличии от 1С в БЭСТ-4+ пользовательские функции написаны на языке xHarbour и позволяют без существенных изменений использовать программы, написанные еще на Клиппере.
Смена версий программы и обновление модулей тоже нисколько не влияют на работу функций.
Плюс, для написания, компиляции и запуска плагина нет необходимости просить пользователей выходить из программы.
Разберем на примере конкретной ситуации процесс создания плагина для решения определенной задачи.

Итак, собственно сама ситуация:
Для передачи сведений о доходах можно использовать отчет из групповых справок (Выходные формы / Справки по шаблонам / Групповые справки). При заполнении параметра для отбора обрабатываемых данных, критерий отбора выбираем - "отмеченные".
Для сдачи сведений за 2006 год нам следует предварительно отметить всех кто работал в том году. Т.е. у кого дата увольнения находится между 01/01/06 и 31/12/06, либо пока еще пуста. Для этого в картотеке сотрудников идем по реестру и отмечаем галочкой сверяясь с условием, благо дата увольнения пишется в подвале картотеки.

Все просто, если в картотеке 1-2 десятка записей, а если более 500 работников?

Итак, задача - Найти решение, позволяющее в автоматическом режиме помечать сотрудников, которые работали в 2006 году.

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

Для экспериментов, разворачиваем стандартную демонстрационную базу БЭСТ-4+. Отсутствие расчетов зарплаты за 2006 в данном случае нам не мешает, т.к. по сведениям в картотеке сотрудники "все еще работают" и логически числятся на предприятии, но для проверки результата мы все же "увольняем" пару сотрудников:

000013 Тарелкин И.А. - 30/11/05
000014 Сталонов А.М. - 30/11/06

Теперь нам предстоит определить - что происходит при отметке записи "галочкой". (Механизм пометки записей рассмотрен на одном из уроков на форуме www.bestnet.ru и также содержится в "Cправочнике пользователя БЭСТ-4+")

Нам предстоит искать поле типа Logical, для этого отмечаем одну из записей и находясь на ней, входим в отладочный режим (alt-ins). Так как текущая таблица установлена CARDSPRI.dbf логично предположить, что поле находится в ней.

Открываем таблицу, и пролистываем все поля текущей записи стрелкой вправо до того момента пока не встретим в столбце характерные для поля значения F или T и описание типа поля в заголовке. Таких полей в таблице всего 2, следовательно можно предположить, что одно из них то что мы ищем.
 

И на самом деле, в поле CHECK только одна отмеченная запись, текущая, имеет значение .T.

Чтобы проверить наше предположение - откроем таблицу в BROplus по указанному в отладчике пути и поменяем значение в этом поле и этой записи на .F. Отметка будет снята.

То же самое можно сделать не выходя из БЭСТа, через "Сервисные функции / Описание структуры DBF" в "Настройке предприятия". Находим раздел SALARY таблицу CARDSPRI и входим в режим просмотра структуры TAB. Видим, что поле CHECK - "Признак выбора сотрудников". То что надо.

Чтобы внести изменения в таблицу, открываем FieldWin через комбинацию клавиш ALT-T.

Теперь необходимо определиться с условием, по которому следует проставлять отметки. Как следует из описания структуры, поле DISMDATE содержит дату увольнения, осталось задать условие. И здесь нам может помочь режим отладчика.

Входим в картотеку сотрудников и задаем фильтр по дате увольнения от 01/01/06 до 31/12/06. (Для этого нам и требовалось "уволить" пару человек разными датами).

Входим в отладочный режим (Alt-Ins).

Установлен индекс с условием, полное значение которого можно увидеть в перечне открытых индексов (ALt-I).

ИМЯ:MY_FILTER(АКТИВНЫЙ)
КЛЮЧ:UPPER(TNUM)
УСЛОВИЕ:(EMPTY(NOSHOW)).AND.((DISMDATE>=CTOD("01/01/06").AND.DISMDATE<=CTOD("31/12/06")))

NOSHOW - "Флаг исключения из расчетов".

Точно! Чуть не забыли. В картотеке есть возможность исключить запись из "видимости" программы. Скорей всего, для записей позапрошлых лет. Включаем эти записи через "Меню операций" по Alt-F10.

Одну часть условия определили, описание функции CTOD() можно найти в справочнике.

Как правильно задать условие для тех, кто еще не уволен, поможет определить опять же режим отладки, через расчетные параметры. Как? Показано на снимке окна программы:
 

Сводим в одно условие:

(DISMDATE>=CTOD("01/01/06").AND.DISMDATE<=CTOD("31/12/06")) .OR. (DISMDATE==CTOD(''))

Замена значения полей в Клиппере осуществляется командой REPLACE. Через поиск в справочнике по слову "Замена" можно ознакомиться с синтаксисом команды.

Команда автоматической отметки записей работников по 2006 году примет вид:

replace check WITH .T. FOR (dismdate>CTOD('01/01/2006') .AND. dismdate<=CTOD('31/12/2006')) .OR. dismdate=CTOD('')

Отлично, теперь можно запустить BROPlus и выбрать команду Replace и записать без ошибок строку условия.

Но для частого использования будет удобнее оформить эту процедуру в виде плагина.
Для этого следует:

· Из реестра лицевых счетов войти в реестр Специальных функций.
· Открыть режим - Среда программирования ( F11 ).
· Создать новый файл - alt-N, к примеру u_otmetka.prg (всегда начинайте с U).
· Написать текст программы, приведенный ниже. Пояснения даны в комментариях.

FUNCTION select2006()

// сохраняем окружение

DBPUSH()

//открываем базу, на случай вызова не из реестра лицевых счетов

IF !(NETUSE("u_cardspri",LOADPATH()+'salary\cardspri.dbf'))

//Выход на случай ошибки

RETURN

ENDIF

//блокируем таблицу

u_cardspri->(FLock())

// т.к. replace обрабатывает все записи таблицы по условию, цикл не нужен

// сбрасываем все отметки

Replace check WITH .F. FOR .T.

// устанавливаем отметки по условию

Replace check WITH .T. ;

FOR (dismdate>CTOD('01/01/2006') .AND. dismdate<=CTOD('31/12/2006'));

.OR. dismdate=CTOD('')

// снимаем блокировку

u_cardspri->(DBUNLOCK())

// закрываем таблицу

u_cardspri->(DBCLOSEAREA())

// возвращаемся в прежнюю область

DBPOP()

RETURN


Компилируем, сохраняем,

Добавляем в реестре строку вызова созданной программы.

Тестируем и проверяем результат.

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
CAPTCHA на основе изображений
Введите символы, которые показаны на картинке.