На сервері 1с підприємство сталася непоправна помилка. Windows error: помилка виконання функції, вирішуємо за хвилину

На сервері 1с підприємство сталася непоправна помилка.  Windows error: помилка виконання функції, вирішуємо за хвилину
На сервері 1с підприємство сталася непоправна помилка. Windows error: помилка виконання функції, вирішуємо за хвилину

Думаю, що кожен із програмістів "сімників" хоч раз стикався з такою помилкою. Вона може виникати або під час "об'єднання конфігурацій", або під час "тестування та виправлення ІБ".

Але далеко не кожен намагався "полагодити" конфігурацію. У таких випадках зазвичай або гарячково шукають бекапи, або ж (складніший спосіб) вдаються до допомоги утиліти GComp, яка "за легендою" може вилікувати МД, якщо його просто "розібрати", а потім "зібрати", використовую функції програми. Справді, це так. Але не у всіх випадках... Саме такий випадок і хотілося б розібрати в цій статті.

Отже, вихідні дані:

- "зламана конфігурація";

Утиліта MDDiags

- FarManagerта плагін DocFileBrowser до нього. За допомогою цього плагіна можна заходити всередину МД і працювати з його об'єктами.

Оскільки конфігуратор навіть відмовляється відображати цю "невиправну помилку", ми запускаємо 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С і отримуватимете повідомлення: 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.

Отже, у чому суть моєї статті?

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