Меню

Msword макет получить ошибка при вызове метода контекста получить

   darkhome

28.11.13 — 12:33

Создал в общихМакетах Макет типа ActiveDocument с расширением doc. Не получает с ним работать. Подскажите что не так. Делаю на УФ. Вот код

&НаКлиенте

Процедура Печать(Команда)

    ПолучитьМакетНаСервере(«ПФ_DOC_Договор»);

    //MSWord = Договор.Получить;

КонецПроцедуры

Процедура ПолучитьМакетНаСервере(ИмяМакета)

    Договор = ПолучитьОбщийМакет(ИмяМакета);

    MSWord = Договор.Получить;

конецпроцедуры

Выскакивает ошибка

Ошибка при вызове метода контекста (Получить)

    MSWord = Договор.Получить();

   Cube

1 — 28.11.13 — 12:34

&НаСервере забыл?

   darkhome

2 — 28.11.13 — 12:36

Если не указываешь директиву, то по умолчанию означает что код будет выполняться на сервере

   darkhome

3 — 28.11.13 — 12:37

Да я пробовал и &НаСервере и &НаСервереБезКонтекста. Все-равно не получается

   Cube

4 — 28.11.13 — 12:40

А зачем ты пишешь Получить()? Ведь у тебя это не хранилище…

   darkhome

5 — 28.11.13 — 12:43

(4) А как надо сделать что бы заработало

   Cube

6 — 28.11.13 — 12:44

MSWord = ПолучитьОбщийМакет(ИмяМакета);

не?

   darkhome

7 — 28.11.13 — 12:48

А потом как начать работать с документом что бы можно было заполнять поля в нем?

   darkhome

8 — 28.11.13 — 12:49

Я ставлю

Документ = MSWord.Application.Documents(1);

Документ.Activate();

У меня сразу выскакивает

Поле объекта не обнаружено (Application)

Документ = MSWord.Application.Documents(1);

Весь инет облазил. У всех работает. Может я что с начала не правильно делал

   Cube

9 — 28.11.13 — 12:52

(8) А ты что, заполнять его на сервере собрался?

   darkhome

10 — 28.11.13 — 12:53

Ну вроде как так надо делать.

   Cube

11 — 28.11.13 — 13:03

(10) Я уже сильно не помню причины, но я делаю через временный файл.

Код такой (у меня макет хранится в ХЗ):

&НаКлиенте

