Содержание:
1. Ошибка при установке значения атрибута контекста
2. Ошибка при получении значения атрибута контекста
Одной из наиболее частых ошибок исполнения кода 1С являются ошибки, связанные с установкой реквизита либо получением реквизита через точку, либо ошибка при вызове функции или процедуры через точку. Все данные объекты являются атрибутами информационных объектов-владельцев, к которым они принадлежат. Рассмотрим примеры таких ошибок и причины их возникновения.
1. Ошибка при установке значения атрибута контекста
Ошибка при установке значения атрибута контекста говорит нам о невозможности присвоить выбранное значение определенному атрибуту информационного объекта. Вызвано это либо несовпадением типа атрибута и присваиваемого ей значения, отсутствием возможности присвоить значение выбранному атрибуту, так как его можно только читать, но не записывать в него, отсутствием прав у текущего пользователя на запись значений в данный атрибут. Например, в реквизит «ДатаДокумента» с типом «Дата» пытаемся записать строку, в реквизит с типом данных ссылки на документ пытаемся записать не ссылку, а объект, полученный по ссылке, что невозможно из-за несоответствия типов, что приводит к ошибке установки значения атрибута.
Другой пример – проходя циклом выборку запроса, пытаемся в колонку выборки записать значение, что невозможно, так как значения выборки запроса можно только считывать, а для того, чтобы можно было полученные из запроса данные изменять в коде, нужно пользоваться не выборкой, а выгружать результат запроса в таблицу значений, в таком случае в цикле по ней можно будет менять значения в колонках, но только на значения, соответствующие типу колонки. Либо у пользователя, под которым выполняется код, нет прав на изменение даты документа, при попытке записать в данный реквизит новую дату, будет выведено сообщение об ошибке установке значения, но в причине будет указано отсутствие прав у пользователя.
2. Ошибка при получении значения атрибута контекста
Ошибка при получении значения атрибута контекста указывает на невозможность прочитать значение атрибута объекта в силу его отсутствия, либо отсутствия прав на его чтение. Например, обращение к несуществующему реквизиту объекта, несуществующему полю выборки из запроса, несуществующему свойству элемента формы и т.п. Так же как пример можно рассмотреть получение текущего пользователя из параметров сеанса — если данный параметр сеанса не установлен, то тоже будет выведена ошибка получения значения атрибута контекста, но в причине будет указана попытка получения неинициализированного значения параметра сеанса.
При возникновении данных ошибок значения атрибута в 1Св первую очередь следует проверить существование атрибута, к которому обращаются, затем проверить совпадение типов значений атрибута и присваиваемого ему значения, затем уже проверить права на установку либо чтение значения. Проверить, является ли дело в правах либо дать права на действия с атрибутом, можно, установив привилегированный режим для совершения действия с данным атрибутом, прописав перед строчкой с ошибкой УстановитьПривилегированныйРежим(Истина), после строчки — УстановитьПривилегированныйРежим(Ложь).
Специалист компании «Кодерлайн»
Александр Суворов
|
|||
Zixxx
22.04.12 — 17:55 |
Как забрать с почтового сервера отправленные письма. Со входящими проблем нет, а вот как забрать отправленные не могу найти, кто-нибудь знает? |
||
Wobland
1 — 22.04.12 — 17:58 |
(0) а они там есть? |
||
Zixxx
2 — 22.04.12 — 18:03 |
(1) Да |
||
andrewks
3 — 22.04.12 — 18:14 |
на некоторых серваках есть опция соответствующая. или IMAP. по-другому никак, если только через веб-интерфейс извращаться |
||
ДенисЧ
4 — 22.04.12 — 18:22 |
На почтовом сервере (если это smtp) по нормальному нет этих отправленных. |
||
Zixxx
5 — 22.04.12 — 18:24 |
Есть IMAP, но не могу найти как правильно прописать его протокол для «Отправленных», «Send» не подходит видимо…
ПараметрыIMAP = Новый Структура;
Почта = Новый ИнтернетПочта; |
||
kod263
6 — 22.04.12 — 18:33 |
интересно |
||
Zixxx
7 — 22.04.12 — 18:35 |
Должно быть как-то так Почта = Новый ИнтернетПочта; Но валиться при установки текущего почтового ящика «answered» |
||
Zixxx 8 — 22.04.12 — 19:48 |
Удалось победить только для входящих… Админы сказали что папка исходящие «sent», но при установки Почта.ТекущийПочтовыйЯщик = «sent»; получаю «Ошибка при установке значения атрибута контекста (ТекущийПочтовыйЯщик)»… |
Помогите пожалуйста начинающему пользователю Платформы 1С 8.2.
Вот такая проблемка
Процедура ОбработкаПроведения(Отказ, Режим)Движения.ОстаткиМатериалов.Записывать = Истина;
Движения.СтоимостьМатериалов.Записывать = Истина;
Движения.Продажи.Записывать = Истина;
Движения.Управленческий.Записывать = Истина;//Создать менеджер временных таблиц.
МенеджерВТ = Новый МенеджерВременныхТаблиц;Запрос = Новый Запрос;
//Укажем, какойменеджер временных таблиц использует этот запрос.
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;Запрос.Текст =
«ВЫБРАТЬ
|ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
|ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
|ОказаниеУслугиПереченьНоменклатуры.НаборСвойств,
|СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК КоличествоВДокументе,
|СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе
|ПОМЕСТИТЬ НоменклатураДокумента
|ИЗ
|Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
|ГДЕ
|ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
|ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
|ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры,
|ОказаниеУслугиПереченьНоменклатуры.НаборСвойств»;Запрос.УстановитьПараметр(«Ссылка», Ссылка);
Результат = Запрос.Выполнить();
Запрос2 = Новый Запрос;
Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос2.Текст = «ВЫБРАТЬ
|НоменклатураДокумента.Номенклатура,
|НоменклатураДокумента.ВидНоменклатуры,
|НоменклатураДокумента.НаборСвойств,
|НоменклатураДокумента.КоличествоВДокументе,
|НоменклатураДокумента.СуммаВДокументе,
|ЕСТЬNULL(СтоимостьМатериаловОстатки.СтоимостьОстаток, 0) КАК Стоимость,
|ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК Количество
|ИЗ
|НоменклатураДокумента КАК НоменклатураДокумента
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(
|,
|Материал В
|(ВЫБРАТЬ
|НоменклатураДокумента.Номенклатура
|ИЗ
|НоменклатураДокумента)) КАК СтоимостьМатериаловОстатки
|ПО НоменклатураДокумента.Номенклатура = СтоимостьМатериаловОстатки.Материал
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
|,
|Материал В
|(ВЫБРАТЬ
|НоменклатураДокумента.Номенклатура
|ИЗ
|НоменклатураДокумента)) КАК ОстаткиМатериаловОстатки
|ПО НоменклатураДокумента.Номенклатура = ОстаткиМатериаловОстатки.Материал»;//Установим необходимость блокировки данных в регистрах
//СтоимостьМатериалов и ОстаткиМатериалов.
Движения.СтоимостьМатериалов.БлокироватьДляИзменения = Истина;
Движения.ОстаткиМатериалов.БлокироватьДляИзменения = Истина;//Запишем пустые наборы записей, чтобы читать остатки без учета данных в документе.
Движения.СтоимостьМатериалов.Записать();
Движения.ОстаткиМатериалов.Записать();Результат = Запрос2.Выполнить();
//Если надо посмотреть результат запроса
//ТЗ = Результат.Выгрузить();ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.Количество = 0 Тогда
СтоимостьМатериала = 0;
Иначе СтоимостьМатериала = ВыборкаДетальныеЗаписи.Стоимость / ВыборкаДетальныеЗаписи.Количество;
КонецЕсли;Если ВыборкаДетальныеЗаписи.ВидНоменклатуры=Перечисления.ВидыНоменклатуры.Материал Тогда
//регистр ОстаткиМатериалов Расход
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.НаборСвойств = ВыборкаДетальныеЗаписи.НаборСвойств;
Движение.Склад = Склад;
Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;// регистр СтоимостьМатериалов Расход
Движение = Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Стоимость = ВыборкаДетальныеЗаписи.КоличествоВДокументе*СтоимостьМатериала;// Регистр Управленческий
// Первая проводка:Д 62 (ДебиторскаяЗадолженность) — К 90 (Капитал) Розничная сумма
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Основной.ДебиторскаяЗадолженность;
Движение.СчетКт = ПланыСчетов.Основной.Капитал;
Движение.Период = Дата;
Движение.Сумма = ВыборкаДетальныеЗаписи.СуммаВДокументе;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Клиенты] = Клиент;
// Вторая проводка: Д 90 (Капитал) — К 41 (Товары) — себестоимость
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Основной.Капитал;
Движение.СчетКт = ПланыСчетов.Основной.Товары;
Движение.Период = Дата;
Движение.Сумма = СтоимостьМатериала*ВыборкаДетальныеЗаписи.КоличествоВДокументе;
Движение.КоличествоКт = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Материалы] = ВыборкаДетальныеЗаписи.Номенклатура;
КонецЕсли;// Регистр Продажи
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Клиент = Клиент;
Движение.Мастер = Мастер;
Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
Движение.Выручка = ВыборкаДетальныеЗаписи.СуммаВДокументе;
Движение.Стоимость = СтоимостьМатериала * ВыборкаДетальныеЗаписи.КоличествоВДокументе;
КонецЦикла;Движения.Записать();
Если Режим = РежимПроведенияДокумента.Оперативный Тогда//Проверить отрицательные остатки.
Запрос3 = Новый Запрос;
Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос3.Текст = «ВЫБРАТЬ
|ОстаткиМатериаловОстатки.Материал,
|ОстаткиМатериаловОстатки.НаборСвойств,
|ОстаткиМатериаловОстатки.КоличествоОстаток
|ИЗ
|РегистрНакопления.ОстаткиМатериалов.Остатки(
|,
|(Материал, НаборСвойств) В
|(ВЫБРАТЬ
|НоменклатураДокумента.Номенклатура,
|НоменклатураДокумента.НаборСвойств
|ИЗ
|НоменклатураДокумента)
|И Склад = &Склад) КАК ОстаткиМатериаловОстатки
|ГДЕ
|ОстаткиМатериаловОстатки.КоличествоОстаток < 0″;
Запрос3.УстановитьПараметр(«Склад», Склад);Результат = Запрос3.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = «Лей» + Строка(- ВыборкаДетальныеЗаписи.КоличествоОстаток) + » единиц материала Лей «»» + ВыборкаДетальныеЗаписи.Материал =»»»»;
Сообщение.Сообщить();
Отказ = Истина;КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)Префикс = Обмен.ПолучитьПрефиксНомера();
КонецПроцедуры
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(«СправочникСсылка.Клиенты») Тогда
// Заполнение шапки
Клиент = ДанныеЗаполнения.Ссылка;
ОбъектОснование = ДанныеЗаполнения.Ссылка;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(«ПереченьНоменклатуры.НаборСвойств»));
Индекс = 0;Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
Индекс = Индекс + 1;Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда
Если Не ЗначениеЗаполнено(ТекСтрокаПереченьНоменклатуры.НаборСвойств) Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = «В строке » + Индекс + » списка Перечень номенклатуры не заполнена колонка Набор свойств»;
Сообщение.Поле = «ПереченьНоменклатуры[» + Строка(Индекс — 1) + «].НаборСвойств»;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;КонецЕсли;
КонецЦикла;
КонецПроцедуры
{Документ.ОказаниеУслуги.МодульОбъекта(166)}: Ошибка при установке значения атрибута контекста (Текст)
Сообщение.Текст = «Лей» + Строка(- ВыборкаДетальныеЗаписи.КоличествоОстаток) + » единиц материала Лей «»» + ВыборкаДетальныеЗаписи.Материал =»»»»;
по причине:
Несоответствие типов
Несоответствие типов
Ошибка при получении значения атрибута контекста (ТекущийПользователь)
bless18 |
|
||
---|---|---|---|
Ошибка при получении значения атрибута контекста (ТекущийПользователь): Попытка получения неинициализированного значения параметра сеанса
Пользователь = ПараметрыСеанса.ТекущийПользователь; по причине: Попытка получения неинициализированного значения параметра сеансаКод 1C v 8.х
Где происходит их инициализация? |
Yandex |
|
||
---|---|---|---|
E_Migachev |
|
||
---|---|---|---|
Когда в Общие — Параметры сеанса добавил ТекущийПользователь, то его нужно определять при загрузке:
так же в процедуре ПриНачалеРаботыСистемы пишешь что то типо: Код 1C v 8.х
Это работает при условии, что ИмяПользователя заданное в конфигураторе, равно Имени введенному в справочнике Пользователей в реквизит Код |
bless18 |
|
||
---|---|---|---|
А если не совпадают, можно как-нибудб привязать пользователя к сотруднику? |
E_Migachev |
|
||
---|---|---|---|
А лучше добавить процедуру в Модуль сеанса(Правой клавишей щелкаещь на названии конфигурации и выбираешь Открыть модуль сеанса)
В ней создаешь Процедура УстановкаПараметровСеанса () и в ней пишешь код который я предложил выше или так, Если не совпадают: Код 1C v 8.х
Эта процедура вызывается раньше чем ПриНачалеРаботыСистемы. Ну а дальше подставлять сопоставленное значение при создании соответствующего документа: Код 1C v 8.х
События модуля сеанса: |
bless18 |
|
||
---|---|---|---|
Спасибо вам огромное! Вы мне очень помогли! |
bless18 |
|
||
---|---|---|---|
Спасибо вам огромное! Вы мне очень помогли! |
E_Migachev |
|
||
---|---|---|---|
Пожалуйста |
Подсказка: Для быстрого поиска ответов — используйте ‘Поиск’ |