1С найти объект не найден

  • автор:

Ошибка в 1С 8.3 Поле объекта недоступно для записи появляется при доработках программного кода и обновлениях программы.

Прочитав эту статью, вы:

  • узнаете, на что обращать внимание при возникновении ошибки;
  • получите рекомендации для ее устранения;
  • сможете скачать внешние обработки, содержащие ошибки и их исправление;
  • изучите конкретные примеры возникновения ошибки при доработке программного кода.

Причины ошибки

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

  • ошибку обновления программы;
  • обращение к данным изменяемого объекта по Ссылке вместо Объект;
  • попытку изменения системных полей в программном коде.

Во всех перечисленных случаях при попытке записи данных фиксируется ошибка Поле объекта недоступно для записи.

Ошибка обновления

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

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

Ваши действия:

  1. Уточните, зарегистрирована ли ошибка на сайте поддержки пользователей: Публикация ошибок 1С.
    Для этого в форме поиска ошибок наберите текст ошибки и укажите конфигурацию программы, в которой она проявляется.Нажмите кнопку Найти.
  2. Если ошибка зарегистрирована, обратите внимание на:
    • дату регистрации ошибки;
    • релиз исправления ошибки;
    • информацию Способ обхода.
  3. Выполните рекомендации, указанные в Способе обхода или обновитесь на релиз исправления ошибки.
  4. Если ошибка не зарегистрирована, обратитесь на горячую линию 1С для регистрации ошибки:
    • телефон горячей линии 1С: (495) 956-11-81;
    • E-mail:v8@1c.ru для вопросов по программам 1С:Предприятие 8.

Пока ошибку не исправили, восстановите базу и архивной копии или ждите выхода нового релиза обновления.

БухЭксперт8 рекомендует всегда делать копии перед обновлением. Это гарантирует возможность восстановления базы при неудачном обновлении.

Изменение объекта по ссылке

Самая распространенная ошибка начинающих программистов — запись изменений Объекта по Ссылке.

Объект — это внутренняя таблица 1С, в которой содержатся полные данные на элемент справочника, документ, регистр или обработку. Ссылка — указание места этой таблицы в 1С.

Чтобы вносить изменения в данные справочника, документа или регистра, нужно обращаться к данным Объекта, а не Ссылки.

При доработке программного кода или написании внешних обработок использование для изменения данных объекта Ссылки приводит к появлению ошибки Поле объекта недоступно для записи.

При написании обработки заполнения контактного лица в справочнике Контрагенты программист допустил ошибку в программном коде:

Выполнение записи происходит с ошибкой в поле Основное контактное лицо.

Ошибка записи выбранного контактного лица регистрируется при нажатии на кнопку Неправильно.

В данном программном коде Объект.Контрагент — это Ссылка на поле формы Контрагент обработки Заполнение контактного лица контрагента:

  • Объект — обработка;
  • Контрагент — поле на форме.

Для обращения к Объекту элемента справочника Контрагент нужно выполнить команду ПолучитьОбъект(). Исправленный программный код выглядит следующим образом:

В обработке Заполнение контактного лица контрагента исправление реализовано по кнопке Правильно. В этом случае программный код отработает без ошибки.

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

По кнопке Идеально выбранное контактное лицо отобразится по ссылке Контактные лица контрагента.

БухЭксперт8 рекомендует выполнять все изменения программного кода на копии рабочей базы. Если ошибка появилась после доработки конфигурации или обработки программистом, лучше передать ему информацию по ошибке для исправления, а не пытаться исправлять ее самостоятельно.

Изменение системных полей

Третьей причиной, вызывающей ошибку Поле объекта недоступно для записи, является попытка изменения системных полей и команд в программном коде:

  • Номер строки табличной части;
  • ТекущаяСтрока, вместо ТекущиеДанные;
  • и т. д.

Эти поля недоступны для записи, попытка их изменения приводит к ошибке.

