Подпишись и читай
самые интересные
статьи первым!

Windows error: ошибка исполнения функции, решаем за минуту. Windows error: ошибка исполнения функции, решаем за минуту 1с 7.7 неисправимая ошибка

Добрый день!. В прошлый раз мы с вами разобрали, как решается "Ошибка применения преобразований . Проверьте правильность путей указанных преобразований", сегодня я расскажу, о еще одном последствии из-за нее. Темой публикации будет ситуация, когда вы не сможете установить платформу 1С и будите получать сообщение: Windows error: ошибка исполнения функции , решаем за минуту, уверен тема будет для многих полезной.

Как выглядит ошибка исполнения функции

Как я и писал выше, она у меня возникает на терминальном сервере Windows Server 2012 R2 , при попытке установить платформу 1С 8.2. Запустив файл setup.exe, появляется окно мастера установки, и сразу же дополнительное окно с сообщением:

Windows error: ошибка исполнения функции

За которой вы получите вот такое уведомление:

Как и в большинстве случаев с платформой 1С, все решается небольшим исправлением в конфигурационных файлах. Во первых включите отображение скрытых папок , так как нужный нам файл по умолчанию не виден. Далее на диске C:\ найдите папку ProgramData .

C:\ProgramData\1C\1CEStat\1CEStat.cfg

Файл 1CEStat.cfg можно открыть с помощью любого текстового редактора, щелкните по нему правым кликом и выберите "Открыть с помощью", а далее удобный для себя редактор.

В файле 1CEStat.cfg найдите параметр , его нужно удалить и сохранить файл.

Если посмотреть логи в просмотре событий , то вы увидите вот такие события.

Код события 1013: Продукт: 1C:Enterprise 8.2 (8.2.19.130) -- Windows Error: Ошибка исполнения функции.

Код события 11708: Продукт: 1C:Enterprise 8.2 (8.2.19.130) -- Операция установки не выполнена.

После того, как мы удалили параметр ADMINISTRATIONFUNC=0, мы получили уже:

Код события 1033: Установщик Windows выполнил установку продукта. Продукт: 1C:Enterprise 8.2 (8.2.19.130). Версия: 8.2.19.130. Язык: 1049. Изготовитель: 1C. Установка завершена с состоянием: 1603.

Думаю, что каждый из программистов "семерочников" хоть раз сталкивался с такой ошибкой. Она может возникать либо во время "объединения конфигураций", либо во время "тестирования и исправления ИБ".

Но далеко не каждый пытался "починить" конфигурацию. В таких случаях обычно или лихорадочно ищут бэкапы, или же (более сложный способ) прибегают к помощи утилиты GComp, которая "по легенде" может вылечить МД, если его просто "разобрать", а потом "собрать", использую функции программы. Действительно, это так. Но не во всех случаях... Как раз такой случай и хотелось бы разобрать в данной статье.

Итак, исходные данные:

- "сломанная конфигурация";

Утилита MDDiags

- Far Manager и плагин DocFile Browser к нему. При помощи этого плагина, можно заходить внутрь МД и работать с его объектами.

Так как Конфигуратор даже отказывается отображать эту "неисправимую ошибку", мы запускаем MDDiags для её или их выявления.

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

У Вас могут быть и другие ошибки, но думаю, что и с ними Вы сможете разобраться, когда будет общее понимание того, как найти ошибку и каким образом её исправить.

1. Ошибка >(\\Journal)

Утилита ясно дала понять, что ошибка наблюдается для 2-х объектов "\\ Journal \ Journal _ Number 212" и "\\ Journal \ Journal _ Number 860". Теперь идем в Far и смотрим там на объекты.


Видим здесь множество объектов и один файл "Container.Contents". В нем хранятся описатели этих самых объектов. После внимательного изучения содержимого файла, мы понимаем, что там нет описателей для 2-х наших объектов.

Добавляем описатели, как показано на рисунке.

Проблема решена.

2. Ошибка ДОКУМЕНТ.ПриходнаяНакладная (\\ TypedText\ UserHelp_ Number434\ Container. Contents)

Идем снова в МД по указанному пути. Раскрываем файл " Container . Contents " и смотрим внимательно на его содержимое.

