Установка:
Компонента реализована в виде класса 1С++. Подключение компоненты стандартно (прописывается строка c описанием класса) в файл defcls.prm в папке базы:
class БыстрыйРегистр = БыстрыйРегистр.ert
{}
Использование:
Создание экземпляра объекта БыстрыйРегистр:
БыстрыйРег = СоздатьОбъект("БыстрыйРегистр");
Перед каждым использованием желательно вызвать метод СброситьНастройки();
Чтобы отобрать по значению измерения (реквизита в случае движений) нужно перед получением данных вызвать метод ИспользоватьОтбор
ИспользоватьОтбор(ИмяРеквизитаОтбора , ЗначениеОтбора, ПризнакРазворачивания );
ИмяРеквизитаОтбора - Имя измерения или реквизита в виде строки
ЗначениеОтбора - Одно значение или список значений
ПризнакРазворачивания - Должно (1) или нет (0) попадать поле таблицы в группировку (в результирующие данные). Актуально для списков значений
Если отбор не осуществляется, но поле необходимо добавить в результат, нужно вызвать ВыводитьИзмерение
ВыводитьИзмерение(ИмяИзмерения, ТипИзмерения )
ТипИзмерения в виде "Справочник.МестаХранения", "Число" ....
Само получение данных осуществуляется вызовом следующих методов:
Функция ПолучитьОстатки(ИмяРегистра, ПолеКоличество = "Количество", ПолеСумма = "Сумма", МоментВремени = 0,
УсловиеСоединения = "", Параметры = "", СтандартныйРегистр = 0, СтрокаСортировки = "", ТЗ = "", СтрокаWHERE = "") Экспорт
Функция ПолучитьДвижения(ИмяРегистра, Регистратор = 0,
МоментВремениОт = 0, МоментВремениДо = 0,
ПолеКоличество = "Количество", ПолеСумма = "Сумма", СтандартныйРегистр = 0, ТЗ = "", СтрокаWHERE = "" ) Экспорт
ИмяРегистра - Имя регистра в кавычках (например, "ТоварыНаСкладах")
ПолеКоличество, ПолеСумма - названия 1-го и 2-го ресурса (могут быть любыми, кол-во и сумма взяты для примера как самые распространенные )
МоментВремени (МоментВремениОт, МоментВремениДо) - дата или документ на который рассчитываются итоги или между которыми берутся движения
Регистратор - если нужно получить движения по данному регистратору (документу)
УсловиеСоединения - строка , в которой можно добавить соеднение с другими таблицами (см. пример ниже)
Параметры - список значений, в который передаются параметры (значение и имя параметра в качестве строкового описания значения в списке - см. пример ниже)
СтрокаWHERE - строка, которая может быть поставлена в место для оператора WHERE
СтрокаСортировки - строка, которая может быть поставлена в место для оператора ORDER BY
ТЗ - можно передать готовую ТЗ для уменьшения операций копирования (экономия памяти)
где возвращаемое значение - таблица значений с выходными полями измерений и реквизитов, а также ресурсов (максимальное количество ресурсов в данной реализации - 2 (например, "Количество" и "Сумма"), но его не трудно расширить)
и упрощенной функции получения скалярного остатка:
Функция ПолучитьОстаток(ИмяРегистра, ИмяРесурса, МоментВремени = 0, УсловиеСоединения = "", Параметры = "")
Параметры данной функции аналогичны предыдущим
Кроме того, если используется соединение с другими таблицами (например, со Справочник.Номенклатура), то можно вывести поля из этой таблицы в результат с помощью метода ВыводитьПроизвольноеПоле:
ВыводитьПроизвольноеПоле(ИмяТаблицы, ИмяПоля)
ИмяТаблицы - имя таблицы, с которой идет соединение (ВНИМАНИЕ, если используется символ разыменования 1С++ "$" в запросе, то здесь он тоже должен быть указан!)
ИмяПоля - имя поля из этой таблицы
ПРИМЕР1 (получить скалярный остаток):
Функция глПолучитьОстаток(Товар = "", Склад = "", Серия = "", Поставка = "", ДатаОстатков = 0, ДатаПроверкиПоставок = 0) Экспорт
БыстрыйРег.СброситьНастройки();
БыстрыйРег.ИспользоватьОтбор("Товар", Товар);
Если Склад <> "" Тогда
БыстрыйРег.ИспользоватьОтбор("Склад", Склад);
КонецЕсли;
Если Серия <> "" Тогда
БыстрыйРег.ИспользоватьОтбор("Серия", Серия);
КонецЕсли;
Если Поставка <> "" Тогда
БыстрыйРег.ИспользоватьОтбор("Поставка", Поставка);
КонецЕсли;
Если ДатаПроверкиПоставок <> 0 Тогда
Условие = "
| JOIN $Справочник.Поставки as Поставки ON ($Р.Поставка = Поставки.Id
| AND $Поставки.ДатаПоставки <= "+глСКЛПараметрДаты("ДатаПроверкиПоставок") +")";
Параметры = СоздатьОбъект("СписокЗначений");
Параметры.Установить("ДатаПроверкиПоставок", ?(ДатаПроверкиПоставок = 0, ТекущаяДата(), ДатаПроверкиПоставок));
Возврат БыстрыйРег.ПолучитьОстаток("ОстаткиТоваров", "Количество", ДатаОстатков, Условие, Параметры);
Иначе
Возврат БыстрыйРег.ПолучитьОстаток("ОстаткиТоваров", "Количество", ДатаОстатков);
КонецЕсли;
КонецФункции
ПРИМЕР2 (получить выборку остатков по настраиваемым условиям):
Примечание: Все переменные списки могут быть как одиночными значениями, так и списками значений
Функция глПолучитьОстаткиПоТоварам(Склад = "", СписокТоваров = "", СписокСерий = "", СписокПоставок = "",
РазворачиватьТовары = 1, РазворачиватьСерии = 1, РазворачиватьПоставки = 0, ДатаОстатков = 0, ДатаПроверкиПоставок = 0,
УчитыватьГорячийРезерв = 0, РазворачиватьСклады = 0, ПолучатьСертификационныеДанные = 0, ТЗ = "") Экспорт
БыстрыйРег.СброситьНастройки();
Если Склад <> "" Тогда
БыстрыйРег.ИспользоватьОтбор("Склад", Склад, РазворачиватьСклады);
ИначеЕсли РазворачиватьСклады = 1 Тогда
БыстрыйРег.ВыводитьИзмерение("Склад", "Справочник.МестаХранения");
КонецЕсли;
Если СписокТоваров <> "" Тогда
БыстрыйРег.ИспользоватьОтбор("Товар", СписокТоваров, РазворачиватьТовары);
ИначеЕсли РазворачиватьТовары = 1 Тогда
БыстрыйРег.ВыводитьИзмерение("Товар", "Справочник.Товары");
КонецЕсли;
Если СписокСерий <> "" Тогда
БыстрыйРег.ИспользоватьОтбор("Серия", СписокСерий, РазворачиватьСерии);
ИначеЕсли РазворачиватьСерии = 1 Тогда
БыстрыйРег.ВыводитьИзмерение("Серия", "Справочник.Серии");
КонецЕсли;
Если СписокПоставок <> "" Тогда
БыстрыйРег.ИспользоватьОтбор("Поставка", СписокПоставок, РазворачиватьПоставки);
ИначеЕсли РазворачиватьПоставки = 1 Тогда
БыстрыйРег.ВыводитьИзмерение("Поставка", "Справочник.Поставки");
КонецЕсли;
Условие = "";
Если ПустоеЗначение(ДатаПроверкиПоставок) = 0 Тогда
Условие = "
| JOIN $Справочник.Поставки as Поставки " + ?(глСКЛ = 1," WITH (nolock) ", " ") + " ON ($Р.Поставка = Поставки.Id
| AND $Поставки.ДатаПоставки <= "+ глСКЛПараметрДаты("ДатаПроверкиПоставок") +")";
КонецЕсли;
Если ПолучатьСертификационныеДанные = 1 Тогда
Условие = Условие + "
| JOIN $Справочник.Товары as Товары " + ?(глСКЛ = 1," WITH (nolock) ", " ") + " ON ($Р.Товар = Товары.Id)
| LEFt JOIN $Справочник.СтавкиНДС СтавкиНДС ON СтавкиНДС.Id = $Товары.СтавкаНДС";
БыстрыйРег.ВыводитьПроизвольноеПоле("$Товары", "СрСебестоимость");
БыстрыйРег.ВыводитьПроизвольноеПоле("$СтавкиНДС", "Ставка");
Условие = Условие + "
| JOIN $Справочник.Серии as Серии " + ?(глСКЛ = 1," WITH (nolock) ", " ") + " ON ($Р.Серия = Серии.Id)";
БыстрыйРег.ВыводитьПроизвольноеПоле("$Серии", "СрокГодности");
Условие = Условие + "
| JOIN $Справочник.Сертификаты as Сертификаты " + ?(глСКЛ = 1," WITH (nolock) ", " ") + " ON ($Поставки.Сертификат = Сертификаты.Id)";
Для Сч = 1 По глСписРегионы.РазмерСписка() Цикл
Стр = 0;
глСписРегионы.ПолучитьЗначение(Сч, Стр);
БыстрыйРег.ВыводитьПроизвольноеПоле("$Сертификаты", "Статус" + Стр, "Перечисление.СтатусыСерий");
КонецЦикла;
КонецЕсли;
Если УчитыватьГорячийРезерв = 1 Тогда
Условие = Условие + "
| JOIN $Справочник.ПрайсЛист " + ?(глСКЛ = 1," WITH (nolock) ", " ") + " as ПрайсЛист ON ($Р.Товар = $ПрайсЛист.Товар)";
БыстрыйРег.ВыводитьПроизвольноеПоле("$ПрайсЛист","КоличествоГорРезерв");
КонецЕсли;
Параметры = СоздатьОбъект("СписокЗначений");
Параметры.Установить("ДатаПроверкиПоставок", ?(ДатаПроверкиПоставок = 0, ТекущаяДата(), ДатаПроверкиПоставок));
Если ТЗ = "" Тогда
ТЗ = СоздатьОбъект("ТаблицаЗначений");
КонецЕсли;
БыстрыйРег.ПолучитьОстатки("ОстаткиТоваров", , "", ДатаОстатков, Условие, Параметры,,, ТЗ);
БыстрыйРег.РежимОтладки = 0;
Возврат ТЗ;
КонецФункции
ПРИМЕР3 (получить выборку движений):
Функция глПолучитьДвиженияПоРегиструОстатков(ДатаОт = 0, ДатаДо = 0, Склад,
СписокТоваров = "", СписокСерий = "", СписокПоставок = "", Док = 0, РазворачиватьСклады = 0) Экспорт
БыстрыйРег.СброситьНастройки();
Если Склад <> "" Тогда
БыстрыйРег.ИспользоватьОтбор("Склад", Склад, 1);
ИначеЕсли РазворачиватьСклады = 1 Тогда
БыстрыйРег.ВыводитьИзмерение("Склад", "Справочник.МестаХранения");
КонецЕсли;
Если СписокТоваров <> "" Тогда
БыстрыйРег.ИспользоватьОтбор("Товар", СписокТоваров, 1);
КонецЕсли;
Если СписокСерий <> "" Тогда
БыстрыйРег.ИспользоватьОтбор("Серия", СписокСерий, 1);
КонецЕсли;
Если СписокПоставок <> "" Тогда
БыстрыйРег.ИспользоватьОтбор("Поставка", СписокПоставок, 1);
КонецЕсли;
Возврат БыстрыйРег.ПолучитьДвижения("ОстаткиТоваров", Док ,ДатаОт, ДатаДо, , "" );
КонецФункции