При написании обработки заполнения членов комиссии в документе Требование-накладная программист допустил ошибку в программном коде.

Выполнение записи членов комиссии в документ Требование-накладная происходит с ошибкой по полю Номер строки.

Ошибка записи выбранных в обработке членов комиссии регистрируется при нажатии кнопки Неправильно.

Ошибка вызвана присвоением номера системному полю НомерСтроки. Правильный программный код выглядит следующим образом:

По кнопке Правильно запись членов комиссии в документ Требование-накладная происходит без ошибки.

Все выбранные в обработке Заполнение членов комиссии в Требовании-накладной члены комиссии отображаются в документе по ссылке Комиссия.

БухЭксперт8 рекомендует выполнять все изменения программного кода на копии рабочей базы. Если ошибка появилась после доработки программистом конфигурации или обработки, лучше передать ему информацию по ошибке, а не пытаться исправлять ее самостоятельно.

См. также:

  • Ошибка 1С: Поле объекта не обнаружено
  • У пользователя недостаточно прав на исполнение операции
  • Конфигурация узла распределенной ИБ не соответствует ожидаемой
  • 1C Отчетность: не удалось расшифровать файл
  • Этот хост неизвестен 1С: как исправить
  • Ошибка при выполнении операции с информационной базой 1С 8.3

Если Вы еще не являетесь подписчиком системы БухЭксперт8:

Активировать демо-доступ бесплатно →

или

Оформить подписку на Рубрикатор →

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

Помогла статья?

Получите еще секретный бонус и полный доступ к справочной системе БухЭксперт8 на 14 дней бесплатно

В статье Битая ссылка, <Объект не найден>, Уникальный Идентификатор, GUID мы обсуждали как востановить битые ссылки!
А вот как найти в базе все битые ссылки, которые имеют вид типа «<Объект не найден> (137:8b270030482898d011daad3cc45fc830)»?
Для поиска этого была написана данная обработка: Скачивать файлы может только зарегистрированный пользователь!
Для поиска: Выбираем объекты метаданных , которые хотим проверить, жмем кнопочку «Выполнить» и наблюдаем в таблице выходные данные. Откуда можем попасть в объекты-источники.

