При настройке обмена данными между конфигурациями на платформе 1С с использованием конфигурации «Конвертация данных 2.1» (КД 2.1) специалисты часто сталкиваются с двумя основными проблемами. Первая — это необходимость выгружать только те документы (например, реализации), которые относятся к определенной группе контрагентов. Вторая — обеспечение корректного поиска этих контрагентов в базе-приемнике, чтобы программа подставляла уже существующих партнеров вместо создания дублей. В этой статье мы подробно разберем, как решить эти задачи, используя стандартные механизмы и обработчики событий.
Рассмотрим ситуацию: нам нужно выгрузить только документы РеализацияТоваровУслуг, у которых в поле Контрагент выбран объект, имеющий определенный признак (например, текстовый код "Б" в дополнительном реквизите КодБ). Часто стандартные отборы в обработке выгрузки не позволяют корректно обратиться к реквизитам «через точку» от основного объекта. Разберем, как реализовать такой отбор правильно.
Способ 1. Использование обработчика «Перед выгрузкой» в ПВД
Наиболее простой способ — прописать условие в Правиле выгрузки данных (ПВД). Это позволит системе анализировать каждый документ перед тем, как он попадет в файл выгрузки. Проанализируем пример кода, который можно разместить в обработчике Перед выгрузкой:
Если ЗначениеЗаполнено(Объект.Контрагент) Тогда
// Проверяем значение строкового реквизита "КодБ"
Если СокрЛП(Объект.Контрагент.КодБ) <> "Б" Тогда
Отказ = Истина;
КонецЕсли;
Иначе
// Если контрагент не заполнен, документ нам не нужен
Отказ = Истина;
КонецЕсли;
Здесь важно обратить внимание на типизацию. Ошибка многих начинающих разработчиков заключается в попытке сравнить строковое поле с числом (например, Объект.Контрагент.КодБ < 0). В языке 1С такое сравнение может привести к непредсказуемым результатам или отсутствию выборки. Мы используем сравнение со строкой "Б" и функцию СокрЛП() для удаления лишних пробелов.
Способ 2. Произвольный алгоритм в ПВД
Если документов в базе сотни тысяч, перебор каждого объекта в обработчике может замедлить процесс. В этом случае мы рекомендуем использовать «Произвольный алгоритм» в ПВД. Это позволит выбрать данные с помощью SQL-запроса на уровне сервера базы данных. Разберем структуру такого алгоритма:
Перед обработкой напишем запрос:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Контрагент.КодБ = &НужныйКод
| И Реализация.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
Запрос.УстановитьПараметр("НужныйКод", "Б");
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
ВыборкаДанных = Запрос.Выполнить().Выгрузить();
Использование ВыборкаДанных позволяет КД 2.1 автоматически подхватить результат запроса и выгрузить объекты по соответствующим правилам конвертации (ПКО).
Вторая часть вопроса касается ситуации, когда в приемнике уже заведены контрагенты вручную, и нам нужно «прицепить» реализации к ним, не создавая новых записей. Проанализируем настройки Правил конвертации объектов (ПКО) для справочника Контрагенты.
Настройка полей поиска
По умолчанию 1С ищет объекты по внутреннему идентификатору (GUID). Поскольку базы разные, GUID контрагента, созданного вручную в приемнике, никогда не совпадет с GUID из источника. Чтобы решить эту проблему, выполним следующие действия:
Контрагенты на закладку «Настройки поиска».ИНН и КПП (для юрлиц) или Наименование.Флаг «Не создавать новых объектов в приемнике»
Если ваша задача — строго запретить создание новых элементов, в ПКО Контрагенты необходимо установить флаг «Не создавать новых объектов в приемнике, если они не найдены». В этом случае алгоритм работы будет следующим:
Реализация.Контрагент в документе останется пустым, а новый контрагент создан не будет.Рассмотрим ситуацию, когда нам вообще не нужно передавать данные о реквизитах контрагента (его адрес, телефон, счета), а нужно передать только информацию для поиска. В правилах конвертации свойств (ПКС) документа РеализацияТоваровУслуг для свойства Контрагент можно установить флаг «Выгружать только ссылку».
Это значительно ускоряет обмен и уменьшает размер файла, так как в него записываются только поля, помеченные как «Поля поиска» в ПКО контрагента. Выясним причину, почему это полезно: система не будет пытаться актуализировать данные уже существующих контрагентов, а просто найдет их для заполнения шапки документа.
Посмотрим на пример, когда отбор не срабатывает. Если реквизит КодБ имеет тип «Строка», а мы пытаемся применить к нему числовое сравнение в интерфейсе обработки выгрузки (например, КодБ > 0), платформа 1С может просто проигнорировать такое условие.
Рекомендации по работе со строками:
ЗначениеЗаполнено() или сравнением с "".СокрЛП(), так как в строковых кодах могут быть невидимые пробелы.V8Exchan83.epf убедитесь, что тип значения в колонке «Значение» соответствует типу реквизита в метаданных.Таким образом, сочетание правильно настроенных полей поиска в ПКО и грамотного использования обработчиков в ПВД позволяет реализовать гибкую и надежную систему обмена данными, исключающую появление «мусора» и дублей в информационной базе.