Работа с Excel в 1С 8.3

Excel — это сторонняя программа, ее можно запускать из 1С в невидимом и видимом режиме и пользоваться всеми возможностями. Excel должен быть установлен на компьютере. Для примера приведено чтение таблицы в из файла Excel на клиенте, передача на сервер и создание на сервере таблицы значений с данными из файла. Такую задачку любят давать на собеседованиях на должность программиста 1С.

&НаКлиенте
Процедура НажатиеКноки()
// обращаемся к Excel
Попытка

     Эксель = новый COMОбъект(«Excel.Application»);
Исключение

Сообщить(ОписаниеОшибки());
     Возврат;
КонецПопытки;
ПутьКФайлу = «C:\Некоторый файл.xlsx»;
// открываем ексель файл
Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
// переходим на первую страницу
Лист = Книга.WorkSheets(1);
// для количества колонок и строк в экселе есть специальные ячейки
ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;

// сохраняем файл в массив строк, где строка это так же массив (на клиенте
// нельзя создавать таблицу значений
НаборСтрокФайла = новый массив;
для Строка = 1 по ВсегоСтрок цикл
     МассивСтрока = новый массив;
     для Колонка = 1 по ВсегоКолонок цикл
// получаем значение из ячейки excel

          Значение = СокрЛП(Лист.Cells(Строка,Колонка).Value); 
          МассивСтрока.Добавить(Значение);
         КонецЦикла;
     НаборСтрокФайла.Добавить(МассивСтрока);
КонецЦикла;
// запишем файл с другим именем

Эксель.SaveAs(«C:\ФайлСДругимИменем.xlsx»);
// закрываем ексель, иначе он останется висеть в памяти
Эксель.Application.Quit();

КонецПроцедуры

&НаСервере
Процедура СоздатьИОбработатьТаблицуЗначений(НаборСтрокФайла, ВсегоКолонок)
     ТЗ = новый ТаблицаЗначений;
     // создаем колонки таблицы значений (столько сколько в файле ексель)
     для й=1 по ВсегоКолонок цикл
          ТЗ.Колонки.Добавить(«кол» + Формат(й,«ЧЦ=4; ЧГ=»));
     КонецЦикла;
     // переносим строки из массива в таблицу значений
     для каждого МассивСтрока из НаборСтрокФайлацикл
          НовСтрока = ТЗ.Добавить();
          для Колонка = 1 по ВсегоКолонок цикл
// переносим значение из массива в таблицу
               НовСтрока[Колонка1] = МассивСтрока[Колонка1]; 
          КонецЦикла;
     КонецЦикла;

КонецПроцедуры

Далее приводятся наиболее частые ситуации, возникающие на

Поиск и замена текста в ячейках файла Excel

//Выбираем область поиска — весь лист
ОбластьПоиска = Лист.Cells;
// Начинаем поиск с левого верхнего угла
НачалоЛиста =Лист.Cells(1, 1);
// Ищем ячейку с текстом «привет»
ОбластьПараметр = ОбластьПоиска.Find(«привет», НачалоЛиста);
// Если нашли вывсодим найденую строку
Если ОбластьПараметр <> неопределено Тогда
     Сообщить(ОбластьПараметр.Value);
КонецЕсли;

Работа со строками в Excel

//Выбираем первую строку
НачальнаяСтрока = Лист.Cells(1, 1);
// Выделяем всю строку
НачальнаяСтрока .EntireRow.Select();
// Копируем выделенное
НачальнаяСтрока .EntireRow.Copy();
// Вставляем (новая строка будет вставлена тут же)
НачальнаяСтрока .EntireRow.Insert();
// Удалим строку
НачальнаяСтрока .EntireRow.Delete();

Прочие полезные методы Excel

Эксель.Visible = Видимость; 0 — Excel не виден, 1 — виден.
Книга = Эксель.WorkBooks.Add(); Создание новой книги (файла) Excel.
Книга.SaveAs(ИмяФайла); Сохранение книги Excel.
Лист = Книга.WorkSheets.Add(); Добавление нового листа в книгу.
Книга = Эксель.WorkBooks.Open(ИмяФайла); Открытие существующей книги (файла) Excel.
Лист = Книга.WorkSheets(НомерЛиста); Установка листа в качестве рабочего с номером НомерЛиста.
Лист.Name = ИмяЛиста; Задание рабочему листу имени ИмяЛиста
Лист.PageSetup.Zoom = Масштаб; Задание параметра страницы «Масштаб» (от 10 до 400).
Лист.PageSetup.Orientation = Ориентация; Ориентация: 1 — книжная, 2 — альбомная.
Лист.PageSetup.LeftMargin = Эксель.CentimetersToPoints(Сантиметры); Задание левой границы (в сантиметрах).
Лист.PageSetup.TopMargin = Эксель.CentimetersToPoints(Сантиметры); Задание верхней границы (в сантиметрах).
Лист.PageSetup.RightMargin = Эксель.CentimetersToPoints(Сантиметры); Задание правой границы (в сантиметрах).
Лист.PageSetup.BottomMargin = Эксель.CentimetersToPoints(Сантиметры); Задание нижней границы (в сантиметрах).
Лист.Columns(НомерКолонки).ColumnWidth = Ширина; Задание ширины колонке.
Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение; Ввод данных в ячейку.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Name = ИмяШрифта; Установка шрифта в ячейке.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Size = РазмерШрифта; Установка размера шрифта в ячейке.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Bold = Жирный; 1 — жирный шрифт, 0 — нормальный.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Italic = Курсив; 1 — наклонный шрифт, 0 — нормальный.
Лист.Cells(НомерСтроки,НомерКолонки).Font.Underline = Подчеркнутый; 2 — подчеркнутый, 1 — нет.
Лист.Cells(НомерСтроки, НомерКолонки).NumberFormat = Формат; Установка формата данных ячейки.
Лист.Cells(НомерСтроки,НомерКолонки).Borders.Linestyle = ТипЛинии; Установка рамок ячейки. 1 — тонкая сплошная.
Лист.Protect(); Установка защиты на лист
Лист.UnProtect(); Снятие защиты с листа
Лист.Cells(Строка, Столбец).Locked=0; Ячейка будет доступной (и после установки защиты на лист)
Эксель.DisplayAlerts = False; Убрать все сообщение при открытии файла. Сообщения останавливают выполнения кода до реакции пользователя

1С 8.3 иерархический фильтр в управляемой форме выбора

Отборы в списках управляемых форм имеют особенность вязанную с иерархией —  если в качестве отбираемого элемента стоит некоторый подчиненный (не корневой) элемент, например, эл 2.1, то в форме выбора не отобразится ничего, т.к. вышестоящие элементы (Эл 2) в отборе не участвуют. Пример — разрешить выбирать статьи затрат только в иерархии эл 2.1:

Корень
* Эл 1
* * Эл 1.1
* * Эл 1.2
* Эл 2
* * Эл 2.1
* * * Эл 2.1.1
* * * Эл 2.1.2
* * Эл 2.2

Неправильно будет просто указать все подчиненные элементы Эл 2.1 в отборе для формы, пример:

&НаКлиенте
Процедура НажаниеКнопкиВыбора()
     Отбор = новый Структура(«Ссылка»,   ПолучитьСписокПодчиненныхСтатейЗатрат(ПредопределенноеЗначение(«Справочник.СтатьиЗатрат.Эл_2_1»)));
     ОткрытьФорму(«Справочник.СтатьиЗатрат.ФормаВыбора», Новый     Структура(«Отбор», Отбор), Элемент);
КонецФункции

&НаСервере
Функция ПолучитьСписокПодчиненныхСтатейЗатрат(СЗ)
Список = новый СписокЗначений;
     Запрос = Новый Запрос;
     Запрос.Текст = «ВЫБРАТЬ
          | СтатьиЗатрат.Ссылка
          |ИЗ
          | Справочник.СтатьиЗатрат КАК СтатьиЗатрат
          |ГДЕ
          | НЕ СтатьиЗатрат.ПометкаУдаления
          | И СтатьиЗатрат.Ссылка В ИЕРАРХИИ(&Ссылка)»;
     Запрос.УстановитьПараметр(«Ссылка»,СЗ);
Список.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(«Ссылка»));
Возврат Список;
КонецФункции

Правильно будет в функции ПолучитьСписокПодчиненныхСтатейЗатрат дополнительно в выбранный список подчиненных элементов добавить родительские:

Родитель = СЗ.Родитель;
пока ЗначениеЗаполнено(Родитель) цикл
     Список.Добавить(Родитель);
     Родитель = Родитель.Родитель;
КонецЦикла;

Таким образом в окне выбора появится кусок дерева с теми элементами, которые нужны.

 

Создание письма в Outlook при помощи 1C

Платформа 1С 8 позволяет создавать сообщения в электронной почте и отображать его на экране, непосредственно отправка осуществляется самим пользователем после просмотра содержимого письма.
Что нужно:
Установленный на компьютере Outlook.

Сформируем электронное письмо двум адресатам и прикрепим к письму картинку:

Outlook = Новый COMОбъект(«Outlook.Application»);
// создаем письмо
ПисьмоOutlook = Outlook.CreateItem(0);
// добавляем адресатов
ПисьмоOutlook.Recipients.Add(«my.friend@mail.ru»);
ПисьмоOutlook.Recipients.Add(«my.girlFriend@mail.ru»);
// тема письма
ПисьмоOutlook.Subject = «Это тема письма»;
// текст письма
ПисьмоOutlook.Body = «Это текст письма»;
// прикрепляем картинку
ПисьмоOutlook.Attachments.Add(«c:\myPicture.jpg»);
// показываем письмо на экране, пользователь отправит его сам
Попытка
     ПисьмоOutlook.Display();
Исключение
     Сообщить(«Не удалось открыть письмо.»);
КонецПопытки;

На экране появится окно Outlook:

Outlook

Работа с FTP в 1С