Для программиста:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
ИспользоватьОграничение = ЗначениеЗаполнено(ОграничениеТипов);
РезультатПоиска.Очистить();
Для Каждого ОбъектыМетаданных Из КоллекцияОбъектов Цикл
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Состояние(ОбъектМетаданных.ПолноеИмя());
ПроверитьОбъектНаБитыеСсылки(ОбъектМетаданных);
КонецЦикла;
КонецЦикла;
Для Каждого ОбъектыМетаданных Из КоллекцияРегистров Цикл
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Состояние(ОбъектМетаданных.ПолноеИмя());
ПроверитьРегистрНаБитыеСсылки(ОбъектМетаданных);
КонецЦикла;
КонецЦикла;
//Анализ последовательностей
//ПроверитьОбъектНаБитыеСсылки(Метаданные.Справочники.СотрудникиОрганизаций);
КонецПроцедуры
Процедура ВывестиДанные(ТекстЗапроса)
Запрос = Новый Запрос(ТекстЗапроса);
Попытка
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
ТЗ = РезультатЗапроса.Выгрузить();
Для Каждого Стр Из ТЗ Цикл
ОбработкаПрерыванияПользователя();
Строка = РезультатПоиска.Добавить();
ЗаполнитьЗначенияСвойств(Строка, Стр);
КонецЦикла;
КонецЕсли;
Исключение
Сообщить(ИнформацияОбОшибке().Описание + » » + ИнформацияОбОшибке().Причина);
КонецПопытки;
КонецПроцедуры
Процедура ПроверитьРегистрНаБитыеСсылки(ОбъектМетаданных)
ИмяТаблицы = ОбъектМетаданных.ПолноеИмя();
Если Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) Тогда
Если ОбъектМетаданных.РежимЗаписи = НезависимыйРежимЗаписи Тогда
//АнализСвойствРегистраСведений(ОбъектМетаданных, ОбъектМетаданных.Измерения, ИмяТаблицы);
//АнализСвойствРегистраСведений(ОбъектМетаданных, ОбъектМетаданных.Ресурсы, ИмяТаблицы);
//АнализСвойствРегистраСведений(ОбъектМетаданных, ОбъектМетаданных.Реквизиты, ИмяТаблицы);
Возврат;
КонецЕсли;
АнализСвойствРегистра(ОбъектМетаданных, ОбъектМетаданных.Реквизиты, ИмяТаблицы);
КонецЕсли;
АнализСвойствРегистра(ОбъектМетаданных, ОбъектМетаданных.Измерения, ИмяТаблицы);
АнализСвойствРегистра(ОбъектМетаданных, ОбъектМетаданных.Реквизиты, ИмяТаблицы);
АнализРегистратораРегистра(ОбъектМетаданных, ИмяТаблицы);
Если Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) Тогда
//Для рег. бухгалтерии анализ субконто
КонецЕсли;
Если Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) Тогда
//Для регистров расчета доп. анализ
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьОбъектНаБитыеСсылки(ОбъектМетаданных)
ИмяТаблицы = ОбъектМетаданных.ПолноеИмя();
АнализСвойствОбъекта(ОбъектМетаданных, ОбъектМетаданных.Реквизиты, ИмяТаблицы);
Для Каждого ТабЧасть Из ОбъектМетаданных.ТабличныеЧасти Цикл
Если ТабличныеЧастиИсключения.Найти(ТабЧасть.Имя) <> Неопределено Тогда
Продолжить;
КонецЕсли;
АнализСвойствОбъекта(ОбъектМетаданных, ТабЧасть.Реквизиты, ИмяТаблицы + «.» + ТабЧасть.Имя)
КонецЦикла;
//проверка владельца у справочников
Если Метаданные.Справочники.Содержит(ОбъектМетаданных) И ОбъектМетаданных.Владельцы.Количество() > 0 Тогда
МассивВладельцев = Новый Массив;
Для Каждого Элемент Из ОбъектМетаданных.Владельцы Цикл
МассивВладельцев.Добавить(Элемент);
КонецЦикла;
//АнализСвойствВладельцаОбъекта(ОбъектМетаданных, МассивВладельцев, ИмяТаблицы);
КонецЕсли;
//Для задач поле исполнитель
//проверки в журналах
ОбработкаПрерыванияПользователя();
КонецПроцедуры
Процедура АнализСвойствОбъекта(ОбъектМетаданных, Свойства, ИмяТаблицы)
Для Каждого Реквизит Из Свойства Цикл
Если РеквизитыИсключения.Найти(Реквизит.Имя) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Для Каждого моТип Из Реквизит.Тип.Типы() Цикл
ТекстЗапроса = «»;
МетаданныеТипа = Метаданные.НайтиПоТипу(моТип);
Если МетаданныеТипа <> Неопределено
И Не Метаданные.Перечисления.Содержит(МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу(МетаданныеТипа.ПолноеИмя()) Тогда
Продолжить;
КонецЕсли;
КонецЕсли;

ДобавитьВЗапросОбъект(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, Реквизит.Имя, моТип);
КонецЕсли;
Если Не ПустаяСтрока(ТекстЗапроса) Тогда
ВывестиДанные(ТекстЗапроса);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура АнализСвойствРегистра(ОбъектМетаданных, Свойства, ИмяТаблицы)
Для Каждого Реквизит Из Свойства Цикл
Если РеквизитыИсключения.Найти(Реквизит.Имя) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Для Каждого моТип Из Реквизит.Тип.Типы() Цикл
ТекстЗапроса = «»;
МетаданныеТипа = Метаданные.НайтиПоТипу(моТип);
Если МетаданныеТипа <> Неопределено
И Не Метаданные.Перечисления.Содержит(МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу(МетаданныеТипа.ПолноеИмя()) Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
ДобавитьВЗапросРегистр(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, Реквизит.Имя, моТип);
КонецЕсли;
Если Не ПустаяСтрока(ТекстЗапроса) Тогда
ВывестиДанные(ТекстЗапроса);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура АнализРегистратораРегистра(ОбъектМетаданных, ИмяТаблицы)
МассивРегистраторов = ПолучитьСписокРегистраторов(ОбъектМетаданных);
Для Каждого Регистратор Из МассивРегистраторов Цикл
Если РеквизитыИсключения.Найти(«Регистратор») <> Неопределено Тогда
Продолжить;
КонецЕсли;
моТип = Регистратор;
ТекстЗапроса = «»;
МетаданныеТипа = Метаданные.НайтиПоТипу(моТип);
Если МетаданныеТипа <> Неопределено
И Не Метаданные.Перечисления.Содержит(МетаданныеТипа) Тогда
Если ИспользоватьОграничение Тогда
Если Не ПоискПоТипу(МетаданныеТипа.ПолноеИмя()) Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
ДобавитьВЗапросРегистр(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, «Регистратор», моТип);
КонецЕсли;
Если Не ПустаяСтрока(ТекстЗапроса) Тогда
ВывестиДанные(ТекстЗапроса);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьСписокРегистраторов(ОбъектМетаданных)
МассивРегистраторов = Новый Массив;
МенеджерОбъект = ПолучитьМенеджерОбъекта(ОбъектМетаданных);
Если МенеджерОбъект <> Неопределено Тогда
НаборЗаписей = МенеджерОбъект.СоздатьНаборЗаписей();
ЭлементОтбора = НаборЗаписей.Отбор.Регистратор;
МассивРегистраторов = ЭлементОтбора.ТипЗначения.Типы();
КонецЕсли;
Возврат МассивРегистраторов;
КонецФункции
Функция ПолучитьМенеджерОбъекта(ОбъектМетаданных)
Перем МенеджерОбъекта;
Если Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыБухгалтерии;
ИначеЕсли Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыНакопления;
ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыСведений;
ИначеЕсли Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) Тогда
МенеджерОбъекта = РегистрыРасчета;
КонецЕсли;
Возврат МенеджерОбъекта;
КонецФункции
Функция ПоискПоТипу(ИмяТипа)
Результат = Ложь;
Если ИспользоватьОграничение Тогда
МассивСтрок = ОграничениеТипов.НайтиСтроки(Новый Структура(«ТипДанных», ИмяТипа));
Если ЗначениеЗаполнено(МассивСтрок) Тогда
Результат = Истина;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура ДобавитьВЗапросРегистр(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, ИмяРеквизита, ТипРеквизита)
Текст = «ВЫБРАТЬ Об.» + ИмяРеквизита + » КАК Объект,
| «»» + ИмяТаблицы + «.» + ИмяРеквизита + «»» КАК ТаблицаИсточник,
| Об.Регистратор КАК ОбъектИсточник,
| » + ДобавитьОписаниеТипа(ИмяРеквизита, ТипРеквизита) + «
|ИЗ
| » + ИмяТаблицы + » КАК Об
|ГДЕ » + ДобавитьУсловия(ИмяРеквизита, ТипРеквизита);
ТекстЗапроса = ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса), «», Символы.ПС + «ОБЪЕДИНИТЬ ВСЕ» + Символы.ПС) + Текст;
КонецПроцедуры
Процедура ДобавитьВЗапросОбъект(ТекстЗапроса, ОбъектМетаданных, ИмяТаблицы, ИмяРеквизита, ТипРеквизита)
Текст = «ВЫБРАТЬ Об.» + ИмяРеквизита + » КАК Объект,
| «»» + ИмяТаблицы + «.» + ИмяРеквизита + «»» КАК ТаблицаИсточник,
| Об.Ссылка КАК ОбъектИсточник,
| » + ДобавитьОписаниеТипа(ИмяРеквизита, ТипРеквизита) + «
|ИЗ
| » + ИмяТаблицы + » КАК Об
|ГДЕ » + ДобавитьУсловия(ИмяРеквизита, ТипРеквизита);
ТекстЗапроса = ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса), «», Символы.ПС + «ОБЪЕДИНИТЬ ВСЕ» + Символы.ПС) + Текст;
КонецПроцедуры
Функция ДобавитьУсловия(ИмяРеквизита, ТипРеквизита)
мдОбъекта = Метаданные.НайтиПоТипу(ТипРеквизита);
ИмяТаблицы = мдОбъекта.ПолноеИмя();
ПроверкаНаПустыеЗначения = » Об.» + ИмяРеквизита + » ССЫЛКА » + ИмяТаблицы;
ПроверкаНаПустыеЗначения = ПроверкаНаПустыеЗначения + » И ВЫРАЗИТЬ(Об.» + ИмяРеквизита + » КАК » + ИмяТаблицы + «).Ссылка есть null»;
Если Не Метаданные.Перечисления.Содержит(мдОбъекта) Тогда
ПроверкаНаПустыеЗначения = ПроверкаНаПустыеЗначения + » И Об.» + ИмяРеквизита + » <> Значение(» + ИмяТаблицы + «.ПустаяСсылка)»;
КонецЕсли;
Возврат ПроверкаНаПустыеЗначения;
КонецФункции
Функция ДобавитьОписаниеТипа(ИмяРеквизита, ТипРеквизита)
ОбъектТипа = Метаданные.НайтиПоТипу(ТипРеквизита);
ИмяТаблицы = ОбъектТипа.ПолноеИмя();
ОписаниеТипа = «»»» + ИмяТаблицы + «»» КАК ТипДанных»;
Возврат ОписаниеТипа;
КонецФункции
Процедура ОграничениеТиповТипДанныхНачалоВыбора(Элемент, СтандартнаяОбработка)
Перем ЭлементСписка;
СтандартнаяОбработка = Ложь;
Строка = ЭлементыФормы.ОграничениеТипов.ТекущиеДанные;
Если Не ПустаяСтрока(Строка.ТипДанных) Тогда
ЭлементСписка = СписокТипов.НайтиПоЗначению(Строка.ТипДанных);
КонецЕсли;
ВыбранныйЭлемент = СписокТипов.ВыбратьЭлемент( , ЭлементСписка);
Если ВыбранныйЭлемент <> Неопределено Тогда
Строка.ТипДанных = ВыбранныйЭлемент.Значение;
КонецЕсли;
КонецПроцедуры
РеквизитыИсключения = Новый Массив;
ТабличныеЧастиИсключения = Новый Массив;
СписокТипов = Новый СписокЗначений;
Для Каждого ОбъектМетаданных Из Метаданные.Справочники Цикл
СписокТипов.Добавить(ОбъектМетаданных.ПолноеИмя(), ОбъектМетаданных.Имя, , БиблиотекаКартинок.СправочникОбъект);
КонецЦикла;
Для Каждого ОбъектМетаданных Из Метаданные.Документы Цикл
СписокТипов.Добавить(ОбъектМетаданных.ПолноеИмя(), ОбъектМетаданных.Имя, , БиблиотекаКартинок.ДокументОбъект);
КонецЦикла;
КоллекцияОбъектов = Новый Массив;
КоллекцияОбъектов.Добавить(Метаданные.ПланыОбмена);
КоллекцияОбъектов.Добавить(Метаданные.Справочники);

