Содержание:
1. Получение расчетного листа в 1С
2. Формирование расчетного листа, формирование табеля и другие возможности
1. Получение расчетного листа в 1С
Большое количество клиентов используют корпоративные порталы для своих сотрудников. В этой статье приведу простейший пример получения сотрудником расчетного листа прямо с сайта. Конечно, это очень упрощенный пример. В тех местах, где стоит его расширить или углубиться, я буду указывать.
Для начала стоит опубликовать нашу базу. Ради улучшения безопасности я советую вам развернуть ее локально и не публиковать на весь интернет. Естественно это подразумевает и то, что корпоративный сайт находится в этой же сети.
Далее необходимо создать в нашей конфигурации 1С 8.3 HTTP-Сервис:
Имя может быть любое. По большому счету, если вы планируете расширять возможности вашего сайта за счет 1С, можно его так и назвать. С корневым URL дела обстоят интереснее: он в ответе за то, из чего будет состоять наш запрос, который будет необходимо вставить на сайте.
Теперь нам необходимо определить Шаблон URL:
Название, как обычно, не играет для нас особой роли, интересен шаблон. Указали мы его как /Documents1C/{Пользователь}.
Теперь наша ссылка выглядит следующим образом:
http://<адрес_базы_1с>/hs/GetList/Documents1C/<Пользователь>.
Адрес вы уже знаете из публикации
hs–http-сервис
GetList – Название нашего HTTP-Сервиса.
Documents1C – Наш шаблон.
{Пользователь} – Наше узкое место, а по совместительству идентификатор пользователей в системе. На практике я советую вам уточнить, как зашифровать имя, чтобы исключить возможность шпионить за коллегами.
К шаблону я добавил метод GETс следующими свойствами:
Все очень просто: в обработчике мы создаем новую функцию и заполняем ее.
Функция ПолучитьЗарплатуGET(Запрос)
Попытка
// Получим переданный в HTTP-запросе сотрудника. Желательно использовать какой-нибудь шифр.
Сотрудник = Справочники.Сотрудники.НайтиПоНаименованию(Запрос.ПараметрыURL["Пользователь"]);
Если Сотрудник = Справочники.Сотрудники.ПустаяСсылка() Тогда
ВызватьИсключение;
КонецЕсли;
Исключение
// Сотрудник не найден в системе.
HTTPОтвет = Новый HTTPСервисОтвет(400); // 400 - BadRequest
HTTPОтвет.УстановитьТелоИзСтроки(НСтр("ru='Сотрудник не найден'"));
Возврат HTTPОтвет;
КонецПопытки;
//Далее следуют параметры для формирования расчетного листа в 1С
Идентификатор = "РасчетныйЛисток";
ПодготовитьКоллекциюПечатныхФорм(Идентификатор);
Если ТипЗнч(Сотрудник) = Тип("СправочникСсылка.Сотрудники") Тогда
ФизическоеЛицоСотрудника = СотрудникиКлиентСерверПовтИсп.ФизическиеЛицаСотрудников(Сотрудник)[0];
Иначе
ФизическоеЛицоСотрудника = Сотрудник;
КонецЕсли;
РасчетныйЛисток = ПечатныеФормыСотрудников[Идентификатор].ПечатныеФормы.Получить(ФизическоеЛицоСотрудника);
//Ищем последние начисления зарплаты в 1С
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| НачислениеЗарплаты.Ссылка КАК Ссылка
|ИЗ
| Документ.НачислениеЗарплаты КАК НачислениеЗарплаты
|
|УПОРЯДОЧИТЬ ПО
| НачислениеЗарплаты.Дата УБЫВ";
Запрос.УстановитьПараметр("Проведен", Проведен);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Ссылка = ВыборкаДетальныеЗаписи.Ссылка;
КонецЦикла;
//В случае если документов в базе нет, то возвращаем ошибку.
Если Ссылка = Документы.НачислениеЗарплаты.ПустаяСсылка() Тогда
HTTPОтвет = Новый HTTPСервисОтвет(400); // 400 - BadRequest
HTTPОтвет.УстановитьТелоИзСтроки(НСтр("ru='Документов нет'"));
Возврат HTTPОтвет;
КонецЕсли;
КарточкаУчета = Новый Массив;
КарточкаУчета.Добавить(Объект.Ссылка);
КарточкаУчета.Добавить(РасчетныйЛисток);
//Тут будет ошибка. В нашей реализации мы использовали обходной метод, в котором мы получаем непосредственно табличный документ. Но для примера опустим сложную реализацию.
ТабДок = УправлениеПечатьюКлиент.ВыполнитьКомандуПечати("Отчет.АнализНачисленийИУдержаний", "РасчетныйЛистокПодробнее",
КарточкаУчета, Неопределено);
// Запишем 1С 8 табличный документ в поток в памяти в формате PDF.
Поток = Новый ПотокВПамяти;
ТабДок.Записать(Поток, ТипФайлаТабличногоДокумента.PDF);
// Получим двоичные данные файлов для отправки клиенту
ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
#КонецОбласти
#Область ОтправкаОтветаКлиенту
// Сформируем имя файла, с которым печатная форма будет загружена у клиента.
ИмяФайла = Строка(ДокументСсылка) + ".pdf";
// Кодируем строку URL, чтобы избежать проблем с русскими буквами и другими символами (например, пробел).
ИмяФайла = КодироватьСтроку(ИмяФайла, СпособКодированияСтроки.КодировкаURL);
// Создадим ответ.
HTTPОтвет = Новый HTTPСервисОтвет(200); // 200 - OK
// Установим заголовки.
HTTPОтвет.Заголовки.Вставить("Content-Type", "application/pdf"); // Чтобы браузер знал, что это PDF
HTTPОтвет.Заголовки.Вставить("Content-Disposition", "attachment; filename=""" + ИмяФайла + """");
// Телом ответа являются двоичные данные печатной формы.
HTTPОтвет.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанные);
// И, наконец, вернем ответ клиенту.
Возврат HTTPОтвет;
2. Формирование расчетного листа, формирование табеля и другие возможности
Осталось только разместить эту функцию, переделать формирование расчетного листа под себя и подумать над тем, как избежать того, чтобы пользователь мог подсмотреть чужую расчетку. Этот пример можно использовать для многих документов. Например, формирование остатка отпуска, формирование табеля. Если развивать мысль дальше, то можно использовать на сайте для клиента, для получения документов реализации в 1С 8.3.
Специалист компании ООО «Кодерлайн»
Роман Барабанов.