Заметки по Конвертации данных 2.1

07.11.23

Интеграция - Перенос данных 1C

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

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

Ни в руководствах по КД 2.1, ни в курсах по этой конфигурации я не увидел решений описанных проблем. Такое ощущение, что либо авторы в своей практике сталкивались только с какими-то простыми сценариями, либо сознательно обошли эти проблемы, чтобы не "усложнять" свои руководства/курсы или же просто не отвечать на неудобные вопросы.

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

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

Но их авторам сердечная благодарность от меня и, надеюсь, от всех, кто найдёт эту статью полезной для себя.


Оглавление


Заметки

Отличия между Универсальным обменом в формате XML и онлайн-обменом

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

Это связано с тем, что для онлайн-обмена:

  • используется другая обработка, Конвертация объектов информационных баз, которая интерпретирует правила по-другому;
  • "привязка" объектов базы-источника и базы-приёмника друг к другу в обеих базах для ускорения поиска при обмене записывается в регистр сведений Соответствия объектов информационных баз.

Самой частой причиной ошибок правил обмена, казалось бы, правильно работающих в обработке Универсальный обмен в формате XML, при использовании их в онлайн-обмене в моей практике было использование для конвертации в ссылочные объекты базы-приёмника не ссылочных объектов базы-источника, а неких коллекций значений: структур, строк таблицы значений, выборки и т.д.
Обработка Конвертация объектов информационных баз ожидает наличие поля Ссылка с соответствующим типом и, в случае его отсутствия или несоответствия типа, выдаёт ошибки.
То есть если в базе-приёмнике на основании каких-то данных базы-источника создаётся ссылочный объект, то ему должен соответствовать какой-то ссылочный объект базы-источника. При этом крайне желательно, чтобы этот ссылочный объект был уникальным: обработка не помешает подставить одну и ту же ссылку базы-источника для разных объектов базы-приёмника, но при поиске соответствий объектов в итоге могут возникнуть проблемы.

Поэтому нужно взять за правило: один ссылочный объект базы-приёмника = один ссылочный объект базы-источника.

Это не обязательно должен быть полностью заполненный объект, можно ограничиться заполнением только обязательных полей.

А документы не обязательно проводить — управлять проведением соответствующих объектов базы-приёмника можно при загрузке.

Например, в моей практике для нескольких обменов возникала потребность передавать документы установки цен и ввода остатков. В базе-источнике они как таковые не нужны, но из-за описанной особенности онлайн-обмена их пришлось создавать с минимальным заполнением и без проведения — просто чтобы была уникальная ссылка для привязки к объекту базы-приёмника.

По этой же причине мне пока так и не удалось настроить онлайн-обмен данными номенклатуры контрагентов: в старых конфигурациях типа КА 1.1 и УПП 1.3 это регистр сведений, а в новых типа УТ 11 — это справочник, соответственно, требующий ссылки базы-источника при конвертации.
В целом, это не такая важная задача, но если у кого-то из читателей этой статьи есть примеры её решения, прошу поделиться опытом.

Использование алгоритмов

Использование алгоритмов позволяет декомпозировать код обработчиков и, таким образом, уменьшать его когнитивную сложность.

Но, к сожалению, при использовании алгоритмов проявляется недостаток исполнения кода обработчиков правил обмена с помощью платформенной функции Выполнить (код обработчиков исполняется именно с помощью неё, если кто-то не в курсе):

  • Если весь код находится в обработчике, т.е. его части не выделены в отдельные алгоритмы, то по сообщению ошибки ПозицияМодуля = <Неизвестный модуль>({номер строки}) можно понять, в какой строке кода обработчика возникла ошибка, т.к. Неизвестный модуль в этом случае — это код обработчика.
  • Если ошибка возникла в алгоритме, то отладка может значительно усложниться, т.к. может быть непонятно, о каком "неизвестном модуле" идёт речь. В лучшем случае можно будет понять, в каком именно алгоритме возникла ошибка, а дальше уже придётся пользоваться  отладкой - через обработки, мысленно или "по классике" с помощью С оо бщитьили  ЗаписьЖурналаРегистрации.

