При настройке и кастомизации правил обмена между конфигурациями 1С на платформе «1С:Предприятие 8» разработчики часто сталкиваются с непредвиденными ошибками в процессе выгрузки или загрузки данных. Типичный пример — сбой при переносе документа СчетФактураПолученный из конфигурации «Управление производственным предприятием, редакция 1.3» (УПП) в конфигурацию «Бухгалтерия предприятия, редакция 2.0» (БП 2.0).
Давайте подробно проанализируем логику возникновения этой ошибки, разберем причины ее появления и рассмотрим четыре практических способа ее устранения.
Для начала внимательно изучим текст сообщения об ошибке, которое выдает обработка «Универсальный обмен данными XML»:
Ошибка получения значения свойства объекта (по имени свойства источника)
ПКО = Хозрасчетный (План счетов: План счетов бухгалтерского учета)
ПКС = 1 (ЗапретитьИспользоватьВПроводках --> ЗапретитьИспользоватьВПроводках)
Объект = 62.01 (Строка)
СвойствоПриемника = ЗапретитьИспользоватьВПроводках (Булево)
ОписаниеОшибки = Получение элемента по индексу для значения не определено
ПозицияМодуля = Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(8283)
Давайте разберем эту запись по ключевым составляющим, чтобы понять, что именно пошло не так:
Хозрасчетный. Ошибка возникает в момент обработки данных плана счетов бухгалтерского учета.ЗапретитьИспользоватьВПроводках. Алгоритм пытается перенести значение этого реквизита из базы-источника в базу-приемник.62.01 (Строка). Это самый важный момент! В качестве источника данных выступает не ссылка на элемент плана счетов (ПланСчетовСсылка.Хозрасчетный), а обычное текстовое значение типа Строка.Получение элемента по индексу для значения не определено.Когда универсальная обработка обмена пытается выгрузить свойство ЗапретитьИспользоватьВПроводках для объекта 62.01, она обращается к нему как к свойству объекта. Но так как в переменную Источник попала обычная строка "62.01", платформа пытается выполнить обращение по индексу или через точку (например, Источник["ЗапретитьИспользоватьВПроводках"]). У типа Строка нет такого свойства, что и приводит к аварийному завершению работы системы.
Дополнительная сложность заключается в том, что в плане счетов УПП 1.3 присутствует реквизит ЗапретитьИспользоватьВПроводках, а в БП 2.0 (особенно если она устарела или снята с поддержки) такого реквизита может не быть вовсе, либо правила обмена некорректно сопоставляют метаданные.
Если ошибка возникает именно при выгрузке документа СчетФактураПолученный, скорее всего, в правилах конвертации свойств этого документа (или в связанных с ним ПКО) счет учета передается некорректно. Например, в обработчике «Перед выгрузкой» какого-то свойства жестко прописано текстовое значение вида Значение = "62.01";.
Давайте исправим это, заменив строковое значение на реальную ссылку на счет учета. Вместо передачи строки мы найдем счет в плане счетов источника:
// Вместо строки Значение = "62.01"; используем поиск ссылки:
СчетУчета = ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.01");
Если ЗначениеЗаполнено(СчетУчета) Тогда
Значение = СчетУчета;
Иначе
// Резервный вариант на случай, если счет не найден
Значение = Неопределено;
КонецЕсли;
После такого изменения в ПКО Хозрасчетный в качестве источника будет передаваться полноценный объект ссылки, у которого платформа сможет прочитать все необходимые свойства, включая ЗапретитьИспользоватьВПроводках.
Если в вашей конфигурации правила обмена построены так, что строковые коды счетов могут передаваться из разных мест и переписать все ПКС документов трудоемко, мы можем применить защитное программирование. Для этого добавим преобразование строки в ссылку непосредственно «на входе» в ПКО Хозрасчетный.
Выполним следующие шаги в конфигурации «Конвертация данных 2.1»:
Хозрасчетный.
Если ТипЗнч(Источник) = Тип("Строка") Тогда
// Пытаемся найти счет по коду в источнике
НайденныйСчет = ПланыСчетов.Хозрасчетный.НайтиПоКоду(Источник);
Если ЗначениеЗаполнено(НайденныйСчет) Тогда
Источник = НайденныйСчет;
Иначе
// Если счет по коду не найден, отменяем выгрузку этого свойства
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Этот простой шаг гарантирует, что даже если в ПКО случайно передадут строку "62.01", она автоматически превратится в объектную ссылку до того, как система начнет анализировать ПКС и вызовет критическую ошибку.
Поскольку Бухгалтерия предприятия 2.0 является устаревшей конфигурацией, реквизит ЗапретитьИспользоватьВПроводках вам может быть абсолютно не нужен в приемнике при обмене данными. Если это так, самым быстрым и правильным решением будет полное отключение выгрузки данного свойства.
Проанализируем порядок действий в программе «Конвертация данных 2.1»:
Хозрасчетный.ЗапретитьИспользоватьВПроводках.УниверсальныйОбменДаннымиXML в вашей информационной базе УПП и повторите попытку выгрузки.Поскольку свойство больше не будет обрабатываться при выгрузке, обработчик обмена проигнорирует его наличие, и выгрузка документа СчетФактураПолученный завершится успешно.
Иногда подобные ошибки возникают из-за банального рассинхронизирования структуры метаданных, загруженной в базу «Конвертация данных», с реальным состоянием ваших рабочих баз 1С (особенно если базы дорабатывались программистами или обновлялись).
Для исправления ситуации выполним полную синхронизацию метаданных:
MD82Exp.epf (она идет в комплекте с Конвертацией данных). Выгрузите структуру метаданных УПП в файл.Хозрасчетный. Система автоматически определит, какие реквизиты изменились или перестали существовать, и предложит скорректировать правила обмена.Использование этого метода позволяет поддерживать правила обмена в актуальном состоянии и избегать ошибок несоответствия типов при последующих доработках обмена.