КоллекцияОбъектов.Добавить(Метаданные.Документы);
КоллекцияОбъектов.Добавить(Метаданные.ПланыВидовХарактеристик);
КоллекцияОбъектов.Добавить(Метаданные.ПланыСчетов);
КоллекцияОбъектов.Добавить(Метаданные.ПланыВидовРасчета);
КоллекцияОбъектов.Добавить(Метаданные.БизнесПроцессы);
КоллекцияОбъектов.Добавить(Метаданные.Задачи);
КоллекцияРегистров = Новый Массив;
КоллекцияРегистров.Добавить(Метаданные.РегистрыСведений);
КоллекцияРегистров.Добавить(Метаданные.РегистрыНакопления);
КоллекцияРегистров.Добавить(Метаданные.РегистрыБухгалтерии);
КоллекцияРегистров.Добавить(Метаданные.РегистрыРасчета);

Чаще всего эта ошибка возникает при работе непосредственно со справочниками договоров, контрагентов, номенклатуры и т. д. Пользователь добавляет в любой из справочников новую запись, при этом система 1С: Предприятие 8 автоматически присваивает ему код, но при сохранении записи выдает ошибку «Код не уникален!», а, следовательно, сохранить объект не удается.

В чем причина появления данной ошибки?

А причина может быть в некорректной нумерации объектов справочника. Как это происходит? Обычно при создании новой записи в каком-то из справочников программа сама генерирует код записи. Если в предыдущих записях пользователь редактировал код вручную, то в последствии есть вероятность того, что при создании последующих записей разрядность кода увеличится на один знак и перестает помещаться в поле, а значит генерация кодов начнется сначала. Только вот хранить объекты с одинаковыми кодами в справочниках 1С нельзя, а, значит, пользователь в такой ситуации будет получать на экран сообщение об ошибке.

