Задача экспорта начисленной заработной платы в текстовый файл с заданным форматом строк (дата, табельный номер, ФИО сотрудника, сумма начисления, комментарий или вид расчета) часто возникает при интеграции 1С с внешними банковскими системами, аналитическими сервисами или системами управленческого учета. Разберем по шагам, как реализовать такую выгрузку в конфигурации 1С:Зарплата и Управление Персоналом 2.5 как программно через внешнюю обработку, так и с помощью типовых инструментов платформы.
Проанализируем структуру хранения данных по начислениям сотрудников. В конфигурации «Зарплата и Управление Персоналом 2.5» начисления разделены по двум основным регистрам расчета:
РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций — содержит оклады, тарифные ставки, оплату по больничным листам, отпускам и другим плановым видам расчетов со сроком действия.РегистрРасчета.ДополнительныеНачисленияРаботниковОрганизаций — содержит разовые премии, разовые надбавки, материальную помощь и прочие разовые выплаты.Сведения о сотрудниках и их табельных номерах хранятся в справочнике СотрудникиОрганизаций (реквизит Код содержит табельный номер). Чтобы собрать полные сведения по всем начислениям за определенный период, в запросе необходимо объединить выборки из обоих регистров расчета с помощью конструкции ОБЪЕДИНИТЬ ВСЕ.
Разберем процесс создания исполняемого файла выгрузки. В отличие от платформы 1С 7.7, где файлы обработок имели расширение .ert, в 1С 8 используются файлы с расширением .epf.
ДатаНачала, ДатаОкончания), организацию (при необходимости) и кнопку запуска процедуры экспорта.Посмотрим на пример процедуры выгрузки. Для предотвращения сдвига колонок в файле в качестве разделителя рекомендуется использовать точку с запятой (;), а не запятую, так как запятые могут встречаться в текстовых комментариях или наименованиях начислений.
При формировании строк важно использовать функцию Формат(), чтобы исключить пробелы-разделители триад в суммах (параметр ЧГ=0) и привести дату к единому стандарту.
Процедура ВыгрузитьНачисленияВФайл(ИмяФайла, ДатаНачала, ДатаОкончания)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Основные.ПериодРегистрации КАК ДатаНачисления,
| Основные.Сотрудник.Код КАК ТабНомер,
| Основные.Сотрудник.Наименование КАК ФИОСотрудника,
| Основные.Результат КАК Сумма,
| ЕСТЬNULL(Основные.Регистратор.Комментарий, Основные.ВидРасчета.Наименование) КАК ТекстРаспоряжения
|ИЗ
| РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК Основные
|ГДЕ
| Основные.ПериодРегистрации МЕЖДУ &ДатаНачала И &ДатаОкончания
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Дополнительные.ПериодРегистрации,
| Дополнительные.Сотрудник.Код,
| Дополнительные.Сотрудник.Наименование,
| Дополнительные.Результат,
| ЕСТЬNULL(Дополнительные.Регистратор.Комментарий, Дополнительные.ВидРасчета.Наименование)
|ИЗ
| РегистрРасчета.ДополнительныеНачисленияРаботниковОрганизаций КАК Дополнительные
|ГДЕ
| Дополнительные.ПериодРегистрации МЕЖДУ &ДатаНачала И &ДатаОкончания";
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ДатаНачала));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания));
Выборка = Запрос.Выполнить().Выбрать();
// Создаем объект для записи текстового файла с поддержкой кодировки ANSI/Windows
ТекстФайл = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.ANSI);
Пока Выборка.Следующий() Цикл
СтрДата = Формат(Выборка.ДатаНачисления, "ДФ=dd.MM.yyyy");
СтрТабНомер = СокрЛП(Выборка.ТабНомер);
СтрФИО = СокрЛП(Выборка.ФИОСотрудника);
СтрСумма = Формат(Выборка.Сумма, "ЧДЦ=2; ЧРД=.; ЧГ=0");
// Очищаем текст распоряжения от возможных символов переноса строк и разделителей
СтрРаспоряжение = СтрЗаменить(СокрЛП(Выборка.ТекстРаспоряжения), ";", " ");
СтрРаспоряжение = СтрЗаменить(СтрРаспоряжение, Символы.ПС, " ");
СтрокаВыгрузки = СтрДата + ";" + СтрТабНомер + ";" + СтрФИО + ";" + СтрСумма + ";" + СтрРаспоряжение;
ТекстФайл.ЗаписатьСтроку(СтрокаВыгрузки);
КонецЦикла;
ТекстФайл.Закрыть();
Предупреждение("Выгрузка успешно завершена!");
КонецПроцедуры
Если нет возможности написать или запустить внешнюю обработку, рассмотрим стандартный способ получения и выгрузки аналогичных сведений с помощью типового отчета:
ОсновныеНачисленияРаботниковОрганизаций.ПериодРегистрации, Сотрудник.Код, Сотрудник, Результат, ВидРасчета.ДополнительныеНачисленияРаботниковОрганизаций, если на предприятии начислялись разовые премии или надбавки.Таким образом, для разовой задачи подходит штатный Универсальный отчет, а для регулярной автоматизированной выгрузки оптимальным решением является внешняя обработка с объединением таблиц начислений через запрос.