Ошибка при вызове метода контекста (Записать): Вывод запрещен |
Я |
16.01.18 — 07:06
Пользовался и поиском и гуглом, ответа на свой вопрос не нашел.
1С:Предприятие 8.1 (8.1.11.67). Регламентное задание.
Код упростил до:
ТабДок = Новый ТабличныйДокумент;
ТабДок.Записать(«E:TempSite1.xls», ТипФайлаТабличногоДокумента.XLS);
При выполнении возникает ошибка: Ошибка при вызове метода контекста (Записать): Вывод запрещен
Варианты которые нашел:
1. Проверить права пользователя, под которым выполняются регламентные задания.
Все права проверил — не помогает.
2. Написать ТабДок.Вывод = ИспользованиеВывода.Разрешить;
Наипсал, ошибка пропала, но файл не создается. Хотя при запуске вручную от себя и при запуске вручную от имени этого пользователя — файл создается.
В чем может быть причина?
1 — 16.01.18 — 07:09
Традиционно — ищешь файл не в том месте.
2 — 16.01.18 — 07:10
пользователь не имеет права(win)
3 — 16.01.18 — 07:16
(1) Но ведь когда я логинюсь на сервер под тем пользователем, от которого запущена служба Агент сервера 1С (USR1CV81), и в 1С под пользователем который указан в регламентном задании — файл создается в том месте.
(2) проверил права и пользователя win (USR1CV81) и пользователя 1С, под которым выполняется регламентное задание
4 — 16.01.18 — 07:21
(3) место поменять? КаталогВременныхФайлов(), к примеру
5 — 16.01.18 — 07:33
Попробуй получить имя временного файла и сохранить. Второй вариант — на рабочий стол. Определись под каким пользователем отрабатывается код в файловой и клиент-серверной может быть разница.
6 — 16.01.18 — 07:57
Написал следующим образом:
ТабДок = Новый ТабличныйДокумент;
ТабДок.Вывод = ИспользованиеВывода.Разрешить;
ИмяФайла = КаталогВременныхФайлов()+»1.xls»;
ЗаписьЖурналаРегистрации(«Выгрузка цен на сайт», УровеньЖурналаРегистрации.Ошибка, , , ИмяФайла);
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);
В журнале регистрации имя файла:
C:UsersUSR1CV81AppDataLocalTemp1.xls
На деле — ошибок нет, файла по этому пути тоже нет.
7 — 16.01.18 — 07:58
Как определил, что ошибок нет?
8 — 16.01.18 — 08:00
А вручную запускаешь на том же сервере, где служба 1С крутится?
9 — 16.01.18 — 08:03
(7) по журналу регистрации и по консоли заданий
(8) да
10 — 16.01.18 — 08:05
(9) Ты видишь в ЖР успешное завершение фонового задания?
11 — 16.01.18 — 08:06
(10) да, сразу после моего записанного сообщения с именем файла — Фоновое задание. Успешное завершение
12 — 16.01.18 — 08:15
(11) Добавь
ФайлXLS = Новый Файл(ИмяФайла);
ЗаписьЖурналаРегистрации(«ВыполнениеРегламентныхЗаданий»,,,,»Файл » + ИмяФайла + » существует = » + ФайлXLS.Существует());
13 — 16.01.18 — 09:06
У пользователя USR1CV81 нет прав на запись
14 — 16.01.18 — 09:21
Может имя файла должно быть «серверным»?
Сияющий в темноте
15 — 16.01.18 — 10:31
в журнал регистрации нуюно писать до и после,чтобы понять,где сглючило,опять же,каталог временных файлов большой,можно что-то не увидеть,прочитайте другой программой файл по этому пути
1
2
Показывать по
10
20
40
сообщений
Новая тема
Ответить
aipnnov
Дата регистрации: 13.04.2009
Сообщений: 6
«Почему не выполняется следующий код при записи текстового документа в .txt файл на диск при выполнении фонового задания.<br>Код в модуле:<br>Процедура ЗаписатьТекстСообщений(ИмяФайла, Отказ=0)<br> …<br> Попытка<br> ПолныйТекстСообщений.Записать(Строка(Файл.ПолноеИмя), КодировкаТекста.UTF8);<br> Исключение<br> ВывестиСообщение(ОписаниеОшибки(),,2);<br> КонецПопытки;<br> …<br>КонецПроцедуры<br><br>ПолныйТекстСообщений = Новый ТекстовыйДокумент;<br><br>Данная процедура выполняется после передачи или приема файлов обмена. Ошибка выдается в в журнале регистрации следующая:<br>Ошбка при вызове метода контекста (Записать): Вывод Запрещен.»
Денис (САМАРА)
Дата регистрации: 09.04.2008
Сообщений: 8351
Все же написано в тексте ошибки. Проверьте права пользователя, от имени которого выполняеете обмен.
aipnnov
Дата регистрации: 13.04.2009
Сообщений: 6
> Все же написано в тексте ошибки. Проверьте права пользователя, от имени которого выполняеете обмен.<br><br>Причем тут права пользователя? Обмен данными происходит в автоматическом режиме с использованием регламентного задания, обработки и плана обмена. В общем модуле и модулях плана обмена и обработки нет процедур и функций требующих для выполнения права администратора.<br>Согласно Описания языка 1С Предприятия 8.1 функция ТекстовыйДокумент.Записать (ПолноеИмяФайла,Кодировка) должна выполнятся во всех режимах, но она не выполняется именно при фоновом обмене(автообмене через планировщика) и выдается сообщение Вывод запрещен, при ручном обмене выполняется без проблем.<br>
Registr
Дата регистрации: 10.04.2009
Сообщений: 14
Во-первых, регламентные задания выполняются то же от имени какого-либо пользователя… во-вторых в коде смущает процедура ВывестиСообщение()… не знаю что там в этой процедуре, но в фоновых заданиях нельзя использовать интерфейсные функции… фактически канает только Сообщить(), в том смысле, что не дает ошибку, хотя и не работает…
aipnnov
Дата регистрации: 13.04.2009
Сообщений: 6
Не обращай внимание на процедуру ВывестиСообщение() эту процедуру написал я специально для автообмена, чтобы выводить предупреждения, сообщения, примечания и ошибки при обмене в ТекстовыйДокумент и в журнал регистраций, который и не записывается в каталог на винте. Суть вопроса в том почему не работает ТекстовыйДокумент.Записать(ПолныйПутьфайла, Кодировкатекста), ВывестиСообщение() работает без проблем.<br>Я конечно уже решил эту задачу по другому, но все равно этой ошибки не должно быть.
Registr
Дата регистрации: 10.04.2009
Сообщений: 14
Еще раз говорю вам, что фоновые задания выполняются от имени какого-либо пользователя, если же пользователь явно не указан, выполняются от имени любого пользователя, в роли которого стоит галочка «Административные функции».. а вот стоит ли там галочка «Вывод», это еще вопрос…
aipnnov
Дата регистрации: 13.04.2009
Сообщений: 6
Хорошо, ты меня добил. Эта встроенная функция ТекстовыйДокумент.Записать(ПолноеИмяФайла, Кодировка) не выполняется под администратором и ролью ПолныеПрава и галочки все стоят на всех модулях,обменах, процедурах, отчетах, обработках, регистрах,параметрах и т.д. и т.п., при выполнении фонового задания т.е. на сервере, а на клиенте выполняется не зависимо от ролей. Что теперь еще скажешь?!
Prikum
активный пользователь
офлайн
Дата регистрации: 18.02.2002
Сообщений: 20836
Ну если ты такой умный, что же лезешь с вопросами?
Registr
Дата регистрации: 10.04.2009
Сообщений: 14
Скажу что согласен с предыдущим постом.. По-крайней мере, мне отсюда не видно, что у тебя там стоит…
aipnnov
Дата регистрации: 13.04.2009
Сообщений: 6
> Ну если ты такой умный, что же лезешь с вопросами?<br><br>Я понял, что решение по данной проблеме вы не знаете. Это однозначно упущение разработчиков 1С 8.1 и будет исправлено.<br>А грубить не надо. Программа 1С с самого начала как имела подобные проблемы, так до сих пор их имеет и надо признавать свои ошибки и помогать в их решении.<br>Мне уже это не нужно, я эту проблему обошел и все сохраняется, но вопрос остался не разрешимым для других программистов в том числе и ваших сторонних сертифицированных разработчиков.
В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.
Исправляем ситуацию
Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.
Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| ";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КонецЦикла;
Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.
Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.
Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа ";
НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
КонецЦикла;
1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.
В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.
Чаще всего причиной подобных ошибок выступают следующие факторы:
- Невнимательность;
- Отсутствие опыта или знаний;
- Несогласованность действий разработчиков друг с другом;
- Изменения в методах контекста в новых версиях платформы.
Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.