Процедура СформироватьПечатнуюФорму(ДоговорКонтрагента, Макет)

    ДанныеДляПечати = ПолучитьДанныеДляПечати(ДоговорКонтрагента, Макет);

    
    ХранилищеМакета = ДанныеДляПечати[0];

    Если ХранилищеМакета.Представление = «ХранилищеМакета» Тогда

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

        ХранилищеМакета.Значение.Записать(ИмяФайла); //Записываем макет во временный файл.

        ДанныеДляПечати.Удалить(ХранилищеМакета);

    Иначе

        Сообщить(«Ошибка получения макета», СтатусСообщения.Внимание);

        Возврат;

    КонецЕсли;

    Попытка

        MSWord = ПолучитьCOMОбъект(, «Word.Application»);    //Если Word уже открыт, то подключаемся к нему.

    Исключение

        Попытка

            MSWord = Новый COMОбъект(«Word.Application»);    //Открываем Word.

        Исключение

            Сообщить(«Ошибка формирования печатной формы. Скорее всего на Вашем компьютере не установлен Microsoft Word.», СтатусСообщения.Внимание);

            Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);

            Возврат;

        КонецПопытки;

    КонецПопытки;

    Документ = MSWord.Documents.Open(ИмяФайла);                //Открываем макет из временного файла.

    MSWord.Selection.WholeStory();                            //Выделяем весь документ.

    MSWord.Selection.Copy();                                //Копируем выделенное в буфер.

    Документ.Close();                                        //Закрываем документ.

    УдалитьФайлы(ИмяФайла);                                    //Удаляем временный файл.

    Документ = MSWord.Documents.Add();                        //Создаем новый документ.

    MSWord.Selection.PasteAndFormat(19);                    //Вставляем в документ содержимое из буфера с форматом исходного документа.

    MSWord.ActiveDocument.Range(0,1).Copy();                //Очищаем буфер обмена, чтоб лишних вопросов при закрытии документа не задавал.

    MSWord.Selection.HomeKey(6);                            //Переводим курсор в начало документа.

    
    //Производим заполнение заменяемых полей

    Замена = Документ.Content.Find;

    Для Каждого ЗаменяемоеПоле Из ДанныеДляПечати Цикл

        Замена.Execute(ЗаменяемоеПоле.Значение, Ложь, Истина, Ложь, , , Истина, , Ложь, ЗаменяемоеПоле.Представление, 2);

    КонецЦикла;

    
    //Проверяем, остались ли незаполненные заменяемые поля

    Если Замена.Execute(«{«) Тогда

        Сообщить(«В печатной форме «»» + СокрЛП(Макет.Наименование) + «»» заполнены не все заменяемые поля.», СтатусСообщения.Внимание);

    КонецЕсли;

    
    Документ.Saved = Истина;                                //Помечаем документ как сохраненный, чтобы при закрытии не выдавался запрос на сохранение документа

    Если Элементы.ФормаПечатьНаПринтер.Пометка Тогда

        Документ.PrintOut(Истина, , , , , , , Макет.КоличествоКопий, , , , Истина);

        Документ.Close();

    Иначе

        MSWord.Visible = Истина;

        MSWord.Activate();

    КонецЕсли;

    
КонецПроцедуры //СформироватьПечатнуюФорму()

   darkhome

12 — 28.11.13 — 13:06

(11) Спасибо. Попробую. Надеюсь заработает

   Cube

13 — 28.11.13 — 13:08

ПолучитьДанныеДляПечати() выполняется &НаСервере

   darkhome

14 — 02.12.13 — 12:03

&НаСервереБезКонтекста

Процедура ПолучитьМакетНаСервере()

    Макет = ПолучитьОбщийМакет(«ПФ_DOC_Договор»);

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

    Ком.Application.Visible = 1;

конецПроцедуры    

&НаКлиенте

Процедура Напечатать(Команда)

    Состояние(НСтр(«ru = ‘Выполняется формирование печатных форм'»));

    
    ПолучитьМакетНаСервере();

        
КонецПроцедуры

Ошибка при вызове метода контекста (Получить)

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

Что не так? Сделал как написано в книге «Профессиональная разработка в системе 1С».

В общих макетах создал .doc макет, в него скопировал содержимое документа. Пытаюсь его получить, вылетает ошибка. Помоги разобрать, как сделать через ActiveDocument

   darkhome

15 — 02.12.13 — 12:04

Тип созданного макета — ActiveDocument

   darkhome

16 — 02.12.13 — 12:06

Делаю все это во внешней обработке

   Kupogun

17 — 02.12.13 — 12:08

(14) что за ошибка?

   darkhome

18 — 02.12.13 — 12:09

Ошибка при вызове метода контекста (Получить)

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

   Kupogun

19 — 02.12.13 — 12:10

хз, попробуй так

текОбъект = ЭтаФорма.РеквизитФормыВЗначение(«Объект»);

Макет = текОбъект.ПолучитьМакет(«ПФ_DOC_Договор»);

   darkhome

20 — 02.12.13 — 12:11

(19) Делал, не получается

   Cube

21 — 02.12.13 — 12:15

(14) (18) Ты (4) Читал?

&НаСервереБезКонтекста

Процедура ПолучитьМакетНаСервере()

    Ком = ПолучитьОбщийМакет(«ПФ_DOC_Договор»);

    Ком.Application.Visible = 1;

конецПроцедуры    

&НаКлиенте

Процедура Напечатать(Команда)

    Состояние(НСтр(«ru = ‘Выполняется формирование печатных форм'»));

    ПолучитьМакетНаСервере();

КонецПроцедуры

Так работает?

   darkhome

22 — 02.12.13 — 12:17

(4) я читал

   darkhome

23 — 02.12.13 — 12:19

(21) Сделал так, выскочила другая ошибка

Поле объекта не обнаружено (Application)

    Ком.Application.Visible = 1;

Я еще раз повторюсь, делал по примеру, который приведен в книге.

   darkhome

24 — 02.12.13 — 12:20

Ну если не работает, как там приведен, вот я спрашиваю у Вас все, форумчане. Так как считаю этот форум одним из лучших по 1С, почти всегда тут можно найти решение проблем

   Cube

25 — 02.12.13 — 12:23

(23) А, точно, Получить() надо. Только что посмотрел, как раньше делал. Тогда у меня версия, что у тебя в макете что-то не то…

  

Cube

26 — 02.12.13 — 12:26

+(25) Если оставить только суть, то:

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

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



Документ = MSWord.Application.Documents(1);

Документ.Activate();



MSWord.Application.Visible = Истина;

MSWord.Activate();

3 / 3 / 7

Регистрация: 21.03.2013

Сообщений: 637

1

13.12.2017, 12:05. Показов 12456. Ответов 10


Добрый день, вот пытаюсь напечатать документ MSWorld в обработке, делаю по примеру, вот так

ОбработкаОбъект = РеквизитФормыВЗначение(«Объект»);
СсылкаМакет = ОбработкаОбъект.ПолучитьМакет(«Макет»);

MSWord = СсылкаМакет.Получить();// И вот тут выдает ошибку

Ошибка при вызове метода контекста (Получить)

Подскажите плз где ошибка?

http://programmist1s.ru/pechat… 8-3-i-8-2/ — вот брал отсюда

Добавлено через 22 минуты
Да, делаю это все на сервере

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Эксперт 1С

434 / 305 / 92

Регистрация: 28.05.2014

Сообщений: 1,247

13.12.2017, 13:53

2

Владислаучык,
что в переменной СсылкаМакет ?
У макета тип ActiveDocument?

в той же статье автор пишет ещё следующее:

Скорее всего проблема в ворде или в правах системы. Он корректно установлен? Попробуйте другую версию Ворда. Ну или на крайний случай можно проделать это на другой машине.



1



3 / 3 / 7

Регистрация: 21.03.2013

Сообщений: 637

13.12.2017, 14:09

 [ТС]

3

Получение макета ActiveDocument



0



Владислаучык

3 / 3 / 7

Регистрация: 21.03.2013

Сообщений: 637

13.12.2017, 16:52

 [ТС]

4

Phil, Да, такой тип

Добавлено через 2 часа 42 минуты
И если дело в ворлде, то как тогда переделать? пробовал так

1C
1
2
3
4
5
6
7
8
9
//ВремФайл = ПолучитьИмяВременногоФайла("doc");
//  MSWord = Новый COMОбъект("Word.Application");
//MSWord.Displayalerts = 0;
//ДокументН = MSWord.Application.Documents.Add();
//ДокументН.SaveAs(ВремФайл,0);                
//MSWord.Quit();
 
//Макет = ВернутьМакет();
//MSWord = Макет.Получить();
1C
1
2
3
4
5
6
7
8
&НаСервере
Функция ВернутьМакет()
    
        
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    СсылкаМакет = ОбработкаОбъект.ПолучитьМакет("Макет");
    Возврат СсылкаМакет;
КонецФункции

Так макет нельзя вернуть, а если на сервере сделать сразу, то тоже ошибка отсутствует отображение типа для ActiveDocument



0



polax

1783 / 1208 / 437

Регистрация: 16.01.2015

Сообщений: 5,322

14.12.2017, 10:25

5

Владислаучык, Вот рабочий код. Неделю назад делал ВПФ с макетом в Ворде

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
&НаСервере
Функция ПолучитьДокументВордИзМакета (ИмяМакета)
    Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");
    ИмяФайла = ПолучитьИмяВременногоФайла ("doc");
    Макет.Записать (ИмяФайла);
    
    Приложение = Новый ComObject ("Word.Application");
    
    ДокументыВорда = Приложение.Documents;
    Документ = ДокументыВорда.Open (ИмяФайла);
    Документ.Activate ();
    
    Selection = Приложение.Selection;
    Selection.WholeStory ();
    Selection.Copy ();
    
    НовыйДокумент = ДокументыВорда.Add ();
    НовыйДокумент.Activate ();
    Selection = Приложение.Selection;
    Selection.WholeStory ();
    Selection.PasteAndFormat (0);
    
    Документ.Close ();
    УдалитьФайлы (ИмяФайла);
    
    Данные = Новый Структура;
    Данные.Вставить ("Приложение", Приложение);
    Данные.Вставить ("Документ", НовыйДокумент);
    
    Возврат Данные;
КонецФункции // ПолучитьДокументВордИзМакета



0



3 / 3 / 7

Регистрация: 21.03.2013

Сообщений: 637

15.12.2017, 15:15

 [ТС]

6

polax, Приложение = Новый ComObject («Word.Application»); — вот тут ошибка, Ошибка при вызове конструктора (ComObject)
Приложение = Новый ComObject («Word.Application»);
по причине:
-2147221005(0x800401F3): Недопустимая строка с указанием класса



0



1783 / 1208 / 437

Регистрация: 16.01.2015

Сообщений: 5,322

15.12.2017, 18:19

7

Владислаучык, Либо делаете не на сервере, либо на компьютере не установлен Ворд



1



1117 / 671 / 195

Регистрация: 22.04.2013

Сообщений: 5,072

Записей в блоге: 1

15.12.2017, 21:17

8

Цитата
Сообщение от polax
Посмотреть сообщение

Либо делаете не на сервере

я путаю? может наоборот — делаете на сервере?
ексель,ворд же надо открывать локально?



1



1783 / 1208 / 437

Регистрация: 16.01.2015

Сообщений: 5,322

15.12.2017, 22:24

9

Лучший ответ Сообщение было отмечено Владислаучык как решение

Решение

Владислаучык, Yulunga, не то что ошибся, а высказал неправильно. Вот здесь описано http://1clancer.ru/article/oso… ie_8.2_847



1



0 / 0 / 0

Регистрация: 06.06.2022

Сообщений: 2

15.06.2022, 11:55

10

polax, У вас есть код для Exel макета active document?



0



1783 / 1208 / 437

Регистрация: 16.01.2015

Сообщений: 5,322

15.06.2022, 15:54

11

Dfolt, Вот из моих закладок по которым делаю подобное



0



Добрый день! Воспользовавшись поиском нашел порядка 3-4х веток на эту тему и  нигде так  и не увидел решения. Может его и  нет? Суть задачи: Открыть на сервере шаблон Word сохраненный как ActiveDocument, заполнить и  откорректировать его на сервере и например вывести его пользователю на стороне клиента. …. ну дальше делаем все что нужно с  документом ДокументWORD = Новый ДвоичныеДанные(ПолноеИмяФайла); и затем записываем его в  хранилище значений а  на клиенте получаем и  открываем. И все замечательно работает и  формируется на толстом и тонком клиенте… пока не запускаем Тонкий клиент через веб-сервер ну или не открываем 1с через браузер. В этом случае вываливается ошибка: Ошибка при вызове метода контекста (Получить)MSWord = Макет.Получить; На некоторых компах ошибка вываливается на методе Документ.SaveAs но если его закомментировать то опять же возвращаемся к  ошибке MSWord = Макет.Получить; Хоть кто нибудь знает доступен ли метод получения шаблона на сервере при работе через веб сервер? Или как это сделать лучше. Но весь смысл в  том чтобы документ формировался именно на сервере, потому как иногда совсем не нужно показывать файл на клиенте пользователю а  достаточно сохранить(на стороне сервера)

В синтакс-помощнике забанили?

xDD ага, забанили… Но то что там написано обламывает нас по полной: ОболочкаActiveDocument (ActiveDocumentShell) Получить (Get) Синтаксис: Получить Возвращаемое значение: Тип: COMОбъект. Описание: Получает COMОбъект для программного управления Active document. Доступность: ТОЛСТЫЙ КЛИЕНТ Но я сюда написал ибо помощь требуется. Кто сталкивался с  подобной задачей? Формировать файлы из ActiveDocument шаблона при клиент-серверном взаимодействии. Есть же наверное способ обхода ((((((

Выход — не использовать ActiveDocument

Вы меня убиваете ))))) Причем так обидно… если полностью по оболочке читать то она доступна на сервере Методы: Описание: Используется для доступа к Active document. Объект может быть записан в файл. Доступность: Сервер, толстый клиент. а ее методы только на толстом клиенте… ((

Однако спасибо все равно ))

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Войти или зарегистрироваться

[РЕШЕНО] Ошибка при вызове метода контекста получитьмакет activedocument

Тема в разделе «Конфигурирование на платформе «1С:Предприятие 8″», создана пользователем Persempre, 29 янв 2015.




0/5,
Голосов: 0
  1. TopicStarter Overlay

    Persempre

    Offline

    Persempre
    Опытный в 1С

    Регистрация:
    18 июл 2012
    Сообщения:
    868
    Симпатии:
    3
    Баллы:
    29

    Доброго времени суток. Суть проблемы в печати как понимаете. Запихнул Word в макет. Дальше заполнил закладки, обработал и тд. На локальной машине работает. А на боевой базе не взлетело. Код ниже, в чем затык не пойму

    Код:
    &НаКлиенте
    Процедура УведомлениеОбУвольненииИГ(Команда)
    
        УведомлениеОбУвольненииИГНаСервере();
       
    КонецПроцедуры
    
    &НаСервере
    Процедура УведомлениеОбУвольненииИГНаСервере() //ActiveDoc)
       
        ТаблицаПараметров.Очистить();
       
        // Открываем Word
        ActiveDoc = Справочники.ДополнительныеСведенияИФайлы.ПолучитьМакет("УведомлениеОбУвольнении");
        WordObj = ActiveDoc.Get();
        WordObj.Application.Visible = 1;
    

    Persempre,
    29 янв 2015
    #1

  2. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.901
    Симпатии:
    1.035
    Баллы:
    204

    на сервере не установлен WORD?


    nomad_irk,
    29 янв 2015
    #2

    Persempre нравится это.

  3. Draco

    Offline

    Draco
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.722
    Симпатии:
    961
    Баллы:
    204

    Ну первый вопрос парвильный Офис то на сервере есть?


    Draco,
    30 янв 2015
    #3

    Persempre нравится это.
  4. TopicStarter Overlay

    Persempre

    Offline

    Persempre
    Опытный в 1С

    Регистрация:
    18 июл 2012
    Сообщения:
    868
    Симпатии:
    3
    Баллы:
    29

    Да офис есть на сервере


    Persempre,
    30 янв 2015
    #4

  5. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.901
    Симпатии:
    1.035
    Баллы:
    204

    какая ошибка?


    nomad_irk,
    30 янв 2015
    #5


    Persempre нравится это.

  6. Draco

    Offline

    Draco
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.722
    Симпатии:
    961
    Баллы:
    204

    Ну или права у пользователя под которым это запускается на сервере еть на офис серверный.


    Draco,
    30 янв 2015
    #6
  7. TopicStarter Overlay

    Persempre

    Offline

    Persempre
    Опытный в 1С

    Регистрация:
    18 июл 2012
    Сообщения:
    868
    Симпатии:
    3
    Баллы:
    29

    Спасибо, вопрос решен. Заполнение нужно было делать на клиенте. Только скорость заполнения адски маленькая. как буд-то человек кнопки нажимает. Как ускорить не знаю


    Persempre,
    30 янв 2015
    #7
(Вы должны войти или зарегистрироваться, чтобы ответить.)
Показать игнорируемое содержимое
Похожие темы

  1. She

    8.х
    Ошибка при вызове метода контекста (Выполнить):Синтаксическая ошибка «И»

    She,
    3 сен 2009
    , в разделе: Отчеты и обработки для «1С:Предприятие 8»
    Ответов:
    3
    Просмотров:
    2.908
    mialord
    4 сен 2009

  2. AlenaAS

    8.х ОБМЕН
    Ошибка выполнения запроса (Ошибка при вызове метода контекста (Выполнить))

    AlenaAS,
    27 авг 2014
    , в разделе: Обмен данными в «1С:Предприятие 8»
    Ответов:
    9
    Просмотров:
    4.867
    nickpugachev
    27 авг 2014

  3. Primorsky

    [РЕШЕНО]
    Ошибка в обработке Ошибка при вызове метода контекста (Выполнить) плюс вылет программы

    Primorsky,
    12 янв 2015
    , в разделе: «1С:Бухгалтерия БП»
    Ответов:
    3
    Просмотров:
    18.107
    Primorsky
    20 янв 2015

Загрузка…
Ваше имя или e-mail:
У Вас уже есть учётная запись?
  • Нет, зарегистрироваться сейчас.
  • Да, мой пароль:
  • Забыли пароль?

Запомнить меня


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

Поиск

  • Искать только в заголовках
Сообщения пользователя:

Имена участников (разделяйте запятой).

Новее чем:
  • Искать только в этой теме
  • Искать только в этом разделе
    • Отображать результаты в виде тем

Быстрый поиск

  • Последние сообщения

Больше…

Lavr
22.10.2015 13:56 Прочитано: 2842

Здравствуйте.

Импортировал word-документ в справочник «Филиал», в макет как Active document. Есть форма списка и форма элемента списка, сделал кнопку на форме элемента, при нажатии вызов процедуры:

&НаКлиенте

Макет = Справочники.Филиал.ПолучитьМакет(«Макет»).Получить();Документ = Макет.Application.Documents(1);Документ.Activate();Макет.Application.Visible = Истина;Макет.Activate();

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

Подскажите пожалуйста, добрые специалисты, как это правильно сделать? Может вообще по другому можно, как-то проще?

Благодарю.

Yandex
Возможно, вас также заинтересует

Реклама на портале

IBReiter
22.10.2015 14:40 Ответ № 1

Код 1C v 8.3

 

&НаКлиенте
Процедура Открытьмакет(Команда)

ОткрытьмакетНаСервере();

КонецПроцедуры

&НаСервере
Процедура ОткрытьмакетНаСервере()

ОбъектВорд = Справочники.Филиал.ПолучитьМакет("Макет").Получить();
ОбъектВорд.Application.Visible = Истина;
ОбъектВорд.Activate();

КонецПроцедуры

Lavr
23.10.2015 08:31 Ответ № 2

В жиме толстого клиента все работает, а в web-интерфейсе ошибка: Ошибка при вызове метода контекста (Получить)

Через web-интерфейс этот метод должен работать?

IBReiter
23.10.2015 09:25 Ответ № 3

Проверил на платформе 8.3.6.2152 и в браузере хром — все ок, работает алоритм.

У вас конфигурация вообще какая?

Lavr
23.10.2015 09:37 Ответ № 4

Платформа 8.2 Конфигурация УП, с нуля пишу, очень простая с 7-ю справочниками.

IBReiter
23.10.2015 10:36 Ответ № 5

Режимы совместимости? как вариант..

Ну а так, попробуйте на 8.3 ещё

Lavr
23.10.2015 10:48 Ответ № 6

Не работает в совместимости. Оставлю тогда так:

&НаКлиентеПроцедура СлужебнаяЗаявка(Команда) Word = Новый COMОбъект («Word.Application»);Word.Documents.Open («\192.168.47.130wudataWU,_Фамилия_Имя,_Филиал_г._Караганда.doc»);Документ = Word.Application.Documents(1);Документ.Application.Visible = Истина;Документ.Activate();КонецПроцедуры

IBReiter
23.10.2015 11:27 Ответ № 7

И на 8.3 не работает?

Вам совместимость нужна

Подсказка: Вы получили ответ на свой вопрос — закройте вопрос!
<?php // Полная загрузка сервисных книжек, создан 2023-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='

Related Posts

  • Получение логина и пароля техподдержки 1С из базы
  • Класс для вывода отчета в ExcelКласс для вывода отчета в Excel
  • Счет-фактура для УПП
  • Библиотека классов для создания внешней компоненты 1С на C#
  • Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
  • Прайс-лист с артикулом в отдельной колонке

47 Comments

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

    Reply

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

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

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

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

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

    Reply

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

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

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

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

    Reply

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

    разъясните

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

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

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

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

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

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

    Reply

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

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

    Reply

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

    Reply

  7. Повторюсь

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

    Reply

  8. (6) s_uu, (7) Dighty,

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

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

    Reply

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

    Reply

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

    Reply

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

    Reply

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

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

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

    Reply

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

    Reply

  14. (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. (14) klinval, проверьте права доступа для пользователя, word и 1С на стороне сервера

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

    Reply

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

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

    Reply

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

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

    Reply

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

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

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

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

    Reply

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

    Что значит

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

    ?

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

    Reply

  20. (19)

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

    Да. Да:)

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

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

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

    по причине:

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

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

    Reply

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

    Reply

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

    Reply

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

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

    Reply

  24. (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. (24) klinval, вам нужна ошибка именно MS Word

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

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

    по причине:

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

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

    Reply

  26. (25)

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

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

    Reply

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

    Reply

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

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

    Reply

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

    Reply

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

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

    Reply

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

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

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

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

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

    Reply

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

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

    Reply

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

    Ошибка таже:

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

    Reply

  34. (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. (32) klinval, (33) ivant, (34) klinval,

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

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

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

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

    Reply

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

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

    Показать

    Reply

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

    Код:

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

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

    Reply

  38. А почему нельзя использовать документ двоичные данные? Загрузил туда шаблон. Получили шаблон. Сохранили документ. Передали на клиент имя открыли через 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

  39. (42)

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

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

    Reply

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

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

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

    Синтаксис:

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

    Параметры:

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

    Тип: Строка.

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

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

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

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

    Описание:

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

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

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

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

    Примечание:

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

    Показать

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

    Reply

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

    Reply

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

    Reply

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

    Reply

Leave a Comment

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

1C. «Недопустимое значение параметра» при вызове макета в расширении

Дано: 1С (в данном примере конфигурация 1С:Университет ПРОФ), платформа 8.3.10. Создано расширение, в котором к документу добавлен новый макет. В модуле менеджера документа есть процедура, формирующая печатную форму на базе макета. Необходимо было заменить данную процедуру (при помощи директивы расширения «&Вместо») и заменить вызов встроенного макета на наш, добавленный в расширение.
Проблема: при вызове добавленного макета в момент его печати в режиме «1С:Предприятие» возникала ошибка при получении макета:

{ЗаявлениеПоступающегоРасширение Документ.ЗаявлениеПоступающего.МодульМенеджера(176)}: Ошибка при вызове метода контекста (ПолучитьМакет)
Макет = Документы.ЗаявлениеПоступающего.ПолучитьМакет («Расш1_МакетЗаявлениеПоступающего»);
по причине:
Недопустимое значение параметра (параметр номер ‘1’)

Код, вызывающий ошибку:

Варианты решения:

1. Добавить функцию, выполняемую на сервере, которая вызовет добавленный макет из документа:

&НаСервере

Функция ПолучитьМакетЗаявленияИзРасширения()

    Макет = Документы.ЗаявлениеПоступающего.ПолучитьМакет («Расш1_МакетЗаявлениеПоступающего»);

    Возврат Макет;

КонецФункции

А затем из заменяемой процедуры вызвать эту функцию:

(как оказалось этот способ не нужен. Причину читайте ниже)

2. Другой вариант — перенести макеты в общие и следующей командой вызвать (получить) макет из «Общие макеты»:

Макет = ПолучитьОбщийМакет («Расш1_МакетЗаявлениеПоступающего»);

——
Видимо это всё-таки какой-то глюк платформы (протестировано на 8.3.10.2252 и 8.3.10.2299), но если просто добавить пустой макет в общие макеты в расширении, то команда, ранее вызывавшая ошибку (ПолучитьМакет из макета документа без допфункций на сервере), начинает нормально работать. При удалении пустого общего макета, команда вызова макета из документа снова вызывает ошибку (даже если вынесена в функцию на сервере, как показано в способе 1).
Т.е. если всё-таки хочется сделать макеты нормально в документе (ожидая, что когда-нибудь этот глюк исправят), то нужно сделать макет-заглушку в общих макетах. Например:

При этом, если в расширении добавлено несколько макетов к документу, то «заглушки» достаточно только одной.

Если Вам понравилась статья, пожалуйста, поставьте лайк, сделайте репост или оставьте комментарий. Если у Вас есть какие-либо замечания, также пишите комментарии.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Msvcr71 dll ошибка winx
  • Msvcr71 dll исправляем ошибку