Сразу же в глаза бросаются странные слова Cgntainer, Contentq, Prmgram. Все верно, это неправильно написанные идентификаторы. Не трудно догадаться, как должно быть верно (если трудно - идем в соседнюю ветку, открываем такой же файл "Container.Contents" и смотрим, как должно быть написано).

3. Ошибка СПРАВОЧНИК .ТиповыеОперации (\\Subconto\Subconto_Number5870\WorkBook\Dialog Stream)

Открываем файл по указанному пути и внимательно смотрим... Все параметры должны быть заключены в кавычки. У одного из параметров вместо "кавычки" стоит "пробел" - исправляем (такая ошибка может возникать, когда в описании одного из элементов объекта (поля, кнопки, списка значений и т.д.) стоит одинарная или двойная кавычка, либо какой-нибудь из "спецсимволов").

Снова запускаем MDDiags и видим, что все предыдущие ошибки исчезли, но появилась другая ошибка .

Вот тут пора обратиться к утилите GComp и проверить "легенду"...

Запускаем утилиту, выбираем наш поломанный (пока еще) МД, и папку, куда следует положить разобранную по объектам конфигурацию, далее все галки по умолчанию, единственное что - устанавливаем галку "удалять пустые шаблоны таблиц" на вкладке "Общие параметры", нажимаем "Декомпилировать".

Затем, не мудрствуя лукаво, переходим на вкладку "компиляция", устанавливаем в качестве исходного каталога тот, в который только что разобрали конфигурацию и указываем путь к новому МД.

Утилита все благополучно соберет.

Теперь нам остается лишь через Far Manager подменить соответствующий файл внутри "поломанного" МД на такой же из "только что собранного" (\\Subconto\Subconto_Number5870\WorkBook\Dialog Stream).

Проверяем еще раз конфигурацию при помощи MDDiags .

Вроде бы все ОК. Теперь заходим в конфигуратор и делаем "тестирование и исправление ИБ", чтобы убедиться, что ошибок больше нет.

На этом всё. Разрешите откланяться. И да пребудет с вами Сила!)

P.S. Отдельное спасибо разработчикам утилит, используемых в примере - они нам всем так помогают жить...

Итак, в чем суть моей статьи?

1. Есть сервер (x64), с установленным Office 2016 (x64), есть 1С 8.3.8 также x64 (имеется в виду сервер 1С). Пользователи подключаются как через тонкого клиента, так и через веб клиент.

2. Есть куча типовых договоров и накладных счет-фактур, оформленных (подготовленных) отделом продаж. Там шрифт, абзац и т.д., естественно, все оформлено в Word,Excel 2016 (x64), естественно, нет желания все это рисовать в 1С, а есть желание засунуть в макеты формата ActiveDocument

Решение банальное, вроде бы :) , не буду описывать весь механизм, как это делается, как заполняются данные из 1С в макет ActiveDocument - думаю, вы это знаете прекрасно и без меня. Но в ходе работы выяснилось, что не все так гладко в царстве COM объектов, а именно:

2. Какой вариант лучше выбрать: ActiveDocument или ДвоичныеДанные? Хотя для меня это звучит примерно как, что выбрать Водку С Пивом или Пиво С Водкой :) . Один фиг, надо забить документы данными из 1С и передать их Клиенту.

Ну да ладно пропустим лирику, я выбираю ActiveDocument, не буду описывать весь алгоритм, просто перечислю "подводные" камни и их решение. Все нижеизложенное это мои личные измышления и в никакой мере не претендуют на истину в последней инстанции. Возможно, вы решили эти проблемы или решите по другому.

1. Камень "первый ". Не работает метод SaveAs (как для MSWord, так и для MSExcel). При попытке записать ДвоичныеДанные 1С просто вылетает. Смотрим фрагмент листинга:

MSWord = Макет.Получить(); Попытка Документ = MSWord.Application.Documents(1); Документ.Activate(); //Далее каким-либо образом получаем данные и заполняем Word-овский документ //Получим путь во временной директории для сохранения туда файла ИмяВрем = ПолучитьИмяВременногоФайла(".docx"); Документ.SaveAs(ИмяВрем); //здесь начинается камень МойДокументВДвоичныхДанных = Новый ДвоичныеДанные(ИмяВрем); //ну а здесь этот камень нафиг выбивает 1С:) MSWord.Application.Quit();

