Работа с механизмами обмена данными в 1С — это ответственный процесс, требующий четкого понимания архитектуры распределенных информационных систем. Одной из самых часто встречающихся преград для начинающего (и даже опытного) разработчика является системная ошибка «Недопустимое значение параметра (параметр номер '1')» при вызове метода ПланыОбмена.ЗарегистрироватьИзменения(). На первый взгляд код может выглядеть абсолютно корректно, однако платформа 1С накладывает ряд жестких ограничений на параметры этой процедуры.
В этой статье мы подробно проанализируем ситуацию, разберем причины возникновения данной ошибки и найдем способы её решения на конкретных примерах.
Прежде чем переходить к коду, давайте вспомним теорию. Метод ЗарегистрироватьИзменения предназначен для того, чтобы «пометить» данные, которые должны быть переданы в другую информационную базу. Процесс регистрации всегда происходит в контексте конкретного узла плана обмена. Параметр №1 этого метода ожидает ссылку на узел или массив таких ссылок. При необходимости выполнить эту операцию без написания кода можно использовать инструмент для массовой регистрации объектов на узел обмена.
Рассмотрим типовой код, который часто приводит к ошибке:
&НаСервере
Процедура ЗарегистрироватьИзмененияНаСервере(УзелСсылка)
// Здесь часто возникает ошибка, если УзелСсылка выбран неверно
ПланыОбмена.ЗарегистрироватьИзменения(УзелСсылка);
КонецПроцедуры
Самая распространенная причина ошибки заключается в том, что в качестве первого параметра передается ссылка на текущий узел информационной базы (так называемый ЭтотУзел). В системе 1С каждый экземпляр базы данных в плане обмена имеет один узел, помеченный значком компьютера — это и есть «само ядро» текущей базы.
Почему это вызывает ошибку? Регистрация изменений имеет смысл только для передачи данных другим участникам обмена. Платформа логично запрещает регистрировать изменения «на самого себя», так как это привело бы к бесконечным циклам и не имело бы практической пользы. Если ваш программный код пытается передать в метод ЭтотУзел, система незамедлительно выдаст ошибку недопустимого параметра.
Рассмотрим, как правильно выполнить проверку перед вызовом:
// Проверяем, не является ли выбранный узел текущим
Если УзелСсылка = ПланыОбмена.МойПланОбмена.ЭтотУзел() Тогда
Сообщить("Нельзя регистрировать изменения для текущего узла!");
Иначе
ПланыОбмена.ЗарегистрироватьИзменения(УзелСсылка);
КонецЕсли;
Метод ЗарегистрироватьИзменения крайне чувствителен к типам данных. Если в первый параметр попадает Неопределено, Null или пустая ссылка соответствующего плана обмена, выполнение прервется с той же самой ошибкой.
Часто это происходит, когда программист пытается найти узел программно по коду или наименованию, но не обрабатывает ситуацию, когда узел не найден. Выясним, как сделать поиск более надежным:
УзелОбмена = ПланыОбмена.СинхронизацияДанныхЧерезФорматExcel.НайтиПоКоду("Планшет001");
// Обязательная проверка на пустую ссылку
Если УзелОбмена.Пустая() Тогда
ВызватьИсключение "Узел обмена с кодом Планшет001 не найден в справочнике!";
КонецЕсли;
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена);
Метод позволяет передавать массив узлов, чтобы зарегистрировать изменения сразу для нескольких получателей. Однако здесь кроется еще одна ловушка. Ошибка «Недопустимое значение параметра» возникнет, если:
ЭтотУзел.Проанализируем правильный алгоритм работы с массивом:
МассивУзлов = Новый Массив;
ВыборкаУзлов = ПланыОбмена.МойПланОбмена.Выбрать();
Пока ВыборкаУзлов.Следующий() Цикл
// Добавляем в массив только тех, кто не является "Этим узлом"
Если ВыборкаУзлов.Ссылка <> ПланыОбмена.МойПланОбмена.ЭтотУзел() Тогда
МассивУзлов.Добавить(ВыборкаУзлов.Ссылка);
КонецЕсли;
КонецЦикла;
Если МассивУзлов.Количество() > 0 Тогда
ПланыОбмена.ЗарегистрироватьИзменения(МассивУзлов);
КонецЕсли;
Иногда ошибка в первом параметре может быть косвенно вызвана вторым параметром. Если вы вызываете ПланыОбмена.ЗарегистрироватьИзменения(Узел, СсылкаНаДокумент), платформа проверяет, входит ли данный тип документа в Состав указанного плана обмена.
Если в метаданных на вкладке «Состав» у плана обмена не стоит галочка напротив нужного объекта (например, документа РеализацияТоваровУслуг), система может выдать общую ошибку параметров. Убедитесь, что объект метаданных включен в план обмена и для него настроен режим авторегистрации или выбран ручной режим управления.
В контексте обсуждения на форуме упоминались планшеты. При разработке обменов с мобильными устройствами важно помнить: на мобильном устройстве «Этим узлом» является само мобильное приложение. Когда вы нажимаете кнопку обмена на планшете, вы должны регистрировать изменения для узла «Центральный офис», а не для узла «Планшет», так как для мобильного приложения именно «Планшет» является ЭтотУзел.
Золотое правило: всегда регистрируйте изменения для того узла, КУДА вы собираетесь отправить данные.
Для предотвращения подобных ошибок в будущем, мы рекомендуем придерживаться следующего чек-листа при написании кода:
&НаСервере или &НаСервереБезКонтекста.Узел <> ПланыОбмена.ИмяПлана.ЭтотУзел().Узел непосредственно перед вызовом метода. Если в значении написано "Объект не найден" или "<...>" (пустая ссылка), проблема в данных.Следуя этим правилам, вы сможете избежать досадных ошибок и сделаете ваши механизмы обмена данными надежными и стабильными. Для оперативной выгрузки данных без написания специального кода подойдет универсальная обработка для регистрации объектов к обмену.