FTP (file transfer protocol)- это просто интернет ресурс с файлами, который позволяет делать с файлами следующее:

  1. Чтение
  2. Копирование
  3. Перемещение
  4. Удаление

Для соединения с сервером нам надо знать его адрес в сети, логин и пароль, затем  скопируем файл с локального диска на ftp:

адрес: myServer.myCompany.ru
логин: myLogin
пароль: myPassword

Код 1C для работы с FTP будет следующий:

АдресФТП = «myServer.myCompany.ru«;
Юзер = «myLogin«;
Пароль «myPassword«;
КаталогФТПКудаКопируем = «/MyFolder/«; // обратите внимание на обратный слэш
ФайлОткудаКопируем = «c:\myFile.txt»;
Попытка
     Сервер = Новый FTPСоединение(АдресФТП,,Юзер, Пароль);
Исключение
     Сообщить(«Не удалось соединиться с ftp — сервером»);
     Возврат;
КонецПопытки;
Сообщить(«Соединение установлено»);
// переходим в нужный каталог на ftp
Сервер.УстановитьТекущийКаталог(КаталогФТПКудаКопируем);
// копируем файл с локального диска на ftp
Сервер.Записать(ФайлОткудаКопируем,  «myFile.txt»);
// копируем этот же файл обратно c FTP на локальный диск и присваиваем ему другое имя
Сервер.Получить(КаталогФТПКудаКопируем«myFile.txt», «c:\myFile_Copy.txt»);
// выводим список всех файлов и папок на FTP
МассивФайлов = Сервер.НайтиФайлы(КаталогФТПКудаКопируем , «*.*»);
Для Каждого Файл Из МассивФайлов Цикл
     Если Файл.ЭтоФайл() Тогда
          Сообщить(«Файл: « + Файл.ПолноеИмя);
     Иначе
          Сообщить(«Папка: « + Файл.ПолноеИмя);
     КонецЕсли;
КонецЦикла;
// удаляем наш файл с FTP
Сервер.Удалить(КаталогФТПКудаКопируем , «myFile.txt»);
// закрываем соединение с FTP
Сервер = Неопределено; 

 

Автоматизация выгрузки последней версии хранилища

В условиях высокой загруженности при коллективной разработке с использованием хранилища 1С часто приходится выгружать последнюю версию конфигурации для отправки/объединения с рабочей базой. Самая частая ошибка разработчика при такой выгрузке — забывают получать последнюю версию из хранилища. Для автоматизации этого процесса можно воспользоваться bat файлом или параметрами командной строки. Пусть у нас есть следующее:

1c: версия 8.3.6.2152

сервер: server, база: base, пользователь: BaseUser, пароль: BasePassword

файловое хранилище: c:\hran, пользователь: HranUser, пароль: HranPassword

папка и имя файла, куда выгружается конфигурация: \\mainServer\MainFolder\_config_.cf

Bat файл (перечень команд) делает следующее:

  1. Удаляет старый файл конфигурации
  2. Получает последнюю версию конфигурации из хранилища
  3. Обновляет конфигурацию БД (накатывает на конфигурацию БД)
  4. Выгружает конфигурацию в файл

Итак — по порядку:

Удаление старого файла конфигурации
del «\\mainServer\MainFolder\_config_.cf«

Получение последней версии конфигурации из хранилища
C:\»Program Files (x86)»\1cv8\8.3.6.2152\bin\1cv8.exe CONFIG /S»server\base» /N»BaseUser» /P»BasePassword» /ConfigurationRepositoryF «c:\hran» /ConfigurationRepositoryN «HranUser» /ConfigurationRepositoryP «HranPassword» /DisableStartupMessages /ConfigurationRepositoryUpdateCfg

Обновление конфигурации БД
C:\»Program Files (x86)»\1cv8\8.3.6.2152\bin\1cv8.exe CONFIG /S»server\base» /N»BaseUser» /P»BasePassword» /ConfigurationRepositoryF «c:\hran» /ConfigurationRepositoryN «HranUser» /ConfigurationRepositoryP «HranPassword» /DisableStartupMessages /UpdateDBCf

Выгружает конфигурацию в файл
C:\»Program Files (x86)»\1cv8\8.3.6.2152\bin\1cv8.exe CONFIG /S»server\base» /N»BaseUser» /P»BasePassword» /ConfigurationRepositoryF «c:\hran» /ConfigurationRepositoryN «HranUser» /ConfigurationRepositoryP «HranPassword» /DisableStartupMessages /DumpCfg «\\mainServer\MainFolder\_config_.cf»

В некоторых случаях можно запустить обработку для выполнения каких либо дополнительных действий, для этого можно в bat файл добавить команду:
C:\»Program Files (x86)»\1cv8\8.3.6.2152\bin\1cv8.exe ENTERPRISE /S»server\base» /N»BaseUser» /P»BasePassword» /DisableStartupMessages /Execute «\\mainServer\MainFolder\obrabotka.epf»

Для того что бы программа закрылась в обработке последней должна вызываться процедура ЗавершитьРаботу();