В общем, нужно правильно оценивать преимущества и недостатки использования алгоритмов, и в каждом случае принимать взвешенное решение по этому поводу.

А если решение принято в пользу алгоритмов, нужно быть осторожными в выборе имён переменных внутри алгоритмов, чтобы они не затирали глобальные переменные (Пар  а метры,  Отк аз, П КО, ОбъектНа йден и т.д.). Впроч ем, эта рекомендация точно так же относится и к код у обработчиков, но там о глобальных переменных в случае чего может напомнить справка по обработчикам — в алгоритмах таких напоминаний нет.

Указание ПКО в ПКС

Тут правило простое:

  • Если значение (Источник[Имя поля] или глобальная для обработчика переменная Знач ение) равно ссылочному объекту базы-источника, которому должен соответствовать некий ссылочный объект базы-приёмника, то ПКО нужно указывать.
  • Если значение равно значению примитивного типа данных, то ПКО не нужно указывать. Это же касается случаев, когда значению присваивается некое строковое представление значения перечисления или предопределённого элемента справочника или плана вида характеристик базы-приёмника.

Примеры:

  1. В обработчике Перед выгрузкой ПКС без источника с приёмником ЕдиницаИзмерения (тип СправочникСсылка.КлассификаторЕдиницИзмерения) ПКО Номенклатура указан такой код:
    Если Не Источник.ЭтоГруппа Тогда
        Значение = Источник.ЕдиницаХраненияОстатков.ЕдиницаПоКлассификатору;
    КонецЕсли;

    В этом случае указание ПКО нужно, чтобы ссылочный объект Источник.ЕдиницаХраненияОстатков.ЕдиницаПоКлассификатору мог правильно конвертироваться в объект базы-приёмника.
    Ну и разумеется, так обращаться к полям не стоит. Про неявное соединение таблиц в приведённом примере я здесь писать не буду, об этом хорошо расписано в стандарте Чтение отдельных реквизитов объекта из базы данных.

  2. В Обработчике Перед выгрузкой ПКС без источника с приёмником Статус (тип ПеречислениеСсылка.СтатусыУстановокЦенНоменклатуры) ПКО УстановкаЦенНоменклатуры указан такой код:
    Значение = "Согласован";

    В этом случае указание ПКО не нужно, нужное значение перечисления в базе-приёмнике будет найдено по указанному строковому значению.

 

Версионирование правил

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

Например, если потребовалось доработать правила под новые требования заказчика, но после загрузки обновлённых правил в план обмена выявились ошибки.

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

Поскольку в конфигурации Конвертация данных 2.1 отсутствует механизм версионирования, каждый разработчик, подозреваю, так или иначе приходит к какому-то варианту хранения разных версий правил. Если разработчик не использует в своей работе Git, но при этом достаточно сознательный, то с большой долей вероятности это будут файлы с меткой даты и времени.

По моему опыту, удобнее всего организовать хранение правил именно с помощью удалённого репозитория Git, т.к. это позволяет:

  • Подстраховаться на случай потери локальных данных или базы Конвертации (если, конечно, ваш сервер Git не находится на локальной машине или на одной машине с базой Конвертации).
  • Легко видеть изменения правил между версиями. Очевидно, что для этого нужно сохранять файлы правил без сжатия.

Если в вашей инфраструктуре уже есть виртуальные машины, не составит труда развернуть ещё одну или использовать имеющуюся для Git.

Чтобы не выделять много ресурсов на отдельную машину с Git, можно поставить что-нибудь достаточно легковесное типа Gitea.

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


Ошибки

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

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

В моих примерах в качестве базы-источника выступала база с конфигурацией Комплексная автоматизация 1.1, а в качестве базы-приёмника — база с конфигурацией Управление торговлей 11.5.

Если в тексте встречается некое значение в фигурных скобках, например, {Имя значения перечисления}, это значит, что вместо него в действительности должно быть какое-то другое значение.

 

На стороне базы-источника

Поле объекта не обнаружено (Ссылка)

Текст ошибки:

