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