Как исправить ошибку "Неверное имя атрибута" при выгрузке Отчета ККМ из 1С:Торговля и склад 7.7 в 1С:Бухгалтерия предприятия 3.0 через Конвертацию данных 2.0?

Программист 1С v7.7 Бухгалтерский учет Торговля и дистрибуция
← На главную

При переносе данных из конфигурации 1С:Торговля и склад 7.7 (ТИС 7.7) в 1С:Бухгалтерия предприятия 3.0 (БП 3.0) с использованием инструмента "Конвертация данных 2.0" (КД 2.0) программисты часто сталкиваются с различными трудностями. Одной из таких распространенных проблем является ошибка "Неверное имя атрибута", возникающая при попытке выгрузки сложных объектов, таких как Отчет ККМ, который в приемнике должен трансформироваться в Отчет о розничных продажах. Давайте подробно разберем, почему возникает эта ошибка и как мы можем ее эффективно устранить.

Ошибка


Значение = Объект.ПолучитьАтрибут(Имя);
{D:\13-12-2021\XMLВЫГРУЗКАДАННЫХВБП300.ERT(11076)}: Неверное имя атрибута
обычно указывает на то, что система конвертации пытается получить доступ к свойству или табличной части исходного объекта (в нашем случае это Отчет ККМ), которое не существует в его метаданных или не является атрибутом в текущем контексте выгрузки. В частности, это часто происходит, когда мы работаем с табличными частями, которые в источнике отсутствуют как таковые или имеют другую структуру, а в приемнике они являются обязательными.

Понимание принципов Конвертации данных 2.0 при работе с табличными частями

КД 2.0 предоставляет мощный механизм для трансформации данных, но для его эффективного использования необходимо глубоко понимать логику работы обработчиков событий и правил конвертации. Когда мы переносим данные между существенно разными конфигурациями, как ТИС 7.7 и БП 3.0, особенно важно уметь программно "создавать" структуры данных в процессе выгрузки.

