Как преобразовать строку налогового периода в дату в «Конвертации данных 2.1» и исправить ошибку загрузки «Поле объекта не обнаружено»?

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

При настройке интеграции и переноса данных между конфигурациями 1С:Предприятие с помощью конфигурации «Конвертация данных 2.1» (КД 2.1) разработчики часто сталкиваются с необходимостью трансформации типов данных. Типичный пример — перенос платежных документов (например, из «Управления торговлей 11» в «Бухгалтерию предприятия 3.0»), где реквизиты налогового периода в источнике хранятся в виде строки (например, МС.12.2019), а в приемнике должны быть записаны в полноценный реквизит с типом Дата.

В рамках данной статьи мы подробно разберем, как правильно реализовать алгоритм разбора такой строки, какие подводные камни могут возникнуть при различных налоговых периодах (месяц, квартал, полугодие, год), а также детально изучим методику устранения популярной ошибки загрузки «Поле объекта не обнаружено» на строке 7176 обработки «Универсальный обмен данными XML».

Где и как правильно настроить конвертацию свойства

При проектировании правил обмена в КД 2.1 у нас есть выбор, в каком обработчике событий производить конвертацию типов. Некоторые разработчики пытаются делать это в обработчике ПередВыгрузкой правила конвертации объектов (ПКО), передавая значение во входящие данные. Однако наиболее лаконичным, прозрачным и простым в обслуживании является написание кода непосредственно в Правиле конвертации свойства (ПКС) для конкретного реквизита.

Выполним следующие шаги для настройки ПКС:

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

Когда мы присваиваем результат переменной Значение в обработчике ПКС Перед выгрузкой, исходный реквизит источника игнорируется, а в файл выгрузки XML помещается именно то значение, которое мы сформировали программно.

Разбор строки налогового периода: пишем надежный алгоритм

Рассмотрим простейший вариант конвертации, который часто используют начинающие специалисты. Если строка имеет строго фиксированный вид МС.12.2019, то можно попытаться просто вырезать составляющие функции и склеить их для передачи в конструктор Дата():


ПоказательПериода = Источник.ПоказательПериода;
ПозицияПериода = Найти(СокрЛП(ПоказательПериода), ".");
ПозицияГода = Найти(Сред(СокрЛП(ПоказательПериода), ПозицияПериода + 1), ".") + ПозицияПериода;

СтрокаНомерПериода = Сред(СокрЛП(ПоказательПериода), ПозицияПериода + 1, ПозицияГода - ПозицияПериода - 1);
СтрокаГодПериода = Сред(СокрЛП(ПоказательПериода), ПозицияГода + 1);

Значение = Дата(Строка(СтрокаГодПериода + СтрокаНомерПериода + "01"));

Почему этот код крайне опасен для реального учета? Проанализируем его слабые стороны:

Для того чтобы избежать этих проблем, разработаем универсальный, отказоустойчивый алгоритм. Вместо устаревших функций Найти и Сред задействуем современную функцию платформы СтрРазделить, которая мгновенно разобьет строку по точкам-разделителям. Мы также учтем специфику всех типов налоговых периодов (МС, КВ, ПЛ, ГД):


ПоказательПериода = СокрЛП(Источник.ПоказательПериода);
Значение = '00010101'; // Инициализируем пустой датой на случай непредвиденного формата

Если Найти(ПоказательПериода, ".") > 0 Тогда
    МассивЧастей = СтрРазделить(ПоказательПериода, ".");
    
    Если МассивЧастей.Количество() = 3 Тогда
        Периодичность = ВРег(МассивЧастей[0]);
        НомерПериода  = Число(МассивЧастей[1]);
        ГодПериода    = Число(МассивЧастей[2]);
        
        Месяц = 1; // По умолчанию первый месяц периода
        
        Если Периодичность = "МС" Тогда
            Месяц = НомерПериода;
        ИначеЕсли Периодичность = "КВ" Тогда
            // КВ.01 -> Январь (1), КВ.02 -> Апрель (4), КВ.03 -> Июль (7), КВ.04 -> Октябрь (10)
            Месяц = (НомерПериода - 1) * 3 + 1;
        ИначеЕсли Периодичность = "ПЛ" Тогда
            // ПЛ.01 -> Январь (1), ПЛ.02 -> Июль (7)
            Месяц = (НомерПериода - 1) * 6 + 1;
        ИначеЕсли Периодичность = "ГД" Тогда
            Месяц = 1; // Для годовых платежей всегда устанавливаем 1 января
        КонецЕсли;
        
        Попытка
            // Используем безопасный конструктор даты по числовым параметрам
            Значение = Дата(ГодПериода, Месяц, 1); 
        Исключение
            // Если дата некорректна (например, неверный год), возвращаем пустую дату
            Значение = '00010101'; 
        КонецПопытки;
    КонецЕсли;