Спасибо огромное.

Создание папок
C:\Windows\SysWOW64\config\systemprofile\Desktop
C:\Windows\System32\config\systemprofile\Desktop
проблему решило. Тема закрыта.

В чем причина? Причина в том, что код

MSWord = Макет.Получить();

Всегда вызывает экземпляр объекта COM (x32) независимо от того какой разрядности Office установлен. Вы никогда не задумывались, почему в макет ActoveDocument нельзя вставить файлы с расширением docx,xlsx

это можно проверить и через ДиспетчерЗадач, но факт есть факт - макет ActiveDocument вызывает неявно экземпляр COM (x32) и поэтому все дальнейшие манипуляции нужно делать учитывая это особенность.

1. Либо сервер и все ПО должно быть x32. Тогда ничего делать (в смысле переписывать код) не надо

2. Либо переписать код, таким образом

// получаем имя временного файла ВремФайл = ПолучитьИмяВременногоФайла("doc"); // этот код точно вызовет экземпляр COM нужной разрядности, в нашем случае x64 Word = Новый COMОбъект("Word.Application"); Word.Displayalerts = 0; ДокументН = Word.Application.Documents.Add(); ДокументН.SaveAs(ВремФайл,0); Word.Quit(); // далее все по старому Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.АктПередачиОборудования."+НазваниеМакета); MSWord = Макет.Получить(); Попытка Документ = MSWord.Application.Documents(1); Документ.Activate(); // здесь что-то делаем, заполняем данные // здесь мы пересохраним наш файл из COM x62 в COM x64 MSWord.Application.Selection.WholeStory(); MSWord.Application.Selection.Copy(); ДокументН = MSWord.Application.Documents.Open(ВремФайл); ДокументН.Activate(); MSWord.Application.Selection.Paste(); ДокументН.SaveAs(ВремФайл,0); ДокументН.Close(); MSWord = Неопределено; Исключение // Если произойдет ошибка выводятся данные об ошибке и объект закрывается. Информация = ИнформацияОбОшибке(); ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка - "+Информация.Описание+" код ошибки - "+СокрЛП(Информация.ИсходнаяСтрока)); MSWord.Application.Quit(); КонецПопытки;

Думаю, тут все понятно, сначала мы создали экземпляр COM нужной разрядности, создали пустой файл и сохранили во временную папку, далее работает с COM x32, заполняем данными и напоследок копируем содержимое всего документа и сохраняем в ранее подготовленный файл.

Все то же самое, но только для Excel

ВремФайл = ПолучитьИмяВременногоФайла("xls"); Excel = Новый COMОбъект("Excel.Application"); Excel.Displayalerts = 0; КнигаН = Excel.WorkBooks.Add(); ЛистН = КнигаН.WorkSheets(1); КнигаН.SaveAs(ВремФайл, -4143); Excel.Quit(); Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.НакладнаяОборудования."+НазваниеМакета); MSExcel = Макет.Получить(); КнигаН = MSExcel.Application.Workbooks.Open(ВремФайл); ЛистН = КнигаН.WorkSheets(1); Попытка WBook = MSExcel.Application.Workbooks(1); Лист = WBook.WorkSheets(1); Лист.Activate(); // что-то делаем, заполняем данными из 1С MSExcel.Application.WorkBooks(1).WorkSheets(1).Cells.Copy(ЛистН.Cells); КнигаН.Save(); КнигаН.Close(); Исключение // Если произойдет ошибка выводятся данные об ошибке и объект закрывается. Информация = ИнформацияОбОшибке(); ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка - "+Информация.Описание+" код ошибки - "+СокрЛП(Информация.ИсходнаяСтрока)); MSExcel.Application.Quit(); КонецПопытки;

ну вот "первый " камень я решил, на сервере x64 с Office x64, все работает точно как часы, без ошибок и не надо создавать никаких папок и все прочее.

Камень "второй ". фрагмент кода

ВремФайл = ПолучитьИмяВременногоФайла("xls");

есть не очень хорошо, потому как идет запись в папку: "c:\Users\ че там....", вообще эта папка всегда в черном списке всех фаерволов, антивирусов и прочее, прочее, хотя бы открыть центр управления безопасностью Word или Excel. Глянем и мы туда

