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