Как исправить ошибку «Код не уникален»?

Безусловно, решение этой проблемы предусмотрено разработчиками 1С. Заключается оно в полной перенумерации элементов справочника. Для этого на диске информационно-технологического сопровождения 1С (1с итс) есть специальная обработка, которая называется «УниверсальныеПодборИОбработкаОбъектов.epf». Она располагается в каталоге \1CITS\EXE\ExtReps\UNIREPS81\UniversalSelection.

Все, что нужно от пользователя ― зайти в вышеуказанный каталог, запустить обработку и подождать пока завершится процесс перенумерации объектов выбранного справочника.

Как предотвратить появление ошибки «Код не уникален»?

Чтобы предотвратить появление данной ошибки при работе со справочниками 1С, в первую очередь не рекомендуется производить ручное редактирование кодов записей. Именно вмешательство в программную нумерацию и приводит чаще всего в ее возникновению. Если же без редактирования кодов не обойтись, то продумайте ситуацию наперед.

Рекомендуем также еще статьи по программам 1С:

  • Выбор режима проведения документов в 1С
  • Настройка доступа к подсистемам программ 1С 8.2
  • Установка 1С: Предприятие 8.0

Вы можете получать новые материалы сайта по RSS-каналу или можете подписаться на новости 1С от Информ Актив и получать их еженедельно на Ваш e-mail .

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