Ошибка в обработчике события ПослеВыгрузкиДанных (конвертация)
    Обработчик             =  ПослеВыгрузкиДанных (конвертация)
    ОписаниеОшибки         =  Поле объекта не обнаружено (Ссылка)
    ПозицияМодуля          =  Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(11286)
    КСообщенияОбОшибках    =  63

Причина:

В базе-источнике нет ссылочного объекта, соответствующего ссылочному объекту в базе-приёмнике.
См. раздел Отличия между Универсальным обменом в формате XML и онлайн-обменом.

Ошибка проявляется при использовании процедуры ВыгрузитьПоПравилу в правилах для онлайн-обмена.
При выгрузке данных через обработку Универсальный обмен в формате XML такой проблемы нет.

Решение:

Переписать правила конвертации таким образом, чтобы в качестве источника передавался ссылочный объект метаданных.

Крайне желательно, чтобы он был уникальным, как это описано выше в разделе Отличия между Универсальным обменом в формате XML и онлайн-обменом.

Тип не определен

Текст ошибки:

Тип не определен
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(8330)}:   СтруктураСвойств = Менеджеры[Тип(ТипИсточника)];
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(13378)}:          ПоследнийОбъектЗагрузки = ПрочитатьИнформациюОРегистрацииОбъекта();
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(844)}:            ПроизвестиЧтениеДанных(ЧтениеСообщения);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(3641)}:          ОбработкаОбменаДаннымиXML.ВыполнитьЗагрузкуДанных();
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(3297)}:          ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, СообщениеОбмена,, ТолькоПараметры);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(2802)}:  ВыполнитьОбменДаннымиЧерезФайловыйРесурс(СтруктураНастроекОбмена, ТолькоПараметры);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(1801)}:          ВыполнитьДействиеОбменаДляУзлаИнформационнойБазы(Отказ,
{Обработка.ВыполнениеОбменаДанными.Форма.Форма.Форма(564)}: ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(

Причина:

Проявляется при онлайн-обмене.

Связана с ошибкой Поле объекта не обнаружено (Ссылка) следующим образом:

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

Решение:

См. решение в разделе Поле объекта не обнаружено (Ссылка).

Значение не является значением объектного типа (УникальныйИдентификатор)

Текст ошибки:

Ошибка в обработчике события ПослеВыгрузкиДанных (конвертация)
    Обработчик             =  ПослеВыгрузкиДанных (конвертация)
    ОписаниеОшибки         =  Значение не является значением объектного типа (УникальныйИдентификатор)
    ПозицияМодуля          =  Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(10862)
    КСообщенияОбОшибках    =  63

Причина:

Проявляется при онлайн-обмене.

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

Ни УникальныйИдентификатор, ни СправочникОбъект или ДокументОбъект в этом случае не подходит, нужен именно СправочникСсылка или ДокументыСсылка (ну или какие там ещё ссылочные типы допустимы).

Решение:

См. решение в разделе Поле объекта не обнаружено (Ссылка).

Поле объекта не обнаружено ({Имя реквизита объекта})

Текст ошибки:

ВНЕШНЕЕ СОЕДИНЕНИЕ: Поле объекта не обнаружено ({Имя поля})
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(10419)}:ИначеЕсли НЕ ЭтоПараметрДляОбъекта
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(16640)}:ПоследнийОбъектЗагрузки = ПрочитатьОбъект();
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(2759)}:ПроизвестиЧтениеДанныхВРежимеВнешнегоСоединения(ЧтениеСообщения);

