1с новый файл не работает на сервере.

Очень часто у пользователей появляются странные ошибки: у одного пользователя программа работает правильно, у другого, рядом, на другом компьютере, совершенно иначе. Зачастую после долгих разбирательств оказывается, что причина таких «глюков» в 1С 8 — кэш.

Ниже расскажу, что такое кэш 1С и как его почистить.

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

Однако очень часто платформа 1С неправильно отрабатывает кеширование конфигурации, и в результате мы получаем неадекватное поведение конфигурации.

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

Первый способ — почистить кэша 1С вручную

Для решения проблем и «глюков» 1С обычно помогает очистка кеша платформы 1C 8.3.

Делается это следующим образом:

шаг 1

Найти каталог, где хранятся временные файлы 1С, их можно увидеть в меню настройки в списке ИБ:

2 шаг

Мы получили адрес вроде

Получите 267 видеоуроков по 1С бесплатно:

C:\Documents and Settings\username\Application Data\1C\1Cv82\tmplts\1c

Папки с кэшем расположены по адресу

C:\Documents and Settings\username\Application Data\1C\1Cv82\

*где username — имя пользователя системы, а папка 1Cv82 может отличаться в зависимости от версии платформы 1С

Зайдя туда, мы находим множество (количество папок равно количеству конфигураций) интересных папок:

Все выделенные каталоги являются кешем БД 1С, их можно смело удалять. Перед удалением обязательно необходимо выйти из ИБ.

Если Вам не хочется искать, где расположены файлы, Вы можете воспользоваться специальной программой (бат-файл), которая очищает папки с временными файлами — скачать . Не забывайте, что Вы пользуетесь ими на свой страх и риск. Они содержат следующую команду:

rmdir «%AppData%\1C\1Cv8» /S /Q
rmdir «%LOCALAPPDATA%\1C\1Cv8» /S /Q

Второй способ очистки временных файлов 1С — удаление базы из списка

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

Вследствие этого старая папка с кэшем «отвяжется» от этой ИБ, и создастся новый каталог.

Можно делать и так, кеш очищается, однако временные файлы так и остаются на жестком диске.

Третий способ — параметр ClearCache

Необходимо в дополнительных параметрах запуска (в списке баз кнопка Изменить, последняя закладка) прописать команду /ClearCache . Пример использования:

Видео по очистке кэша в программах 1С:

Если же «глюки» в 1С не пропали после очистки кэша, и 1С работает не так, как хотелось бы, Вы можете обратиться к .

Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

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

1.1. Если доступ к файловой системе осуществляется из кода, выполняемого на клиенте, то он выполняется под правами пользователя, от имени которого запущено приложение (тонкий, толстый или веб-клиент). Как правило, это текущий пользователь операционной системы.

1.2. Если доступ к файловой системе осуществляется из кода, выполняемого на сервере, то:

  • при использовании клиент-серверной информационной базы, доступ ограничен правами пользователя, от имени которого запущен сервер 1С:Предприятия (*);
  • при использовании файловой базы, опубликованной на веб-сервере, доступ ограничен правами пользователя, от имени которого запущен веб-сервер.

Работа с временными файлами и каталогами

При необходимости использования временных файлов и каталогов необходимо соблюдать следующие требования:

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

Неправильно:

ИмяПромежуточногоФайла = "C:/Временные файлы 1С/TempFile.xml"Данные.Записать(ИмяПромежуточногоФайла);

У текущего пользователя может не быть прав на запись в указанный каталог. Кроме того, при одновременном выполнении этого кода из двух разных сеансов возникнет ошибка.

Правильно:

ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("xml");Данные.Записать(ИмяПромежуточногоФайла);

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

2. Для создания временного каталога рекомендуется также использовать имя, полученное при помощи метода ПолучитьИмяВременногоФайла . Это гарантирует уникальность имени создаваемого каталога при работе в многопользовательском режиме. После этого, внутри созданного каталога можно создавать другие каталоги и файлы без ограничений.

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

См. также Особенности разработки конфигураций для ОС Linux , об особенностях использования имен и путей файлов.

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

ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("xml");Данные.Записать(ИмяПромежуточногоФайла);// Работа с файлом...// Удаляем временный файлПопытка УдалитьФайлы(ИмяПромежуточногоФайла);Исключение ЗаписьЖурналаРегистрации(НСтр("ru = "Мой механизм.Действие""), УровеньЖурналаРегистрации.Ошибка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));КонецПопытки;

См. также: Использование Журнала регистрации.

5. При использовании временных файлов и каталогов на сервере, необходимо полностью завершать работу с ними в рамках одного серверного вызова. При работе конфигурации с использованием кластера серверов, при следующем вызове эти файлы могут стать недоступны, так как код начнет исполняться на другом компьютере. При необходимости сохранить данные между серверными вызовами в пределах одного сеанса следует использовать временное хранилище платформы (методы , ).

