Содержание:
1. Ошибка при установке значения атрибута контекста
2. Ошибка при получении значения атрибута контекста
Одной из наиболее частых ошибок исполнения кода 1С являются ошибки, связанные с установкой реквизита либо получением реквизита через точку, либо ошибка при вызове функции или процедуры через точку. Все данные объекты являются атрибутами информационных объектов-владельцев, к которым они принадлежат. Рассмотрим примеры таких ошибок и причины их возникновения.
1. Ошибка при установке значения атрибута контекста
Ошибка при установке значения атрибута контекста говорит нам о невозможности присвоить выбранное значение определенному атрибуту информационного объекта. Вызвано это либо несовпадением типа атрибута и присваиваемого ей значения, отсутствием возможности присвоить значение выбранному атрибуту, так как его можно только читать, но не записывать в него, отсутствием прав у текущего пользователя на запись значений в данный атрибут. Например, в реквизит «ДатаДокумента» с типом «Дата» пытаемся записать строку, в реквизит с типом данных ссылки на документ пытаемся записать не ссылку, а объект, полученный по ссылке, что невозможно из-за несоответствия типов, что приводит к ошибке установки значения атрибута.
Другой пример – проходя циклом выборку запроса, пытаемся в колонку выборки записать значение, что невозможно, так как значения выборки запроса можно только считывать, а для того, чтобы можно было полученные из запроса данные изменять в коде, нужно пользоваться не выборкой, а выгружать результат запроса в таблицу значений, в таком случае в цикле по ней можно будет менять значения в колонках, но только на значения, соответствующие типу колонки. Либо у пользователя, под которым выполняется код, нет прав на изменение даты документа, при попытке записать в данный реквизит новую дату, будет выведено сообщение об ошибке установке значения, но в причине будет указано отсутствие прав у пользователя.
2. Ошибка при получении значения атрибута контекста
Ошибка при получении значения атрибута контекста указывает на невозможность прочитать значение атрибута объекта в силу его отсутствия, либо отсутствия прав на его чтение. Например, обращение к несуществующему реквизиту объекта, несуществующему полю выборки из запроса, несуществующему свойству элемента формы и т.п. Так же как пример можно рассмотреть получение текущего пользователя из параметров сеанса — если данный параметр сеанса не установлен, то тоже будет выведена ошибка получения значения атрибута контекста, но в причине будет указана попытка получения неинициализированного значения параметра сеанса.
При возникновении данных ошибок значения атрибута в 1Св первую очередь следует проверить существование атрибута, к которому обращаются, затем проверить совпадение типов значений атрибута и присваиваемого ему значения, затем уже проверить права на установку либо чтение значения. Проверить, является ли дело в правах либо дать права на действия с атрибутом, можно, установив привилегированный режим для совершения действия с данным атрибутом, прописав перед строчкой с ошибкой УстановитьПривилегированныйРежим(Истина), после строчки — УстановитьПривилегированныйРежим(Ложь).
Специалист компании «Кодерлайн»
Александр Суворов
Содержание:
1. Ошибка при установке значения атрибута контекста
2. Ошибка при получении значения атрибута контекста
Одной из наиболее частых ошибок исполнения кода 1С являются ошибки, связанные с установкой реквизита либо получением реквизита через точку, либо ошибка при вызове функции или процедуры через точку. Все данные объекты являются атрибутами информационных объектов-владельцев, к которым они принадлежат. Рассмотрим примеры таких ошибок и причины их возникновения.
1. Ошибка при установке значения атрибута контекста
Ошибка при установке значения атрибута контекста говорит нам о невозможности присвоить выбранное значение определенному атрибуту информационного объекта. Вызвано это либо несовпадением типа атрибута и присваиваемого ей значения, отсутствием возможности присвоить значение выбранному атрибуту, так как его можно только читать, но не записывать в него, отсутствием прав у текущего пользователя на запись значений в данный атрибут. Например, в реквизит «ДатаДокумента» с типом «Дата» пытаемся записать строку, в реквизит с типом данных ссылки на документ пытаемся записать не ссылку, а объект, полученный по ссылке, что невозможно из-за несоответствия типов, что приводит к ошибке установки значения атрибута.
Другой пример – проходя циклом выборку запроса, пытаемся в колонку выборки записать значение, что невозможно, так как значения выборки запроса можно только считывать, а для того, чтобы можно было полученные из запроса данные изменять в коде, нужно пользоваться не выборкой, а выгружать результат запроса в таблицу значений, в таком случае в цикле по ней можно будет менять значения в колонках, но только на значения, соответствующие типу колонки. Либо у пользователя, под которым выполняется код, нет прав на изменение даты документа, при попытке записать в данный реквизит новую дату, будет выведено сообщение об ошибке установке значения, но в причине будет указано отсутствие прав у пользователя.
2. Ошибка при получении значения атрибута контекста
Ошибка при получении значения атрибута контекста указывает на невозможность прочитать значение атрибута объекта в силу его отсутствия, либо отсутствия прав на его чтение. Например, обращение к несуществующему реквизиту объекта, несуществующему полю выборки из запроса, несуществующему свойству элемента формы и т.п. Так же как пример можно рассмотреть получение текущего пользователя из параметров сеанса — если данный параметр сеанса не установлен, то тоже будет выведена ошибка получения значения атрибута контекста, но в причине будет указана попытка получения неинициализированного значения параметра сеанса.
При возникновении данных ошибок значения атрибута в 1Св первую очередь следует проверить существование атрибута, к которому обращаются, затем проверить совпадение типов значений атрибута и присваиваемого ему значения, затем уже проверить права на установку либо чтение значения. Проверить, является ли дело в правах либо дать права на действия с атрибутом, можно, установив привилегированный режим для совершения действия с данным атрибутом, прописав перед строчкой с ошибкой УстановитьПривилегированныйРежим(Истина), после строчки — УстановитьПривилегированныйРежим(Ложь).
Специалист компании «Кодерлайн»
Александр Суворов
|
|||
AnisaL
08.08.19 — 12:59 |
Добрый день! Скажите пожалуйста, такая ошибка: {UDS_GAME Документ.ЧекККМ.Форма.ФормаДокумента_РМК.Форма(328)}: Ошибка при установке значения атрибута контекста (Запасы) ЗаполнитьСуммуВсегоВТаблице(Объект.Запасы, Объект.СуммаВключаетНДС); по причине: Нельзя изменять поле, содержащее объект данных формы Что делать? |
||
Кац
1 — 08.08.19 — 13:00 |
(0) Что делать? Не изменять поле содержащее объект данных формы |
||
RomanYS
2 — 08.08.19 — 13:01 |
(0) Сделать ЗаполнитьСуммуВсегоВТаблице контектсной и не передавать туда Объект.Запасы, оно и так будет доступно в контексте |
||
AnisaL
3 — 08.08.19 — 13:02 |
(2) а как сделать контекстной? |
||
hhhh
4 — 08.08.19 — 13:03 |
(3) показывайте уже вашу функцию |
||
Кац
5 — 08.08.19 — 13:04 |
&НаСервере ЗаполнитьСуммуВсегоВТаблице() |
||
AnisaL
6 — 08.08.19 — 13:08 |
(4)// Заполняет поле СуммаВсего в зависимости от признака включения НДС в цену. // // Параметры: // Таблица - ДанныеФормыКоллекция - Таблица, в которой необходимо заполнить колонку СуммаВсего. // ЦенаВключаетНДС - Булево - признак включения НДС в цену. // Процедура ЗаполнитьСуммуВсегоВТаблице(Таблица, ЦенаВключаетНДС) Экспорт Для Каждого СтрокаТаблицы Из Таблица Цикл ЗаполнитьСуммуВсегоВСтрокеТаблицы(СтрокаТаблицы, ЦенаВключаетНДС); КонецЦикла; КонецПроцедуры// ЗаполнитьСуммуВсегоВТаблице() |
||
AnisaL
7 — 08.08.19 — 13:16 |
(2) все-таки как сделать контекстной? |
||
RomanYS
8 — 08.08.19 — 13:20 |
(7) смотри (5) Но в данном случае не поможет (слишком универсальная функция). Твоя функция проста, сделай её &НаКлиенте вместе с ЗаполнитьСуммуВсегоВСтрокеТаблицы |
||
AnisaL
9 — 08.08.19 — 14:44 |
(8) я сделала функцию без параметров, и вот такой: &НаСервере Процедура ЗаполнитьСуммуВсегоВТаблице() Для Каждого СтрокаТаблицы Из Объект.Запасы Цикл ЗаполнитьСуммуВсегоВСтрокеТаблицы(СтрокаТаблицы, Объект.СуммаВключаетНДС); КонецЦикла; КонецПроцедуры ЗаполнитьСуммуВсегоВСтрокеТаблицы тоже сделала &НаСервере |
||
RomanYS
10 — 08.08.19 — 14:48 |
(9) Это и имелось в виду в (2), но процедура сталане универсальной. Проще (и вероятно правильнее) делать такие (простые) расчеты на клиенте — проблема вообще не возникла бы. |
||
hhhh
11 — 08.08.19 — 15:15 |
(9) оно и было на сервере. Потому что если ничего не указано, значит на сервере. То есть и было на сервере, и ты указала на сервере, ничего не изменилось. |
||
RomanYS
12 — 08.08.19 — 15:18 |
(11) >> ничего не изменилось. изменялись параметры, их больше нет |
||
palsergeich 13 — 08.08.19 — 15:23 |
Настало время рефакторинга |
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку «Обновить» в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
1 февраля, 2017
21 апреля, 2017
Дано
- 1С конфигурация бухгалтерия предприятия 2.0
- Ошибка печати ПКО (приходный кассовый ордер):
{ОбщаяФорма.ФормаПечати.Форма(18)}: Ошибка при установке значения атрибута контекста ЭлементыФормы.ПолеДокумента.ПолеСверху по причине: Несоответствие типов |
Анализ проблемы
На первый взгляд все ужасно:
- в конфигураторе видно, что система пытается выполнить строчку кода:
ЭлементыФормы.ПолеДокумента.ПолеСверху = ПечатныйДокумент.ПолеСверху; |
- в отладке видно, что обе переменные типа “Число”,
- синтакс-помощник говорит что:
ТабличныйДокумент (SpreadsheetDocument) ПолеСверху (TopMargin) Использование: Чтение и запись. |
То есть ПолеСверху доступно для записи и обе переменные типа число и все тут корректно, но система говорит “Несоответствие типов” – полный бред.
Решение
На решение проблемы натолкнула фраза “Ошибка при установке значения атрибута контекста”, значит что-то не так с доступом.
Оказалось в базе нет ни одного пользователя и работа осуществлялась под пользователем НеАвторизован. После создания пользователя с необходимыми правами все заработало.
Дополнено 2017.04.10
Проблема повторилась, но уже при печати РТУ и с использованием уже настроенной учетной записи.
Помогло создание нового пользователя с такими же правами доступа. То есть нового создаем, старого удаляем и после этого все работает.
Ошибка при установке значения атрибута контекста (СписокВыбора)
Данная ошибка возникает при попытке установить полю с типом «СписокЗначений» значение неподходящего типа. Например: Неопределено.
Полная ошибка
Ошибка при установке значения атрибута контекста (СписокВыбора)
ЭлементыФормы.Поставщик.СписокВыбора = КЭШируемые.СписокПоставщиков(Контрагент);
по причине:
Несоответствие типов
Скриншот:
Причина: В функции, которая формировала данный список (КЭШируемые.СписокПоставщиков()) отсутствовал возврат значения.
В экспериментальных целях:
передал значение с типом «Массив» — текст ошибки не поменялся.
В итоге переписал на более универсальный метод ЗагрузитьЗначения() самого элемента диалога:
ЭлементыФормы.Поставщик.СписокВыбора.ЗагрузитьЗначения(КЭШируемые.СписокПоставщиков(Контрагент));
Впервые в истории планеты Земля все люди во всех странах задались единой целью: заработать столько денег, чтобы уподобиться героям рекламы.
turboq 159 / 158 / 13 Регистрация: 14.01.2010 Сообщений: 1,488 |
||||||||
1 |
||||||||
Нельзя изменить поле, содержащее данные формы. Почему?17.01.2013, 12:44. Показов 29565. Ответов 12 Метки нет (Все метки)
Всем привет
а 2й код работает
8.2 0 |
856 / 655 / 111 Регистрация: 01.11.2012 Сообщений: 2,410 |
|
17.01.2013, 13:37 |
2 |
Ну в 1-м примере бессмысленно передавать Объект, ибо он итак доступен в контексте модуля формы, я думаю первый пример заработает. если написать функция С(Знач о) А если так заработает, то, имхо, передача Объекта по ссылке в другую процедуру или функцию считается в 1С как попытка изменения. Добавлено через 5 минут 1 |
159 / 158 / 13 Регистрация: 14.01.2010 Сообщений: 1,488 |
|
17.01.2013, 17:38 [ТС] |
3 |
Это как раз оно и есть. 0 |
90 / 90 / 17 Регистрация: 26.10.2012 Сообщений: 249 |
|
17.01.2013, 19:29 |
4 |
Если тебе нужен конкретный объект, его можно получить по ссылке: ссылка.ПолучитьОбъект(). При этом объект должен существовать в базе (т.е. записан). 0 |
159 / 158 / 13 Регистрация: 14.01.2010 Сообщений: 1,488 |
|
18.01.2013, 11:11 [ТС] |
5 |
В том то и дело я хотел распечатать не сохраненный док 0 |
856 / 655 / 111 Регистрация: 01.11.2012 Сообщений: 2,410 |
|
18.01.2013, 12:24 |
6 |
Через форму, а не через объект тогда. 0 |
159 / 158 / 13 Регистрация: 14.01.2010 Сообщений: 1,488 |
|
18.01.2013, 14:37 [ТС] |
7 |
Примерчик можно? 0 |
Xomych 856 / 655 / 111 Регистрация: 01.11.2012 Сообщений: 2,410 |
||||
18.01.2013, 15:37 |
8 |
|||
Печатает не сохраненный документ на тонком клиенте, тока что у себя написал. 1 |
159 / 158 / 13 Регистрация: 14.01.2010 Сообщений: 1,488 |
|
20.01.2013, 15:45 [ТС] |
9 |
Хотя с таким же успехом можно просто обратиться к Объекту. 0 |
856 / 655 / 111 Регистрация: 01.11.2012 Сообщений: 2,410 |
|
20.01.2013, 16:06 |
10 |
Если документ не сохранен, объекта ещё нет 0 |
159 / 158 / 13 Регистрация: 14.01.2010 Сообщений: 1,488 |
|
20.01.2013, 16:57 [ТС] |
11 |
Поставил в ваш цикл перебора 0 |
856 / 655 / 111 Регистрация: 01.11.2012 Сообщений: 2,410 |
|
20.01.2013, 17:14 |
12 |
Мистика, у меня так не заработало. Добавлено через 8 минут 0 |
Dethmontt Модератор 3697 / 2897 / 569 Регистрация: 10.03.2011 Сообщений: 11,398 Записей в блоге: 1 |
||||
21.01.2013, 11:59 |
13 |
|||
Зарезервированное ОБЪЕКТ в модуле формы имеет тип ДанныеФормыСтруктура, соответственно что бы обращаться к эспортным процедурам этого объекта (обработки в данном случае) и получить макет в конкретном случае необходимо привести тип Формы в прикладной тип
1 |
Код 1C v 8.3
// Реквизиты
ДобавляемыеРеквизиты = Новый Массив;
ИмяТаблицы = "КомандыДополнительныхОбработок";
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяТаблицы, Новый ОписаниеТипов("ТаблицаЗначений")));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Ссылка", Новый ОписаниеТипов("СправочникСсылка.ДополнительныеОтчетыИОбработки"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ВариантЗапуска", Новый ОписаниеТипов("ПеречислениеСсылка.СпособыВызоваДополнительныхОбработок"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИмяЭлемента", Новый ОписаниеТипов("Строка"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Представление", Новый ОписаниеТипов("Строка"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Идентификатор", Новый ОписаниеТипов("Строка"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ЭтоОтчет", Новый ОписаниеТипов("Булево"), ИмяТаблицы));
Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
//реквизит
ИмяЭлемента = "Добавлен" + ИндексЭлемента;
Реквизит = Новый РеквизитФормы(ИмяЭлемента, ОписаниеТипов);
ДобавляемыеРеквизиты.Добавить(Реквизит);
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
//команда печать
ИмяКомандыПечать = "ДобавленПечать" + ИндексЭлемента;
КомандаПечать = Команды.Добавить(ИмяКомандыПечать);
КомандаПечать.Действие = "ПечатьДокумента";
КомандаПечать.Подсказка = НСтр("ru = 'Печать документа...'");
//элемент формы
//Родитель = Элементы.ГруппаСформированныеДокументы;
Элемент = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ЭлементГруппа);
Элемент.Вид = ВидПоляФормы.ПолеНадписи;
Элемент.ПутьКДанным = ИмяЭлемента;
Элемент.Гиперссылка = Истина;
Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
ЭтаФорма[ИмяЭлемента] = Документ;
//кнопка печать
ИмяЭлементаПечать = "ДобавленПечать" + ИндексЭлемента;
ЭлементПечать = Элементы.Добавить(ИмяЭлементаПечать, Тип("КнопкаФормы"), ЭлементГруппа);
ЭлементПечать.Картинка = БиблиотекаКартинок.Печать;
ЭлементПечать.Отображение = ОтображениеКнопки.Картинка;
ЭлементПечать.ИмяКоманды = ИмяКомандыПечать;
Утро доброе. Установил 1с на новый компьютер, захожу под любым пользователем, выдает такую ошибку: {МодульПриложения}: Ошибка при установке значения атрибута контекста (***): Несоответствие типов В инете, нашел подобную проблему, только, приравнивание идет к ТекущийПользователь. Там проблема решается чисткой профиля в windows. А как решить, данную, проблему? Комп находиться на расстоянии, профиль почищу, как доберусь, просто хотел узнать, может загвоздка в другом.
Компьютер=Неопределено у тебя скорее всего.
Хм, база одна на 20 компов, проблема только с этим. Неопределенность смотреть в том же модуле?
Смотри где определяется переменная Компьютер
Переменная Компьютер берется из запроса. Вот кусок кода:
Что будет, если Выборка.Следующий = Ложь?
На моем компе, ни чего не меняется =) На том, посмотреть не могу, плюс, если поменяю код, придется выгонять всех пользователей, что бы обновить, либо ждать, пока ночью обновиться.
Я же написал, что не могу проверить. У себя изменил, в тестовой, все работает.
может получится так, что в справочнике смсКомпьютеры нет наименования проблемного компьютера.
Думал над этим, только, почему программа его не добавляет.
А как, по другому, имя компьютера там появится? =) Перед этим, устанавливал на другие компьютеры 1с, делал все тоже самое — все работает. У меня есть подозрение, что не порядки с правами в винде. С админами сейчас поговорю, они как раз, в том здании, где комп.
[А как, по другому, имя компьютера там появится? =)] Например, пользователь руками создаст элемент справочника. Для это нужно запустить приложение в режиме 1с:Предприятие.
Сейчас попробую. Просто не делал ни когда такого, не требовалось.
Справочник заполняется программой. Таки думаю, что с правами косяк.
так есть в справочнике элемент с наименованием того компьютера?
В справочнике нет наименования. Зашел в другую базу, с этого же сервера — все работает (правда не создавал нового пользователя в этой базе, зашел под админом). Зашел в другую базу, с другого сервера — аналогично, все работает. Не работает одна единственная база, хотя, базы, у которых идентичный код, с неработающей и находящиеся на том же сервере, так же работают. Добавил в справочник наименование компьютера. Пойду смотреть.
Помогло добавление справочника. Не понятно, из-за чего сие чудо было.
[Помогло добавление справочника.] Ну вообще это очевидно сразу было — первым делом проверить есть ли в этом справочнике элемент с именем этого компьютера;)
Мысля то была, просто, при установки программы на новый комп и добавлении нового пользователя ни когда его не заполнял.
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям
Нельзя изменять поле, содержащее объект данных формы |
Я |
08.08.19 — 12:59
Добрый день!
Скажите пожалуйста, такая ошибка: {UDS_GAME Документ.ЧекККМ.Форма.ФормаДокумента_РМК.Форма(328)}: Ошибка при установке значения атрибута контекста (Запасы)
ЗаполнитьСуммуВсегоВТаблице(Объект.Запасы, Объект.СуммаВключаетНДС);
по причине:
Нельзя изменять поле, содержащее объект данных формы
Что делать?
1 — 08.08.19 — 13:00
(0) Что делать?
Не изменять поле содержащее объект данных формы
2 — 08.08.19 — 13:01
(0) Сделать ЗаполнитьСуммуВсегоВТаблице контектсной и не передавать туда Объект.Запасы, оно и так будет доступно в контексте
3 — 08.08.19 — 13:02
(2) а как сделать контекстной?
4 — 08.08.19 — 13:03
(3) показывайте уже вашу функцию
5 — 08.08.19 — 13:04
&НаСервере
ЗаполнитьСуммуВсегоВТаблице()
6 — 08.08.19 — 13:08
(4) // Заполняет поле СуммаВсего в зависимости от признака включения НДС в цену.
//
// Параметры:
// Таблица — ДанныеФормыКоллекция — Таблица, в которой необходимо заполнить колонку СуммаВсего.
// ЦенаВключаетНДС — Булево — признак включения НДС в цену.
//
Процедура ЗаполнитьСуммуВсегоВТаблице(Таблица, ЦенаВключаетНДС) Экспорт
Для Каждого СтрокаТаблицы Из Таблица Цикл
ЗаполнитьСуммуВсегоВСтрокеТаблицы(СтрокаТаблицы, ЦенаВключаетНДС);
КонецЦикла;
КонецПроцедуры // ЗаполнитьСуммуВсегоВТаблице()
7 — 08.08.19 — 13:16
(2) все-таки как сделать контекстной?
8 — 08.08.19 — 13:20
(7) смотри (5)
Но в данном случае не поможет (слишком универсальная функция). Твоя функция проста, сделай её &НаКлиенте вместе с ЗаполнитьСуммуВсегоВСтрокеТаблицы
9 — 08.08.19 — 14:44
(8) я сделала функцию без параметров, и вот такой:
&НаСервере
Процедура ЗаполнитьСуммуВсегоВТаблице()
Для Каждого СтрокаТаблицы Из Объект.Запасы Цикл
ЗаполнитьСуммуВсегоВСтрокеТаблицы(СтрокаТаблицы, Объект.СуммаВключаетНДС);
КонецЦикла;
КонецПроцедуры
ЗаполнитьСуммуВсегоВСтрокеТаблицы тоже сделала &НаСервере
10 — 08.08.19 — 14:48
(9) Это и имелось в виду в (2), но процедура сталане универсальной.
Проще (и вероятно правильнее) делать такие (простые) расчеты на клиенте — проблема вообще не возникла бы.
11 — 08.08.19 — 15:15
(9) оно и было на сервере. Потому что если ничего не указано, значит на сервере. То есть и было на сервере, и ты указала на сервере, ничего не изменилось.
12 — 08.08.19 — 15:18
(11) >> ничего не изменилось.
изменялись параметры, их больше нет
palsergeich
13 — 08.08.19 — 15:23
Настало время рефакторинга
turboq 159 / 158 / 13 Регистрация: 14.01.2010 Сообщений: 1,495 |
||||||||
1 |
||||||||
Нельзя изменить поле, содержащее данные формы. Почему?17.01.2013, 12:44. Показов 30538. Ответов 12 Метки нет (Все метки)
Всем привет
а 2й код работает
8.2
0 |
856 / 655 / 111 Регистрация: 01.11.2012 Сообщений: 2,410 |
|
17.01.2013, 13:37 |
2 |
Ну в 1-м примере бессмысленно передавать Объект, ибо он итак доступен в контексте модуля формы, я думаю первый пример заработает. если написать функция С(Знач о) А если так заработает, то, имхо, передача Объекта по ссылке в другую процедуру или функцию считается в 1С как попытка изменения. Добавлено через 5 минут
1 |
159 / 158 / 13 Регистрация: 14.01.2010 Сообщений: 1,495 |
|
17.01.2013, 17:38 [ТС] |
3 |
Это как раз оно и есть.
0 |
90 / 90 / 17 Регистрация: 26.10.2012 Сообщений: 249 |
|
17.01.2013, 19:29 |
4 |
Если тебе нужен конкретный объект, его можно получить по ссылке: ссылка.ПолучитьОбъект(). При этом объект должен существовать в базе (т.е. записан).
0 |
159 / 158 / 13 Регистрация: 14.01.2010 Сообщений: 1,495 |
|
18.01.2013, 11:11 [ТС] |
5 |
В том то и дело я хотел распечатать не сохраненный док
0 |
856 / 655 / 111 Регистрация: 01.11.2012 Сообщений: 2,410 |
|
18.01.2013, 12:24 |
6 |
Через форму, а не через объект тогда.
0 |
159 / 158 / 13 Регистрация: 14.01.2010 Сообщений: 1,495 |
|
18.01.2013, 14:37 [ТС] |
7 |
Примерчик можно?
0 |
Xomych 856 / 655 / 111 Регистрация: 01.11.2012 Сообщений: 2,410 |
||||
18.01.2013, 15:37 |
8 |
|||
Печатает не сохраненный документ на тонком клиенте, тока что у себя написал.
1 |
159 / 158 / 13 Регистрация: 14.01.2010 Сообщений: 1,495 |
|
20.01.2013, 15:45 [ТС] |
9 |
Хотя с таким же успехом можно просто обратиться к Объекту.
0 |
856 / 655 / 111 Регистрация: 01.11.2012 Сообщений: 2,410 |
|
20.01.2013, 16:06 |
10 |
Если документ не сохранен, объекта ещё нет
0 |
159 / 158 / 13 Регистрация: 14.01.2010 Сообщений: 1,495 |
|
20.01.2013, 16:57 [ТС] |
11 |
Поставил в ваш цикл перебора
0 |
856 / 655 / 111 Регистрация: 01.11.2012 Сообщений: 2,410 |
|
20.01.2013, 17:14 |
12 |
Мистика, у меня так не заработало. Добавлено через 8 минут
0 |
Dethmontt Модератор 3722 / 2917 / 574 Регистрация: 10.03.2011 Сообщений: 11,489 Записей в блоге: 1 |
||||
21.01.2013, 11:59 |
13 |
|||
Зарезервированное ОБЪЕКТ в модуле формы имеет тип ДанныеФормыСтруктура, соответственно что бы обращаться к эспортным процедурам этого объекта (обработки в данном случае) и получить макет в конкретном случае необходимо привести тип Формы в прикладной тип
1 |
1 февраля, 2017
21 апреля, 2017
Дано
- 1С конфигурация бухгалтерия предприятия 2.0
- Ошибка печати ПКО (приходный кассовый ордер):
{ОбщаяФорма.ФормаПечати.Форма(18)}: Ошибка при установке значения атрибута контекста ЭлементыФормы.ПолеДокумента.ПолеСверху по причине: Несоответствие типов
Анализ проблемы
На первый взгляд все ужасно:
- в конфигураторе видно, что система пытается выполнить строчку кода:
ЭлементыФормы.ПолеДокумента.ПолеСверху = ПечатныйДокумент.ПолеСверху;
- в отладке видно, что обе переменные типа “Число”,
- синтакс-помощник говорит что:
ТабличныйДокумент (SpreadsheetDocument) ПолеСверху (TopMargin) Использование: Чтение и запись.
То есть ПолеСверху доступно для записи и обе переменные типа число и все тут корректно, но система говорит “Несоответствие типов” – полный бред.
Решение
На решение проблемы натолкнула фраза “Ошибка при установке значения атрибута контекста”, значит что-то не так с доступом.
Оказалось в базе нет ни одного пользователя и работа осуществлялась под пользователем НеАвторизован. После создания пользователя с необходимыми правами все заработало.
Дополнено 2017.04.10
Проблема повторилась, но уже при печати РТУ и с использованием уже настроенной учетной записи.
Помогло создание нового пользователя с такими же правами доступа. То есть нового создаем, старого удаляем и после этого все работает.
Ошибка при установке значения атрибута контекста (СписокВыбора)
Данная ошибка возникает при попытке установить полю с типом «СписокЗначений» значение неподходящего типа. Например: Неопределено.
Полная ошибка
Ошибка при установке значения атрибута контекста (СписокВыбора)
ЭлементыФормы.Поставщик.СписокВыбора = КЭШируемые.СписокПоставщиков(Контрагент);
по причине:
Несоответствие типов
Скриншот:
Причина: В функции, которая формировала данный список (КЭШируемые.СписокПоставщиков()) отсутствовал возврат значения.
В экспериментальных целях:
передал значение с типом «Массив» — текст ошибки не поменялся.
В итоге переписал на более универсальный метод ЗагрузитьЗначения() самого элемента диалога:
ЭлементыФормы.Поставщик.СписокВыбора.ЗагрузитьЗначения(КЭШируемые.СписокПоставщиков(Контрагент));
Нулевую рекламную идею можно помножить на миллион долларов – все равно получится нуль.
// Реквизиты
ДобавляемыеРеквизиты = Новый Массив;
ИмяТаблицы = "КомандыДополнительныхОбработок";
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяТаблицы, Новый ОписаниеТипов("ТаблицаЗначений")));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Ссылка", Новый ОписаниеТипов("СправочникСсылка.ДополнительныеОтчетыИОбработки"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ВариантЗапуска", Новый ОписаниеТипов("ПеречислениеСсылка.СпособыВызоваДополнительныхОбработок"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИмяЭлемента", Новый ОписаниеТипов("Строка"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Представление", Новый ОписаниеТипов("Строка"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Идентификатор", Новый ОписаниеТипов("Строка"), ИмяТаблицы));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ЭтоОтчет", Новый ОписаниеТипов("Булево"), ИмяТаблицы));
Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
//реквизит
ИмяЭлемента = "Добавлен" + ИндексЭлемента;
Реквизит = Новый РеквизитФормы(ИмяЭлемента, ОписаниеТипов);
ДобавляемыеРеквизиты.Добавить(Реквизит);
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
//команда печать
ИмяКомандыПечать = "ДобавленПечать" + ИндексЭлемента;
КомандаПечать = Команды.Добавить(ИмяКомандыПечать);
КомандаПечать.Действие = "ПечатьДокумента";
КомандаПечать.Подсказка = НСтр("ru = 'Печать документа...'");
//элемент формы
//Родитель = Элементы.ГруппаСформированныеДокументы;
Элемент = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ЭлементГруппа);
Элемент.Вид = ВидПоляФормы.ПолеНадписи;
Элемент.ПутьКДанным = ИмяЭлемента;
Элемент.Гиперссылка = Истина;
Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
ЭтаФорма[ИмяЭлемента] = Документ;
//кнопка печать
ИмяЭлементаПечать = "ДобавленПечать" + ИндексЭлемента;
ЭлементПечать = Элементы.Добавить(ИмяЭлементаПечать, Тип("КнопкаФормы"), ЭлементГруппа);
ЭлементПечать.Картинка = БиблиотекаКартинок.Печать;
ЭлементПечать.Отображение = ОтображениеКнопки.Картинка;
ЭлементПечать.ИмяКоманды = ИмяКомандыПечать;