Каким образом из консольного приложения можно определить перечень зарегистрированных в БЭСТ-5 баз данных?
Т.е. необходимо из консольной утилиты получить пути к установленным БД.
Возможно, кому-то пригодится.
Выкладываю таблицу с географическими координатами на каждый почтовый индекс.
Можно использовать, например, для отчетности по распределению объемов выручки по территории РФ с привязкой к гугл-картам.
Отлично грузится в QlikView.
В инструментарии к 4+ была возможность написания программ, запускаемых через батники, проще говоря exe-шники.
Есть ли аналогичный способ запуска программного кода в БЭСТ-5 ?
Требуется для ночного запуска процедуры по обработке данных без участия оператора.
В сп24 появилась возможность привязки файлов к номенклатуре.
Как один из вариантов применения - просмотр изображений при работе с каталогом (справочником).
Этот момент приятно порадовал, причем просмотрщик закрывается, когда курсор уходит с просмотренной детали.
в просмотрщике. Использую xnView.
При нажатии alt-Y открывается картинка на весь экран.
Можно ли как-то задать размер экрана и местоположение, чтобы БЭСТовское окно оставалось доступным.
Или какой просмотрщик можете посоветовать?
Лента новостей сайта Компании БЭСТ в формате RSS доступна по адресу http://www.bestnet.ru/rss-news.php Способ размещения на своих сайтах зависит от используемого движка (набора скриптов, шаблонов).
Браузеры поддерживают без проблем.
12 июня на территории поля «Красный пахарь» прогремит салют международного музыкального фестиваля «Рок Над Волгой»! Среди участников фестиваля – Легенда хард-рока, британская группа Deep Purple, легенды российского рока «Машина Времени», «Алиса», «Чайф», Кипелов, Вячеслав Бутусов и «Юпитер», «Аквариум», а так же «Сплин», «Король и Шут», Пелагея.
БЭСТОВЦЫ, я давно уже говорил что если проводить аналогию между ПО и музстилями, то мы явные рокеры .
Кто-нибудь планирует посетить фестиваль в этом году? В прошлом году это был отличный праздник.
Задача: Две базы в БЭСТ-5. Допустим, номенклатурные справочники идентичны.
Учет ведется по партиям. Необходимо в базе данных - приемнике программно создать накладную, сделать записи в справочник партий. В виду сложности и опасности самостоятельно прямой записи в базы данных, хотелось бы понять, как это можно сделать с помощью объектов БЭСТ-5?
Задача: Сформировать отчет для анализа продаж по:
фактическим срокам исполнения заказов;
по группам товара заказанного, отгруженного;
по продукции;
по покупателям;
........
прочим аналитическим признакам партнеров, групп продукции, продукции.
Решение:
Подобные задачи часто возникают на предприятиях. Для решения задачи возможно формирование отдельного отчета для каждого пункта требований.
Но более удобным способом для анализа, будет формирование массива необходимых данных и их анализ средствами офисных приложений.
А именно - режима сводных таблиц MS Office Excel или OpenOffice.Org Calc.
Задача решается в несколько этапов:
Определение структуры данных, содержащей необходимые сведения для анализа.
Выгрузка в таблицу сведений по заказам (выписанным счетам);
Выгрузка в таблицу сведений по отгрузкам;
Экспорт таблицы в офисное приложение (по выбору - OpenOffice.org Calc или MS Office Excel);
Формирование сводной таблицы по необходимым критериям.
Рассмотрим подробнее (текст программы приведен не полностью):
Этап 1. Определение структуры данных для анализа
Набор данных для анализа определяется на каждом предприятии индивидуально, исходя из используемой схемы ведения товарного и аналитического учета. Для примера будет достаточно следующего набора данных:
Документы в БЭСТ-5
Сведения
Заказы (счета)
Дата выписки, Дата отгрузки, Номер документа, Корсчет, Контрагент (тип, код, наименование), товар (код круппы, наименование группы, код товара, наименование), количество, цена, сумма
Накладная на отгрузку
Дата выписки,Номер документа, Корсчет, Контрагент (тип, код, наименование), товар (код круппы, наименование группы, код товара, наименование), количество, цена, сумма
Исходя из сведений (тип, размерность поля) полученых в описании таблиц, определяем итоговую таблицу:
Код
aTable := {} // массив со структурой временной таблицы
AADD(aTable,{"priznak","c",4,0}) // ПЛАН / ФАКТ
AADD(aTable,{"orddate","D",8,0}) // Дата документа
AADD(aTable,{"numdoc","C",6,0}) // Номер документа
AADD(aTable,{"otgdate","D",8,0}) // Дата отгрузки
AADD(aTable,{"schet","C",16,0}) // Счет
AADD(aTable,{"agentcode","C",60,0}) // Код контрагента
AADD(aTable,{"agentname","C",25,0}) // Наименование покупателя
AADD(aTable,{"agenttype","C",25,0}) // Тип покупателя
AADD(aTable,{"grup","C",5,0}) // Код группы товара
AADD(aTable,{"grupname","c",60,0}) // Наименование группы
AADD(aTable,{"nnum","C",13,0}) // Номенклатурный номер товара
AADD(aTable,{"lname","c",60,0}) // Наименование товара
AADD(aTable,{"kol","N",19,6}) // Количество по строке заказа
AADD(aTable,{"cena","N",19,8}) // Цена по строке заказа
AADD(aTable,{"sumout","N",19,3}) // Сумма по строке заказа
cFile := "user\u_plnfct.dbf" // Определяем файл в папке USER базы данных
cName := B6_DBF_PATH+cFile // путь к файлу с временной таблицей
DBCREATE(cName, aTable) // создание временного файла, если есть, то перепишется
Этап 2. Формирование выборки по реестру заказов
Далее, для осуществления выборки необходимо сформировать область связаных таблиц, содержащих необходимые данные.
Код
// Открываем таблицы для первого этапа, получения сведений для плана отгрузки
NetUseRo("u_rbook",B6_DBF_PATH+"real\rbook.dbf") //открыли реестр заголовков заказов
ORDSETFOCUS("rbook0")// ставим индекс по коду
NetUseRo("u_rbookm",B6_DBF_PATH+"real\rbookm.dbf") //открыли реестр содержимого заказов
ORDSETFOCUS("tag_oper_")
NetUseRo("u_mgrup",B6_DBF_PATH+"sclad\mgrup.dbf") //открыли справочник групп
ORDSETFOCUS("mgrup")
NetUseRo("u_mlabel",B6_DBF_PATH+"sclad\mlabel.dbf") //открыли номенклатурный справочник
ORDSETFOCUS("mlabel")
NetUseRo("u_partner",B6_DBF_PATH+"partner.dbf") //открыли справочник партнеров
ORDSETFOCUS("code")
NetUseRo("u_type_a",B6_DBF_PATH+"type_a.dbf") // открыли справочник типов
ORDSETFOCUS("tag_oper")
/// Блок запроса дат
dDateOt:=BoM(DATE())// Ставим начальную дату периода
dDateDo:=EoM(DATE())// Ставим конечную дату периода
//Делаем запрос периода для формирования реестра
aDates:=DIALOG({'Введите дату начала периода..','Введите дату завершения......'},{,},{dDateOt,dDateDo})
dDateOt:=aDates[1]
dDateDo:=aDates[2]
SELECT u_rbook // ставим активной область заголовков заказов
// Ставим фильтр на активные заказы и даты отгрузки по запросу
Set Filter TO u_rbook->status="1" .And.( u_rbook->date1>=dDateOt .And. u_rbook->date1<=dDateDo)
Count TO uncount //считаем записи для индикатора
Go top//?
Set Relation TO nnoper into u_rbookm //связываем заголовки с содержимым по ИД
Set Relation TO part_code into u_partner Additive // свзываем реестр заказов со справочником партнеров
SELECT u_partner
Set Relation TO type_a into u_type_a Additive // связываем
SELECT u_rbookm //делаем активной область перечня заказа
//связываем строки со справочниками для детализации
Set Relation TO UPPER(grup) into u_mgrup Additive // справочник групп
Set Relation TO UPPER(grup)+UPPER(nnum) into u_mlabel Additive//справочник товаров
На этом этапе получили массив связанных таблиц и теперь можно приступать к перебору и записи необходимых данных в итоговую таблицу.
Код
NETUSE("File_tab",cName) // открываем временную таблицу с алиасом FILE_TAB
SELECT u_rbook
PROGRESSINIT(uncount,"Идет перебор картотеки заказов ...")
Go top //Начинаем перебор заказов
DO WHILE (u_rbook->(!EOF())) // Цикл 1
uncurent:=uncurent+1 // счетчик +1
PROGRESSUPD ATE(uncurent) // обновляем картинку в строке статуса
SELECT u_rbookm //переходим в содержимое текущего заказа
// Начинаем перебор позиций по заказу
DO WHILE u_rbookm->nnoper_=u_rbook->nnoper // ставим условие для связанных таблиц Цикл 2
IF FILE_TAB->(ADDREC()) // добавляем в приемную таблицу новую запись
FILE_TAB->priznak:="План" // Значение для фильтрации в сводной таблице
FILE_TAB->ordDate:=u_rbook->DATE // Дата заказа
FILE_TAB->numdoc:=u_rbook->numdoc // Номер заказа
FILE_TAB->schet:=u_rbook->schet // Счет
FILE_TAB->otgdate:=u_rbook->date2 // Дата отгрузки
FILE_TAB->agentcode:=u_rbook->agentcode // Код контрагента
FILE_TAB->agentname:=u_rbook->agentname // Название контрагента
FILE_TAB->agenttype:=u_type_a->name // Тип контрагента
FILE_TAB->grup:=u_rbookm->grup // Код группы товара
FILE_TAB->nnum:=u_rbookm->nnum // Номенклатурный номер товара
FILE_TAB->kol:=u_rbookm->kol // Количество поставки
FILE_TAB->cena:=u_rbookm->cenaout // Цена
FILE_TAB->sumout:=u_rbookm->sumout // Сумма поставки
FILE_TAB->grupname:=u_mgrup->name // Название группы товара
FILE_TAB->lname:=u_mlabel->name // Название товара
FILE_TAB->(DBUNLOCK())
ENDIF
u_rbookm->(DBSKIP()) // переходим к следующей строке заказа
ENDDO // Конец 2 цикла
// Переходим к следующему заказу
SELECT u_rbook
u_rbook->(DBSKIP())
ENDDO // конец 1 цикла
PROGRESSHIDE() // убираем индикатор
Этап 3. Формирование выборки по реестру накладных на реализацию
Часть необходимых таблиц уже открыта, поэтому на достаточно закрыть только таблицы реестра и содержимого заказов.
NetUseRo("u_mdoc",B6_DBF_PATH+"sclad\mdoc.dbf") //открыли реестр заголовков документов
ORDSETFOCUS("mdoc")
NetUseRo("u_mdocm",B6_DBF_PATH+"sclad\mdocm.dbf") //открыли реестр содержимого накладных
ORDSETFOCUS("tag_oper_")
SELECT u_mdoc // Выделяем область заголовков накладных
// Накладываем фильтр на перечень накладных, вид и тип - реализация со склада, период аналогично заказам
Set Filter TO u_mdoc->vid="2" .And. u_mdoc->TYPE="1" .And. u_mdoc->DATE>=dDateOt .And. u_mdoc->DATE<=dDateDo
Go top // сдвигаем указатель, для активации фильтра
Count TO uncount
Set Relation TO nnoper into u_mdocm
Set Relation TO part_code into u_partner Additive
SELECT u_partner
Set Relation TO type_a into u_type_a Additive
SELECT u_mdocm
Set Relation TO UPPER(grup) into u_mgrup Additive
Se t Relation TO UPPER(grup)+UPPER(nnum) into u_mlabel Additive
SELECT u_mdoc
Go top
PROGRESSINIT(uncount,"Идет перебор картотеки накладных ...")
DO WHILE (u_mdoc->(!EOF()))
uncurent:=uncurent+1
PROGRESSUPDATE(uncurent)
SELECT u_mdocm
DO WHILE u_mdocm->nnoper_=u_mdoc->nnoper
IF FILE_TAB->(ADDREC())
FILE_TAB->priznak:="Факт"
FILE_TAB->ordDate:=u_mdoc->DATE
FILE_TAB->numdoc:=u_mdoc->numdoc
FILE_TAB->schet:=u_mdoc->schet_a
FILE_TAB->otgdate:=u_mdoc->DATE
FILE_TAB->agentcode:=u_mdoc->agentcode
FILE_TAB->agentname:=u_mdoc->agentname
FILE_TAB->agenttype:=u_type_a->name
FILE_TAB->grup:=u_mdocm->grup
FILE_TAB->nnum:=u_mdocm->nnum
FILE_TAB->kol:=u_mdocm->kol
FILE_TAB->cena:=u_mdocm->cenaout // Количество поставки
FILE_TAB->sumout:=u_mdocm->sumoutr
FILE_TAB->grupname:=u_mgrup->name
FILE_TAB->lname:=u_mlabel->name
FILE_TAB->(DBUNLOCK())
ENDIF
u_mdocm->(DBSKIP())
ENDDO
SELECT u_mdoc
u_mdoc->(DBSKIP())
ENDDO
PROGRESSHIDE()
Этап 4. Экспорт таблицы в офисное приложение по выбору
Заключительным этапом программы является экспорт таблицы для анализа в офисное приложение по выбору.
Для этих целей используем функции БЭСТ-5 ExportToCalc() и ExportToExcel()
Код
SELECT file_tab
nRetFormat:=NOORYES("Сформировать таблицу в формате..."+CHR(13)+CHR(10)+CHR(13)+CHR(10);
+"Примечание:"+CHR(13)+CHR(10)+"Цена и сумма без НДС",1,{"OpenOffice.org Calc ","MS Excel "})
IF nRetFormat == 1
exporttocalc()
ELSEIF nRetFormat == 2
exporttoexcel()
ENDIF
//закрытие таблиц
u_partner->(DBCLOSEAREA())
u_type_a->(DBCLOSEAREA())
u_mlabel->(DBCLOSEAREA())
u_mgrup->(DBCLOSEAREA())
u_mdocm->(DBCLOSEAREA())
u_mdoc->(DBCLOSEAREA())
file_tab->(DBCLOSEAREA())
на проработку:
Возможно ли сделать такой отчет: Торг-12 по продукции, НО в перечне не комплект (коробка с деталями), а перечень деталей, входящих в этот комплект.
Т.е. по базе продается комплект ABC, произведенный по спецификации (упаковка и детали), а в печатной форме документа только детали.
??
Вот такая вот странная проблема.
Планируется ввод модуля ПРОИЗВОДСТВО.
В связи с этим необходимо внести изменения в план счетов.
Согласно принятой концепции необходимо использовать субсчет 10Х Материалы в производстве.
Главбух категорически против. Аргументы со стороны бухгалтера - ПБУ и план счетов.
Какие весомые аргументы со стороны системы?
Добрый день.
Заинтересовала такая тема:
Приложение на БЭСТ-5, анализирующее обычный штрих-код, и регистрирующее все считываемые коды.
Насколько сложно это осуществить и сколько может стоить аппаратная часть?
Итак, на данный момент в системе отсутствует связь с ОКЕИ. До поры до времени проблем не возникало, если по умолчанию в группе забита единица измерения. Но в последнее время, то ли в документах поставщика идет некорректная информация, то ли оператор - творческая натура, но на складе можно встретить все что угодно и бухты и пачки и емкости.
Для работы в номенклатурном справочнике нарисовал плагин, который при сохранении проверяет единицу измерения по выборке из ОКЕИ. Какое событие, или каким образом можно осуществлять контроль при вводе новой позиции из накладной?
Модуль - Сырье. Материалы
Код
usr_edizm()
Function usr_edizm()
Local cMsgEdIzm,nStep:=1,nEdIzm,lRet:=.T.//Строка сообщения,счетчик,количество строк перечня,возврат
Local aEdIzm := {;//Массив {код,Наименование, Нац.обозначение, КОДОВОЕ обозначение}
{"868","Бутылка","бут", "БУТ"},;
{"055","Квадратный метр ","м2", "М2"},;
{"166","Килограмм","кг", "КГ"},;
{"839","Комплект","компл","КОМПЛ"},;
{"113","Кубический метр","м3", "М3"},;
{"625","Лист","л.", "ЛИСТ"},;
{"112","Литр","л.", "Л"},;
{"006","Метр","м", "М"},;
{"715","Пара (2 шт.)","пар", "ПАР"},;
{"018","Погонный метр","пог.м","ПОГ М"},;
{"736","Рулон","рул", "РУЛ"},;
{"168","Тонна","т", "Т"},;
{"798","Тысяча штук","тыс.шт","ТЫСШТ"},;
{"778","Упаковка","упак", "УПАК"},;
{"796","Штука","шт", "ШТ"};
}
dbpush()// в астрал
AltD()
//Готовим сообщение пользователю
cMsgEdIzm:="Внимание!"+Chr(13)+Chr(10)+"Единицы измерения должны соответствовать ОКЕИ :"+Chr(13)+Chr(10)
nEdIzm:=Len(aEdIzm) // подсчитываем строки в массиве
Do While nStep <= nEdIzm // Перебор по справочнику единиц измерения
// Наполняем строку сообщения (КОД - Наименование)
cMsgEdIzm:=cMsgEdIzm+aEdizm[nStep,4]+" - "+aEdizm[nStep,2]+Chr(13)+Chr(10)
nStep:=nStep+1
EndDo
//Если значение поля пустое
If Len(AllTrim(mlabel->ed))=0
//Делаем намек
cMsgEdIzm:=cMsgEdIzm+"Необходимо заполнить поле | Ед.Измер... | !"
lret:=.f. // Оставляем в карточке до поиска нужного решения
//Оповещаем
messagebox(cMsgEdIzm,"Внимание! Пустое значение...",48)
ElseIf AScan(aEdIzm,AllTrim(mlabel->ed))=0
//Оглашаем приговор
cMsgEdIzm:=cMsgEdIzm+"Значение поля <"+AllTrim(mlabel->ed)+"> будет удалено !"+Chr(13)+Chr(10)
//Доводим до сведения
messagebox(cMsgEdIzm,"Внимание! Ошибочный код Ед.измер.",16)
//Делаем мелкую пакость
mlabel->(RLock())
mlabel->ed:=""
mlabel->(DbUnLock())
lret:=.f. // Не выпускать
EndIf
// для уверенности пробиваем в верхний регистр, то что прошло через ascan
mlabel->(RLock())
mlabel->ed:=Upper(mlabel->ed)
mlabel->(DbUnLock())
dbpop()//вернулись
Return lRet
Одно время было обязательным требованием - занесение данных работника в верхнем регистре.
В последнее время акцент на этом делать перестали, и картотека начала "пестрить" на разные лады.
Если кто-то сталкивался с такой проблемой, то нижеприведенный плагин может помочь.
Запускать из картотеки в кадрах.
Код
usr_FioUp()
Function usr_FioUp()
Local cFam,cName,cPatr,cFior,cFiod,cFiov
dbpush()
PROGRESSINIT(3,"Идет перебор картотеки..")
//
ProgressUpdate(1)
NetUse("u_people",B6_DBF_PATH+"people.dbf")//открываем картотеку
Go top
Do While (u_people->(!EoF()))
cFam:=Upper(AllTrim(u_people->shortname))
cName:=Upper(AllTrim(u_people->Name1))
cPatr:=Upper(AllTrim(u_people->Name2))
RLock()
u_people->shortname:=cFam
u_people->name1:=cName
u_people->name2:=cPatr
DbUnLock()
u_people->(DbSkip())
EndDo
u_people->(DbCloseArea())
//
ProgressUpdate(2)
NetUse("u_cardssec",B6_DBF_PATH+"kadry\cardssec.dbf")//открываем картотеку
Go top
Do While (u_cardssec->(!EoF()))
cFam:=Upper(AllTrim(u_cardssec->Fam))
cName:=Upper(AllTrim(u_cardssec->Name))
cPatr:=Upper(AllTrim(u_cardssec->Patr))
cFior:=Upper(AllTrim(u_cardssec->Fio_r))
cFiod:=Upper(AllTrim(u_cardssec->Fio_d))
cFiov:=Upper(AllTrim(u_cardssec->Fio_v))
RLock()
u_cardssec->fam:=cFam
u_cardssec->name:=cName
u_cardssec->Patr:=cPatr
u_cardssec->Fio_r:=cFior
u_cardssec->Fio_d:=cFiod
u_cardssec->Fio_v:=cFiov
DbUnLock()
u_cardssec->(DbSkip())
EndDo
u_cardssec->(DbCloseArea())
//
ProgressUpdate(3)
NetUse("u_cardspri",B6_DBF_PATH+"salary\cardspri.dbf")//открываем картотеку
Go top
Do While (u_cardspri->(!EoF()))
cFam:=Upper(AllTrim(u_cardspri->Fam))
cName:=Upper(AllTrim(u_cardspri->Name))
cPatr:=Upper(AllTrim(u_cardspri->Patr))
RLock()
u_cardspri->fam:=cFam
u_cardspri->name:=cName
u_cardspri->Patr:=cPatr
DbUnLock()
u_cardspri->(DbSkip())
EndDo
u_cardspri->(DbCloseArea())
PROGRESSHIDE()
dbpop()
Return
Не так давно вышла обновленная версия указанного продукта. На днях проверил работу в деморежиме на рабочих данных.
Результат впечатлил. Получаем HTTP-сервер отчетов, доступ к которому возможен из любого браузера из любой точки подключения (при настройке доступа из Интернета).
На простых примерах отчеты формируются прекрасно, т.е. как обычно. Но отчеты часто требуются с такими нюансами, что формирование SQL-запроса становится непростой задачей. Хотелось бы узнать мнение специалистов по Fast Report - возможно ли взять на вооружение эту программу для использования в качестве корпоративного сервера отчетов для БЭСТ-5 ?
Есть ли желающие принять участие в тестировании с целью сформировать десяток рабочих отчетов для примера?
Все результаты и отчеты выложим в свободном доступе и здесь и на сайте.
Судя по описанию никаких проблем возникнуть не должно, неплохая.
Центральный веб-сервер отчетов для руководства, он же антикризисный центр управления - то что многим не помешало бы.
Какие мнения?
В кадрах СП18 в отчет "Фактические отпуска" не попадают записи, даты начала/окончания которой не входит в период дат запроса.
Т.е. если взять отчет за период с 23 по 28 марта то в отчет попадет только тот, кто уходит/выходит в этот период.
Если человек находится в длительном отпуске, то он выпадает из отчета.
Я полагаю, что это не совсем верно. Если нет, то как определить кто из работников находится в отпуске на этой неделе?
Каким образом можно получить правильно рассчитанную цифру среднесписочной численности за месяц, при наличии модуля Кадры и Зарплата ?
Отчет, который есть в зарплате, к сожалению не выдает цифру, на которую выходит служба персонала.
СП18, собственно не могу открыть форму приходного ордера.
В шаблонах печатных форм только 4 раздела (Авансовый, Платежная, Ведомость деп., Карточка деп).
Сами формы выводятся на печать как обычно.
В чем может быть проблема?
Часть сотрудников, уволенных приказами попадают в отчеты по кадрам.
Например, Штатная расстановка с выводом на текущую дату выходит правильно, с выводом на вчерашний день на 50 человек больше.
Связи не прослеживается, часть уволенных не попадает, часть попадает.
Что проверять?
СП18
СП18.
В сентябре прошлого года человек по приказу принят на работу.
Затем в этом же месяце переведен на другую должность по приказу.
С этим все нормально.
Формируем отчет "Данные о работе в подразд, должности и виде работы за период" за период 31.01.2009
Эти сотрудники присутствуют в отчете двумя строками, по должности приема и по должности на которую были переведены.
Может неправильно используется технология работы при переводе сотрудников на другую должность?
Хотя на остальное не влияет.
Помимо упомянутого отчета неверно формируются и остальные отчеты со схожей логикой формирования источников данных, например в категории "Распределение работников".
Кто-нибудь сталкивался с таким случаем?
С новым пакетом появились новые возможности.
Возникли ы:
1. Как можно использовать поле "Секция" в бюджетах.
2. Как правильно передавать результат вычислений из программы пользователя в алгоритмах.
3. Можно увидеть обновленные таблицы в демо-версии, с учетом нового функионала?
4. Названия колонок, не обрабатываются шаблоны (YYYY, MM, ГГГГ... )
5. Как быть, если интервал планирования проекта - месяц, а требуется получить фактический оборот за предыдущие 10, 30, 45 дней отсчитывая от даты расчета.
Должна ли рассчитываться амортизация, если в карточке объекта на вкладке амортизация признак "Амортизируется" не установлен. ??
Замечено, что после перехода на 14 пакет в ведомость амортизации попали объекты, перенесенные еще с 4+ по которым не должна считаться амортизация.