Как исправить ошибку «Поле объекта недоступно для записи (РабочийТелефон)» при выгрузке заявок на открытие лицевых счетов в 1С:ЗУП?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

Приветствуем коллег и пользователей системы «1С:Зарплата и Управление Персоналом»! Сегодня мы детально разберем крайне неприятную проблему, с которой столкнулись многие бухгалтеры и технические специалисты после обновления конфигурации до релиза 3.1.10.443. Речь идет о сбое при попытке выгрузить документ «Заявка на открытие лицевых счетов» в XML-файл для отправки в банк.

При запуске процесса выгрузки программа внезапно прекращает работу, выдавая системную ошибку:

{ОбщийМодуль.ОбменСБанкамиПоЗарплатнымПроектам.Модуль(3647)}: Поле объекта недоступно для записи (РабочийТелефон) ОбъектXDTO[СвойствоОбъектаXDTO.Имя] = ЗначениеПоля;

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

Выясняем причину: почему это происходит?

Вся магия обмена данными с банками в современных конфигурациях 1С строится на технологии XDTO (XML Data Transfer Objects). В релизе ЗУП 3.1.10.443 разработчики фирмы «1С» обновили поставляемый XDTO-пакет ФорматОбменаСБанкамиПоЗарплатнымПроектам.

В новой версии XML-схемы формат полей РабочийТелефон и ДомашнийТелефон претерпел изменения. В свойствах этих элементов было установлено значение множественности (параметр maxOccurs теперь больше единицы или равен unbounded). Это сделано для того, чтобы в одном файле можно было передавать сразу несколько контактных номеров одного типа.

Однако в платформе «1С:Предприятие 8» работа с множественными и одиночными свойствами XDTO кардинально отличается:

  1. Если свойство одиночное (строка или число), мы можем записать в него значение напрямую через простое присваивание: ОбъектXDTO.РабочийТелефон = "89991112233".
  2. Если свойство может повторяться (коллекция), платформа инициализирует его как объект типа СписокXDTO. Напрямую присвоить значение такому списку через знак равенства нельзя. Попытка выполнить прямую перезапись вызывает исключение платформы: «Поле объекта недоступно для записи». Для работы с такими свойствами необходимо использовать метод Добавить().

Поскольку общий модуль ОбменСБанкамиПоЗарплатнымПроектам в релизе 3.1.10.443 не был вовремя адаптирован под новые требования схемы, универсальный алгоритм выгрузки пытается «в лоб» присвоить строковое значение свойству-списку, что и приводит к аварийному завершению транзакции.

---

Решение 1. Быстрый обходной путь для пользователя (без программирования)

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

Выполним следующие шаги:

  1. Откройте карточки сотрудников, включенных в выгружаемую «Заявку на открытие лицевых счетов».
  2. Перейдите в раздел контактной информации и временно очистите поля «Рабочий телефон» и «Домашний телефон» (скопируйте их значения в блокнот или запишите в комментарий, чтобы не потерять).
  3. Оставьте заполненным только «Мобильный телефон» — в схеме обмена этот реквизит остался одиночным полем, поэтому его заполнение не вызывает никаких ошибок.
  4. Сохраните изменения в личных карточках физических лиц.
  5. Вернитесь в документ выгрузки и повторите операцию экспорта файла.

Файл обмена будет успешно сформирован и сохранен на ваш компьютер. После успешной отправки реестра в банк вы сможете вернуть удаленные телефоны сотрудников на свои места.

---

Решение 2. Программное исправление через расширение конфигурации

Для того чтобы решить проблему раз и навсегда без изменения типовой конфигурации (чтобы база оставалась на полной поддержке), мы можем создать небольшое расширение и скорректировать процедуру заполнения XDTO-объекта.

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

Выполним по шагам:

  1. Запустите конфигуратор базы данных 1С:ЗУП.
  2. Перейдите в меню Конфигурация — Расширения конфигурации. Создайте новое расширение, выбрав назначение «Адаптация».
  3. В дереве метаданных основной конфигурации найдите общий модуль ОбменСБанкамиПоЗарплатнымПроектам, нажмите на него правой кнопкой мыши и выберите команду Добавить в расширение.
  4. В модуле расширения переопределите процедуру, содержащую строку записи значения в XDTO (ориентируйтесь на строку 3647). Вместо опасного прямого присвоения:

ОбъектXDTO[СвойствоОбъектаXDTO.Имя] = ЗначениеПоля;

Внедрите безопасную конструкцию, которая определяет тип приемника:


ИмяСвойства = СвойствоОбъектаXDTO.Имя;
ТекущееСвойствоXDTO = ОбъектXDTO[ИмяСвойства];

Если ТипЗнч(ТекущееСвойствоXDTO) = Тип("СписокXDTO") Тогда
    // Если поле множественное, добавляем значение в список
    Если ЗначениеЗаполнено(ЗначениеПоля) Тогда
        ТекущееСвойствоXDTO.Добавить(ЗначениеПоля);
    КонецЕсли;
Иначе
    // Если поле одиночное, выполняем стандартную перезапись
    ОбъектXDTO[ИмяСвойства] = ЗначениеПоля;
КонецЕсли;

Этот код проверяет, является ли целевой элемент структуры списком СписокXDTO. Если это список, платформа использует корректный метод Добавить(), а если простое поле — отрабатывает стандартный механизм. Сохраните расширение и обновите базу данных.

---

Решение 3. Замена XDTO-пакета на версию из предыдущего релиза

Еще один рабочий способ, обнаруженный системными администраторами на практике — это временный откат XML-схемы до старой, стабильной версии.

Рассмотрим этот вариант по шагам:

  1. Откройте конфигуратор резервной копии базы данных или чистой базы ЗУП версии 3.1.10.416 (где выгрузка работала штатно).
  2. В дереве конфигурации перейдите по пути: Общие — XDTO-пакеты — ФорматОбменаСБанкамиПоЗарплатнымПроектам.
  3. Нажмите правой кнопкой мыши по пакету и выберите пункт Экспортировать схему XML.... Сохраните полученный файл с расширением .xsd на жесткий диск.
  4. Откройте конфигуратор вашей рабочей базы релиза 3.1.10.443. Обратите внимание, что для изменения пакета конфигурацию придется временно снять с поддержки (или включить возможность изменения с сохранением поддержки).
  5. Найдите тот же XDTO-пакет, кликните правой кнопкой мыши и выберите пункт Импортировать схему XML..., указав сохраненный ранее файл от версии 3.1.10.416.
  6. Выполните обновление конфигурации базы данных (клавиша F7).

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

---

Решение 4. Установка официального патча от фирмы «1С»

Фирма «1С» оперативно реагирует на критические ошибки, мешающие расчету зарплаты и взаимодействию с банками, выпуская автоматические исправления (патчи).

Рекомендуем проверить наличие готового исправления в вашей системе:

  1. Зайдите в базу данных под правами администратора.
  2. Перейдите в раздел Администрирование — Обслуживание.
  3. Откройте группу Обновление программы и перейдите по гиперссылке Установленные исправления (патчи).
  4. Если у вас подключена интернет-поддержка, нажмите кнопку Поиск и установка исправлений. Программа просканирует сервер обновлений и предложит установить патч для исправления обмена с банками по зарплатным проектам (если он выпущен для вашей версии).
  5. После автоматической установки патча перезапустите сеанс «1С:Предприятия».

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

← На главную