Работа с ActiveDocument в клиент-серверном варианте




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

47 Comments

  1. andrei.k

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

    Reply
  2. zqzq
    P.S. кстати, обратите, какая изящная задача получилась для тестирования опытного кандидата на работу.

    На собеседовании спрашивают то, что сами недано узнали (с)баш

    А если по теме, с какой стати у клиента есть доступ к файловой системе сервера и наоборот (и расшаренные папки тоже неуниверсально)? Лучше через двоичные данные и ХранилищеЗначения передавать, см. работу с картинками, а на клиенте сохранять во временный файл.

    А так полезная статья, узнал зачем нужен ActiveDocument 🙂

    (1) andrei.k, согласен, пусть лучше юзеры свой шаблон правят, не программистское это дело.

    Reply
  3. CeHbKA

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

    Слишком уж тут много неявных причин.

    По сути да — не очень понятно на кой черт такие танцы с бубном, ведь программная работа с ActiveDocument ничем не отличается от ДвоичныхДанных или ХранилищаЗначения. Принцип тот же.

    Но все-таки, пусть будет — для галочки 😉

    Reply
  4. YurySigolaev
    Макет = ОбщийМодуль.ПолучитьМакет(Документ); //серверная функция, записывает макет в файл и возвращает полное имя файла

    разъясните

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

    если на сервере, то как к нему получает доступ клиент в этом коде?

    Шаблон = ПолучитьCOMОбъект(Макет); //инициализируем COM-объект

    если на клиенте, то как серверная функция получит доступ к файловой системе клиента?

    и как она передаст на клиента этот самый файл?

    в общем, нужно привести листинг этой серверной функции, а также параметры модуля «ОбщийМодуль»

    Reply
  5. CeHbKA

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

    В остальных случаях уже написали как это делать 🙂

    Reply
  6. s_uu

    А можно для тупых полный листинг привести?))

    Reply
  7. Dighty

    Повторюсь

    А можно для тупых полный листинг привести?))

    Reply
  8. CeHbKA

    (6) s_uu, (7) Dighty,

    какой именно листинг нужно привести?

    В статье ведь есть листинг

    Reply
  9. Dighty

    Листинг &НаСервере если можно.

    Reply
  10. Dighty

    Или помогите я разобраться не могу. Мне надо документ activedocument на тонкий клиент вывести, сижу 3 день мозг ломаю. Пожалуйста помогите.

    Reply
  11. CeHbKA

    (10) Dighty, через двоичные данные. Читайте 2-й пост

    Reply
  12. klinval

    Каким методом вы записывали файл Word на сервере? У меня на файловой метод SaveAs(ПУТЬ) работает, а на сервере нет. Путь доступен соответственно и там и тут, только на сервере почему то метод SaveAs не обнаружен… Метод Save работает только для ранее сохраненных, а у меня файл вновь созданный.

    /////Уточнение от 17.09.15

    Метод SaveAs он не пишет, что не обнаружен, а пишет «Произошла исключительная ситуация (Microsoft Word): Ошибка команды»

    Reply
  13. CeHbKA

    (12) klinval, a word на сервере установлен?

    Reply
  14. klinval

    (13) да, установлен. Спотыкается именно на SaveAs. Макет получается(ПолучитьМакет),

     MSWord = Макет.Получить(); Документ = MSWord.Application.Documents(1); Документ.Activate();

    проходят успешно. Заполнение тоже проходит, а на Документ.SaveAs(ИмяВрем); спотыкается.

    Ощущение, что что-то не так с word-ом именно под пользователем под которым работает служба 1С, хотя я под ним заходил и офис нормально запускается!

    Чтобы не дебажить весь код, например можно попробовать написать (см. обработка во вложении):

    &НаКлиенте
    Процедура СоздатьТестWord(Команда)
    СоздатьТестWordНаСервере();
    КонецПроцедуры
    
    &НаСервере
    Процедура СоздатьТестWordНаСервере()
    Word = Новый COMОбъект(«Word.Application»);
    Word.Visible=1;
    Документ = Word.Documents.Add();
    ИмяВрем = ПолучитьИмяВременногоФайла(«.docx»);
    Документ.SaveAs(ИмяВрем);
    Сообщить(ИмяВрем);
    КонецПроцедуры
    

    Показать

    На файловой базе работает, на SQL не работает (спотыкается на SaveAs). Можете попробовать у себя? Если эта простенькая обработка у вас заработает, значит у нас что-то не так с word-ом на сервере под этим Windows-пользователем.

    Я кстати задачу решил через двоичные данные, но всё равно интересно почему не работает SaveAs на сервере!

    Reply
  15. CeHbKA

    (14) klinval, проверьте права доступа для пользователя, word и 1С на стороне сервера

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

    Reply
  16. klinval

    (15) я уже ранее проводил такую проверку: залогинился под пользователем и сохранил word интерактивно. Клиентской 1С на сервере до этого вообще не стояло, я поставил. Запустился, а там ошибка(см. приложение). Возможно в этом и косяк.

    У вас то обработка (во вложении к 14 сообщению) работает на SQL базе?

    Reply
  17. CeHbKA

    (16) klinval, конкретно в данный момент, нет возможности проверить вашу обработку

    Добавьте 1С в исключения в свойствах обозревателя IE

    Reply
  18. klinval

    (17) отключил усиленную безопасность IE, поставил на самый «небезопасный» уровень, ошибка, указанная в 16 сообщении ушла, но метод SaveAS всё равно не работает.

    Так всё таки под кодом:

     Макет = ОбщийМодуль.ПолучитьМакет(Документ); //серверная функция, записывает макет в файл и возвращает полное имя файла

    Каким методом ты записываешь? Save, SaveAS?

    Reply
  19. CeHbKA

    (18) klinval, посмотрите на дату публикации. Доступа к той обработке у меня давно нет, а в памяти я такое держать не могу 🙂

    Что значит

    метод SaveAS всё равно не работает.

    ?

    Ошибка выпадает? Файл не сохраняет?

    Reply
  20. klinval

    (19)

    Ошибка выпадает? Файл не сохраняет?

    Да. Да:)

    По-любому косяк где-то на уровне прав Windows-пользователя (т.е. связано с администрированием серверов, а не с 1С). Даже обработка с сообщения 14 не работает (хотя где там можно ошибиться?).

    {Форма.Форма.Форма(13)}: Ошибка при вызове метода контекста (SaveAs)

    Документ.SaveAs(ИмяВрем);

    по причине:

    Произошла исключительная ситуация (Microsoft Word): Ошибка команды

    Поэтому мне проще было не разбираться, а запихнуть шаблон не в ActiveDocument, а в двоичные данные, которые я могу спокойно передать на клиент. Что я и сделал… А ошибка с SaveAs, скорее всего так и останется неразгаданной.

    Reply
  21. CeHbKA

    (20) klinval, вам нужно запуститься непосредственно по тем пользователем, который указан для 1С на сервере и именно под ним попробовать сохранить MS Word интерактивно

    Reply
  22. klinval

    (21) уже пробовал. Сохраняет… как ни странно.

    Reply
  23. CeHbKA

    (22) klinval, тогда нужно ловить ошибку, которую возвращает приложение

    подключитесь к MS Word из 1С через COM на сервере и попытайтесь сохранить файл методом SaveAs

    Reply
  24. klinval

    (23) ну так это я и сделал! Ошибка уже давно выявлена и описание её ни о чём не говорит. Файл в 14 сообщении, ошибка от его исполнения в 20 сообщении.

    {Форма.Форма.Форма(13)}: Ошибка при вызове метода контекста (SaveAs)

    Документ.SaveAs(ИмяВрем);

    по причине:

    Произошла исключительная ситуация (Microsoft Word): Ошибка команды

    Если дать заведомо рабочий путь вручную: та-же ошибка (не важно сетевой или на диск C:)

    Если дать заведомо некорректный путь, то уже другая ошибки:

    {Форма.Форма.Форма(16)}: Ошибка при вызове метода контекста (SaveAs)

    Документ.SaveAs(«Ы:111.docx»);

    по причине:

    Произошла исключительная ситуация (Microsoft Word): Неверно указано имя файла.

    Попробуйте выполнить следующие действия:

    * Убедитесь, что путь введен правильно.

    * Выберите нужный файл из списка файлов и папок.

    Пробовал эксперементировать с расширением файла:

     Для Инд = 0 По 100 Цикл
    Попытка
    Word = Новый COMОбъект(«Word.Application»);
    Word.Visible=1;
    Документ = Word.Documents.Add();
    Документ.SaveAs(«C:111.docx»,Инд);
    Сообщить(«ПОЛУЧИЛОСЬ:»+Инд);
    Исключение
    Сообщение = Новый СообщениеПользователю();
    Сообщение.Текст = Строка(Инд)+»!»+ОписаниеОшибки();
    Сообщение.Сообщить();
    КонецПопытки;
    КонецЦикла;
    

    Показать

    файл так и не создался.

    Сверил все настройки Word локальные и на сервере (запустившись от имени пользователя под которым работает служба 1С). Процесс ворда запускается точно под тем пользователем под которым запускается служба (проверил в диспетчере задач)…

    Reply
  25. CeHbKA

    (24) klinval, вам нужна ошибка именно MS Word

    {Форма.Форма.Форма(13)}: Ошибка при вызове метода контекста (SaveAs)

    Документ.SaveAs(ИмяВрем);

    по причине:

    Произошла исключительная ситуация (Microsoft Word): Ошибка команды

    Это листинг ошибки 1С. Обработайте через 1С, сообщение об ошибке MS Word и выведите её содержимое

    Reply
  26. klinval

    (25)

    Обработайте через 1С, сообщение об ошибке MS Word и выведите её содержимое

    Не понял, как это сделать?

    Reply
  27. CeHbKA

    (26) klinval, в смысле? руками)))

    Reply
  28. klinval

    (27) правильно я понял: ты хочешь увидеть ошибку как её видит Word, а не как её нам даёт 1С?

    Если да, то опять вопрос: как из 1С это можно вывести?

    Reply
  29. CeHbKA

    (28) klinval, читай про COM-объекты и инструментарий по MS Word

    Reply
  30. klinval

    (29) что искать/читать и где? Вы ответьте хотя бы на:

    правильно я понял: ты хочешь увидеть ошибку как её видит Word, а не как её нам даёт 1С?
    Reply
  31. CeHbKA

    (30) klinval, искатьчитать:

    — работа с COM объектами в 1С

    — интеграция MS Word и 1С

    где:

    — в гугле

    Вы ответьте хотя бы на:

    1С вообще никакой ошибки не видит, она тупо посредник между пользователем и приложением (MS Word)

    Reply
  32. klinval

    (31) это реально можно вывести ошибку в 1С как её видит Word или ты чисто теоретически предполагаешь, что такой метод есть?

    Может я тебя не правильно понял: по тексту мне показалось, что ты уверен, что такая возможность (такой метод) есть, а может ты имел ввиду, что чисто теоретически такая возможность должна быть.

    Reply
  33. ivant

    (32) Столкнулся с аналогичной проблемой — хотел узнать, удалось ли ее в итоге победить или забили?

    Ошибка таже:

    Ошибка при вызове метода контекста (SaveAs)

    Reply
  34. klinval

    (33) ivant, вроде как CeHbKA утверждал, что можно считать ошибку как то по-другому и увидеть причину косяков. Я сильно «копнул» в этом направлении, но ничего не нашёл. Похоже это совет из разряда гипотетических, что мол возможно считать ошибку Word как то по другому, но я не знаю как, но точно можно… Можете как советовал CeHbKA копнуть в эту сторону, может я что-то не увидел!

    Хотя если честно ошибку я как-то исправил. Но вот не помню как, но явно не по этому совету. Моя обработка в (14) сообщении теперь у меня работает на серверной базе. Возможно ошибка просто ушла после обновления платформы.

    Ещё есть вариант перейти с ActiveDocument на двоичные данные, как я в начале и сделал. Можете посмотреть тут код как это делается. Если вкратце:

    //На клиенте получаем макет и заполняем его предварительно полученными данными
    ДвоичныеДанныеМакета = ПолучитьИзВременногоХранилища(ПолучитьМакетСКлиента(«ПисьмоНаОплатуWord»));
    ИмяВрем = ПолучитьИмяВременногоФайла(«.docx»);
    ДвоичныеДанныеМакета.Записать(ИмяВрем);
    Попытка
    Документ = ПолучитьCOMОбъект(ИмяВрем);
    Для Каждого Параметр из СтруктураПараметров.Значение Цикл
    //В оригинале тут другой код, но для простаты пример:
    Selection = Документ.Content;
    Selection.Find.Execute(«[«+Параметр.Ключ+»]»,Ложь,Истина,Ложь,,,Истина,,Ложь,Параметр.Значение,2);
    КонецЦикла;
    Документ.Application.Visible = Истина;
    Документ.Application.WindowState = 2;
    Документ.Application.WindowState = 1;
    Документ.Activate();
    Исключение
    …..
    
    &НаСервереБезКонтекста
    Функция ПолучитьМакетСКлиента(Имя)
    Возврат ПоместитьВоВременноеХранилище(Документы.ПисьмоНаОплату.ПолучитьМакет(«ПисьмоНаОплатуWordДвоичныеДанные»));
    КонецФункции
    

    Показать

    Reply
  35. CeHbKA

    (32) klinval, (33) ivant, (34) klinval,

    вы получаете COM-объект MS Word

    соответственно работаете с API данного com-объекта (т.е. Word)

    функция SaveAS является функцией API Word

    значит, чтобы получить ошибку Word нужно воспользоваться API этого самого Word

    Reply
  36. CeHbKA

    Статья обновлена

    Reply
  37. Stepka1206

    Аналогичная ошибка, не может открыть документ сохраненный в темп

    
    ДвоичныеДанные = ПолучитьДвоичныеДанныеМакета();
    
    COMОбъект = Новый COMОбъект(«Word.Application»);
    
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(«DOC»);
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    
    COMОбъект.Documents.Open(ИмяВременногоФайла);
    // здесь вываливается ошибка, никаких документов он не открыл, в темпе лежит созданный документ ворда , COMОбъект.Documents.Count = 0, через ЖР проверял
    Док = COMОбъект.Application.Documents(1);
    Док.Activate();
    
    
    

    Показать

    Reply
  38. uke_boy

    1

    Reply
  39. Bkmz

    Почему при сохранении макета типа active document в файл word кодом:

    Код:

    ОбработкаОбъект = РеквизитФормыВЗначение(«Объект»);
    Макет  = ОбработкаОбъект.ПолучитьМакет(«ШаблонПисьмаПросрочка»);
    ИмяФайла = КаталогВременныхФайлов() + «файл.doc»;
    Макет.Записать(ИмяФайла);

    Я получаю вместо нормального документа вот такой

    Reply
  40. Bkmz

    А почему нельзя использовать документ двоичные данные? Загрузил туда шаблон. Получили шаблон. Сохранили документ. Передали на клиент имя открыли через COM и заполняем.

    &НаКлиенте
    Процедура ПолучитьМакет(Команда)
    
    Попытка
    Индификатор = ПолучитьДанныеМакета();
    МакетПисьма = ПолучитьИзВременногоХранилища(Индификатор);
    ИмяФайла = «Письмо.doc»;
    ИмяФайлаПолное = «С:» + ИмяФайла;
    МакетПисьма.Записать(ИмяФайлаПолное);
    Исключение
    Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
    Попытка
    Шаблон = Новый COMОбъект(«Word.Application»);
    Исключение
    Сообщить(«Ошибка при попытке создать объект «»MS Word»»!» + Символы.ПС +
    «Возможно приложение «»MS Word»» не установлено или установлено неправильно.», СтатусСообщения.Внимание);
    КонецПопытки;
    
    Шаблон.Documents.Open(ИмяФайлаПолное);
    Попытка
    Шаблон.Application.Documents(1).Content.Find.Execute(«{Сумма}»,,,,,,,,, ЭтаФорма.Сумма, 2);
    Шаблон.Application.Documents(1).Content.Find.Execute(«{Контрагент}»,,,,,,,,, ЭтаФорма.Контрагент, 2);
    //Перемещаемся до строки в таблице
    Шаблон.Application.Selection.MoveDown(,8);
    //Перемещаемся вниз, выделяем строку таблицы и копируем ее в буфер обмена
    Шаблон.Application.Selection.SelectRow();
    Шаблон.Application.Selection.Copy();
    Для каждого Строка Из Этаформа.ТЗ Цикл
    //Заменяем значения
    Шаблон.Application.Selection.Find.Execute(«{НомерСчета}» ,,,,,,,,,Строка.НомерСчета, 2);
    Шаблон.Application.Selection.Find.Execute(«{ДатаПоставки}» ,,,,,,,,,Строка.ДатаПоставки, 2);
    //Последний параметр поиска пустой
    Шаблон.Application.Selection.Find.Execute(«{КрайняяДата}» ,,,,,,,,,Строка.КрайняяДата, 2);
    Шаблон.Application.Selection.Find.Execute(«{СтоимостьТоваров}» ,,,,,,,,,Строка.СтоимостьТоваров, 2);
    //Перемещаемся вниз, вставляем из буфера обмена строку
    Шаблон.Application.Selection.MoveDown();
    Шаблон.Application.Selection.Paste();
    //Перемещаемся вверх и выделяем строку для замены значений
    Шаблон.Application.Selection.MoveUp();
    Шаблон.Application.Selection.SelectRow();
    КонецЦикла;
    //Вырезаем лишнюю строку
    Шаблон.Application.Selection.Cut();
    Шаблон.Application.Visible = Истина;
    Исключение
    // Если произойдет ошибка выводятся данные об ошибке и объект закрывается.
    Сообщить(«Ошибка: » + ОписаниеОшибки(), СтатусСообщения.Внимание);
    Шаблон.Application.Quit(0);
    КонецПопытки;
    
    
    КонецПроцедуры
    
    &НаСервере
    Функция ПолучитьДанныеМакета()
    
    АдресХранилища = Новый УникальныйИдентификатор();
    ОбработкаОбъект = РеквизитФормыВЗначение(«Объект»);
    Макет    = ОбработкаОбъект.ПолучитьМакет(«ШаблонПисьмаПросрочка»);
    Возврат ПоместитьВоВременноеХранилище(Макет, АдресХранилища);
    
    КонецФункции
    

    Показать

    У меня этот код на серверной базе работает

    Reply
  41. shumvlesu

    (42)

    МакетПисьма = ПолучитьИзВременногоХранилища(Индификатор);

    Здесь в тонком клиенте у Вас будет выскакивать ошибка. Такой способ только для толстого клиента подходит.

    Reply
  42. klinval

    (43) Выскажусь в защиту:

    Глобальный контекст (Global context)

    ПолучитьИзВременногоХранилища (GetFromTempStorage)

    Синтаксис:

    ПолучитьИзВременногоХранилища(<Адрес>)

    Параметры:

    <Адрес> (обязательный)

    Тип: Строка.

    Адрес, указывающий на значение во временном хранилище.

    Возвращаемое значение:

    Тип: Произвольный.

    Значение, ранее помещенное с помощью метода ПоместитьВоВременноеХранилище.

    Описание:

    Получает значение из временного хранилища.

    Доступность:

    Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).

    Вызов метода выполняет обращение к серверу.

    Примечание:

    Результат выполнения не кэшируется, вызов сервера осуществляется при каждом вызове метода.

    Показать

    В справке написано, что тонкий клиент можно использовать! Я в своей статье данный метод тоже привожу в тонком клиенте, причём этот код уже давно работает на рабочей базе (в толстом клиенте у нас никто не работает).

    Reply
  43. artms
  44. altern

    Решение проблемы «Ошибка при вызове метода контекста (SaveAs) «

    Reply
  45. mentozavr

    (17) Надо не 1с в исключения добавить, а всю строку about:…. только при добавлении снять галку с https…,а указанное в (18) делать нежелательно…тем более на сервере…

    Reply
  46. mentozavr

    (33) У меня такая проблема была. все было в правах на сервере…получалось при этом сохранять в шару..решил делать это не на рдп а на локальной машине…SQL тут не причем

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *