Часто перед разработчиком 1С встает задача сличить данные, хранящиеся в информационной базе, с внешними источниками — например, таблицами Excel, CSV-файлами или загруженными массивами данных. Простейший и наиболее гибкий способ решения этой задачи в схеме компоновки данных (СКД) — использование объединения наборов данных с подключением внешнего набора типа Объект.
Рассмотрим подробно, как правильно организовать получение данных из регистра и внешнего файла, связать их в единый отчет и корректно настроить ресурсы для расчета отклонений.
Проанализируем структуру данных базы. В нашем случае требуется выгрузить движении или остатки из регистра накопления ТоварыНаСкладах. Для этого создадим в СКД Набор данных — Запрос и напишем следующий текст запроса:
ВЫБРАТЬ
ТИПЗНАЧЕНИЯ(ТоварыНаСкладах.Регистратор) КАК ТипДокумента,
ТоварыНаСкладах.Склад КАК Склад,
ТоварыНаСкладах.Регистратор КАК Документ,
ТоварыНаСкладах.Номенклатура КАК Номенклатура,
ТоварыНаСкладах.Период КАК Дата,
ТоварыНаСкладах.ВНаличии КАК Количество
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
В этом запросе мы получаем общие поля группировки (Склад, Документ, Номенклатура, ТипДокумента), а также специфические показатели текущей базы — Дата и Количество.
Данные из файла нельзя сразу прочитать языком запросов 1С без предварительной загрузки. Поэтому в схеме компоновки данных добавим Набор данных — Объект и назовем его, например, ДанныеФайла.
В списке полей данного набора добавим следующие колонки:
ТипДокументаСкладДокументНоменклатураДатаФайл — дата операции согласно внешнему файлу;КоличествоФайл — количество товара по данным файла.Важное правило: для общих полей аналитики (Номенклатура, Склад, Документ) псевдонимы в обоих наборах должны строго совпадать. Различающиеся показатели должны иметь уникальные имена (Дата и ДатаФайл, Количество и КоличествоФайл).
Чтобы избежать потери строк, которые присутствуют в файле, но отсутствуют в базе (или наоборот), не рекомендуемся использовать связь наборов данных, так как она работает как левое соединение. Вместо этого применим Набор данных — Объединение.
НаборДанныхЗапрос и НаборДанныхОбъект.Для того чтобы отчет корректно выводил итоговые количества, даты и рассчитывал отклонения, проанализируем настройки вкладки Вычисляемые поля и Ресурсы.
На вкладке Вычисляемые поля добавим поле расхождения количеств:
ЕСТЬNULL(Количество, 0) - ЕСТЬNULL(КоличествоФайл, 0)ОтклонениеПерейдем на вкладку Ресурсы. Чтобы числовые показатели суммировались по группировкам, выберем для них стандартную функцию aggregation:
Количество — выражение: Сумма(Количество)КоличествоФайл — выражение: Сумма(КоличествоФайл)Отклонение — выражение: Сумма(Отклонение)Отдельный вопрос касается дат из базы и файла. Если требуется выводить даты в итоговых строках или общих группировках, сделать их ресурсами можно, но функция Сумма() к типам Дата неприменима. В этом случае для дат задается функция Максимум():
Дата — выражение: Максимум(Дата)ДатаФайл — выражение: Максимум(ДатаФайл)При вызове отчета из кода (или в модуле объекта отчета при переопределении процедуры ПриКомпоновкеРезультата) считаем файл в объект ТаблицаЗначений и передадим ее в компоновку данных:
// 1. Программно считываем файл в Таблицу Значений
ТаблицаИзФайла = ПрочитатьДанныеИзФайла(ПутьКФайлу);
// 2. Формируем структуру внешних наборов данных
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ДанныеФайла", ТаблицаИзФайла);
// 3. Выполняем компоновку макета
СхемаКомпоновки = ПолучитьМакет("СхемаКомпоновкиДанных");
Настройки = СхемаКомпоновки.НастройкиПоУмолчанию;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
СDocument = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(СDocument);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Благодаря использованию агрегации Максимум(Дата) и ресурсов для количеств, СКД сведет записи с одинаковой номенклатурой и документами в единые строки, наглядно отобразив расхождения между информационной базой и сторонним файлом.