5. 1. В редких случаях может возникнуть необходимость передачи данных во временных файлах между сеансами, например, при подготовке данных для фонового задания, при организации длительного процесса, обслуживающего несколько последовательных вызовов web-сервиса. Необходимо самостоятельно обеспечивать гарантировано общее место хранения , права для доступа к файлам из разных мест их обработки, удаление файлов по истечению сроков их обработки или аварийного завершения процесса обработки. Рекомендуется использовать следующий подход:

  • Для обеспечения доступа со всех возможных мест обработки заводится константа для хранения общего пути к файлам, доступного для доступа со всех серверов кластера;
  • При создании временных файлов их имена заносятся во вспомогательный регистр сведений с сохранением времени создания файла;
  • При штатном прохождении процесса, последняя операция, которой были нужны файлы, перед своим завершением удаляет как сам файл, так и записи о них во вспомогательном регистре ;
  • Вспомогательное регламентное задание периодически проверяет наличие записей во вспомогательном регистре, время существования которых заведомо превышает время штатного завершения процесса. При обнаружении таких записей, задание удаляет временные файлы и записи о них.

Передача файлов между клиентом и сервером

1. При одновременной работе с файлом на клиенте и на сервере необходимо использовать передачу файла через временное хранилище (методы ПоместитьФайл , ПоместитьФайлы , ПолучитьФайл , ПолучитьФайлы , НачатьПомещениеФайла , ПоместитьВоВременноеХранилище , ПолучитьИзВременногоХранилища ). В общем случае клиент и серверы кластера - это разные компьютеры с разной файловой системой, причем доступ к файлам может происходить под разными пользователями ОС с различными правами.

Неправильно:

&НаКлиентеПроцедура ОбработкаФайла() ... ИмяФайла = "C:/Файлы для обработки/Загрузка.xml"; Результат = ПроизвестиОбработкуНаСервере(ИмяФайла); ...КонецПроцедуры&НаСервереФункция ПроизвестиОбработкуНаСервере(ИмяФайла) Чтение = Новый ЧтениеТекста(ИмяФайла) ... Результат = Чтение.Прочитать(); Возврат Результат;КонецФункции

Правильно:

&НаКлиентеПроцедура ОбработкаФайла() ... ИмяФайлаДляОбработки = "C:/Файлы для обработки/Загрузка.xml"; Адрес = ""; ПоместитьФайл(Адрес, ИмяФайлаДляОбработки, ИмяФайлаДляОбработки, Ложь); Результат = ПроизвестиОбработкуНаСервере(Адрес); ...КонецПроцедуры&НаСервереФункция ПроизвестиОбработкуНаСервере(Адрес) Данные = ПолучитьИзВременногоХранилища(Адрес) ИмяПромежуточногоФайла = ПолучитьИмяВременногоФайла("txt"); Данные.Записать(ИмяПромежуточногоФайла); Чтение = Новый ЧтениеТекста(ИмяПромежуточногоФайла) ... Результат = Чтение.Прочитать(); ... УдалитьФайлы(ИмяПромежуточногоФайла); Возврат Результат;КонецФункции

2. Для сохранения данных во временном хранилище между несколькими серверными вызовами, при помещении его в хранилище необходимо использовать параметр УникальныйИдентификаторФормы метода ПоместитьФайл , передав в него идентификатор текущей формы . Такие значение будут удалены их временного хранилища только при закрытии указанной формы. При этом, при повторном помещении того же файла во временное хранилище, предыдущее значение необходимо удалять вручную. Например:

Неправильно:

ИмяФайлаДляОбработки = "C:/Файлы для обработки/Загрузка.xml"; ... // Первый серверный вызов Адрес = ""; ПоместитьФайл(Адрес, ИмяФайлаДляОбработки, ИмяФайлаДляОбработки, Ложь, УникальныйИдентификатор); Результат = ПроизвестиНачальнуюОбработкуНаСервере (Адрес);
... // Второй серверный вызов с той же версией файла Результат = ПроизвестиПромежуточнуюОбработкуНаСервере(Адрес); ...
// Третий серверный вызов с новой версией файла Адрес = ""; ПоместитьФайл(Адрес, ИмяФайлаДляОбработки, ИмяФайлаДляОбработки, Ложь, УникальныйИдентификатор); Результат = ПроизвестиКонечнуюбОбработкуНаСервере(Адрес); ...

При этом во временном хранилище формы останется две копии файлов. Адрес второй копии будет находиться в переменной Адрес , а адрес первой копии будет утерян. Это приводит к затрате дополнительных ресурсов приложения, замедлению работы.

Правильно:

ИмяФайлаДляОбработки = "C:/Файлы для обработки/Загрузка.xml"; ... // Первый серверный вызов Адрес = ""; ПоместитьФайл(Адрес, ИмяФайлаДляОбработки, ИмяФайлаДляОбработки, Ложь, УникальныйИдентификатор); Результат = ПроизвестиНачальнуюОбработкуНаСервере(Адрес); ... // Второй серверный вызов с той же версией файла Результат = ПроизвестиПромежуточнуюОбработкуНаСервере(Адрес); ...
// Третий серверный вызов с новой версией файла УдалитьИзВременногоХранилища(Адрес); Адрес = ""; ПоместитьФайл(Адрес, ИмяФайлаДляОбработки, ИмяФайлаДляОбработки, Ложь, УникальныйИдентификатор); Результат = ПроизвестиКонечнуюбОбработкуНаСервере(Адрес); ...

