Одним из значительных достоинств применения системы 1С является возможность соединения с различными внешними приложениями и файлами, включая широко используемые офисные пакеты Microsoft Word и Excel. Эта функция предоставляет пользователям шанс автоматизировать множество процессов, генерировать документы по предварительно заданным шаблонам, а также анализировать данные, которые были импортированы из 1С. В этой статье мы подробно рассмотрим способы открытия файлов Word и Excel прямо из 1С версий 8.3 и 8.2, а также сопутствующие аспекты и особенности этой интеграции.
Основы взаимодействия 1С с внешними приложениями
Чтобы обеспечить эффективное взаимодействие 1С с другими программными продуктами, важно разобраться в механизме инициирования внешних приложений и открытия файлов. В 1С существует ряд встроенных функций и методов, способствующих запуску и управлению внешними программами. Одним из ключевых инструментов для данного процесса является функция ЗапуститьПриложение, предназначенная для выполнения команд в операционной системе Windows.
Пример простой реализации открытия файла Excel
Изучим пример простого сценария, в котором происходит открытие файла Excel из 1С 8.3 с применением функции ЗапуститьПриложение. Этот пример предполагает, что у пользователя есть доступ к указанному файлу на его локальном устройстве.
Этот пример демонстрирует, как одной строкой кода можно запустить внешний файл. Однако на практике задачи часто бывают сложнее и требуют дополнительных настроек и проверок.
Механизмы обеспечения безопасности
При работе с внешними файлами в 1С необходимо обращать внимание на безопасность. Запуск сторонних приложений без адекватного надзора может создать угрозы для системы и привести к исполнению нежелательного кода. Настоятельно советуется проверять пути к файлам и применять надежные методы обработки информации.
Проверка существования файла
Прежде чем запускать файл, нужно удостовериться в его наличии. Это поможет избежать возможных ошибок и неприятных ситуаций. Для проверки можно воспользоваться функцией ФайлСуществует.
Функция ОткрытьФайлЕслиСуществует(ПутьКФайлу) Если ФайлСуществует(ПутьКФайлу) Тогда ЗапуститьПриложение(ПутьКФайлу); Иначе Сообщить("Файл отсутствует: " + ПутьКФайлу); КонецЕсли; КонецФункции
Запуск с проверкой безопасности
Для повышения безопасности можно использовать дополнительные проверки прав доступа и ограничение доступа к определенным типам файлов.
Функция ЗапускФайлаСБезопасностью(ПутьКФайлу, РазрешенныеРасширения) Расширение = Прав(ПутьКФайлу, СтрДлина(ПутьКФайлу) — Найти(ПутьКФайлу, ".", -1)); Если ФайлСуществует(ПутьКФайлу) И Найти(РазрешенныеРасширения, Расширение) > 0 Тогда ЗапуститьПриложение(ПутьКФайлу); Иначе Сообщить("Не удалось найти файл или его формат не разрешен: " + ПутьКФайлу); КонецЕсли; КонецФункции
Открытие Word и Excel на клиенте
Чаще всего выполнение внешних файлов осуществляется на стороне клиента. Это подразумевает, что инструкции обрабатываются на устройстве пользователя, что имеет ключевое значение для приложений с графическим интерфейсом.
Использование ВнешниеКомпоненты
В случаях, требующих большей сложности, возможно применение сторонних компонентов, которые предлагают усовершенствованные функции для работы с документами. К примеру, интеграция с интерфейсом Microsoft Office может быть осуществлена с помощью COM-объектов.
Пример работы с COM-объектами для Microsoft Excel
Процедура ОткрытьФайлExcel(ПутьКДокументу) Если НЕ СуществованиеФайла(ПутьКДокументу) Тогда Сообщить("Документ не обнаружен: " + ПутьКДокументу); Возврат; КонецЕсли; Попытка ExcelПриложение = СоздатьОбъект("Excel.Application"); ExcelПриложение.Workbooks.Open(ПутьКДокументу); ExcelПриложение.Visible = Истина; Исключение Сообщить("Произошла ошибка при открытии файла Excel"); КонецПопытки; КонецПроцедуры
Открытие файлов на сервере
В определенных обстоятельствах требуется доступ к файлам на сервере и их обработка. Это критически необходимо для задач, связанных с обработкой больших массивов данных, когда клиентское устройство может оказаться не в состоянии справиться с возложенной нагрузкой.
Использование серверных методов
Серверные методы работы с файлами аналогичны клиентским, однако требуют учета особенностей серверной среды, таких как пути к файлам и права доступа.
Процесс ОткрытьФайлНаСервере(ПутьКФайлу) Экспорт Если НЕ ФайлСуществует(ПутьКФайлу) Тогда Уведомить("Файл отсутствует: " + ПутьКФайлу); Возврат; КонецЕсли; ЗапуститьПриложение(ПутьКФайлу); КонецПроцедуры
Взаимодействие с файловой системой
При работе на сервере часто требуется более сложное взаимодействие с файловой системой, включая создание и удаление файлов, управление правами доступа и выполнение дополнительных проверок.
Использование шаблонов документов
Одной из наиболее частых задач при работе с файлами Word и Excel является создание документов на основе шаблонов. В 1С это можно реализовать с помощью стандартных инструментов работы с шаблонами и генераторами отчетов.
Пример создания документа Word на основе шаблона
Автоматизация задач с помощью VBA
Одним из способов автоматизации работы с Excel и Word является использование макросов VBA. В 1С также можно выполнять VBA-скрипты используя возможности COM-объектов.
Пример выполнения макроса VBA из 1С
Процедура ВыполнитьМакросExcel(ПутьКФайлу, Макрос) Если НЕ ФайлСуществует(ПутьКФайлу) Тогда Сообщить("Файл отсутствует: " + ПутьКФайлу); Возврат; КонецЕсли; Попытка ExcelApp = СоздатьОбъект("Excel.Application"); Документ = ExcelApp.Workbooks.Open(ПутьКФайлу); ExcelApp.Run(Макрос); Документ.Close(Истина); ExcelApp.Quit(); Исключение Сообщить("Во время выполнения макроса возникла ошибка"); КонецПопытки; КонецПроцедуры
Работа с 1C + Word
// Создание объекта MS Word //Попытка // Word = Новый COMОбъект(«Word.Application»); //Исключение // Сообщить(ОписаниеОшибки(),». »); // Сообщить(«Возможно, MS Word не установлен на этом компьютере.»); // Возврат; //КонецПопытки;
Handler = Новый Структура(«Тип», «DOC»);
Попытка Word = Новый COMОбъект(«Word.Application»); Исключение //ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), «Ошибка», // ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); //НеУдалосьСформироватьПечатнуюФорму(ИнформацияОбОшибке()); КонецПопытки;
Handler.Вставить(«COMСоединение», Word); Попытка Word.Documents.Add(); Исключение Word.Quit(0); Word = 0; Handler.Word = 0; //ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), «Ошибка», // ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); //НеУдалосьСформироватьПечатнуюФорму(ИнформацияОбОшибке()); КонецПопытки;
// Установка видимости приложения Word.Visible = Истина; // Добавление нового документа в приложение //Word.Documents.Add(); // Делаем документ активным Документ = Word.ActiveDocument();
Таблица = Документ.Tables.Add(Документ.characters.last, 2, 2); Таблица.Cell(1, 1).Range.Text = «»; Таблица.Cell(1, 2).Range.Text = «»; Таблица.Cell(1, 2).Range.ParagraphFormat.Alignment = 2; // выравнивание по правому краю
Таб.Cell(2, 1).Range.Text = «г. Иркутск, б. Постышева 18Б»; Таб.Cell(2, 2).Range.Text = «Отдел по работе с претензиями»; Таб.Cell(2, 2).Range.ParagraphFormat.Alignment = 2; // Выравнивание в право
// Добавим параграф Документ.Paragraphs.Add(); НомерПараграфа = Документ.Paragraphs.Count(); Документ.Paragraphs(НомерПараграфа).Range.InsertAfter(«Претензия № «);
Документ.Paragraphs.Add(); НомерПараграфа = Документ.Paragraphs.Count();
ПечТема = «»; ПечТема = «Тема: Адресная система распространения»;
Документ.Paragraphs(НомерПараграфа).Range.InsertAfter(ПечТема); Документ.Paragraphs(НомерПараграфа).Range.Font.Size = 12; // размер шрифта Документ.Paragraphs(НомерПараграфа).Range.Font.Bold = -1; // жирный шрифт
Документ.Paragraphs.Add(); НомерПараграфа = Документ.Paragraphs.Count(); Документ.Paragraphs(НомерПараграфа).Range.InsertAfter(«на «); Документ.Paragraphs(НомерПараграфа).Range.Font.Size = 12; // размер шрифта Документ.Paragraphs(НомерПараграфа).Range.Font.Bold = -1; // жирный шрифт
ПечТовар = «» + » (» + «)»; ПечНомерИздания = «»; ПечЗаказ = «№ » + » от «;
ПечИсполнитель = «123»; ПечТелефон = «123»;
Документ.Paragraphs.Add(); НомерПараграфа = Документ.Paragraphs.Count(); //Документ.Paragraphs(НомерПараграфа).Format.SpaceAfter = 24; Документ.Paragraphs(НомерПараграфа).Range.InsertAfter(» Направляем для проверки запрос о неполучении «); Документ.Paragraphs(НомерПараграфа).Range.Font.Size = 12; // размер шрифта Документ.Paragraphs(НомерПараграфа).Range.Font.Bold = 0; // обычный шрифт Документ.Paragraphs.Item(НомерПараграфа).Format.Alignment=0; // лево
Документ.Paragraphs.Add(); НомерПараграфа = Документ.Paragraphs.Count(); Документ.Paragraphs(НомерПараграфа).Range.InsertAfter(» Пожалуйста, предоставьте информацию об отправительных документах для указанного издания или укажите причину, по которой посылка не была получена.»); Документ.Paragraphs(НомерПараграфа).Range.Font.Size = 12; // размер шрифта Документ.Paragraphs(НомерПараграфа).Range.Font.Bold = 0; // обычный шрифт Документ.Paragraphs.Item(НомерПараграфа).Format.Alignment=0; // по левому краю
Документ.Paragraphs.Add(); // Отступ Документ.Paragraphs.Add(); // Отступ
Документ.Paragraphs.Add(); НомерПараграфа = Документ.Paragraphs.Count(); Документ.Paragraphs(НомерПараграфа).Range.InsertAfter(«ФИО исполнителя: » + ПечИсполнитель + » _____________ подпись»); Документ.Paragraphs(НомерПараграфа).Range.Font.Size = 12; // размер шрифта Документ.Paragraphs(НомерПараграфа).Range.Font.Bold = 0; // обычный шрифт Документ.Paragraphs.Item(НомерПараграфа).Format.Alignment=0; // лево
Документ.Paragraphs.Add(); НомерПараграфа = Документ.Paragraphs.Count(); Документ.Paragraphs(НомерПараграфа).Range.InsertAfter(«Контактный телефон: » + ПечТелефон); Документ.Paragraphs(НомерПараграфа).Range.Font.Size = 12; // размер шрифта Документ.Paragraphs(НомерПараграфа).Range.Font.Bold = 0; // обычный шрифт Документ.Paragraphs.Item(НомерПараграфа).Format.Alignment=0; // лево
Использование шаблонов Word в 1С
В работе программиста 1С, данный функционал требуется крайне редко, хотя благодаря нему можно решать довольно сложные задачи с динамическими и не постоянными печатными формами. При реализации данной задачи, работа по созданию шаблонов Word и расстановке закладок в шаблоне Word возлагается на пользователей 1C.
В данном примере будет показано, как используя механизмы 1С и документа Word в качестве шаблона, можно создать печатную форму для вывода данных, пользователям программы 1С.
Создадим шаблон на основе документа Word для 1С. Сначала необходимо включить показ закладок для более удобной работы с документом:

