Ошибка при вызове метода контекста в 1с при печати

Столкнулся с такой ошибкой, при выводе информации на печатную форму, платформа выдает следующее сообщение:
Ошибка при вызове метода контекста (ПроверитьВывод)…

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

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

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

1. Помещение ПроверитьВывод в попытку

2) Сформировал печатную форму.

1. Помещение ПроверитьВывод в попытку

2) Сформировал печатную форму.

2. Пустая печатная форма (кол-во товаров = 0)

3) Для текущей печатной формы открыл параметры страницы и установил правильные параметры.

3. Параметры страницы

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

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

UPD 04/10/2015: Если устанавливать свойство КлючПараметровПечати в конце формирования табличного документа, то метод ПроверитьВывод будет использовать параметры печати установленные по-умолчанию, а не пользовательские. Что бы избежать данной ситуации, необходимо устанавливать свойство КлючПараметровСистемы в начале формирования табличного документа, а метод ПроверитьВывод поместить в конструкцию Попытка-Исключение-КонецПопытки.

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

Исправляем ситуацию

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

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


	 Запрос = Новый Запрос;
	 Запрос.Текст =
	         "ВЫБРАТЬ
	          |        Номенклатура.Ссылка КАК Ссылка,
	          |        Номенклатура.ВерсияДанных КАК ВерсияДанных,
	          |        Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	          |        Номенклатура.Родитель КАК Родитель,
	          |        Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	          |        Номенклатура.Код КАК Код,
	          |        Номенклатура.Наименование КАК Наименование,
	          |        Номенклатура.Артикул КАК Артикул,
	          |        Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	          |        Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	          |        Номенклатура.Предопределенный КАК Предопределенный,
	          |        Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	          |ИЗ
	          |        Справочник.Номенклатура КАК Номенклатура
	          |ГДЕ
	          |         ";
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 КонецЦикла;
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.

Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.

Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.


	 Запрос = Новый Запрос;
	            Запрос.Текст =
	                       "ВЫБРАТЬ
	                        |          Номенклатура.Ссылка КАК Ссылка,
	                        |          Номенклатура.ВерсияДанных КАК ВерсияДанных,
	                        |          Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	                        |          Номенклатура.Родитель КАК Родитель,
	                        |          Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	                        |          Номенклатура.Код КАК Код,
	                        |          Номенклатура.Наименование КАК Наименование,
	                        |          Номенклатура.Артикул КАК Артикул,
	                        |          Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	                        |          Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	                        |          Номенклатура.Предопределенный КАК Предопределенный,
	                        |          Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	                        |ИЗ
	                        |          Справочник.Номенклатура КАК Номенклатура
	                        |ГДЕ
	                        |          НЕ Номенклатура.ЭтоГруппа ";
	 НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
	 КонецЦикла;
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.

Рис.3 Синтакс-помощник
Рис.3 Синтакс-помощник

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

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает
Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Чаще всего причиной подобных ошибок выступают следующие факторы:

  1. Невнимательность;
  2. Отсутствие опыта или знаний;
  3. Несогласованность действий разработчиков друг с другом;
  4. Изменения в методах контекста в новых версиях платформы.

Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.

   DTX 4th

20.11.20 — 14:39

1. Сломался метод ПроверитьВывод:

{ВнешняяОбработка.ТестПечати.Форма.Форма.Форма(9)}: Ошибка при вызове метода контекста (ПроверитьВывод)
    Если ТабДок.ПроверитьВывод(Обл) Тогда
по причине:
Ошибка получения информации о принтере

2. При печати пустого табличного документа появляется ошибка «Ошибка при получении характеристик принтера»

https://i.imgur.com/bOAp6MP.png

Пробовали вот что:

— еще две последние версии 8.3.17, а также последню 8.3.18

— чистка кэша

— ОчиститьНастройкиПользователя(ПользователиИнформационнойБазы.ТекущийПользователь())

— устанавливали в реестр дефолтный принтер (Прописали значение ключа «по умолчанию» — «//appServer123/printer008“)

При этом на сервере работает (где стоит сервер 1С), а на пустой локальной файловой базе нет

Кто-нибудь сталкивался? Как лечить?

В списке ошибок платформу тоже пусто.

   DTX 4th

1 — 20.11.20 — 14:41

И отключите уже автоформаттер…

   piter3

2 — 20.11.20 — 14:45

HKCUPrintersDefaults{id}» там чего?

   DTX 4th

3 — 20.11.20 — 14:49

   piter3

4 — 20.11.20 — 14:52

А если нового пользователя завести?

   DTX 4th

5 — 20.11.20 — 15:37

(4) Под новым пользователем все ок..

И что это значит?)

   dka80

