Как в плане обмена зарегистрировать только ту номенклатуру, которая используется в документах

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

При настройке синхронизации данных между базами 1С часто возникает задача ограничить объем передаваемой информации. Одной из самых популярных задач является регистрация в плане обмена не всего справочника Номенклатура, а только тех позиций, которые реально фигурируют в выбранных документах (например, в поступлениях или реализациях). Это позволяет избежать «замусоривания» базы-приемника лишними данными и ускоряет процесс обмена.

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

Способ 1. Использование обработки «Регистрация изменений для обмена»

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

Рассмотрим пошагово, как выполнить выборочную регистрацию с помощью запроса:

  1. Откроем обработку «Регистрация изменений для обмена» (ее можно найти в разделе «Администрирование — Синхронизация данных — Состав отправляемых данных» или запустить через функции для технического специалиста).
  2. Выберем нужный Узел (базу-приемник), для которого мы готовим данные.
  3. В списке объектов найдем справочник Номенклатура.
  4. Нажмем правую кнопку мыши на строке со справочником и выберем пункт «Добавить регистрацию» (или «Зарегистрировать изменения»).
  5. В появившемся окне выбора режима регистрации выберем «Выбрать из запроса». Если система предложит «Зарегистрировать все объекты», нажимаем «Нет», чтобы перейти к конструктору запроса.

Теперь нам необходимо написать запрос, который выберет только нужные ссылки. Проанализируем пример запроса, который объединяет номенклатуру из двух видов документов: ПоступлениеТоваровУслуг и РеализацияТоваровУслуг.


ВЫБРАТЬ РАЗЛИЧНЫЕ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В (
        ВЫБРАТЬ
            ТЧ.Номенклатура
        ИЗ
            Документ.ПоступлениеТоваровУслуг.Товары КАК ТЧ
    )
    ИЛИ Номенклатура.Ссылка В (
        ВЫБРАТЬ
            ТЧ.Номенклатура
        ИЗ
            Документ.РеализацияТоваровУслуг.Товары КАК ТЧ
    )

Важный нюанс: Чтобы избежать ошибки «Не найдена колонка Ссылка», убедитесь, что в результате запроса колонка с ссылками на номенклатуру называется именно Ссылка. Для этого мы используем псевдоним КАК Ссылка.

Способ 2. Решение проблемы «лишней» регистрации (Авторегистрация)

Часто программисты сталкиваются с ситуацией: запрос выполнен верно, но в обмен все равно попадают «лишние» элементы справочника. Выясним причину такого поведения. В 1С у каждого объекта в составе плана обмена есть свойство «Авторегистрация».

Проанализируем ситуацию: если для Номенклатуры установлено значение «Разрешить», то любая запись карточки товара (даже если вы просто изменили описание вручную) автоматически создает запись в плане обмена. Ваши ручные фильтры в обработке будут работать, но новые изменения будут «пролезать» бесконтрольно.

Решение:

  1. Зайдем в Конфигуратор.
  2. Найдем наш ПланОбмена.
  3. На вкладке «Состав» найдем Номенклатура и установим значение Авторегистрация = Запретить.
  4. Теперь регистрация будет происходить только программно или через обработку по вашему запросу.

Способ 3. Программная регистрация через подписки на события

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

Создадим подписку на событие ПриЗаписи для группы документов. В обработчике напишем следующий код:


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

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

Типичные ошибки при работе с запросами регистрации

Разберем ошибку «Неоднозначное поле Номенклатура.Ссылка». Она возникает, когда в запросе соединяются несколько таблиц, имеющих поля с одинаковыми именами, и система не понимает, из какой таблицы брать данные. Всегда указывайте алиас (псевдоним) таблицы перед полем, например: СпрНоменклатура.Ссылка.

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

Оптимизация обмена через EnterpriseData

Если вы используете современные конфигурации на базе БСП и обмен через формат EnterpriseData, то ручная регистрация номенклатуры может вообще не понадобиться. Рассмотрим подробнее механизм «выгрузки по ссылке». В таких обменах при регистрации документа система сама анализирует его состав и автоматически включает в пакет обмена все связанные объекты. Таким образом, достаточно зарегистрировать только сам документ, а вся номенклатура, склады и контрагенты «подтянутся» автоматически. Это наиболее современный и правильный подход для типовых решений 1С.

← На главную