КонецЕсли;

Этот код защищен от сбоев преобразования типов, корректно интерпретирует кварталы и полугодия, а также использует конструктор Дата(Год, Месяц, День), который не зависит от региональных настроек операционной системы сервера.

Разбор ошибки загрузки: «Поле объекта не обнаружено» на строке 7176

Представим ситуацию: выгрузка прошла успешно, в сформированном XML-файле мы видим долгожданную строку вида 2020-04-01T00:00:00. Но при попытке загрузить этот файл в базу-приемник «Бухгалтерия предприятия» обработка загрузки падает с ошибкой:

Ошибка при загрузке данных: {ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(7176)}: Поле объекта не обнаружено

Выясним причину этой проблемы. В конфигурации КД 2.1 при автоматической генерации правил обмена или при ручном копировании строк ПКС в таблице свойств могут образовываться так называемые «фантомные» (пустые) строки. У такой строки полностью отсутствует имя источника и имя приемника, однако само правило остается активным и записывается в XML-файл правил обмена. Когда универсальный загрузчик парсит правила и пытается сопоставить свойства, он наталкивается на это пустое свойство и пытается выполнить код вида Объект[""] = Значение, что и вызывает исключение.

Вторая распространенная причина — **несоответствие метаданных**. Если ваша конфигурация БП 3.0 обновилась, и разработчики фирмы «1С» переименовали или удалили какой-то реквизит из документа СписаниеСРасчетногоСчета (либо перенесли его в другую табличную часть), а правила обмена не обновлялись, то загрузчик попытается записать данные в несуществующее поле.

Рассмотрим по шагам методы отладки и устранения этой ошибки.

Метод 1. Быстрый поиск в XML-файле правил обмена

Самый простой способ локализовать «безымянный» реквизит — открыть сохраненный файл правил обмена (не файл с данными, а именно XML-файл правил) в текстовом редакторе типа Notepad++ или Visual Studio Code.

  1. Откройте файл правил в редакторе.
  2. Нажмите комбинацию клавиш Ctrl + F и запустите поиск строки: Приемник="" или Источник="".
  3. Если вы найдете тег <Свойство>, у которого атрибут Приемник пустой (или отсутствует вовсе, при этом у него нет признака виртуального свойства), обратите внимание на родительский тег ПКО. Так вы поймете, в правилах какого именно объекта закралась ошибка.
  4. Вернитесь в Конвертацию данных 2.1, найдите это ПКО, перейдите на вкладку «Конвертация свойств» и удалите пустую/недозаполненную строку. Пересохраните правила.

Метод 2. Использование режима отладки обработчиков загрузки

Если визуальный поиск в XML не дал результатов, воспользуемся штатным механизмом отладки, встроенным в обработку «Универсальный обмен данными XML»:

  1. Откройте обработку «Универсальный обмен данными XML» в базе-приемнике.
  2. Перейдите на вкладку «Параметры отладки» (в некоторых версиях — «Отладка обработчиков событий»).
  3. Установите флаг «Режим отладки обработчиков загрузки».
  4. Нажмите кнопку «Сформировать модуль отладки». Обработка создаст текстовый файл с кодом всех обработчиков.
  5. Создайте пустую внешнюю обработку в Конфигураторе приемника, скопируйте полученный текст модуля в модуль этой обработки и сохраните ее на диск.
  6. Укажите путь к этой обработке в окне настройки параметров отладки.
  7. Теперь вы можете запустить Конфигуратор базы-приемника в режиме отладки, открыть сохраненный файл внешней обработки, поставить точку останова на строке с ошибкой (в районе строки 7176) и запустить загрузку.
  8. В момент остановки в табло Конфигуратора вычислите переменную, содержащую имя загружаемого свойства (обычно это ИмяРеквизита или Свойство.Приемник). Вы сразу увидите, на каком именно реквизите спотыкается система.

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

← На главную