{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(3245)}:           ВызватьИсключение СтрокаСообщения;
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(2209)}:           ЗаписатьВФайл(Приемник);
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(11533)}:  ВыгрузитьПоПравилу(Объект, , ВходящиеДанные, ИсходящиеДанные, ИмяПКО, УзелСсылки, , , НЕ НеВыгружатьОбъектыСвойствПоСсылкам,
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(15022)}:          ВыгрузкаОбъектаВыборки(Данные, ПравилоВыгрузкиДанных, , ИсходящиеДанные, НеВыгружатьОбъектыПоСсылкам);
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(14671)}:      ВыполнитьВыгрузкуЗарегистрированныхДанных(ЗаписьСообщения, СтрокаСообщенияОбОшибке, ТаблицаПравилВыгрузкиИспользуемые);
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(743)}:        ВыполнитьВыгрузку();
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(3233)}:      ОбработкаОбменаДаннымиXML.ВыполнитьВыгрузкуДанных(ОбработкаДляЗагрузкиДанных);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(1757)}:          ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыПоВнешнемуСоединению(Отказ,
{Обработка.ВыполнениеОбменаДанными.Форма.Форма.Форма(588)}: ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(

Причина:

Может проявляться при любых видах обмена.

В моей практике такое происходило после удаления реквизита объекта метаданных в конфигурации базы-приёмника.

В частности, в одном из обновлений УТ 11.5 из справочника Номенклатура удалили реквизит Комментарий, а соответствующее правило конвертации свойств осталось неизменным, и КД 2.1 ничего не сообщила об отсутствующем реквизите справочника после обновления метаданных конфигурации УТ 11.5.

Решение:

Обновить метаданные конфигурации, поле объекта метаданных которой не обнаружено.

Поле объекта не обнаружено ({Имя значения перечисления})

Текст ошибки:

ВНЕШНЕЕ СОЕДИНЕНИЕ: Поле объекта не обнаружено ({Имя значения перечисления})
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(3795)}:Возврат Менеджер[Значение];
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(3893)}:Возврат одНайтиОбъектПоСвойству(Свойства.Менеджер, Свойство, Стр);
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(4415)}:Возврат одПолучитьЗначениеПоСтроке(Значение, Тип, ИскатьПоСвойству);
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(7795)}:Значение         = одЗначениеЭлемента(ФайлОбмена, Тип, ИскатьПоСвойству, Ложь);
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(10433)}:Значение    = ПрочитатьСвойство(ТипСвойства,,, ИмяПКО);
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(16640)}:ПоследнийОбъектЗагрузки = ПрочитатьОбъект();
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(2759)}:ПроизвестиЧтениеДанныхВРежимеВнешнегоСоединения(ЧтениеСообщения);

Причина:

Проявляется при онлайн-обмене.

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

На конкретном примере:

  • Для конвертации контрагентов КА 1.1 в партнёров и контрагентов УТ 11.5 разработаны ПКО Партнеры и Контрагенты.
  • Тип ПеречислениеСсылка.ЮрФизЛицо КА 1.1 использовался в трёх ПКО для конвертации в типы УТ 11.5:
    • ПеречислениеСсылка.ЮрФизЛицо
    • ПеречислениеСсылка.ЮридическоеФизическоеЛицо
    • ПеречислениеСсылка.КомпанияЧастноеЛицо
  • При конвертации через онлайн-обмен в реквизит ЮрФизЛицо подставлялось значение ЮридическоеЛицо типа ПеречислениеСсылка.ЮридическоеФизическоеЛицо вместо значения ЮрЛицо типа ПеречислениеСсылка.ЮрФизЛицо, в итоге возникала описанная ошибка, хотя при выгрузке через универсальный обмен никаких ошибок не было.

Решение:

Чтобы такого не происходило, желательно иметь лишь по одному ПКО, где объект конфигурации-источника выступает источником данных.

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

Если (Источник.ЮрФизлицо = Перечисления.ЮрФизлицо.ЮрЛицо) Тогда
    Значение = "Компания";
Иначе
    Значение = "ЧастноеЛицо";
КонецЕсли;

Ни источник, ни правило при этом в ПКС указывать не нужно.

Не исключаю, что можно решить и другим способом, для меня работал описанный выше.

Ошибка инициализации модуля

Текст ошибки:

Ошибка при вызове метода контекста (ВнешнееСоединениеПередЗагрузкойДанных)
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(710)}:    ОбработкаДляЗагрузкиДанных().ВнешнееСоединениеПередЗагрузкойДанных();
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(3233)}:    ОбработкаОбменаДаннымиXML.ВыполнитьВыгрузкуДанных(ОбработкаДляЗагрузкиДанных);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(1757)}:      ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыПоВнешнемуСоединению(Отказ,
{Обработка.ВыполнениеОбменаДанными.Форма.Форма.Форма(588)}:  ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(
{Обработка.ВыполнениеОбменаДанными.Форма.Форма.Форма(576)}:  ОбычнаяВыгрузкаДанных_ОбработкаДлительнойОперации(Отказ, УзелИнформационнойБазы, ВидТранспортаСообщений);
{(1)}:Подключаемый_ОбычнаяВыгрузкаДанных_ОбработкаДлительнойОперации(Отказ, ПерейтиДалее)
{Обработка.ВыполнениеОбменаДанными.Форма.Форма.Форма(381)}:    А = Вычислить(ИмяПроцедуры);
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.3.22.1851): Ошибка инициализации модуля: {Имя расширения} {Имя объекта метаданных}.МодульМенеджера
{{Имя расширения} {Имя объекта метаданных}.МодульМенеджера(11,16)}: Процедура или функция с указанным именем не определена ({Имя процедуры или функции})

Причина:

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

Подробности описаны здесь: https://its.1c.ru/db/v8std#content:680:hdoc

В моей практике такая ситуация возникла, когда в базе-приёмнике из модуля расширенного типового объекта конфигурации вызывался модуль менеджера объекта, добавленного в стороннем расширении, разработчики которого не рассчитывали, что вызов возможен из внешнего соединения.
Кроме того, у одной из функций модуля зачем-то была установлена директива компиляции &НаСервере (в модуле менеджера), которая также частично была ответственна за ошибку.

Решение:

Описано по ссылке выше — обрамить код модуля инструкцией препроцессора.

#Если Сервер Или ВнешнееСоединение Тогда

// Здесь код модуля

#КонецЕсли

Также удалить директивы компиляции, если есть: в моём случае одних инструкций препроцессора было недостаточно, да и непонятно, зачем в модуле менеджера объекта, который, по сути, является общим серверным модулем, указывать какие-то директивы компиляции.

Я не разбирался, почему директива &НаСервере в серверном модуле вызывает ошибку инициализации модуля. Если кто-то может объяснить, прошу написать в комментариях.

Не найдено правило конвертации объектов

Текст ошибки:

Не найдено правило конвертации объектов
    ТипОбъекта             =  Справочник объект: {Имя справочника}
    Объект                 =  {Представление элемента}
    КСообщенияОбОшибках    =  45

Причина:

Если правила ранее были отлажены и правило конвертации в действительности существует, то возможны такие варианты:

  • Забыли включить нужное правило выгрузки данных.
  • В нужном правиле выгрузки данных не указано правило конвертации.

Решение:

Включить отключенное правило выгрузки данных или указать в нём нужное правило конвертации объектов.

Переполнение стека встроенного языка на сервере

Текст ошибки:

Ошибка при вызове метода контекста (ОбычнаяВыгрузкаДанных_ОбработкаДлительнойОперации)
{Обработка.ВыполнениеОбменаДанными.Форма.Форма.Форма(576)}:	ОбычнаяВыгрузкаДанных_ОбработкаДлительнойОперации(Отказ, УзелИнформационнойБазы, ВидТранспортаСообщений);
{(1)}:Подключаемый_ОбычнаяВыгрузкаДанных_ОбработкаДлительнойОперации(Отказ, ПерейтиДалее)
{Обработка.ВыполнениеОбменаДанными.Форма.Форма.Форма(381)}:		А = Вычислить(ИмяПроцедуры);
по причине:
Переполнение стека встроенного языка на сервере
по причине:

Обработка.ВыполнениеОбменаДанными.Форма.Форма.Форма : 588 : ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(
ОбщийМодуль.ОбменДаннымиСервер.Модуль : 1757 : ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыПоВнешнемуСоединению(Отказ,
ОбщийМодуль.ОбменДаннымиСервер.Модуль : 3233 : ОбработкаОбменаДаннымиXML.ВыполнитьВыгрузкуДанных(ОбработкаДляЗагрузкиДанных);
Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта : 743 : ВыполнитьВыгрузку();
...
Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта : 1965 : ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКО.СвойстваПоиска,
Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта : 11162 : УзелСсылки = ВыгрузитьПоПравилу(Значение, , ИсходящиеДанные, , ИмяПКО, , ВыгрузитьТолькоСсылку, ПКОСвойств, , , , , Ложь,
Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта : 1716 : Выполнить(ПКО.ПередВыгрузкой);
 : 0
по причине:
Переполнение стека встроенного языка на сервере

Причина:

Происходит рекурсивный вызов какого-то правила конвертации объектов.

Например, выгружается контрагент, а в каком-то из обработчиков его ПКО есть вызов процедуры ВыгрузитьПоПравилу для связанных с ним объектов, например, договоров или банковских счетов, которые содержат ссылку на владельца — этого же контрагента.

В моей практике ошибка возникала в отлаженных через Универсальный обмен в формате XML правилах при переносе их в онлайн-обмен.

В причинах не разбирался. Предполагаю, что в обработках Универсальный обмен в формате XML и Конвертация объектов информационных баз различается максимальный допустимый уровень рекурсии или же иные механизмы устранения бесконечной рекурсии.

Решение:

Устранить рекурсию.

Часто это звучит намного проще, чем есть на самом деле.

В общем случае нужно умственно пробежаться по ПКО, их обработчикам и ПКС, чтобы представлять себе дерево вызовов ПКО — первыми под подозрение должны попадать ПКС со ссылками на те же объекты, которые выгружаются выше по стеку вызовов ПКО. Часто такие поля называются Владелец.

Самый простой способ исправления: установить ВыгрузитьОбъект = Ложь; в обработчике Перед выгрузкой нужных ПКС.

Не найдено соответствие для значения Источника

Текст ошибки:

Не найдено соответствие для значения Источника
	ИмяПКО                 =  ЮрФизЛицо
	Значение               =  ИндивидуальныйПредприниматель
	ТипЗначения            =  ПеречислениеСсылка.ЮрФизЛицо
	Текст                  =  В правиле конвертации значений (ПКЗ) необходимо сопоставить значение Источника значению Приемника.
Если подходящего значения приемника нет, то указать пустое значение.
	КСообщенияОбОшибках    =  71

Причина:

Для ПКС назначено ПКО с предопределёнными значениями или значениями перечисления, при этом значениям источника сопоставлены не все значения приёмника, т.е. не для всех значений приёмника есть ПКЗ.

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

Решение:

Очистить поле Правило в ПКС.

Предопределённые значения или значения перечисления при этом будут правильно подбираться по переданному строковому представлению, и ошибка возникать не будет.

Ошибка получения значения свойства подчиненного объекта (по имени свойства приемника)

Текст ошибки:

Ошибка получения значения свойства подчиненного объекта (по имени свойства приемника)
    ПКО                    =  ЧекККМПродажа  (Документ: Чек ККМ)
    ПКС                    =  26  (--> СтавкаНДС)
    Объект                 =  Чек ККМ 00000000205 от 19.09.2023 0:00:00  (Документ объект: Чек ККМ)
    СвойствоПриемника      =  СтавкаНДС  (ПеречислениеСсылка.СтавкиНДС)
    ОписаниеОшибки         =  Поле объекта не обнаружено (СтавкаНДС)
    ПозицияМодуля          =  Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(10184)
    КСообщенияОбОшибках    =  17
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(3645)}:       ВызватьИсключение СтрокаСообщенияОбОшибке;
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(10189)}:          ЗаписатьИнформациюОбОшибкеОбработчикиПКС(КодОшибки, ОписаниеОшибки(), ПКО, ПКС, Источник, "");
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(11002)}:          ПолучитьЗначениеСвойства(Значение, ОбъектКоллекции, ПКО, ПКС, ВходящиеДанные, Источник, ВыборкаСвойств);
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(9985)}:               ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКГС.ПравилаГруппы,
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(10876)}:          ВыгрузитьГруппуСвойств(
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(2137)}:           ВыгрузитьСвойства(
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(11533)}:  ВыгрузитьПоПравилу(Объект, , ВходящиеДанные, ИсходящиеДанные, ИмяПКО, УзелСсылки, , , НЕ НеВыгружатьОбъектыСвойствПоСсылкам,
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(15022)}:          ВыгрузкаОбъектаВыборки(Данные, ПравилоВыгрузкиДанных, , ИсходящиеДанные, НеВыгружатьОбъектыПоСсылкам);
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(14671)}:      ВыполнитьВыгрузкуЗарегистрированныхДанных(ЗаписьСообщения, СтрокаСообщенияОбОшибке, ТаблицаПравилВыгрузкиИспользуемые);
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(743)}:        ВыполнитьВыгрузку();
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(3527)}:          ОбработкаОбменаДаннымиXML.ВыполнитьВыгрузкуДанных();
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(3325)}:          ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена.ИмяФайлаСообщенияОбмена());
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(2802)}:  ВыполнитьОбменДаннымиЧерезФайловыйРесурс(СтруктураНастроекОбмена, ТолькоПараметры);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(1812)}:          ВыполнитьДействиеОбменаДляУзлаИнформационнойБазы(Отказ,
{Обработка.ВыполнениеОбменаДанными.Форма.Форма.Форма(588)}: ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(

Причина:

Возникает в ПКС с пустым источником в ситуации, когда значение не присваивается в обработчике Перед выгрузкой.

Например, значение присваивается по какому-то условию, но в случае, когда проверка не срабатывает, значения по умолчанию нет.

В этом случае происходит попытка обращения к одноимённому реквизиту источника, а такого реквизита нет.

Решение:

Присваивать значение явно для каждой ветки условий.

Проще всего вначале присвоить значение по умолчанию, а потом уже присваивать что-то другое в зависимости от выполнения условий.

 

На стороне базы-приёмника

Никаких неочевидных ошибок со стороны базы-приёмника я не встречал, все были связаны с ошибками данных или ошибками кодирования обработчиков, выполняемых со стороны базы-приёмника.

Раздел добавил, чтобы было меньше недоумения — раздел На стороне базы-источника есть, а где же на стороне базы-приёмника?

Если в будущем обнаружу какие-то подходящие ошибки, добавлю их сюда.

 

При работе с конфигурацией "Конвертация данных"

Ошибка при попытке вставки записи с неуникальным значением ссылки

Текст ошибки:

Ошибка при вызове метода контекста (Записать)
{Обработка.ЗагрузкаСтруктурыМетаданных.МодульОбъекта(499)}:		Объект.Записать();
{Обработка.ЗагрузкаСтруктурыМетаданных.МодульОбъекта(65)}:			ПрочитатьОбъектXML(ЧтениеXML, (КоличествоОбъектов - 1) % мКоличествоЭлементовДляОбновленияСтатуса = 0);
{Обработка.ЗагрузкаСтруктурыМетаданных.Форма.Форма.Форма(75)}:	РезультатЗагрузки = ВыполнитьЗагрузку();
по причине:
Ошибка при попытке вставки записи с неуникальным значением ссылки.
Microsoft SQL Server Native Client 11.0: Нарушено "PK___Referen__AC8ED0C4F03BE78F" ограничения PRIMARY KEY. Не удается вставить повторяющийся ключ в объект "dbo._Reference37". Повторяющееся значение ключа: (0xafb3b7e7723bffba48ddd2a951204a18).
HRESULT=80040E2F, SQLSrvr: SQLSTATE=23000, state=1, Severity=E, native=2627, line=1

Причина:

Может возникать при обновлении метаданных конфигурации, когда идентификатор одного из объектов в файле описания метаданных совпадает с идентификатором существующего объекта в базе

Конвертация данных.

Решение:

Выгрузить метаданные ещё раз — при каждой выгрузке объектам присваиваются случайные идентификаторы, и есть большая вероятность, что ошибка не повторится.

Все остальные ошибки пока были более специфическими, и их описание вряд ли может помочь так же, как описание ошибок, приведённых выше.

Допускаю, что какие-то из описанных ошибок я мог интерпретировать не совсем правильно, и вследствие этого то или иное предложенное решение не является оптимальным.

Если у комментаторов есть что добавить по существу, прошу поделиться своим опытом или мнением.


При создании картинки для анонса использовались иконки:

конвертация обмен

См. также

SALE! 10%

Перенос данных 1C Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

55778 50200 руб.

04.08.2015    167069    338    278    

376

SALE! 15%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

26280 руб.

12.06.2017    142201    802    297    

423

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.236.x) и БП 3.0 (3.0.164.x). Правила подходят для версии ПРОФ и КОРП.

35000 руб.

15.12.2021    24325    172    51    

131

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.88.x) и УТ 11.5 (11.5.19.x).