Правило Конвертации Группы Свойств (ПКГС) и Правило Конвертации Свойств (ПКС) являются ключевыми элементами. ПКГС обычно используется для табличных частей. Если в источнике нет прямой табличной части, соответствующей табличной части приемника (например, табличная часть "Оплата" или "Возвраты" в Отчете о розничных продажах БП 3.0, которая не имеет прямого аналога в Отчете ККМ ТИС 7.7), мы должны сформировать эти данные программно.

  1. Обработчик ПередОбработкой в ПКГС: Это самый подходящий обработчик для формирования табличных частей, которых нет в источнике. В нем мы можем создать объект типа ТаблицаЗначений, который КД будет воспринимать как коллекцию строк для табличной части приемника. Эта коллекция должна содержать колонки, имена которых соответствуют реквизитам табличной части в приемнике.

    Рассмотрим пример формирования табличной части "Оплата" для Отчета о розничных продажах. В ТИС 7.7 Отчет ККМ может содержать общие суммы наличной и безналичной оплаты, но не иметь детализации по видам оплаты в виде отдельной табличной части. В БП 3.0 же требуется табличная часть "Оплата" с полями, например, "ВидОплаты" и "СуммаОплаты".

    В обработчике ПКГС_ПередОбработкойВыгрузки_ОтчетОРозничныхПродажах_Оплата_ТабличнаяЧасть мы можем сделать следующее:

    
    КоллекцияОбъектов = СоздатьОбъект("ТаблицаЗначений");
    КоллекцияОбъектов.УдалитьСтроки(); // Очищаем на всякий случай
    КоллекцияОбъектов.НоваяКолонка("ВидОплаты");
    КоллекцияОбъектов.НоваяКолонка("СуммаОплаты", "Число", 15, 2);
    
    // Добавляем строку для безналичной оплаты, если есть сумма
    Если Источник.СуммаБезНал > 0 Тогда
        КоллекцияОбъектов.НоваяСтрока();
        КоллекцияОбъектов.ВидОплаты = "Сбер"; // Пример: указываем наименование вида оплаты
        КоллекцияОбъектов.СуммаОплаты = Источник.СуммаБезНал;
    КонецЕсли;
    
    // Аналогично можно добавить строку для наличной оплаты
    // Если Источник.СуммаНал > 0 Тогда
    //     КоллекцияОбъектов.НоваяСтрока();
    //     КоллекцияОбъектов.ВидОплаты = "Наличные";
    //     КоллекцияОбъектов.СуммаОплаты = Источник.СуммаНал;
    // КонецЕсли;
    
    // Здесь же можно установить Отказ = 1, если коллекция должна быть пустой
    // Например, если нет никаких оплат
    // Если КоллекцияОбъектов.КоличествоСтрок() = 0 Тогда
    //     Отказ = 1;
    // КонецЕсли;
    

    Обратите внимание, что мы создаем колонки с именами, соответствующими реквизитам табличной части "Оплата" в БП 3.0. Таким образом, мы "обманываем" КД, предоставляя ей готовую таблицу значений, которую она будет обрабатывать как обычную табличную часть.

  2. Обработчик ПередВыгрузкой в ПКС: Этот обработчик используется для подготовки значения отдельного свойства перед его выгрузкой. Например, для реквизита "СуммаОплаты" в табличной части "Оплата" мы можем напрямую передать значение из источника, либо из ранее сформированной КоллекцияОбъектов.

    Пример обработчика ПКС_ПередВыгрузкой_ОтчетОРозничныхПродажах_Оплата_СуммаОплаты_Реквизит:

    
    Функция ПКС_ПередВыгрузкой_ОтчетОРозничныхПродажах_Оплата_СуммаОплаты_Реквизит26(
                Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКС, НомерПКО, ОбъектКоллекции, Значение, ТипПриемника, ИмяПКО, ИмяПКОВидСубконто, Пусто, Выражение, НеЗамещать, УзелКоллекцииСвойств)
        Отказ = 0;
        Попытка
            Значение = ОбъектКоллекции.СуммаОплаты; // Берем значение из сформированной нами коллекции
        Исключение
            Сообщить("Ошибка исполнения обработчика: ПКС_ПередВыгрузкой_ОтчетОРозничныхПродажах_Оплата_СуммаОплаты_Реквизит26", "!!!");
            Сообщить("  - " + ОписаниеОшибки());
            ЗафиксироватьОшибку("Ошибка исполнения обработчика: ПКС_ПередВыгрузкой_ОтчетОРозничныхПродажах_Оплата_СуммаОплаты_Реквизит26" + ": " + ОписаниеОшибки());
        КонецПопытки;
        Возврат Отказ;
    КонецФункции 
    

    Здесь ОбъектКоллекции представляет собой текущую строку из нашей ТаблицыЗначений, сформированной в ПередОбработкой ПКГС.

Работа со ссылочными типами данных в табличных частях (ВидыОплатОрганизаций, Номенклатура)

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

  1. Создание ПКО для ссылочного справочника: Для каждого ссылочного типа, который мы передаем (например, "ВидыОплатОрганизаций", "Номенклатура"), мы должны создать отдельное ПКО. Например, для "ВидыОплатОрганизаций" создадим ПКО с источником "Пусто" (или соответствующим справочником, если он существует в ТИС 7.7) и приемником "Справочник.ВидыОплатОрганизаций".

    В этом ПКО мы должны указать правила для поиска существующих элементов или создания новых. Чаще всего поиск осуществляется по наименованию или коду.

    В ПКО "ВидыОплатОрганизаций" создаем ПКС для свойства "Наименование" и устанавливаем для него галку "Поиск". В обработчике ПКС_ПередЗагрузкой_ВидыОплатОрганизаций_Наименование мы можем явно указать значение, по которому будет производиться поиск:

    
    Функция ПКС_ПередЗагрузкой_ВидыОплатОрганизаций_Наименование(
        Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКС, НомерПКО, ОбъектКоллекции, Значение, ТипПриемника, ИмяПКО, ИмяПКОВидСубконто, Пусто, Выражение, НеЗамещать, УзелКоллекцииСвойств)
        Отказ = 0;
        Попытка
            // Здесь Источник будет являться строкой, которую мы передали из КоллекцияОбъектов
            Значение = Источник; 
        Исключение
            // Обработка ошибок
        КонецПопытки;
        Возврат Отказ;
    КонецФункции
    

    Также важно, чтобы в настройках ПКО "ВидыОплатОрганизаций" был установлен флаг "Продолжать поиск по полям поиска". Это позволит системе сначала попытаться найти объект по внутреннему идентификатору, а затем, если он не найден, по указанным полям поиска (в нашем случае, по наименованию).

  2. Передача значения в КоллекциюОбъектов: В обработчике ПередОбработкой ПКГС, где мы формируем КоллекцияОбъектов, мы можем просто присвоить текстовое наименование вида оплаты колонке "ВидОплаты":

    
    КоллекцияОбъектов.ВидОплаты = "Сбер"; // Или любое другое наименование вида оплаты
    

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

Обработка табличной части "Возвраты"

Аналогичный подход мы применяем и для табличной части "Возвраты". Если в Отчете ККМ ТИС 7.7 нет прямой табличной части для возвратов товаров, мы должны ее сформировать программно в обработчике ПередОбработкой соответствующего ПКГС.

  1. Формирование КоллекцияОбъектов для "Возвратов":

    Мы собираем данные о возвратах из документов "ВозвратОтПокупателя" или регистров ТИС 7.7 за определенный период и заносим их в новую ТаблицуЗначений. Важно, чтобы имена колонок этой таблицы совпадали с реквизитами табличной части "Возвраты" в Отчете о розничных продажах БП 3.0 (например, "Номенклатура", "Количество", "Цена", "Сумма", "СтавкаНДС", "СуммаНДС", "Единица").

    
    // Примерный код для ПКГС_ПередОбработкойВыгрузки_ОтчетОРозничныхПродажах_Возвраты_ТабличнаяЧасть:
    КоллекцияОбъектов = СоздатьОбъект("ТаблицаЗначений");
    КоллекцияОбъектов.НоваяКолонка("Номенклатура");
    КоллекцияОбъектов.НоваяКолонка("Количество", "Число", 15, 3);
    КоллекцияОбъектов.НоваяКолонка("Единица");
    КоллекцияОбъектов.НоваяКолонка("Цена", "Число", 15, 2);
    КоллекцияОбъектов.НоваяКолонка("Сумма", "Число", 15, 2);
    КоллекцияОбъектов.НоваяКолонка("СтавкаНДС");
    КоллекцияОбъектов.НоваяКолонка("СуммаНДС", "Число", 15, 2);
    
    // Инициализация регистра для получения движений
    Рег = СоздатьОбъект("Регистр.Продажи"); // Или любой другой подходящий регистр в ТИС 7.7
    
    // Пример получения данных из документов ВозвратОтПокупателя за тот же день, что и Отчет ККМ
    Док = СоздатьОбъект("Документ.ВозвратОтПокупателя");
    Док.ВыбратьДокументы(Источник.ДатаДок, Источник.ДатаДок);
    
    Пока Док.ПолучитьДокумент() = 1 Цикл
        Если Док.Проведен() = 0 Тогда Продолжить; КонецЕсли;
        Если Док.Фирма <> Источник.Фирма Тогда Продолжить; КонецЕсли;
        Если Док.Склад <> Источник.Склад Тогда Продолжить; КонецЕсли;
    
        // Выбираем движения документа по номенклатуре
        Рег.ВыбратьДвиженияДокумента(Док);
        Пока Рег.ПолучитьДвижение() = 1 Цикл
            КоллекцияОбъектов.НоваяСтрока();
            КоллекцияОбъектов.Номенклатура = Рег.Номенклатура; // Ссылка на объект Номенклатура
            КоллекцияОбъектов.Количество = Рег.Количество;
            КоллекцияОбъектов.Единица = Рег.Номенклатура.БазоваяЕдиница; // Ссылка на объект Единица измерения
            КоллекцияОбъектов.Цена = Рег.ПродСтоимость / Рег.Количество;
            КоллекцияОбъектов.Сумма = Рег.ПродСтоимость;
            КоллекцияОбъектов.СтавкаНДС = Перечисление.СтавкиНДС.БезНДС; // Пример: если ИП на УСН
            КоллекцияОбъектов.СуммаНДС = 0;
        КонецЦикла;
    КонецЦикла;
    
    // Свертка строк для агрегации по одинаковым позициям
    КоллекцияОбъектов.Свернуть("Номенклатура, Единица, Цена, СтавкаНДС", "Количество, Сумма, СуммаНДС");
    
    // Установка Отказ = 1, если нет возвратов
    Если КоллекцияОбъектов.КоличествоСтрок() = 0 Тогда
        Отказ = 1;
    КонецЕсли;
    

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

  2. Правильное сопоставление ПКС: Для каждого реквизита табличной части "Возвраты" (Номенклатура, Количество, Цена и т.д.) необходимо создать соответствующее ПКС в ПКГС "Возвраты".

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

