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

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

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

Суть проблемы и анализ ошибки

Типичная ситуация: в правиле конвертации свойств (ПКС) необходимо принудительно установить определенное значение перечисления, если в источнике оно не заполнено. Программист пишет в обработчике Перед выгрузкой следующий код:


Если не ЗначениеЗаполнено(Источник.ТипНоменклатуры) Тогда
    Значение = "Товар"; // Попытка установить строковое значение
КонецЕсли;

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

Решение №1: Очистка поля «Тип источника»

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

Пошаговый алгоритм действий:

  1. Откройте настройки нужного ПКС в конфигурации «Конвертация данных».
  2. Найдите поле «Тип источника».
  3. Очистите это поле (оно должно стать пустым).
  4. Убедитесь, что поле «Тип приемника» заполнено корректно (ссылка на соответствующее перечисление в базе-приемнике).
  5. В обработчике Перед выгрузкой оставьте код присвоения строкового идентификатора: Значение = "Товар";.

При такой настройке система воспримет строку "Товар" как идентификатор значения перечисления в приемнике и успешно выполнит сопоставление.

Решение №2: Использование ссылочного значения (полный путь)

Если вы не хотите очищать тип источника или логика обмена предполагает работу только с метаданными текущей базы, можно использовать прямое обращение к перечислению конфигурации-источника. Рассмотрим пример кода:


Если не ЗначениеЗаполнено(Источник.ТипНоменклатуры) Тогда
    Значение = Перечисления.ТипыНоменклатуры.Товар; 
КонецЕсли;

Важные нюансы этого метода:

Решение №3: Настройка таблицы соответствий в ПКО

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

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

Проанализируем ситуацию: если вы передаете строковый литерал, система ищет его среди исходных значений. Если в таблице соответствий источником указано не строковое значение, а реальная ссылка на перечисление из метаданных, поиск по строке "Товар" может не дать результата.

Дополнительные советы по работе с перечислениями

Разберем еще несколько важных моментов, которые помогут избежать ошибок при программной установке значений:

1. Регистр символов и пробелы. Строковое значение "Товар" и "товар" для системы могут быть разными вещами. Всегда проверяйте соответствие имени значения перечисления в метаданных приемника. Также убедитесь в отсутствии лишних пробелов в начале или конце строки.

2. Использование «Фиксированного значения». Если вам нужно, чтобы значение устанавливалось всегда (без условий типа Если...), лучше не писать код, а воспользоваться штатным механизмом ПКС. Установите галочку «Фиксированное значение» и выберите нужный элемент из списка перечисления базы-приемника. Это самый надежный способ, минимизирующий риск ошибок в коде.

3. Использование переменной Отказ. В обработчике Перед выгрузкой вы можете не только устанавливать значение, но и полностью отменять выгрузку конкретного свойства, если данные не соответствуют условиям:


Если Источник.ТипНоменклатуры.Пустая() Тогда
    // Если мы не можем определить тип, лучше вообще не выгружать это свойство
    Отказ = Истина;
Иначе
    Значение = Источник.ТипНоменклатуры;
КонецЕсли;

4. Приоритет обработчиков. Помните, что значение, установленное в обработчике Перед выгрузкой, является приоритетным. Оно перекрывает то значение, которое система могла бы получить автоматически из объекта-источника. Однако это работает только тогда, когда вы правильно подготовили настройки типизации в ПКС, о чем мы говорили в первом решении.

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

← На главную