Далее необходимо в файл шаблона для 1С, добавить текст и пару закладок. Закладка добавляется через меню «Вставка» — «Закладка». Нужно выделить текст закладки, скопировать его, открыть меню «Вставка — Закладка», вставить скопированный текст закладки и нажать «Добавить»: Когда файл шаблона Word готов, создаем новую внешнею обработку в 1С, добавляем форму и в модуле формы вставляем следующий код:

В результат запуска внешней обработки 1С по формированию печатной формы на основе шаблона в виде файла Word, мы получим следующий результат:
Информацию по методам COM объекта Word, а так же дополнительные данные можно узнать из MSDN.
Дополнение к заметке Использование шаблонов Word в 1С
Хочу выразить признательность всем, кто оставляет комментарии под записью. Благодаря вашим отзывам, информация обогащается новыми сведениями и станет полезной для более широкой аудитории.
1. А как поменять размер шрифта во вставляемом тексте? Достаточно изменить размер шрифта закладки, в шаблоне. А вот, если необходимо динамически менять размерность, тогда:
//Обновляем закладку3 на сегодняшнюю дату ШаблонВорд.Bookmarks("Закладка3").Select(); ШаблонВорд.Application.Selection.Font.Bold = 1; ШаблонВорд.Application.Selection.Font.Size = 20; ШаблонВорд.Application.Selection.TypeText(ТекущаяДата());
2. Картинки есть возможность выгружать в шаблон? Да, конечно. Примеры для C# и VB описаны по ссылке: https://msdn.microsoft.com/ru-ru/library/ms178792.aspx, а для 1С код будет следующий:
// Добавление изображения ШаблонВорд.Bookmarks("Закладка3").Select(); ШаблонВорд.Application.Selection.InlineShapes.AddPicture("C:UsersКонстантинDesktoplogo_1c.png");
4. Подскажите пожалуйста еще почему при сохранении макета типа active document в файл word кодом:
Я получаю вместо нормального документа вот такой http://prntscr.com/eshgjk Предполагаю, что метод Записать( , ) по умолчанию, записывает файл в формате MXL. Попробуйте вторым параметром установить значение: ТипФайлаТабличногоДокумента.DOCX, более подробно описано в «Синтакс-помощнике».
5. У меня в документе есть ссылки на файлы которые расположены на сетевом диске. Как в шаблоне сделать гиперссылку на эти файлы? Интересный вопрос, если попробовать сделать запись макроса и посмотреть результат, то в Visual Basic добавление гиперссылки будет выглядеть следующим образом:
Sub Макрос1() ‘ ‘ Макрос1 Макрос ‘ ‘ Selection.MoveLeft Unit:=wdCharacter, Count:=15, Extend:=wdExtend ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, Address:= _ "C:UsersКонстантинDesktopТест.txt", SubAddress:="", ScreenTip:="", _ TextToDisplay:="СсылкаДляТеста" End Sub
Соответственно код для 1С следующий:




