При переносе данных между конфигурациями 1С часто возникает задача выгрузки начальных остатков. Если в исходной базе (например, 1С:Управление торговлей) нет физических документов ввода остатков, а данные необходимо собрать напрямую из регистров накопления с помощью произвольного запроса, разработка правил в Конвертации данных 3.0 (КД3) может вызвать ряд вопросов. Механизмы КД3 и БСП накладывают жесткие рамки на процесс обмена через универсальный формат EnterpriseData.
В этой статье мы подробно разберем, как спроектировать и написать правила обмена для программного формирования и выгрузки виртуальных документов остатков, обходя ограничения планов обмена БСП, и как решить сопутствующие технические проблемы.
Прежде чем перейти к написанию кода, проанализируем важную архитектурную деталь работы БСП. При регулярном автоматическом обмене по плану обмена подсистема БСП обрабатывает только те объекты, ссылки на которые непосредственно зарегистрированы на узле плана обмена. В этом режиме БСП игнорирует обработчик ПОД (Правила обработки данных) Выборка данных.
Если мы хотим выгружать остатки по расписанию, у нас есть два пути выполнения произвольного запроса:
Организации или Склады). В обработчике ПОД При обработке для этого справочника мы перехватываем процесс выгрузки, запускаем наш произвольный запрос по остаткам этой организации и выгружаем полученные данные в виде документов формата.Перед конвертацией, принудительно добавив правила выгрузки остатков в коллекцию КомпонентыОбмена.СценарийВыгрузки.Выясним также важную особенность версий формата EnterpriseData. В версиях формата выше 1.5 универсальный документ ввода остатков был упразднен. Теперь формат требует выгрузки узкоспециализированных документов, таких как Документ.ОстаткиСобственныхТМЦ, Документ.ОстаткиРасчетовСПокупателямиДолги и других. Соответственно, наш алгоритм должен уметь генерировать разные структуры данных под каждый конкретный тип остатков.
Рассмотрим наиболее надежный и простой в сопровождении вариант — выгрузку остатков при регистрации справочника Организации. Представим ситуацию: в базе ведется учет по 5 организациям, и нам нужно выгрузить остатки только по выбранным (тем, что зарегистрированы к обмену).
Для реализации этого сценария выполним следующие шаги в Конвертации данных 3.0:
Шаг 1. Настройка ПОД для справочника Организации
В правилах обмена для ПОД справочника Организации в обработчике При обработке пишем алгоритм, который будет собирать остатки по текущей выгружаемой организации.
Шаг 2. Написание произвольного запроса и формирование структуры
Внутри обработчика мы получаем ссылку на текущую организацию, выполняем запрос к регистру накопления (например, ТоварыНаСкладах) и формируем структуру-обертку, понятную для КД3. Структура-обертка должна содержать два обязательных свойства:
Значение — вложенная структура со всеми реквизитами и табличными частями документа формата;ИмяПКО — строковое имя правила конвертации объектов, которое должно обработать созданную структуру.Рассмотрим пример реализации кода в обработчике:
// Получаем организацию, которая сейчас выгружается
ТекущаяОрганизация = ДанныеИБ.Ссылка;
// Выполняем произвольный запрос для получения остатков товаров
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
| ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Количество
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Организация = &Организация) КАК ТоварыНаСкладахОстатки";
Запрос.УстановитьПараметр("Период", ТекущаяДата());
Запрос.УстановитьПараметр("Организация", ТекущаяОрганизация);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
// Создаем структуру для документа формата
ДанныеДокумента = Новый Структура;
ДанныеДокумента.Вставить("Ссылка", НовыйУникальныйИдентификатор()); // Генерируем уникальный ключ для сопоставления
ДанныеДокумента.Вставить("Дата", ТекущаяДата());
ДанныеДокумента.Вставить("Организация", ТекущаяОрганизация);
// Формируем табличную часть
ТаблицаТоваров = Новый ТаблицаЗначений;
ТаблицаТоваров.Колонки.Добавить("Номенклатура");
ТаблицаТоваров.Колонки.Добавить("Количество");
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = ТаблицаТоваров.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
КонецЦикла;
ДанныеДокумента.Вставить("Товары", ТаблицаТоваров);
// Оборачиваем данные в структуру-обертку для КД3
ВиртуальныйОбъект = Новый Структура;
ВиртуальныйОбъект.Вставить("Значение", ДанныеДокумента);
ВиртуальныйОбъект.Вставить("ИмяПКО", "Документ_ОстаткиСобственныхТМЦ_Отправка");
// Находим нужное ПОД для документа остатков и отправляем его в выгрузку
ПОДДокумента = КомпонентыОбмена.ПравилаОбработкиДанных.Найти("Документ_ОстаткиСобственныхТМЦ_Стр_Отправка", "Имя");
Если ПОДДокумента <> Неопределено Тогда
ОбменДаннымиXDTOСервер.ВыгрузкаОбъектаВыборки(КомпонентыОбмена, ВиртуальныйОбъект, ПОДДокумента);
КонецЕсли;
КонецЕсли;
При тестировании выгрузки вы можете столкнуться с тем, что данные не выгружаются, а в журнале регистрации фиксируются ошибки. Проанализируем ситуацию: часто в регистре сведений НастройкиОбменаДаннымиXDTO для формата конкретного документа (например, Документ.ОстаткиСобственныхТМЦ) стоит признак только на отправку, а получение отсутствует. БСП сверяет возможности обеих баз и, если принимающая база "не заявила" о готовности принимать этот объект, выгрузка блокируется на стороне источника.
Для устранения этой проблемы выполним следующие действия:
НастройкиОбменаДаннымиXDTO, обновятся автоматически.
// Принудительное обновление локальных настроек обмена XDTO
РегистрыСведений.НастройкиОбменаДаннымиXDTO.ОбновитьНастройки();
// Принудительное обновление настроек для конкретного узла информационной базы
РегистрыСведений.НастройкиОбменаДаннымиXDTO.ОбновитьНастройкиКорреспондента(СсылкаНаУзелПланаОбмена);
Применение этих методов позволит вам успешно организовать гибкую выгрузку остатков любого уровня сложности по произвольным запросам, используя все преимущества современной технологии Конвертации данных 3.0.