При переносе данных из устаревших конфигураций 1С 7.7 (например, «Торговля и Склад 7.7») в современные базы 1С 8.3 («Управление торговлей 11») разработчики часто сталкиваются с изменением структуры хранения данных. Типичный пример: в 7.7 реквизит КодПоставщика хранился как обычная строка в справочнике Номенклатура, а в УТ 11 для бренда или марки используется отдельный справочник Марки (или Бренды), ссылка на который проставляется в карточке номенклатуры.
Разберем по шагам, как правильно настроить правила конвертации объектов (ПКО) и свойств (ПКС) в КД 2.1 для такой передачи, а также проанализируем ошибки, которые могут возникнуть при выгрузке и загрузке данных.
Так как в источнике (1С 7.7) отдельного справочника марок нет, а в приемнике (УТ 11) элемент должен быть найден или создан, создадим специальное правило конвертации объектов:
СправочникСсылка.Марки.Наименование (Источник — пусто, Приемник — Наименование) и устанавливаем у него флаг «Поиск».Теперь перейдем в ПКО Номенклатура и настроим передачу строки КодПоставщика в реквизит Марка:
Марка.КодПоставщика).Марка.Марки.Важный нюанс синтаксиса 1С 7.7: В платформе 7.7 отсутствует объект Структура и конструктор Новый. Формирование передаваемых данных на стороне 7.7 выполняется через объект СписокЗначений или прямое присвоение строкового значения переменной Значение с обрезанием концевых пробелов методом СокрЛП().
Рассмотрим два корректных варианта кода обработчика «Перед выгрузкой» в ПКС:
Вариант A (присвоение через переменную Значение):
Значение = СокрЛП(Источник.КодПоставщика);
Если ПустаяСтрока(Значение) = 1 Тогда
Отказ = 1;
КонецЕсли;
Вариант Б (передача через ИсходящиеДанные):
ИсходящиеДанные = СоздатьОбъект("СписокЗначений");
ИсходящиеДанные.ДобавитьЗначение(СокрЛП(Источник.КодПоставщика), "Наименование");
Проанализируем частую проблему при работе с выгрузкой из 1С 7.7. При запуск обработки выгрузки платформа может выдать ошибку:
Функция не обнаружена (ПКС_ПередВыгрузкой_Номенклатура_Марка_...)
Выясним причину: В отличие от 1С 8, где алгоритмы выгрузки могут исполняться динамически, обработка выгрузки из 7.7 (V77EXP.ERT) содержит компилируемый модуль. При изменении или добавлении кода в обработчиках КД 2.1 генерирует новый текст модуля выгрузки.
Решение: После внесения любых изменений в обработчики событий правил конвертации необходимо заново скопировать сгенерированный текст модуля из Конвертации Данных и вставить его в модуль формы/объекта обработки выгрузки V77EXP.ERT в Конфигураторе 7.7 (либо перегрузить правила с автоматической заменой модуля обработки).
При загрузке данных в 1С 8.3 УТ 11 может возникнуть ошибка следующего вида:
Ошибка при вызове метода контекста (Выполнить): Нельзя сравнивать поля неограниченной длины и поля несовместимых типов. ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ...
Выясним причину: При поиске существующего объекта универсальная обработка загрузки формирует динамический запрос к базе приемника. Ошибка возникает в том случае, если в ПКО случайно установлен флажок «Поиск» у реквизитов с типом Строка неограниченной длины (например, «Описание», «Комментарий») или у сложного составного типа/табличной части (например, «Дополнительные реквизиты»). База данных SQL не позволяет выполнять прямое сравнение на равенство в секции ГДЕ для неограниченных строк.
Решение: Проверим все ПКС в ПКО Номенклатура и ПКО Марки. Убедимся, что флаг «Поиск» стоит исключительно на индексируемых полях ограниченной длины (например, Код, Артикул, Наименование).
Для успешного переноса строки из 1С 7.7 в объект-ссылку 1С 8.3 требуется:
СокрЛП, СоздатьОбъект("СписокЗначений")) в обработчиках.V77EXP.ERT после любых изменений в коде обработчиков.