Что случилось после обновления
После обновления 1С:Зарплата и управление персоналом КОРП, редакция 3.1 до версии 3.1.39.53 перестали работать сразу несколько связанных механизмов:
- получение уведомлений из налоговой
- обновление списка документов ЭДО
- отправка документов через ЭДО
- работа 1С-Отчетности
Во всех случаях пользователь видит малопонятную ошибку:
Поле объекта недоступно для записи (Удостоверения)
Ошибка выглядит как проблема с сертификатом, настройками ЭДО или правами пользователя. Но на практике причина находится в коде конфигурации: после обновления возник конфликт имен.
Что произошло в обновлении
Удостоверения.Из-за этого в одной из процедур возник конфликт: локальная переменная с таким же названием перестала корректно использоваться как поле объекта. Код пытается выполнить запись в Удостоверения, но платформа 1С воспринимает это имя как общий модуль, а не как доступную для записи переменную.
В результате возникает ошибка:
Поле объекта недоступно для записи (Удостоверения)
Ошибка проявляется не только в ЭДО, но и в 1С-Отчетности, потому что оба контура используют общие механизмы работы с сертификатами, удостоверениями и паспортными данными владельца.
Где находится проблемный код
Проблемная функция называется:
ПолучитьПаспортныеДанныеВладельцаИзРегФайла
Именно в ней используется имя Удостоверения, которое теперь конфликтует с новым общим модулем.
Типичный сценарий:
- Обновили ЗУП КОРП до версии 3.1.39.53.
- Попытались получить письма из налоговой или обновить ЭДО.
- Получили ошибку «Поле объекта недоступно для записи (Удостоверения)».
- Попытка отправить документ через ЭДО также завершается ошибкой.
- 1С-Отчетность тоже перестала работать.
Идея исправления
Не нужно править типовую конфигурацию напрямую. Лучше создать расширение и перехватить проблемную функцию.
Логика решения:
- Создать расширение конфигурации.
- Добавить в него функцию
ПолучитьПаспортныеДанныеВладельцаИзРегФайла. - Установить для нее режим вызова «Вызывать вместо».
- Скопировать код штатной функции в расширение.
- Переименовать конфликтную переменную
УдостоверениявперУдостоверения.
После этого обращение к локальной переменной перестает конфликтовать с именем общего модуля.
Создание расширения
Создайте новое расширение конфигурации, например:
ИсправлениеУдостоверенияЗУП
Рекомендуемое назначение расширения:
Исправление ошибки "Поле объекта недоступно для записи (Удостоверения)" в ЗУП КОРП 3.1.39.53
Расширение удобно назвать так, чтобы при следующем обновлении было сразу понятно, какую проблему оно решает.
Добавление функции-перехватчика
В расширении создайте функцию с точно таким же именем, как в конфигурации:
ПолучитьПаспортныеДанныеВладельцаИзРегФайла
Для функции установите свойство:
Вызывать вместо
Это ключевой момент. Без него расширение не перехватит штатную функцию, и ошибка останется.
Копирование штатного кода
Откройте в конфигураторе штатную функцию:
ПолучитьПаспортныеДанныеВладельцаИзРегФайла
Скопируйте её код в одноименную функцию расширения.
Не переписывайте логику «по памяти». Нужно скопировать актуальный код именно из установленной версии 3.1.39.53, потому что в следующих релизах он может измениться.
Переименование конфликтной переменной
В скопированном коде найдите все использования переменной:
Удостоверения
Переименуйте ее в безопасное имя, например:
перУдостоверения
Важно заменить имя во всех местах внутри функции:
- при объявлении или первом присваивании;
- при последующих присваиваниях;
- при чтении свойств и методов;
- при передаче переменной в другие процедуры или функции, если она используется внутри этого фрагмента кода.
Концептуально изменение выглядит так:
// Было
Удостоверения = ...;
...
Значение = Удостоверения.КакоеТоСвойство;
// Стало
перУдостоверения = ...;
...
Значение = перУдостоверения.КакоеТоСвойство;
После переименования ошибка исчезает: код продолжает работать с теми же данными, но больше не пытается записать значение в имя общего модуля Удостоверения.
Почему это работает
До обновления имя Удостоверения в контексте функции однозначно указывало на локальную переменную или реквизит.
После обновления это имя занял общий модуль. Когда код обращается к Удостоверения, платформа разрешает его как ссылку на модуль. Попытка записать в него значение приводит к ошибке:
Поле объекта недоступно для записи (Удостоверения)
Переименование локальной переменной в перУдостоверения устраняет неоднозначность. Функционально ничего не меняется, но исчезает конфликт имен.
Что проверить после исправления
После сохранения расширения и обновления конфигурации базы проверьте сценарии по очереди:
- получение писем из налоговой;
- обновление ЭДО;
- отправку тестового документа через ЭДО;
- формирование и отправку отчётности через 1С-Отчётность;
- отсутствие ошибки «Поле объекта недоступно для записи (Удостоверения)» в журнале регистрации.
Если ошибка исчезла, но ЭДО всё ещё не работает, ищите отдельную причину:
- просроченный или некорректный сертификат;
- настройки учётной записи ЭДО;
- права пользователя на операции ЭДО;
- доступность сервиса оператора ЭДО;
- ошибки на стороне налоговой или оператора ЭДО;
- проблемы с прокси, сертификатами или сетевым доступом.
Безопасность изменения
Это обходное решение, а не официальное исправление от вендора. Его разумно применять, если ошибка блокирует работу прямо сейчас.
Перед изменениями обязательно:
- сделайте резервную копию базы;
- выгрузите текущую конфигурацию и существующие расширения;
- проверьте решение сначала на копии базы;
- зафиксируйте версию ЗУП, в которой воспроизводится проблема;
- проверьте, не вышел ли уже официальный патч или следующий релиз.
При следующем обновлении конфигурации код штатной функции может измениться. Тогда потребуется заново сравнить её с кодом в расширении и при необходимости обновить расширение.
Как минимизировать риск при будущих обновлениях
Чтобы расширение не превратилось в источник новых проблем:
- храните его в отдельном репозитории или в защищенном общем хранилище;
- укажите в описании расширения версию ЗУП и причину исправления;
- добавьте комментарий в код с датой, версией конфигурации и ссылкой на проблему;
- перед обновлением проверяйте, изменилась ли функция
ПолучитьПаспортныеДанныеВладельцаИзРегФайла; - после обновления обязательно прогоняйте сценарии ЭДО и 1С-Отчетности;
- удаляйте расширение, когда вендор выпустит официальное исправление.
Итог
Ошибка:
Поле объекта недоступно для записи (Удостоверения)
в ЗУП КОРП 3.1.39.53 связана с появлением общего модуля Удостоверения и конфликтом имен в функции ПолучитьПаспортныеДанныеВладельцаИзРегФайла.
Быстрое решение:
- Создать расширение.
- Добавить функцию
ПолучитьПаспортныеДанныеВладельцаИзРегФайлас режимом «Вызывать вместо». - Скопировать туда код штатной функции.
- Переименовать переменную
УдостоверениявперУдостоверения. - Проверить ЭДО и 1С-Отчётность.
Это быстрый и относительно безопасный способ вернуть работоспособность ЭДО и отчетности до выхода официального исправления.
