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