Отладка и полезные советы

Отладка правил обмена в 1С 7.7 может быть достаточно сложной. Вот несколько советов, которые помогут нам в этом процессе:

  1. Использование Сообщить() в 1С 7.7: Функция Сообщить() является нашим надежным помощником для вывода значений переменных и отслеживания хода выполнения кода в 1С 7.7. Активно используйте ее в обработчиках, чтобы понимать, какие данные передаются и какие ошибки возникают. Например: Сообщить("Имя атрибута: " + Имя);

  2. Понимание Шаблон[]: В 1С 7.7 конструкция Шаблон[] используется для вычисления выражения, содержащегося в квадратных скобках. Это означает, что она может вызывать функции, но не процедуры. Поэтому все наши обработчики событий, которые вызываются через механизм шаблонов, должны быть оформлены как функции.

  3. Актуальность метаданных: Всегда следите за актуальностью описаний метаданных конфигураций источника и приемника в конфигурации "Конвертация данных". Любые изменения в структуре объектов могут привести к неработоспособности правил.

  4. Порядок выгрузки: Убедитесь, что зависимые объекты выгружаются в правильном порядке. Например, справочники (номенклатура, контрагенты, организации) должны быть выгружены до документов, которые на них ссылаются.

  5. Тестирование по частям: При возникновении ошибок старайтесь изолировать проблему. Начните с выгрузки простых объектов, затем переходите к более сложным, таким как табличные части.

  6. Обработчик ПослеЗагрузки: Хотя мы стараемся максимально заполнять данные в процессе выгрузки, в некоторых случаях ПослеЗагрузки может быть полезен. Однако, как показал опыт, для заполнения ссылочных объектов в табличных частях предпочтительнее использовать механизмы ПКО/ПКС с поиском по наименованию или коду, нежели пытаться заполнить их после загрузки документа.

Перенос остатков из ТИС 7.7 в БП 3.0

Отдельно стоит упомянуть вопрос переноса начальных остатков из ТИС 7.7 в БП 3.0. Это вполне осуществимо с помощью КД 2.0. Обычно это делается через документы "Ввод начальных остатков" в БП 3.0. Мы можем создать Правила Выгрузки Данных (ПВД) с произвольным алгоритмом выборки, который будет собирать данные об остатках из регистров ТИС 7.7 (например, остатки товаров, взаиморасчеты) и формировать их в ТаблицуЗначений. Эта таблица значений затем будет использована для заполнения табличных частей документов "Ввод начальных остатков" в БП 3.0, по аналогии с тем, как мы работали с Отчетом ККМ.

Заключение

Работа с "Конвертацией данных 2.0" требует внимательности и глубокого понимания внутренних механизмов. Ошибка "Неверное имя атрибута" при выгрузке Отчета ККМ является типичным примером, когда отсутствие прямой табличной части в источнике требует программного формирования данных. Используя обработчик ПередОбработкой ПКГС для создания КоллекцияОбъектов и правильно настраивая ПКО для ссылочных объектов, мы можем успешно преодолеть подобные сложности и обеспечить корректный перенос данных.

← На главную