придется возится с этим, иначе есть вероятность появления "странных" ошибок. Поэтому я предлагаю следующее:

1. Открываем Конфигуратор и добавляем новый РегистрСведений

здесь мы будем хранить наши готовые Word, Excel файлы уже заполненные, конечно:

НазваниеМакета - Идентификатор макета

ДокументOffice - ХранилищеЗначений, здесь мы и держим наш готовый файл

2. Дописываем выше написанный код следующим образом:

МЗ = РегистрыСведений.ВременноеХранилищеOffice.СоздатьМенеджерЗаписи(); МЗ.Объект = Выборка.Ссылка; МЗ.НазваниеМакета = НазваниеМакета; МЗ.Прочитать(); МЗ.Объект = Выборка.Ссылка; МЗ.НазваниеМакета = НазваниеМакета; МЗ.ДокументOffice = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ВремФайл)); МЗ.Записать(); УдалитьФайлы(ВремФайл);

Что мы делаем, мы записываем готовый файл в регистр сведений и затем удаляем сам временный файл, решаем проблему "Центра безопасности Word,Excel". Осталось только одно показать этот готовый файл Клиенту (клиент тонкий и веб)

3. Камень "третий " - передача файла клиенту, тут просто выложу весь код, что-то взял из БСП, что-то из Демонстрационная конфигурация "Управляемое приложение", что-то из Инета, но в общем вот код (целиком)

//////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ БСП &НаСервере Функция ПолучитьМакет() ОбъектСсылка = СтруктураДанных.Объект; НазваниеМакета = СтруктураДанных.НазваниеМакета; КлючЗаписи = РегистрыСведений.ВременноеХранилищеOffice.СоздатьКлючЗаписи(Новый Структура("Объект,НазваниеМакета",ОбъектСсылка,НазваниеМакета)); // Адрес = ПолучитьНавигационнуюСсылку(КлючЗаписи,"ДокументOffice"); Возврат Адрес; КонецФункции // &НаКлиенте Процедура ПослеЗапускаПриложения(КодВозврата, ИмяПриложения) Экспорт; // КонецПроцедуры &НаКлиенте Процедура ПослеПолученияФайлов(ПереданныеФайлы, ДополнительныеПараметры) Экспорт Если НЕ ПереданныеФайлы=Неопределено Тогда Для каждого Описание Из ПереданныеФайлы Цикл ОпПослеЗапускаПриложения = Новый ОписаниеОповещения("ПослеЗапускаПриложения", ЭтотОбъект, Описание.Имя); НачатьЗапускПриложения(ОпПослеЗапускаПриложения, Описание.Имя); КонецЦикла; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПослеВыбораКаталога(ВыбранныеФайлы, ИмяКоманды) Экспорт Если ВыбранныеФайлы = Неопределено Тогда Возврат; КонецЕсли; Каталог = ВыбранныеФайлы; ОбщегоНазначенияВызовСервера.СохранитьРабочийКаталог(Каталог); Если ИмяКоманды = "Накладная" Тогда НазваниеМакета = "Накладная" КонецЕсли; СтруктураДанных.Вставить("Каталог", Каталог); ПодключитьОбработчикОжидания("Подключаемый_ПередатьФайлКлиенту",5,Истина); КонецПроцедуры &НаКлиенте Процедура ОткрытьФайлыЧерезРасширение(ИмяКоманды) ОпПослеВыбораКаталога = Новый ОписаниеОповещения("ПослеВыбораКаталога", ЭтотОбъект, ИмяКоманды); Каталог = ОбщегоНазначенияВызовСервера.ПолучитьРабочийКаталог(); Если Каталог = Неопределено ИЛИ Каталог = "" Тогда Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); Диалог.Заголовок = НСтр("ru = "Выбор каталога временного хранения файлов"", "ru"); Диалог.Показать(ОпПослеВыбораКаталога); Иначе ВыбранныеФайлы = Новый Массив; ВыбранныеФайлы.Добавить(Каталог); ВыполнитьОбработкуОповещения(ОпПослеВыбораКаталога, ВыбранныеФайлы); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ОбработатьПодключениеРасширенияРаботыСФайлами(РасширениеПодключено,ДополнительныеПараметры) Экспорт Если РасширениеПодключено Тогда ОткрытьФайлыЧерезРасширение(ДополнительныеПараметры.ИмяКоманды); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура Подключаемый_ПередатьФайлКлиенту() Адрес = ПолучитьМакет(); Если Адрес<>Неопределено Тогда ОтключитьОбработчикОжидания("Подключаемый_ПередатьФайлКлиенту"); НомерДокумента = СтруктураДанных.НомерДокумента; Каталог = СтруктураДанных.Каталог; НазваниеМакета = СтруктураДанных.НазваниеМакета; ПутьКфайлу = Каталог+"\"+НазваниеМакета+"_№"+НомерДокумента+".xls"; Описание = Новый ОписаниеПередаваемогоФайла(ПутьКфайлу, Адрес); ПередаваемыеФайлы = Новый Массив; ПередаваемыеФайлы.Добавить(Описание); НачатьПолучениеФайлов(Новый ОписаниеОповещения("ПослеПолученияФайлов", ЭтотОбъект), ПередаваемыеФайлы, "", Ложь); КонецЕсли; КонецПроцедуры &НаСервере Процедура ВыполнитьПечатьСервер() ОбъектСсылка = СтруктураДанных.Объект; НазваниеМакета = СтруктураДанных.НазваниеМакета; СтруктураДанных.Вставить("НомерДокумента", ОбъектСсылка.Номер); МассивОбъектов = Новый Массив; МассивОбъектов.Добавить(ОбъектСсылка); Документы.НакладнаяОборудования.ПечатьНакладная(МассивОбъектов,НазваниеМакета,Истина); КонецПроцедуры &НаКлиенте Процедура Подключаемый_ВыполнитьПечать() ВыполнитьПечатьСервер(); КонецПроцедуры // СтандартныеПодсистемы.Печать &НаКлиенте Процедура Подключаемый_ВыполнитьКомандуПечати(Команда) Ссылка = Элементы.Список.ТекущиеДанные.Ссылка; СтруктураДанных = Новый Структура; СтруктураДанных.Вставить("Объект", Ссылка); СтруктураДанных.Вставить("НазваниеМакета", "Накладная"); ПодключитьОбработчикОжидания("Подключаемый_ВыполнитьПечать", 1, Истина); ОписаниеКоманды = УправлениеПечатьюКлиент.ОписаниеКомандыПечати(Команда.Имя,ИмяФормы); НачатьУстановкуРасширенияРаботыСФайлами(); НачатьПодключениеРасширенияРаботыСФайлами(Новый ОписаниеОповещения("ОбработатьПодключениеРасширенияРаботыСФайлами",ЭтотОбъект,Новый Структура("ИмяКоманды",ОписаниеКоманды.Идентификатор))); КонецПроцедуры // Конец СтандартныеПодсистемы.Печать

