Выгрузка зарплатной ведомости для Альфабанк: АЗОН или создаем файл xls с несколькими листами без использования Excel


Альфабанк является одним из крупнейших банков в нашей стране. В корпоративном секторе этот банк предлагает своим клиентам множество услуг, в число которых входит зарплатный проект — «Альфа-Зарплата Онлайн» или знакомый многим как «АЗОН».
В АЗОН есть возможность загрузки зарплатных ведомостей из файлов XLS. Но в формате файла есть небольшая особенность: в файле должно быть несколько листов с различными данными. В этой публикации разберемся, как сформировать такой файл без использования COM-объекта Microsoft Excel.

К сожалению, 1С пока не умеет работать штатными средствами с листами XLS-файлов. На ИС уже есть решения, использующие COM-объект Excel. Но это решение будет работать только под Windows, а у меня несколько пользователей работают под Linux, поэтому приходится изобретать кроссплатформенные решения. Для решения этой задачи я использовал Python. С его огромным количество модулей и относительно простой их установкой он уже не первый раз выручает в задачах, которые нельзя решить типовыми средствами 1С. Мое решение одинаково хорошо работает как в ОС Windows, так и на Linux. А для его работы вообще не требуется Excel (Openoffice или другие текстовые редакторы).

 

1. Установка Python.

Особых сложностей при установке Pyhton 3.x не должно возникнуть. В Windows  скачиваем установщик с сайта python.org и устанавливаем в режиме «Далее» — «Готово».

В linux выполняем команды  в терминале:

 

sudo apt-get install python3

 

Если вы используете Linux отличный от Debian/Ubuntu, то наверняка сами знаете как установить Python.

 

2. Установка дополнительных модулей для работы с Excel.

Для работы с файлами Excel нам понадобятся пара дополнительных модулей:  xlutils и xlwt.

Проще всего их установить используя менеджер пакетов pip (устанавливается вместе с Python).

Для установки открываем командную строку в Windows или терминал в Linux и вводим команды:

pip install xlutils
pip install xlwt

или, если на компьютере установлено несколько версий Python

pip3 install xlutils
pip3 install xlwt

 

3. Печатная форма

Для экспорта файла начислений была сделана внешняя печатная форма, которая подключается к документу «Зарплата к выплате организаций».  При использовании проверьте правильность заполнения реквизитов "Номер" и "Дата" для выбранного договора с банком. Эти данные заполняются в печатной форме. 

Значение поля "Служебная информация" можно посмотреть в файле выгрузки (образец), полученном из АЗОН. 

Реквизиты банка и основание платежа ("согласно платежному поручению № ….") определяется из документа "Платежное поручение исходящее", введенного на основании Зарплаты к выплате. 

 

Само формирование зарплатой ведомости стандартно, и ничего интересного не представляет: формируются три табличных документа, по одному на каждую страницу. Они записываются во временные файлы и вызывается скрипт для их объединения в один документ. 

 

Полученный документ загружаем в АЗОН в разделе Ведомости — Загрузка.

 

Пример файла, сформированный в демонстрационной базе УПП: 

 

4. Создание книги Excel

Эта обработка может быть интересна и тем, кому необходимо объединить несколько отдельных табличных документов в один файл Excel. Для этого можно воспользоваться функцией "ОбъединитьЛистыВЕдиныйФайл" в которую передаются массив табличных документов и каталог для сохранения итогового документа.

 

Для табличного документа можно заранее определить имя листа, передав его в свойстве "ИспользуемоеИмяФайла":

ЛистИнформации = Новый ТабличныйДокумент;
ЛистИнформации.ИспользуемоеИмяФайла = "Info"; //Задаем имя листа в книге XLS

Листы будут добавляться в книгу Excel в том порядке, в котором добавлены в массив:

МассивЛистов = Новый Массив;
МассивЛистов.Добавить(ЛистРеестрНачислений);
МассивЛистов.Добавить(ЛистИнформации);
МассивЛистов.Добавить(ЛистПлатежей);

ИмяФайлаExcel = ОбъединитьЛистыВЕдиныйФайл(МассивЛистов, ДанныеДляПечати.Каталог, ДанныеДляПечати.ИмяФайла);

Функция возвращает путь к полученному файлу XLS. 

 

5. Как работает скрипт?

С помощью команды wb = xlwt.Workbook() мы создаем новый документ, в который будем записывать данные.

Далее обходим найденные в текущем каталоге XLS-файлы и добавляем их как отдельный лист к новому документу (wb).

//Создаем новый лист с именем входящего файла
(fileBaseName, fileExtension)=os.path.splitext(fileName)
ws = wb.add_sheet(fileBaseName)

Одной из проблем которая возникла при записи файлов это некорректное форматирование документа. Это удалось исправить с помощью копирования стилей из исходного файла:

//Вначале получаем описание стилей исходного документа
w = XLWTWriter()
process(XLRDReader(in_file,'unknown.xls'), w)
styles =  w.style_list

//записываем данные в ячейку с сохранением стилей оформления
xf_index = rs.cell_xf_index(Ряд, Строка)
ws.write(Ряд,Строка,Значение_ячейки, styles[xf_index])

 

Выполняем копирование всех ячеек для каждого листа и сохраняем выходной файл:

 

wb.save(outfile)

В приложенной печатной форме код модулей открыт. Полный текст скрипта находится в текстовом макете script.

Версия платформы: 8.3.10.Х и старше.

 

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *