Печатная форма сохраняет ТабДок в эксель. Это работает, когда я открываю её через файл->открыть, и перестаёт работать, когда подключаю как внешнюю печатную форму в базу (erp).
Неправильно реализована серверная процедура Печать() ?
&НаКлиенте
Процедура Печать(Команда) Экспорт
ТабДок = ПечатьНаСервере();
ИмяПартнераДляФайла = стрзаменить(Строка(Объект.СсылкаНаОбъект)," ","");
ИмяПартнераДляФайла = стрзаменить(ИмяПартнераДляФайла,".","");
ИмяПартнераДляФайла = стрзаменить(ИмяПартнераДляФайла,"""","");
ИмяФайла = сокрлп("Бланк_заказа_"+ИмяПартнераДляФайла+"_")+".xls";
Режим = РежимДиалогаВыбораФайла.Сохранение;
ДиалогСохраненияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогСохраненияФайла.ПолноеИмяФайла = ИмяФайла;
Фильтр = "Excel(*.xls)|*.xls";
ДиалогСохраненияФайла.Фильтр = Фильтр;
ДиалогСохраненияФайла.МножественныйВыбор = Ложь;
ДиалогСохраненияФайла.Заголовок = "Выберите файл";
Если ДиалогСохраненияФайла.Выбрать() Тогда
ПутьКФайлу = ДиалогСохраненияФайла.ПолноеИмяФайла;
КонецЕсли;
Попытка
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLS);
Сообщить("Файл записан: " + ПутьКФайлу);
Исключение
сообщить("При сохранении файла произошла ошибка");
КонецПопытки;
#Область ФормированиеExcel
Эксель = Новый COMОбъект("Excel.Application");
Эксель.Application.DisplayAlerts = False;
Эксель.Application.ReferenceStyle = "xlR1C1";
Эксель.Application.ErrorCheckingOptions.InconsistentFormula = Ложь;
//Книга = Эксель.WorkBooks.Add();
Книга = Эксель.Workbooks.Open(ПутьКФайлу);
Лист = Книга.WorkSheets(1);
ВсегоКолонок = ТабДок.ШиринаТаблицы;
ВсегоСтрок = ТабДок.ВысотаТаблицы;
МассивКом = Лист.Range(Лист.Cells(1, 1), Лист.Cells(ВсегоСтрок, ВсегоКолонок)).FormulaR1C1;
Для Ном = 1 По МассивКом.GetLength(0) Цикл
Для Ном2 = 1 По МассивКом.GetLength(1) Цикл
Значение = МассивКом.GetValue(Ном,Ном2);
Если НЕ Найти(Значение, "") = 0 Тогда
МассивКом.SetValue(Ном, Ном2, СтрЗаменить(Значение, "", ""));
КонецЕсли;
Если СтрНачинаетсяС(Значение, "=") Тогда //Формулам зададим формат...
Ячейка = Лист.Cells(Ном2,Ном);
Ячейка.NumberFormat = "# ##0,00;-# ##0,00;""""";
КонецЕсли;
КонецЦикла;
КонецЦикла;
Лист.Range(Лист.Cells(1, 1), Лист.Cells(ВсегоСтрок, ВсегоКолонок)).FormulaR1C1 = МассивКом; //Если тут ошибка, то скорее всего косяк в формуле
Книга.SaveAs(ПутьКФайлу);
Эксель.Quit();
Эксель = Неопределено;
#КонецОбласти
КонецПроцедуры
&НаСервере
Функция ПечатьНаСервере()
ТекОбъект = РеквизитФормыВЗначение("Объект");
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(ТекОбъект.СсылкаНаОбъект);
ОбъектыПечати =Новый СписокЗначений;
ОбъектыПечати.ЗагрузитьЗначения(МассивОбъектов);
ТабДок = ТекОбъект.ПечатьДокумента(МассивОбъектов,ОбъектыПечати);
Возврат ТабДок;
КонецФункции
Так у вас ошибка, слишком много фактических параметров, у вас у процедуры Печать один параметр(команда), а в процедуре вызова два параметра.
У вас в клиентскую процедуру печать должны входить два параметра Идентификатор печати и объекты назначения. Вы должны брать документы для печати из второго параметра Объекты Назначения.
1) &НаКлиенте Печать(Команда) - это сейчас для кнопки(команды), ее отвязать от команды. Для команды сделать другую процедуру.
2) Переделать под БСП процедуру Печать(...)
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
Объект.СсылкаНаОбъект = ОбъектыНазначенияМассив[0];
// далее как было
ТабДок = ПечатьНаСервере();
// и т.д.
...
КонецПроцедуры
Проблема в том, что на сервере нет Excel. Поэтому Ваш вариант из модуля обработки выдаст ошибку, когда попробует выполнить в частности вот такое чудо
Эксель = Новый COMОбъект("Excel.Application");
Автору вопроса нужен клиентский вариант. Поскольку с подключением дополнительной обработки проблем не возникло и, судя по ошибке, из БСП уже идет вызов клиентской экспортной процедуры Печать() - значит СведенияОВнешнейОбработке() уже написаны и свое отрабатывают, их пока не нужно трогать.
Пока достаточно поправить параметры клиентской процедуры Печать() и дописать одну строчку, как я указал в (3)
текущий вопрос частично был снят, но есть другой: возможно ли при таком сохранении в эксель защитить часть листа книги от редактирования (доступными оставить список ячеек)?
(7)Возможно всё что делаешь и в екселе, сделать и из 1с - задать снять пароли, внести формулы, защитить\снять защиту и тп, главное подобрать нужную команду екселя. Какие есть команды всегда смотрел в МСДН(на аглицком, понятное дело).
(12) А еще можно распаковать XLSX архив, внести требуемые изменения в xml-файлы, из которых он состоит, и снова их запаковать в XLSX - тогда даже COM-Excel не нужен.