Как загрузить данные из 1С в Excel-файл с макросами без их повреждения?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом Бухгалтерский учет Финансы и профессиональные услуги
← На главную

При интеграции 1С с банковскими системами программисты часто сталкиваются с необходимостью заполнения готовых шаблонов реестров. Многие крупные банки, такие как ВТБ, предоставляют сложные файлы Excel с расширением .xlsm. Эти файлы содержат встроенные макросы VBA, которые проверяют корректность введенных данных (СНИЛС, номера счетов, паспортные данные) и форматируют итоговый документ для отправки в банк. Если заполнить такой шаблон неправильно или сохранить его некорректно, все макросы удалятся, и банк не примет документ.

В этой статье мы подробно разберем, как программно заполнить шаблон Excel с макросами из 1С, сохранив их работоспособность, а также рассмотрим готовые альтернативы автоматизации обмена данными с банком ВТБ.

Решение 1: Использование макета «Двоичные данные» и COM-соединения

Попытка использовать стандартный макет типа ActiveDocument для файлов с поддержкой макросов (.xlsm) часто приводит к повреждению внутренней структуры документа или блокировке макросов системой безопасности Excel. Единственным надежным способом является хранение шаблона в конфигурации в виде двоичных данных и его последующее программное заполнение.

Проанализируем этот процесс по шагам:

  1. Создание макета в 1С: Переходим в конфигуратор, создаем новый макет и выбираем тип Двоичные данные. Загружаем в него наш исходный файл шаблона с расширением .xlsm, полученный от банка.
  2. Выгрузка шаблона на диск: Перед началом заполнения нам необходимо извлечь файл из макета во временный каталог на диске.
  3. Заполнение через COM-соединение: Запускаем приложение Excel, открываем временный файл, находим нужные ячейки и заполняем их данными из нашей информационной базы.
  4. Правильное сохранение файла: Это самый критичный шаг. Обычный метод 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.

Решение 2: Использование официальных обработок от банка ВТБ

Выясним альтернативный путь решения этой задачи. Разработчику не всегда целесообразно тратить время на написание собственного кода интеграции с нуля. Крупные банки, включая ВТБ, прекрасно понимают потребности бизнеса и давно разработали специализированное программное обеспечение для интеграции с продуктами 1С.

Вместо ручного заполнения файлов .xlsm мы можем использовать готовые модули:

Решение 3: Переход на технологию 1С:DirectBank

Если мы хотим полностью уйти от ручных манипуляций с промежуточными файлами (будь то txt, xls или xlsm), лучшим решением станет внедрение технологии DirectBank. Это современный стандарт прямого обмена документами между 1С и банком напрямую через защищенные каналы связи.

Рассмотрим преимущества этого метода:

Для активации DirectBank достаточно зайти в настройки зарплатного проекта в вашей базе 1С, установить флаг Использовать обмен электронными документами и следовать пошаговому помощнику настройки, введя логин и пароль от системы «ВТБ Бизнес-онлайн».

Решение 4: Текстовый формат выгрузки (.txt) для Linux-серверов

Использование COM-объекта Excel.Application накладывает жесткое ограничение: код должен выполняться на операционной системе Windows с установленным пакетом Microsoft Office. Если сервер 1С работает под управлением Linux, COM-технология недоступна.

В таком случае мы можем использовать текстовый формат выгрузки, который ВТБ официально поддерживает. Текстовые реестры имеют строгую структуру с разделителями (обычно точка с запятой) и служебными строками начала и конца файла.

Разберем структуру типичного текстового реестра ВТБ:

  1. Строка заголовка (Шапка): Должна начинаться со специального тега и содержать реквизиты организации и расчетный счет. Например: START;01.12.2023;1;CREDIT;ООО Ромашка;40702810000000001234.
  2. Информационные строки: Построчные данные сотрудников с суммами, номерами лицевых счетов, ФИО и СНИЛС. Например: 40817810000000005678;150000.00;Иванов Иван Иванович;123-456-789 01.
  3. Строка завершения (Подвал): Содержит количество записей, общую сумму выплат и код валюты. Например: END;1;150000.00;RUR.

Запись такого файла легко реализовать стандартным объектом 1С ЗаписьТекста, который кроссплатформен и стабильно работает на любых серверах без использования стороннего ПО.

← На главную