Добрый день. Опять к Вам на поклон. Такое дело... Из 1С я открываю Эксель-файл (как положено). И в этом файле запускаю сперва один макрос, затем второй. И начиная с определенных строк макроса №2, в 1С появляется сообщение об ошибке. Если закомментировать эти строки, сообщения об ошибке НЕ возникает, но это строки нужные и в рабочем файле они должны быть раскомментированы. Причем, когда я запускаю этот макрос НЕ из 1С, а как обычно, открыв этот файл в Экселе, то все нормально отрабатывается, как и задумано. Эксель при этом ни на что не жалуется. Да и когда 1С жалуется на ошибку, Эксель--ни в одном глазу. Вот.
Сообщение 1С об ошибке такое: {Форма.Форма.Форма(116)}: Ошибка при вызове метода контекста (Run): Произошла исключительная ситуация (0x800a9c68)
Добрые люди, помогите, пожалуйста. PS. В коде вложенного файла я отметил начало проблемных строк.
Sub В_отдельную_книгу()
Application.ScreenUpdating = False 'отключаем обновление экрана.
Application.Calculate 'пересчет формул, на всякий случай.
With ThisWorkbook
'''''''''''''''''''''''БЛОК КОРРЕКЦИИ В СЛУЧАЕ ДОБАВЛЕНИЯ НОМЕКЛАТУРЫ'''''''''''''''''''''''''''''''''
.Sheets("Шаблон").Range("E8:E111").Value = .Sheets("Ф_Transit").Range("I10:I113").Value 'ЛИМИТ НА максимальное ЧИСЛО НОМЕНКЛАТУР.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
.Sheets("Шаблон").Copy Before:=.Sheets(1)
.Sheets("Шаблон (2)").Name = "Лист1" 'и он активируется.
' ActiveSheet.Range("B1").Select ' - не надо.
Prefix = "C:\1С_Форт_ЗАКАЗЫ_ПОСТАВЩИКАМ_на_отправку\" 'его в новую книгу по адресу...
Контрагент = .Sheets("Ф_Transit").Range("B1")
tdat = Format(Now, "dd_mm_yyyy HH_MM")
Suffix = ".xls"
NewFileName = Prefix & Контрагент & "__" & tdat & Suffix
.Sheets("Ф_Transit").[L10].Value = NewFileName '''''''''
.Sheets("Лист1").Copy ' это Заказ_Поставщику.
End With
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs NewFileName, FileFormat:=xlExcel8
ActiveWorkbook.Close 'закрытие сделанного Эксель-варианта Заказа.
ThisWorkbook.Close True 'закрытие с сохранением. И это уже сам файл Шаблон.
End Sub
Скорее всего потеря связи 1с с excel. Возможно книга сохраняется долго. В винде сделано так,если сом объект не отвечает в течении минуты-получите ошибку. Если результат приемлем, обработайте ошибку и все.
kuklp, Doober, спасибо, что отозвались. Ре kuklp. Не помогает. Все по прежнему. Ре Doober. Книга маленькая. Вся работа в ней, вместе с сохранением занимает около 2-3 секунд.
Для 1С вот эта запись: Sheets("Ф_Transit").[L10].Value = NewFileName ни о чем не говорит. С точки зрения 1С "[L10]" - это непонятное свойство/метод, а для экселя - неявный вызов команды Evaluate.
Как вариант: "xlExcel8" - это константа экселя, 1С про нее ничего не знает + попробуйте записать "Контрагент = Sheets("Ф_Transit").Range("B1").Value". И лучше использовать "ActiveWorkbook.Sheets" вместо "Sheets".
Процедура КнопкаВыполнитьНажатие(Кнопка)
Книга = "";
Если ЗначениеЗаполнено(Регистратор) И ЗначениеЗаполнено(Поставщик) Тогда
Запрос = Новый Запрос ("ВЫБРАТЬ
| ЗаказПоставщикуТовары.Номенклатура,
| ЗаказПоставщикуТовары.Количество,
| НоменклатураКонтрагентов.НомерСтрокиЭксельПрайса,
| ЗаказПоставщикуТовары.Номенклатура.Код
|ИЗ
| Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
| ПО ЗаказПоставщикуТовары.Номенклатура = НоменклатураКонтрагентов.Номенклатура
| И ЗаказПоставщикуТовары.Ссылка.Контрагент = НоменклатураКонтрагентов.Контрагент
|ГДЕ
| ЗаказПоставщикуТовары.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка",Регистратор);
ТЗ = Запрос.Выполнить().Выгрузить();
Для каждого ТекСтрока Из ТЗ Цикл
Текст = "";
Если ТекСтрока.НомерСтрокиЭксельПрайса = 0 Тогда
Текст = Текст + ТекСтрока.Номенклатура + "..." + ТекСтрока.Номенклатура.Код + Символы.ПС
КонецЕсли;
КонецЦикла;
Если Текст <> "" Тогда
Сообщить ("Формирование Эксель-Формы ОТМЕНЕНО, т.к. среди товаров в документе есть товары, для которых НЕ заполнено поле" + Символы.ПС + "''Номер СТРОКИ Эксель-прайса'' (в регистре сведений ''Номенклатура контрагентов'')." + Символы.ПС + "Либо НЕ верно был выбран поставщик в этой форме." + Символы.ПС + "Проблемные товары:" + Символы.ПС + Текст);
Возврат;
КонецЕсли;
//Если для всех позиций есть НомерСтрокиЭксельПрайса, то формируем Заказ.
Попытка
Контрагент = Регистратор.Контрагент;
Дистрибьютор = Регистратор.Организация;
АдресДоставки = "Склады";
ДатаЗаказа = Формат(ТекущаяДата(), "ДЛФ=Д"); // 01.01.2005
ДатаДоставкиЖелаемая = ДатаЗаказа;
КонтактноеЛицоДляПолучения = Регистратор.Ответственный;
Телефон = "(066) 777-77-77";
НомерДока = Регистратор.Номер;
//Сообщить (Организация);
Попытка
Эксель = Новый COMОбъект("Excel.Application"); // для v7 код будет: Эксель = СоздатьОбъект("Excel.Application");
Исключение
Эксель.Quit(); //закрыли приложение.
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
ВыбратьШаблонЗаказа(Книга,Эксель);
Эксель.Run("Очистить");
Лист = Книга.WorkSheets("Ф_Transit");
//////////////Лист.Cells.ClearContents();//очищаем весь лист (содержимое).
//ЭксельЗначение = ЭксельОбъект.Clean(ЭксельЛист.Cells(2,2).Value); //очищаем ячейку (содержимое).
Лист.Cells(1, 2).Value = Строка(Контрагент);
Лист.Cells(2, 2).Value = Строка(Дистрибьютор); // Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение;
Лист.Cells(3, 2).Value = АдресДоставки;
Лист.Cells(4, 2).Value = Строка(ДатаЗаказа);
Лист.Cells(5, 2).Value = Строка(ДатаДоставкиЖелаемая);
Лист.Cells(6, 2).Value = Строка(КонтактноеЛицоДляПолучения);
Лист.Cells(7, 2).Value = Строка(Телефон);
Лист.Cells(1, 3).Value = Строка(НомерДока);
//Лист.Cells(8, 2).Value = Строка(Телефон);
//Более 8-й строки нельзя (нет места). При необходимости писать в следующие колонки.
i = 10; //заполняем, начиная с 10-й.
Для Каждого Стр из ТЗ Цикл
Лист.Cells (i,2).Value = Строка(Стр.НомерСтрокиЭксельПрайса);
Лист.Cells (i,3).Value = Число(Стр.Количество);
i = i + 1;
КонецЦикла;
Эксель.Visible = Истина;
//'excel.run("testmacro.xls!SetColors",ActiveWorkbook,15,15395562);
//Эксель.run("Вомонд_ШаблонЗаказаПоставщику_Форт.xlsb!Start",Книга,15,15395562);
Эксель.Run("Start");// готовим файл-клон заказа. Если все Ок, то оба эксель-файла закрываем.
ФайлКлон = Книга.WorkSheets("Ф_Transit").Cells(10, 12).Value;
Сообщить ("Эксель-вариант Заказа поставщику " + ФайлКлон + " создан.");
Эксель.Quit(); //закрыли приложение.
Исключение
Эксель.Quit(); //закрыли приложение.
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Иначе
Предупреждение("Заполните, пожалуйста, оба поля.");
КонецЕсли
КонецПроцедуры
........
Код
Процедура ВыбратьШаблонЗаказа(Книга,Эксель)
Если Поставщик = "ВОМОНД" Тогда
Книга = Эксель.WorkBooks.Open("C:\1С_Форт_ШАБЛОНЫ_Экспорт\ШаблоныПоставщиков\Вомонд_ШаблонЗаказаПоставщику_Форт.xlsb"); //ПолноеИмяФайла.
//Возврат
КонецЕсли;
КонецПроцедуры
Немного ошибся, с книгой Интересно девки пляшут , сделать книге харакири и потом заставлять ее что-то делать
Скрытый текст
Код
Sub В_отдельную_книгу()
Application.ScreenUpdating = False 'отключаем обновление экрана.
Calculate 'пересчет формул, на всякий случай.
'''''''''''''''''''''''БЛОК КОРРЕКЦИИ В СЛУЧАЕ ДОБАВЛЕНИЯ НОМЕКЛАТУРЫ'''''''''''''''''''''''''''''''''
Sheets("Шаблон").Range("E8:E111").Value = 0 'протягиваем 0 в Шаблоне.
Sheets("Ф_Transit").Range("I10:I113").Copy 'ЛИМИТ НА максимальное ЧИСЛО НОМЕНКЛАТУР.
Sheets("Шаблон").Range("E8:E111").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False 'вставили значения в Шаблон.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sheets("Шаблон").Copy Before:=Sheets(1)
Sheets("Шаблон (2)").Name = "Лист1" 'и он активируется.
ActiveSheet.Range("B1").Select 'просто снимем выделение с остального.
Prefix = "C:\1С_Форт_ЗАКАЗЫ_ПОСТАВЩИКАМ_на_отправку\" 'его в новую книгу по адресу...
Контрагент = Sheets("Ф_Transit").Range("B1")
tdat = Format(Now, "dd_mm_yyyy HH_MM")
Suffix = ".xls"
NewFileName = Prefix & Контрагент & "__" & tdat & Suffix
Sheets("Ф_Transit").Range("L10").Value = NewFileName '''''''''
ActiveSheet.Copy ' это Заказ_Поставщику.
Application.DisplayAlerts = False
Set wb = ActiveSheet.Parent
wb.SaveAs Filename:=NewFileName _
, FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False
wb.Close SaveChanges:=False 'закрытие сделанного Эксель-варианта Заказа.
ThisWorkbook.Save
End Sub
Sub Start()
If Sheets("Ф_Transit").Range("B10").Value <> "" Then
Application.ScreenUpdating = False 'отключаем обновление экрана.
Application.DisplayAlerts = False
Dim sh As Worksheet
For Each sh In Worksheets
If sh.Name = "Лист1" Then
ЭтаКнига.Worksheets("Лист1").Delete 'удалить такой лист, если он уже есть.
End If
Next sh
В_отдельную_книгу
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Else
MsgBox "Таблица значений Заказа Поставщику пустая! Файл не создан."
End If
End Sub
В 1С
Код
Эксель = Новый COMОбъект("Excel.Application");
Эксель.Visible = True;
//------------------------------
// много кода
//-------------------------------
Эксель.Run ("Start");
ФайлКлон = Книга.WorkSheets("Ф_Transit").Cells(10, 12).Value;
Книга.Close (False);
Doober, я рад помощи. Спасибо большое за внимание. Пока не могу попробовать код с Вашими правками. Жду пока раздуплится сервер. Можно попросить Вас прокомментировать кое-что? 1) Ошибка была в том, что раз основная книга открывалась в 1С-ке, то и закрываться она должна в ней, а не в Экселе? Так? 2) А где в синтакс-помощнике "живет" ".Close" для Книги? Я поискал в функциях для работы с файлами и не нашел... 3) Насколько принципиально использовать именно Ваш кусок? Будет ли он поддерживать сохранение файла в другом экселевском формате?
Попробовал. Работает!!! Спасибо. По поводу "2.Не совсем понял вопрос.". Ну, я не нашел в 1С-ке такого метода или свойства. Потому спрашиваю. Теперь подозреваю, что 1С-ка просто использует ".Close", которое является "собственностью" Экселя.