Как настроить отчет на СКД для сверки остатков из регистра с данными из внешнего файла?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

Часто перед разработчиком 1С встает задача сличить данные, хранящиеся в информационной базе, с внешними источниками — например, таблицами Excel, CSV-файлами или загруженными массивами данных. Простейший и наиболее гибкий способ решения этой задачи в схеме компоновки данных (СКД) — использование объединения наборов данных с подключением внешнего набора типа Объект.

Рассмотрим подробно, как правильно организовать получение данных из регистра и внешнего файла, связать их в единый отчет и корректно настроить ресурсы для расчета отклонений.

Шаг 1. Формирование набора данных из информационной базы

Проанализируем структуру данных базы. В нашем случае требуется выгрузить движении или остатки из регистра накопления ТоварыНаСкладах. Для этого создадим в СКД Набор данных — Запрос и напишем следующий текст запроса:


ВЫБРАТЬ
    ТИПЗНАЧЕНИЯ(ТоварыНаСкладах.Регистратор) КАК ТипДокумента,
    ТоварыНаСкладах.Склад КАК Склад,
    ТоварыНаСкладах.Регистратор КАК Документ,
    ТоварыНаСкладах.Номенклатура КАК Номенклатура,
    ТоварыНаСкладах.Период КАК Дата,
    ТоварыНаСкладах.ВНаличии КАК Количество
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах

В этом запросе мы получаем общие поля группировки (Склад, Документ, Номенклатура, ТипДокумента), а также специфические показатели текущей базы — Дата и Количество.

Шаг 2. Создание набора данных для внешнего файла

Данные из файла нельзя сразу прочитать языком запросов 1С без предварительной загрузки. Поэтому в схеме компоновки данных добавим Набор данных — Объект и назовем его, например, ДанныеФайла.

В списке полей данного набора добавим следующие колонки:

  1. ТипДокумента
  2. Склад
  3. Документ
  4. Номенклатура
  5. ДатаФайл — дата операции согласно внешнему файлу;
  6. КоличествоФайл — количество товара по данным файла.

Важное правило: для общих полей аналитики (Номенклатура, Склад, Документ) псевдонимы в обоих наборах должны строго совпадать. Различающиеся показатели должны иметь уникальные имена (Дата и ДатаФайл, Количество и КоличествоФайл).

Шаг 3. Объединение наборов данных

Чтобы избежать потери строк, которые присутствуют в файле, но отсутствуют в базе (или наоборот), не рекомендуемся использовать связь наборов данных, так как она работает как левое соединение. Вместо этого применим Набор данных — Объединение.

  1. Создадим корневой Набор данных — Объединение.
  2. Переместим внутрь него созданные ранее НаборДанныхЗапрос и НаборДанныхОбъект.
  3. Убедимся, что общие поля сгруппированы под одинаковыми именами.

Шаг 4. Настройка вычисляемых полей и ресурсов

Для того чтобы отчет корректно выводил итоговые количества, даты и рассчитывал отклонения, проанализируем настройки вкладки Вычисляемые поля и Ресурсы.

На вкладке Вычисляемые поля добавим поле расхождения количеств:

  1. Выражение: ЕСТЬNULL(Количество, 0) - ЕСТЬNULL(КоличествоФайл, 0)
  2. Путь к данным: Отклонение

Перейдем на вкладку Ресурсы. Чтобы числовые показатели суммировались по группировкам, выберем для них стандартную функцию aggregation:

  1. Количество — выражение: Сумма(Количество)
  2. КоличествоФайл — выражение: Сумма(КоличествоФайл)
  3. Отклонение — выражение: Сумма(Отклонение)

Отдельный вопрос касается дат из базы и файла. Если требуется выводить даты в итоговых строках или общих группировках, сделать их ресурсами можно, но функция Сумма() к типам Дата неприменима. В этом случае для дат задается функция Максимум():

  1. Дата — выражение: Максимум(Дата)
  2. ДатаФайл — выражение: Максимум(ДатаФайл)

Шаг 5. Программный вывод отчета с внешним источником

При вызове отчета из кода (или в модуле объекта отчета при переопределении процедуры ПриКомпоновкеРезультата) считаем файл в объект ТаблицаЗначений и передадим ее в компоновку данных:


// 1. Программно считываем файл в Таблицу Значений
ТаблицаИзФайла = ПрочитатьДанныеИзФайла(ПутьКФайлу);

// 2. Формируем структуру внешних наборов данных
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ДанныеФайла", ТаблицаИзФайла);

// 3. Выполняем компоновку макета
СхемаКомпоновки = ПолучитьМакет("СхемаКомпоновкиДанных");
Настройки = СхемаКомпоновки.НастройкиПоУмолчанию;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки, ДанныеРасшифровки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);

СDocument = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(СDocument);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Благодаря использованию агрегации Максимум(Дата) и ресурсов для количеств, СКД сведет записи с одинаковой номенклатурой и документами в единые строки, наглядно отобразив расхождения между информационной базой и сторонним файлом.

← На главную