35000 руб.

23.07.2020    51861    229    70    

187

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

48278 43450 руб.

25.02.2015    171418    304    257    

381

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

53111 47800 руб.

03.12.2020    36851    95    66    

92

Перенос данных 1C Программист Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ ФОМС, ЕФС Платные (руб)

Обработки для быстрого перехода с конфигураций «КАМИН:Расчет заработной платы 3.0», «КАМИН:Зарплата для бизнеса 4.0» и «КАМИН:Зарплата 5.0» на конфигурацию «Зарплата и управление персоналом» версии 3.1.

12000 руб.

25.09.2016    81003    315    250    

267

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в УПП 1.3 | из КА 2 в КА 1.1 | из КА 2 в УПП 1.3 | из КА 2 в УТ 10.3 | из ERP в КА 1.1 | из ERP в УТ 10.3 | из УТ 11 в УТ 10.3 | из УТ 11 в УПП 1.3 | из УТ 11 в КА 1.1 | Можно переносить только новые объекты, найденные в приемнике перезаписываться не будут | Есть фильтр по организации при выгрузке данных | Оперативно обновляем на новые релизы 1С

53111 47800 руб.

28.11.2015    83381    33    125    

65
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. pyrkin_vanya 493 07.11.23 20:46 Сейчас в теме
Можете ещё ссылку на мою статью разместить по отладку)https://infostart.ru/1c/articles/205460/
2. Vasvas05 27 08.11.23 00:34 Сейчас в теме
Ошибка проявляется при использовании процедуры ВыгрузитьПоПравилу в правилах для онлайн-обмена