Почему появляется эта ошибка?

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

Рис.1 Окно ошибки

Разработчики выделяют 3 распространенные причины появления окна с ошибкой:

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

Если вы случайно или по незнанию попытались изменить реквизит ссылки и получили ошибку, то необходимо добавить всего пару строк кода. В платформе 8.3 заложена функция получения объекта по ссылке, и для изменения значения реквизитов придется ею воспользоваться. То есть перед изменением нужно получить объект по ссылке, изменить реквизит и записать объект.

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

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

Что делать, если после обновления вы все-таки не можете работать, наблюдая ошибку недоступности поля объекта для записи?

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

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

Для более глубокого изучения 1С скачайте книгу «Разработка оперативного учёта в 1С 8.3»

При работе с 1С довольно часто может появляться сообщение об ошибке «Поле объекта недоступно для записи». Рассмотрим, какие действия могут привести к ней, и как её можно устранить.

Причины возникновения ошибки

К появлению системного окна с этой ошибкой может привести 6 факторов:

  1. Попытка изменения значений в полях, смена которых бессмысленна;
  2. Ошибка в коде;
  3. Попытка изменения системных полей;
  4. Недостаточно прав на изменение;
  5. Устаревшая конфигурация 1С;
  6. В управляемой форме используется элемент и реквизит с одним именем.

