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