Немного пояснений:

1. Во-первых, клиент у нас работает как через Тонкий, так и через Веб режимы, поэтому заранее в свойствах Конфигуратор ставим следующие значения:

Чтобы не было проблем при работе с браузером

2. Используем обработчики ожидания, чтобы избежать проблем с синхронностью вызов (это касается только режим Веб)

3. И последнее, подключаем Расширение для работы с Файлами (помним что в режиме Тонкий клиент, это расширение включено всегда). И через код:

передаем файл Клиенту используя механизм НавигационнаяСсылка, получаем следующие сообщения в браузере (Тонкий само собой работает):

ну вот, кажется, все. Надеюсь, это поможет кому-нибудь...

По поводу Word, Excel файлы вставлять в виде ДвоичныхДанные? проблема-то в чем?

1. Мы либо должны вытащить из макета эти ДвоичныеДанные и заполнить данными из 1С и ВНИМАНИЕ снова записать в виде ДвоичныхДанных (Водка С Пивом или Пиво С Водкой)

2. Либо мы должно получить макет ДвоичныеДанные на стороне Клиента и там заполнить его, НО COM объект поддерживается только браузером IE и то с танцами с настройками ActiveX, другие браузеры давно отказались от использования ActiveX

Включайся в дискуссию
Читайте также
Как обменять серийный номер на ключ Dr
Список лучших бесплатных анонимайзеров
Тариф Теле2 «Мой разговор»: насладись беседой