6 — 20.11.20 — 15:39

Сбросьте сохраненные настройки пользователя все

   DTX 4th

7 — 20.11.20 — 15:43

(6) В винде? Или как?

Вот это вот

ОчиститьНастройкиПользователя(ПользователиИнформационнойБазы.ТекущийПользователь())

не оно?

Плюс печать не работает даже на только что созданной базе

   DTX 4th

8 — 20.11.20 — 15:48

(5) Я нового пользователя винды сделал, а не 1с

Новый пользователя 1с не поможет

   dmrjan

9 — 20.11.20 — 16:35

Я до сих пор не понимаю — зачем 1с внедрила свой модуль печати. Использовали все родные драйвера принтеров. Все было более менее нормально. Нет нужно извратиться и подсунуть свой обработчик. Теперь нужно указывать — использовать настройки принтера двусторонней печати от 1с или принтера. Зачем плодить сущности?

   dmrjan

10 — 20.11.20 — 16:37

(8) Есть обработка в сети — «ХранилищеНастроек_Чистка». Можешь с помощью нее почистить настройки печати https://all4cf.ru/univof-ochistka_nastroek_polzovateley.html

   dmrjan

11 — 20.11.20 — 16:41

А ещё — может стоит по-умолчанию принтер, который не подключен.

   DTX 4th

12 — 20.11.20 — 16:47

(10) Так я же говорю, что я даже новую базу создал, и оттуда не получается на печать документ отправить

(11) В настройках печати нельзя выбрать ни один принтер

   Ногаминебить

13 — 20.11.20 — 16:54

А не из 1С под этим пользователем печатать можно? А то всякие случаи бывают.

   DTX 4th

14 — 20.11.20 — 16:58

   Lama12

15 — 20.11.20 — 17:15

Точно не ошибка Код ошибки: 10216040?

   DTX 4th

16 — 20.11.20 — 17:18

(15) Точно. Пробовал последнюю 18ую платформу, не работает ни один принтер, включал виртуальные типа Print To OneNote, XPS и т.д

   DTX 4th

17 — 20.11.20 — 18:34

Похоже, не хватает каких-то прав, т.к. под админом все работает.

Есть идеи?

   МимохожийОднако

18 — 20.11.20 — 18:36

Дай админиские права пользователю. После настройки принтера уберешь

   piter3

19 — 20.11.20 — 18:37

(5) значит, что настройки пользователей сохранились

   piter3

20 — 20.11.20 — 18:39

Нси-пользователи, дожди до настроек печатных форм, не помню как точно называется

   FormatC

21 — 20.11.20 — 18:41

ШО… Опять… на любые принтеры не печатает?

во я тему поднимал в ноябре ошибка при печати на принтеры Kyocera

   FormatC

22 — 20.11.20 — 18:43

пришлось тогда откатиться на 8.3.15.30 на ней и сидим

   piter3

23 — 20.11.20 — 18:45

(21) ну погоди, у него вроде другая машинка

   DTX 4th

24 — 20.11.20 — 19:08

(19) Пользователей 1С? Или винды?

Я же говорю, что я создал Новую Пустую Базу, и даже после этого не получается вызвать метод ПроверитьВывод табличного документа.

(21) Даже на Microfost XPS Writer, скрин в (0)

   piter3

25 — 20.11.20 — 19:24

(24) Я бы начал с 1с, но где-то видел, что может прав не хватает в винде. Но настройки пришли старые при распаковке, а движок уже по новому берет. У меня было, но я как-то быстро сделал, потом подованам раздал. Точно помню, реестр и настройки пользователей

   Lea_lbs

26 — 20.11.20 — 19:45

(25) Проблема точно в правах, но как понять в чем конкретно? И где копать?

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

В случае запуска под админской учетной записью проблемы нет.

Дать всем админов не вариант. В компании более 20 человек такое делать нельзя.

   piter3

27 — 20.11.20 — 19:54

(26) Еще раз, я зачистил для начала бы в 1с настройки печатных форм, потом бы глянул бы на админство, вроде дали не админские коллеги мои

   Провинциальный 1сник

28 — 20.11.20 — 20:02

В 1с начиная с 8.3.16 функции работы с принтером выделены в отдельные приложения 1cv8p32.bin и 1cv8p64.bin, которые запускаются при обращении к принтеру. Это сделано для того, чтобы отвязать основные библиотеки 1с от работы с потенциально нестабильным драйвером принтера. Но некоторые антивирусы запуск таких приложений блокируют. Кроме того, это может быть закрыто политиками безопасности. Проверяйте там.

   d4rkmesa