ВыгрузитьПоПравилу - в "онлайн обмене" надо заменить на "ВыгрузитьРегистр", тут даже статья есть об этом.
3. AlekseiAdamov 184 08.11.23 09:00 Сейчас в теме
Как это решит проблему отсутствия ссылки?
4. Vasvas05 27 08.11.23 15:18 Сейчас в теме
(3) да все прекрасно работает(два года назад точно работало) при обменах на БСП без ссылки в источнике. Как же еще делают РС -> справочник и наоборот.


(3)
Как это решит проблему отсутствия ссылки?

- будет работать может,не?
5. AlekseiAdamov 184 08.11.23 15:22 Сейчас в теме
(4) Хорошо, спасибо, я проверю, когда вернусь к вопросу синхронизации данных номенклатуры контрагентов.
6. Attya 05.12.23 10:39 Сейчас в теме
С такой проблемой при переносе данных из розницы в ут. В документе ОтчетОРозничныхПродажах есть табличная часть ОплатаБонусныБаллами. В рознице в этой тч есть реквизит ДисконтнаяКарта (ИнформационнаяКарта), а в ут Клиент (Партнер). Как можно перенести такие данные? Я думал брать реквизит дисконтной карты "ВладелецКарты", но там типы Контрагенты, Пользователи, физлица. а Клиент в ут с типом Партнеры который к тому же отсутствует в рознице
7. AlekseiAdamov 184 05.12.23 11:37 Сейчас в теме
(6)
Я думал брать реквизит дисконтной карты "ВладелецКарты", но там типы Контрагенты, Пользователи, физлица.

Берите из него, просто проверяйте перед выгрузкой тип примерно так:
Если ТипЗнч(Источник.ВладелецКарты) <> Тип("СправочникСсылка.Контрагенты") Тогда
    Отказ = Истина;
КонецЕсли;


а Клиент в ут с типом Партнеры который к тому же отсутствует в рознице

А как настроен перенос контрагентов из Розницы в УТ?
По идее, должна быть конвертация контрагентов как в контрагенты, так и в партнёров.
То есть если правило конвертации Контрагенты -> Партнёры уже настроено, то выбрать его для ПКС ВладелецКарты.
Оставьте свое сообщение