При интеграции 1С с банковскими системами программисты часто сталкиваются с необходимостью заполнения готовых шаблонов реестров. Многие крупные банки, такие как ВТБ, предоставляют сложные файлы Excel с расширением .xlsm. Эти файлы содержат встроенные макросы VBA, которые проверяют корректность введенных данных (СНИЛС, номера счетов, паспортные данные) и форматируют итоговый документ для отправки в банк. Если заполнить такой шаблон неправильно или сохранить его некорректно, все макросы удалятся, и банк не примет документ.
В этой статье мы подробно разберем, как программно заполнить шаблон Excel с макросами из 1С, сохранив их работоспособность, а также рассмотрим готовые альтернативы автоматизации обмена данными с банком ВТБ.
Попытка использовать стандартный макет типа ActiveDocument для файлов с поддержкой макросов (.xlsm) часто приводит к повреждению внутренней структуры документа или блокировке макросов системой безопасности Excel. Единственным надежным способом является хранение шаблона в конфигурации в виде двоичных данных и его последующее программное заполнение.
Проанализируем этот процесс по шагам:
.xlsm, полученный от банка.Save() может вызвать предупреждения безопасности или сохранить файл как стандартную книгу без макросов. Мы должны использовать метод SaveAs с явным указанием кода формата 52 (что соответствует константе xlOpenXMLWorkbookMacroEnabled).Рассмотрим пример программного кода, который реализует данный алгоритм:
// 1. Получаем двоичные данные шаблона из макета
ДвоичныеДанныеШаблона = ПолучитьОбщийМакет("РеестрВТБ_Шаблон");
// 2. Создаем временный файл на диске
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsm");
ДвоичныеДанныеШаблона.Записать(ИмяВременногоФайла);
// 3. Инициализируем COM-соединение с Microsoft Excel
Попытка
Эксель = Новый COMОбъект("Excel.Application");
Исключение
ВызватьИсключение "Не удалось запустить Excel. Убедитесь, что приложение установлено на сервере/клиенте.";
КонецПопытки;
// Отключаем экранные предупреждения и отображение интерфейса для ускорения работы
Эксель.ScreenUpdating = Ложь;
Эксель.DisplayAlerts = Ложь;
Попытка
// Открываем наш временный файл-шаблон
Книга = Эксель.Workbooks.Open(ИмяВременногоФайла);
Лист = Книга.Sheets(1); // Работаем с первым листом
СтрокаНачалаДанных = 7; // Предположим, что шапка занимает первые 6 строк
НомерСтроки = СтрокаНачалаДанных;
// Выборка данных для реестра (например, сотрудники и суммы к выплате)
Выборка = Справочники.Сотрудники.Выбрать();
Пока Выборка.Следующий() Цикл
// Заполняем ячейки шаблона
Лист.Cells(НомерСтроки, 1).Value = Выборка.Наименование; // ФИО
Лист.Cells(НомерСтроки, 2).Value = Выборка.ИНН; // ИНН
Лист.Cells(НомерСтроки, 3).Value = Выборка.ОсновнойБанковскийСчет; // Номер счета
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
// 4. Сохраняем файл под новым именем.
// Код формата 52 критически важен — он сохраняет работоспособность макросов (.xlsm)
ПутьКФайлуРезультата = "C:\Выгрузка\ИтоговыйРеестр.xlsm";
Книга.SaveAs(ПутьКФайлуРезультата, 52);
// Закрываем книгу и приложение Excel
Книга.Close(Ложь);
Эксель.Quit();
Сообщить("Данные успешно выгружены в файл: " + ПутьКФайлуРезультата);
Исключение
// В случае ошибки обязательно закрываем процесс Excel, чтобы он не завис в памяти
Если ЗначениеЗаполнено(Книга) Тогда
Книга.Close(Ложь);
КонецЕсли;
Если ЗначениеЗаполнено(Эксель) Тогда
Эксель.Quit();
КонецЕсли;
ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
Используя этот подход, мы гарантируем, что все внутренние VBA-скрипты, формулы и валидации банка останутся нетронутыми, а итоговый файл откроется у пользователя без каких-либо ошибок структуры XML.
Выясним альтернативный путь решения этой задачи. Разработчику не всегда целесообразно тратить время на написание собственного кода интеграции с нуля. Крупные банки, включая ВТБ, прекрасно понимают потребности бизнеса и давно разработали специализированное программное обеспечение для интеграции с продуктами 1С.
Вместо ручного заполнения файлов .xlsm мы можем использовать готовые модули:
Если мы хотим полностью уйти от ручных манипуляций с промежуточными файлами (будь то txt, xls или xlsm), лучшим решением станет внедрение технологии DirectBank. Это современный стандарт прямого обмена документами между 1С и банком напрямую через защищенные каналы связи.
Рассмотрим преимущества этого метода:
Для активации DirectBank достаточно зайти в настройки зарплатного проекта в вашей базе 1С, установить флаг Использовать обмен электронными документами и следовать пошаговому помощнику настройки, введя логин и пароль от системы «ВТБ Бизнес-онлайн».
Использование COM-объекта Excel.Application накладывает жесткое ограничение: код должен выполняться на операционной системе Windows с установленным пакетом Microsoft Office. Если сервер 1С работает под управлением Linux, COM-технология недоступна.
В таком случае мы можем использовать текстовый формат выгрузки, который ВТБ официально поддерживает. Текстовые реестры имеют строгую структуру с разделителями (обычно точка с запятой) и служебными строками начала и конца файла.
Разберем структуру типичного текстового реестра ВТБ:
START;01.12.2023;1;CREDIT;ООО Ромашка;40702810000000001234.40817810000000005678;150000.00;Иванов Иван Иванович;123-456-789 01.END;1;150000.00;RUR.Запись такого файла легко реализовать стандартным объектом 1С ЗаписьТекста, который кроссплатформен и стабильно работает на любых серверах без использования стороннего ПО.