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