Как исправить ошибку Поле объекта недоступно для записи Затраты в 1С УПП 1.3

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет
← На главную

При работе в конфигурации «1С:Управление производственным предприятием» (УПП) ред. 1.3, особенно после обновления на релиз 1.3.116.2 и выше, технические специалисты могут столкнуться с неожиданной ошибкой при открытии или проведении документа «Отражение зарплаты в регламентированном учете». Текст ошибки гласит: Поле объекта недоступно для записи: Затраты. В этой статье мы подробно разберем причины возникновения этой ситуации, проанализируем поведение платформы «1С:Предприятие» и рассмотрим несколько эффективных способов решения проблемы.

Анализ проблемы и диагностика через отладчик

Давайте проанализируем, что происходит в системе в момент возникновения ошибки. Когда мы открываем форму документа или запускаем процесс заполнения, вызывается процедура ЗаполнитьГруппыДляОтборов. Внутри этой процедуры программный код пытается инициализировать локальную переменную для хранения массива данных:


Процедура ЗаполнитьГруппыДляОтборов()
    // ... какой-то код ...
    Затраты = Новый Массив; // Именно здесь происходит аварийная остановка
    // ... дальнейшая логика ...
КонецПроцедуры

На первый взгляд, код выглядит абсолютно корректно. Однако, если мы воспользуемся инструментом «Вычислить выражение» в конфигураторе, то увидим странную картину: до выполнения строки с присваиванием переменная Затраты уже имеет значение, и её тип — ОбщийМодуль.

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

Почему возникает конфликт имен в глобальном пространстве

Разберем по шагам механизм работы пространств имен в 1С. В системе существует иерархия имен:

  1. Локальные переменные процедуры или функции.
  2. Переменные модуля.
  3. Экспортные переменные других модулей и имена глобальных общих модулей.

Проблема кроется в свойстве общего модуля «Глобальный». Если в вашей конфигурации (или в подключенном расширении) существует общий модуль с именем Затраты, и у него в палитре свойств установлен флажок «Глобальный», то имя этого модуля резервируется во всей системе. Любая попытка использовать слово Затраты в качестве имени переменной в любом другом модуле приведет к тому, что компилятор будет считать это обращением к данному глобальному модулю.

Важно отметить, что в типовой конфигурации УПП 1.3 нет модуля с названием Затраты. Как правило, такие модули появляются в результате:

Способ решения №1: Изменение свойств общего модуля (Рекомендуемый)

Рассмотрим самый правильный с точки зрения архитектуры способ исправления. Если мы обнаружили, что в системе присутствует модуль Затраты, нам необходимо лишить его статуса глобального. Это освободит имя для использования в локальных переменных типового кода.

Выполним следующие действия:

  1. Перейдем в дерево метаданных: Общие -> Общие модули.
  2. Найдем модуль с именем Затраты.
  3. Откроем его палитру свойств (клавиша Alt+Enter).
  4. Снимем галочку «Глобальный».
  5. Сохраним изменения и обновим конфигурацию базы данных.

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

Способ решения №2: Переименование локальной переменной

Если по каким-то причинам вы не можете менять свойства общего модуля (например, он используется во множестве внешних обработок, которые сложно быстро обновить), можно пойти путем изменения типового кода документа. Рассмотрим, как это сделать в модуле формы документа «Отражение зарплаты в регл. учете».

Нам необходимо найти все вхождения переменной Затраты в процедуре ЗаполнитьГруппыДляОтборов и заменить их на уникальное имя, например мЗатраты или СписокЗатрат.


// Было:
Затраты = Новый Массив;
Затраты.Добавить(СсылкаНаЗатрату);

// Стало:
мЗатраты = Новый Массив;
мЗатраты.Добавить(СсылкаНаЗатрату);

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

Способ решения №3: Использование расширений конфигурации

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

Разберем алгоритм создания расширения:

  1. Создадим новое расширение конфигурации.
  2. Добавим в расширение документ «ОтражениеЗарплатыВРеглУчете» и его форму.
  3. Найдем процедуру ЗаполнитьГруппыДляОтборов и добавим её в расширение с типом вызова &Вместо.
  4. В коде расширения скопируем текст типовой процедуры, но заменим имя конфликтующей переменной Затраты на другое.

Этот метод позволяет сохранить «чистоту» основной конфигурации и корректно проходить обновления в будущем.

Почему ошибка проявилась именно на релизе 1.3.116.2?

Многие пользователи задаются вопросом: почему раньше всё работало, а после обновления программа начала «ругаться»? Выясним причину. В новых релизах разработчики 1С часто проводят оптимизацию кода или добавляют новые проверки и фильтры. В релизе 1.3.116.2 в документе отражения зарплаты могла измениться логика работы с отборами, где и была внедрена (или изменена) переменная Затраты.

Если в вашей базе «самописный» модуль Затраты существовал годами, он не конфликтовал с типовым кодом до тех пор, пока в типовом коде не появилась переменная с точно таким же именем. Это классическая проблема «загрязнения» глобального пространства имен, которой стоит избегать при разработке собственных модулей.

Заключение и рекомендации

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

Применяя один из описанных выше способов (лучше всего — снятие признака глобальности с модуля), вы сможете быстро восстановить работоспособность документа и обеспечить стабильную работу бухгалтерии.

← На главную