1. Попытка изменения значений в полях, смена которых бессмысленна

Например, в программе происходит попытка замены ссылки, а не объекта. Но сделать этого невозможно. Если изменить ссылку, то, во-первых, она будет ссылаться на несуществующий объект (в никуда), во-вторых, нужный объект по ней вы больше не найдёте.

Пример неправильного фрагмента кода:

Иванов = Справочники.ФизическиеЛица.НайтиПоНаименованию(«Иванов Петр»);

Иванов.НомерПаспорта = «2175353»;

И при вводе последней строчки появляется ошибка «Поле объекта недоступно для записи».

Причина в том, что происходит попытка редактирования свойств или реквизитов ссылки. В указанном примере параметру «НомерПаспорта» вы пытаетесь задать определённое значение. Но эти данные можно менять только у объекта. В данном примере «Иванов» — это именно ссылка, которая предназначена для чтения. По ней человек идентифицируется в базе данных. Во второй строчке указана «точка» — «Иванов.НомерПаспорта». Но это также не объект, потому что при обращении к «точке» выполняется все тот же запрос к базе данных. Сделано это для удобства использования 1С.

Как исправить ошибку? Чтобы сообщение «Поле объекта недоступно для записи» больше не появлялось, нужно прописать следующее:

ИвановСсылка = Справочники.ФизическиеЛица.НайтиПоНаименованию(«Иванов Петр»);

ИвановОбъект = ИвановСсылка.ПолучитьОбъект();

ИвановОбъект.НомерПаспорта = «2175353»;

ИвановОбъект.Записать();

Теперь по ссылке выполняется обращение к объекту, а затем уже он редактируется. После этого объект записывается, то есть фиксируется его новое состояние.

2. Ошибка в коде

Возможно причина в том, что программист, который работал с текущей конфигурацией 1С, допустил ошибку при доработке. Тогда исправить её сможет также только специалист. Желательно, чтобы это был именно тот человек, который изначально настраивал 1С.

3. Попытка изменения системных полей

Пользователь пытается редактировать те данные, на замену которых он не имеет прав. Например, номер строки в таблице, установка «ТекущаяСтрока» вместо «ТекущиеДанные» и т. д. Иногда ошибка возникает из-за простой невнимательности. Если обращаться к правильным полям – ошибка появляться не будет.

4. Недостаточно прав на изменение

Иногда поле, которое пытается изменить пользователь, доступно только для чтения. Это связано с правами на объекты конкретного пользователя. Чтобы устранить возникающую ошибку, необходимо проанализировать права на конкретный объект и либо разрешить пользователю доступ к соответствующему полю (на запись), либо вообще исключить поле (или целый объект) из рассмотрения.

5. Устаревшая конфигурация 1С

Иногда ошибка «Поле объекта недоступно для записи» появляется при обновлении 1С. Чтобы убрать её, нужно обновиться до самой свежей версии платформы.

Устранить ошибку обычно не сложно и сделать это может сам пользователь. Если же серьёзно нарушена конфигурация 1С, исправить положение сможет только специалист.

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

Достаточно редко ошибка «Поле объекта недоступно для записи» появляется при совпадении имён реквизита и элемента управляемой формы. Чтобы устранить ошибку, необходимо явно прописать обращение к реквизиту или элементу формы.

К примеру, в форме 1С имеется реквизит с именем «Сумма». С таким же именем на форме находится элемент «Сумма».

1 2 3 4 5 6 //Возможна ошибка присвоения Сумма = 1; // Правильно так Элементы.Сумма = 1; //Происходит присвоение значения элементу формы ЭтаФорма.Сумма = 1; //Происходит присвоение значения реквизиту формы

Добавить комментарий

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