Как исправить ошибку преобразования типа Число и настроить отбор по регистратору в Конвертации данных 2.1?

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

При обмене данными между различными конфигурациями 1С с помощью универсальной обработки V8Exchan82.epf (или ее современных аналогов для КД 2.1) специалисты часто сталкиваются с двумя критическими проблемами. Первая — это несовпадение типов метаданных, например, когда в базе-источнике Код номенклатуры является строкой, а в базе-приемнике — числом. Вторая — ошибка записи в регистры сведений, подчиненные регистратору, с сообщением «Не установлен отбор по регистратору».

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

Проблема 1: Ошибка «Преобразование значения к типу Число не может быть выполнено»

Разберем ситуацию на примере обмена между 1С:ERP и Далион. В типовых решениях, таких как ERP, УТ 11 или БП 3.0, справочник Номенклатура обычно имеет строковый тип кода. Это позволяет использовать префиксы и ведущие нули. В некоторых специализированных или старых конфигурациях (как Далион) тип кода может быть числовым.

Когда обработка обмена пытается записать строку «000000123» или, что хуже, «А000123» в числовое поле, платформа 1С выдает ошибку преобразования. Рассмотрим варианты решения этой проблемы.

Вариант А: Исключение кода из правил обмена

Если для вашей системы не принципиально сохранение идентичности кодов между базами (например, вы синхронизируете объекты по GUID или Артикулу), это самый простой и безопасный способ. Выполним следующие шаги:

  1. Откроем конфигурацию «Конвертация данных 2.1».
  2. Перейдем в ПКО (Правила конвертации объектов) для справочника Номенклатура.
  3. В табличной части ПКС (Правила конвертации свойств) найдем строку, где источником и приемником является Код.
  4. Установим флаг «Отключить» (первая колонка в списке свойств).

В этом случае при загрузке в базу-приемник система автоматически назначит объекту следующий свободный числовой код. Это исключит программные сбои и сохранит целостность данных.

Вариант Б: Программная очистка кода в обработчиках

Если же код необходимо перенести, мы должны гарантировать, что передаваемое значение является «чистым» числом. Для этого в ПКС для свойства Код в обработчике «Перед выгрузкой» можно написать алгоритм очистки:


// Очищаем строку от всех нецифровых символов
ТолькоЦифры = "";
Для Поз = 1 По СтрДлина(Источник.Код) Цикл
    Символ = Сред(Источник.Код, Поз, 1);
    Если Найти("0123456789", Символ) > 0 Тогда
        ТолькоЦифры = ТолькоЦифры + Символ;
    КонецЕсли;
КонецЦикла;

// Если результат не пустой, передаем его
Если ЗначениеЗаполнено(ТолькоЦифры) Тогда
    Значение = Число(ТолькоЦифры);
Иначе
    Отказ = Истина; // Или другое логическое действие
КонецЕсли;

Рассмотрим важный момент: изменение типа кода в самой базе-приемнике (через Конфигуратор) крайне нежелательно. Как отмечают эксперты, это может привести к невозможности обновления конфигурации и сбоям в работе торгового оборудования, которое ожидает от Далиона именно числовые PLU.

Проблема 2: Ошибка «Не установлен отбор по регистратору» при переносе цен

Вторая частая ошибка возникает при попытке переноса данных регистра сведений ЦеныНоменклатуры. В большинстве современных конфигураций этот регистр является подчиненным регистратору (документу Установка цен номенклатуры). Попытка записать набор записей в такой регистр без указания документа-основания приводит к ошибке КодСообщения = 26.

Анализируем причину

Проанализируем ситуацию: регистр сведений в режиме «Подчинение регистратору» не может существовать без ссылки на документ. Когда КД 2.1 пытается выгрузить именно РегистрСведенийЗапись, она создает набор записей. Но для записи этого набора в базе-приемнике должен быть установлен отбор по конкретному регистратору.

Как правильно настроить перенос цен:

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

Рассмотрим пример правильной структуры ПКО для регистра сведений:


// В обработчике "Перед выгрузкой" ПКО регистра сведений
Если Источник.Регистратор = Неопределено Или Источник.Регистратор.Пустая() Тогда
    Отказ = Истина;
КонецЕсли;

Рекомендации по отладке правил

Для того чтобы выяснить, почему преобразование или запись не удается, воспользуемся режимом отладки в обработке Универсальный обмен данными XML:

  1. На вкладке «Дополнительно» установим флаг «Режим отладки обработчиков».
  2. Сгенерируем модуль отладки и сохраним его как внешнюю обработку.
  3. Подключим эту обработку в поле «Имя файла внешней обработки с выгруженными обработчиками».
  4. Теперь мы можем ставить точки останова в конфигураторе 1С и пошагово наблюдать за тем, как меняются значения переменных Источник и Приемник.

Важный итог: При возникновении ошибки преобразования типов всегда проверяйте вкладку «Настройки поиска». Если у вас стоит «Поиск по коду», а типы данных (строка/число) различаются, поиск не сработает, и система будет пытаться создать дубли объектов, что приведет к еще большему хаосу в справочниках. Оптимально использовать поиск по уникальному идентификатору или комбинации полей (например, Наименование + Артикул).

← На главную