29 — 20.11.20 — 21:29

Можно попробовать Process Monitor’ом глянуть с фильтром по 1cv8p64.bin и Result is not success. Но это несколько неблагодарное дело, там при запуске Ctrl+P порядка 1500-2000 событий будет, в основном поиск в ветках реестра(хотя и по ним можно отфильтровать). Главное найти то что нужно среди кучи информации.

  

piter3

30 — 20.11.20 — 21:31

(29) Думаю там все проще

ls600
25.12.2013 13:45 Прочитано: 5010

Доброго времени суток. Ситуация такая стояла платформа 8.2.18.61 обновили на платформу 8.3.4.365.
Вылез один косяк при печати Авансового отчета.

Не удалось сформировать внешнюю печатную форму!
Ошибка при вызове метода контекста (Выполнить): {(198, 80)}: В запросе с предложениями РАЗЛИЧНЫЕ или ОБЪЕДИНИТЬ нельзя использовать поля неограниченной длины
ИЛПеречислениеПолучателям.ДокументОснование.ВидИсполнительно гоДокумента + » » <<?>>+ ПОДСТРОКА(ИЛПеречислениеПолучателям.ДокументОснование.Реквиз итыИсполнительногоДокумента, 1, 1000)

если запустить платформу 8.2 то без проблем. все печатает.

подскажите как исправить?

P.S конфигурация Бухгалтерия для Казахстана 2.0.11.9, даже если поставить последний релиз проблема остается

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

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

Jonsony
25.12.2013 14:38 Ответ № 1

(0) ls600, писать в саппорт по 8.3 платформе
это изменения в языке 1С походу, или у полей сменить с неопределённой длины на заданное кол-во символов, но эти поля найти надо ещё

PS
и кто-ж без тестирования накатывает новое?
какой смысл был в переводе на 8.3 платформу? даже бух3 ещё под 8.2 работает, в отличии от ЗУП3 который сразу на 8.3 вышел
правда и ут11 похоже с 11.1.4 на 8.3 посадят, ибо тестовая 11.1.4.6 уже под 8.3


Изменено 25.12.13 14:39:28

ls600
26.12.2013 14:24 Ответ № 2

проблема решена благодаря одному хорошему человеку. если изменить значение ИЛПеречислениеПолучателям.ДокументОснование.ВидИсполнительногоДокумента + » » <<?>>+ ПОДСТРОКА(ИЛПеречислениеПолучателям.ДокументОснование.РеквизитыИсполнительногоДокумента, 1, 900) или ниже то все нормально. видимо в 8,3 какое то ограничение стоит.

Jonsony
26.12.2013 16:43 Ответ № 3

(2) ls600, ну правильно, вы строку ограничили вот и перестал ругаться, просто в конфе у этого реквизита стоит «строка неопределённой длины»
в саппорт отпишитесь по этому моменту, а то что-то они много касячить в коде стали в последние полгода

ls600
28.12.2013 13:10 Ответ № 4

Вопрос закрыт!

Подсказка: Вы получили ответ на свой вопрос — закройте вопрос!
  • #1

В 1Сv8.2Управление Предприятием Создал пользователя «кладовщик» с соответствующей ролью «кладовщик» и интерфейсом «кладовщик». По должностным обязанностям требуется создавать Требования-накладные и Лимитно-заборные карты( без права Проводки обоих ), а так же разпечатывать эти документы. Возникло две ошибки: одна при открытии (Ошибка при вызове метода контекста(Записать):Вывод запрещен ) Нажимаю ОК и она закрывается. И вторая ошибка при печати документа (Ошибка при вызове метода контекста(Напечатать):Вывод запрещен) Причем печатная форма документа показывается нормально, а ошибка возникает при отправке документа на принтер. Просмотрел все права роли а так же дополнительные права — разрешил все что так или иначе связано с печатью, но проблема не решилась. Пользователь с ролью «Полные права» и полными доп.правами нормально всё разпечатывает и не имеет сообщения об ошибке при входе . Где еще можно искать решение данной проблемы?

  • _________________.bmp

    737,9 КБ

    · Просмотры: 210

  • ___________________.bmp

    1,1 МБ

    · Просмотры: 209

Понравилась статья? Поделить с друзьями:
  • Ошибка при вызове метода контекста в 1с как исправить
  • Ошибка при вызове метода контекста выпол
  • Ошибка при вызове метода контекста wsпрокси
  • Ошибка при вызове метода контекста выпо
  • Ошибка при вызове метода контекста write