См. также

Нас находят: дос туп к файловой системе , ПолучитьИмяВременногоФайла(


Технологическая платформа 1С:Предприятие 8 позволяет сохранять в информационной базе произвольные файлы, получать их оттуда и использовать различными способами. Рассмотрим эти операции на примерах.

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

Для хранения файлов используется реквизит (или ресурс регистра) с типом ХранилищеЗначения .

Загрузка произвольного файла в информационную базу 1С

Любой файл можно представить в виде двоичных данных и загрузить в ХранилищеЗначений .

При преобразовании двоичных данных в объект ХранилищеЗначения используется конструкция новый ХранилищеЗначения(Данные,Сжатие) с двумя параметрами:

  1. Данные — двоичные данные, которые нужно поместить в хранилище
  2. Сжатие — степень сжатия алгоритма Deflation. Целое число в диапазоне -1…9. -1 — степень сжатия по умолчанию. 0 — никакого сжатия, 9 — максимальная степень сжатия. Значение по умолчанию: -1. Параметр необязательный, если не указан, то сжатие не используется.

//Преобразуем файл в двоичные данные
Файл = Новый ДвоичныеДанные(Путь) ;

//Создаем новый объект ХранилищеЗначения

ХранилищеДанных = Новый ХранилищеЗначения(Файл, Новый СжатиеДанных(9 ) ) ;

Сохранение произвольного файла из информационной базы 1С на диск

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

//Получаем двоичные данные из хранилища
//ХранилищеДанных - реквизит объекта с типом ХранилищеЗначения

//Записываем полученные данные на диск
//В переменной Путь находится полный адрес файла на диске
Данные. Записать(Путь) ;

Просмотр файла, находящегося в информационной базе 1С

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

//Получаем имя временного файла с необходимым расширением
//В переменную Расширение нужно поместить расширение файла, например "pdf"
Путь= ПолучитьИмяВременногоФайла(Расширение) ;

//Получаем данные из хранилища
//ХранилищеДанных - реквизит объекта с типом ХранилищеЗначения
Данные= ХранилищеДанных. Получить() ;

//Записываем данные во временный файл
Данные. Записать(Путь) ;

//Пытаемся открыть файл в предназначенном для него приложении
//Если приложение не найдено, появится системный диалог "Открыть с помощью..."
ЗапуститьПриложение(Путь) ;

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

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

Расскажу случай из своей практики. Однажды мне пришлось наладить выгрузку данных в 1С:Бухгалтерия из не тиражируемой конфигурации. Выгрузка была в виде отдельной обработки, работающей по правилам обмена. Сами правила были прикреплены в виде макета двоичных данных. Алгоритм работы типичный – правила выгружаются во временный файл, а затем подтягиваются обработкой « Универсальный обмен данными в формате XML».

Разработчик правил и обработки переноса бил себя в грудь и клялся, что у него все работает отлично. На практике же, во время выгрузки данных постоянно возникала ошибка. Текст сообщение об ошибке в открытую заявлял, что проблема кроется в правилах обмена. «Нет больше такого свойства у документа, выгружать отказываюсь» - гласил текст сообщения. Ковыряться в правилах обмена мне не хотелось, т.к. работа это не моя. Вместо этого я открыл код обработки и решил посмотреть, как организован процесс выгрузки правил обмена во временный файл.

Оказалось, что проблема была именно в этом. Дело в том, что программист не удосужился сделать уникальное имя файла для правил обмена (во временной директории), да еще и вставил проверку: «Если файл существует, то выгрузка не требуется». Само собой, все работало пока обработка, а точнее макет с правилами не обновился. В итоге, пользователи постоянно пытались осуществлять выгрузку с помощью морально устаревших правил обмена. «Временный файл» в директории «temp» стал постоянным и пока его не удалишь вручную, для выгрузки всегда будет использоваться всегда он.

Создавать временные файлы нужно правильно

Чтобы не возникло таких курьезных ситуаций, нужно не пытаться изобретать велосипеды и костыли в виде «хитрых» функций, использующих COM-объекты. Достаточно воспользоваться встроенной в платформу функцией – ПолучитьИмяВременногоФайла() , которая автоматом решает многие проблемы:

Гарантирует, что имя файла будет действительно уникально;

Если разработчик забудет удалить файл самостоятельно, то он обязательно удалится при следующем запуске платформы.

Автоматическое удаление временных файлов во время перезапуска платформа – весьма интересная фича, теоретически позволяющая разработчику забить на необходимость удалять файлы самостоятельно. Правда злоупотреблять ей все же не стоит. Если код выполняется на сервере, то нужно понимать, что сервер может долго не перезапускаться, а значит, папка temp будет забиваться ненужными файлами. В связи с этим, не стоит полностью доверять «грязную» работу платформе. Лучше использовать эту возможность как запасной вариант, а в свой код добавлять одну лишнюю строчку кода для принудительного удаления временного файла.