Вывод справочника в Web
На самом деле, бОльшая работа уже проделана. Реализация сервлета, который собственно выводит данные справочника Контрагенты в браузер достаточно проста.
Наш сервлет получает атрибут контекста, который был установлен нашим стартером:
ServletContext context = getServletContext();
V7 v7 = (V7)context.getAttribute("ru.j1c.V7");
Затем мы выводим саму таблицу. Делаем это сознательно не самым опимальным образом, что бы показать возможности J1C - а именно работаем через ссылку на справочник. При работе со ссылкой на справочник мы получаем атрибуты справочника через методы ссылки
ref.getAttribute("ОсновнойДоговор")
При этом, конечно, происходит "лишнее" обращение к базе.
import j1c.ru.V7;
import j1c.ru.Metadatas.Catalog;
import j1c.ru.V7.CatalogReference;
import j1c.ru.V7.RecordSet;
import j1c.ru.V7.ResultSet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
@SuppressWarnings("serial")
public class Covenantors extends HttpServlet{
private void forwardError(Exception e, HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException{
req.setAttribute("error", e);
RequestDispatcher dispatcher = req.getRequestDispatcher("/error");
dispatcher.forward(req, resp);
}
private void printJournal(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException{
PrintWriter out = resp.getWriter();
ServletContext context = getServletContext();
V7 v7 = (V7)context.getAttribute("ru.j1c.V7");
out.println("<table>");
out.println("<caption style=\"font-size:160%\">Справочник \"Контрагенты\"</caption>");
out.println("<tr align=\"center\" style=\"font-size: 120%\"><td>Код</td><td>Наименование</td><td>Договор</td></tr>");
if(v7!=null){//значит приложение запущено
//HttpSession session = req.getSession();
String parentEncode = req.getParameter("parent");
RecordSet rs = v7.getRecordSet();
String query;
if(parentEncode!=null){
query = "select * from $Справочник.Контрагенты (nolock) where parentid=:parent order by isfolder, descr, row_id";
rs.setParameter("parent", new String(Base64.decode(parentEncode)));
}
else{
query = "select * from $Справочник.Контрагенты (nolock) where parentid=$ПустойИд order by isfolder, descr, row_id";
}
try {
ResultSet result = rs.executeQuery(query);
Catalog meta = (Catalog) v7.getMetaData().selectTypes("Справочник.Контрагенты").get(0);
while(result.next()){
CatalogReference ref = result.getRef("id", meta);
if(result.getInt("isfolder")==1){
String url = req.getContextPath()+"/covenantors?parent="+Base64.encode(result.getString("id").getBytes());
out.println("<tr><td><a href=\""+url+"\">"+ref.getCode()+"</a></td>" +
"<td>"+ref.getName()+"</td></tr>"+
"<td>"+ref.getAttribute("ОсновнойДоговор")+"</td></tr>");
}
else{
out.println("<tr><td>"+ref.getCode()+"</td>" +
"<td>"+ref.getName()+"</td>" +
"<td>"+ref.getAttribute("ОсновнойДоговор")+"</td></tr>");
}
}
} catch (Exception e) {
forwardError(e, req, resp);
}
}
out.println("</table>");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html; charset=\"UTF-8\"");
PrintWriter out = resp.getWriter();
out.println("<html><head>");
out.println("<title>Контрагенты</title>");
out.println("</head>");
out.println("<body>");
printJournal(req, resp);
out.println("</body></html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
doGet(req, resp);
}
}
Наш пример готов и его можно запускать на web-сервере имеющий контейнер для запуска сервлетов.
Нами приложение тестировалось на Web-серверере Apache Tomcat 6.0.