Как зарегистрировать физических лиц на узле обмена при изменении подразделения в 1С:ЗУП 3.1

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе сопровождения 1С:ЗУП 3.1 часто возникает задача синхронизации данных с другими системами (например, с 1С:Бухгалтерией). Одной из специфических задач является необходимость принудительной регистрации связанных объектов. Например, когда в справочнике Подразделения меняется важный реквизит, нам нужно, чтобы все сотрудники (физические лица) этого подразделения также ушли в обмен, даже если их собственные карточки не редактировались. В этой статье мы подробно разберем, как реализовать этот механизм, избежав типичных ошибок.

Разбор ошибки «Недопустимое значение параметра (параметр номер 1)»

При попытке программной регистрации объектов программисты часто сталкиваются с ошибкой при вызове метода ПланыОбмена.ЗарегистрироватьИзменения. Проанализируем типичный код, который приводит к этой ситуации:


УзелОбмена = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоКоду("ПП");
// ... выборка данных ...
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Выборка.ФизическоеЛицо);

Причина ошибки кроется в том, что метод НайтиПоКоду возвращает пустую ссылку, если узел с таким кодом не найден. В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем), таких как ЗУП 3.1, «Код» узла обмена часто не совпадает с «Префиксом» базы. Код может быть представлен в виде GUID или автоматически сгенерированной последовательности (например, «001»).

Метод ЗарегистрироватьИзменения ожидает в первом параметре ссылку на конкретный, существующий в базе узел. Если передать ПустаяСсылка, платформа выдаст ошибку. Чтобы этого избежать, рассмотрим более надежные способы поиска узла.

Как надежно найти узел плана обмена

Вместо жесткого кодирования префикса в тексте программы, рассмотрим несколько альтернативных подходов:

  1. Поиск по уникальному идентификатору или реквизиту: Если узел в системе один, можно использовать поиск по наименованию или перебор. Но лучше всего добавить в расширение специальный реквизит (например, типа Булево) для узла обмена, чтобы программно идентифицировать нужный канал синхронизации.
  2. Использование функций БСП: В типовых решениях рекомендуется обращаться к программному интерфейсу обмена данными.
  3. Поиск через «ЭтотУзел»: Если нужно зарегистрировать данные на всех узлах, кроме текущего, мы можем использовать цикл по всем элементам плана обмена.

Проанализируем пример корректного поиска с проверкой:


УзелОбмена = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоНаименованию("Обмен с Бухгалтерией");
Если УзелОбмена.Пустая() Тогда
    // Записываем лог или выводим предупреждение
    Возврат;
КонецЕсли;

Оптимизация регистрации через дополнительные свойства

Выполнение тяжелых запросов внутри процедуры ПередЗаписью или ПриЗаписи может существенно замедлить работу пользователя и привести к блокировкам в транзакции. Рассмотрим правильную стратегию реализации через ДополнительныеСвойства объекта.

Разберем по шагам:

Шаг 1. Обработка в «ПередЗаписью»

Здесь мы только проверяем, изменились ли значимые реквизиты. Если изменение зафиксировано, мы ставим «флаг» в свойства объекта.


Процедура Расш1_ПередЗаписью(Отказ)
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

    Если Не Ссылка.Пустая() Тогда
        // Получаем старое значение из базы для сравнения
        СтарыйКод = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Код");
        Если СтарыйКод <> ЭтотОбъект.Код Тогда
            ЭтотОбъект.ДополнительныеСвойства.Вставить("НужнаРегистрацияФизЛиц", Истина);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Шаг 2. Регистрация в «ПриЗаписи»

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


Процедура Расш1_ПриЗаписи(Отказ)
    Если Не ЭтотОбъект.ДополнительныеСвойства.Свойство("НужнаРегистрацияФизЛиц") Тогда
        Возврат;
    КонецЕсли;

    // Выбираем все физлица, связанные с этим подразделением
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |   Сотрудники.ФизическоеЛицо КАК ФизЛицо
        |ИЗ
        |   Справочник.Сотрудники КАК Сотрудники
        |ГДЕ
        |   Сотрудники.Подразделение = &Подразделение";
    
    Запрос.УстановитьПараметр("Подразделение", ЭтотОбъект.Ссылка);
    
    Результат = Запрос.Выполнить();
    Если Не Результат.Пустой() Тогда
        МассивФизЛиц = Результат.Выгрузить().ВыгрузитьКолонку("ФизЛицо");
        
        // Находим узлы (в примере — все активные узлы обмена)
        ВыборкаУзлов = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.Выбрать();
        Пока ВыборкаУзлов.Следующий() Цикл
            Если ВыборкаУзлов.Ссылка = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.ЭтотУзел() Тогда
                Продолжить;
            КонецЕсли;
            
            // Регистрируем сразу весь массив — это гораздо быстрее!
            ПланыОбмена.ЗарегистрироватьИзменения(ВыборкаУзлов.Ссылка, МассивФизЛиц);
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

Альтернативный метод: Использование правил регистрации (ПРО)

Рассмотрим ситуацию, когда мы не хотим вносить изменения в программный код конфигурации или расширения. Если обмен настроен через «Универсальный формат» (Enterprise Data), в нашем распоряжении есть мощный инструмент — Правила регистрации объектов (ПРО).

Выясним, как это работает в КД 3.0:

  1. Выгружаем существующие правила регистрации из конфигурации (через обработку РегистрацияТехнологическихЖурналов или встроенные средства обмена).
  2. Загружаем их в конфигурацию «Конвертация данных 3.0».
  3. Для объекта Справочник.ПодразделенияОрганизаций настраиваем обработчик «После записи».
  4. В коде обработчика прописываем логику регистрации связанных объектов. Система сама определит нужные узлы.
  5. Загружаем измененные правила обратно в ЗУП 3.1.

Преимущество этого метода в том, что он является «штатным» для механизма синхронизации и не требует обновления расширений при изменении логики поиска узлов. Однако этот способ требует навыков работы с Конвертацией данных.

Особенности регистрации для Enterprise Data

Проанализируем важный технический нюанс: физическое лицо в 1С:ЗУП — это не просто ссылка в справочнике. Это целый комплекс данных, включая ФИО, паспортные данные, ИНН и адреса, которые хранятся в регистрах сведений.

Если вы регистрируете только ссылку на Справочник.ФизическиеЛица, система при обмене может выгрузить только базовые поля. Если на стороне приемника (например, БП 3.0) ожидается обновление персональных данных, убедитесь, что в плане обмена также зарегистрированы записи соответствующих регистров (например, ФИОФизическихЛиц), если они входят в состав обмена. В большинстве случаев регистрации самого элемента справочника достаточно, так как при его выгрузке механизмы БСП автоматически подтягивают связанные сведения, но об этом стоит помнить при отладке сложных случаев.

Подведем итоги

Для реализации корректной регистрации связанных данных при изменении подразделения необходимо:

← На главную