1) На большом объеме данных может сильно задумываться. Таблицы для определения партий не обрезаются левой датой, используется много больших по объему временных таблиц. Поэтому, чем меньше выбранной номенклатуры, тем быстрее формирование. Лучше всего формировать с отбором по одной номенклатуре (использовался именно для этого), формируется мгновенно.
2) Для определения суммы списания в рамках склада, необходимо, чтобы на выбранном счете номенклатуры для субконто вида "Склады" велся суммовой учет и оно присутствовало в составе субконто счета, иначе разворот сумм списания по таблицам остатков и оборотов по складу не будет выполняться.
Предполагается, что пользователь в зависимости от установленной политики учета себестоимости на предприятии в "целом" выставит параметр "Номер субконто склад" в параметрах отчета. Если значение параметра = 0, тогда разворот по складу не будет использоваться (разрез будет заполняться пустыми значениями). Если параметр от 1 до 3, то разрез отчета по складам будет зависеть от того есть ли на счете субконто типа "Склады" и стоит ли на этом субконто признак суммовой. Для каждого выбранного в настройке счета производится отдельное определение данного принципа.
Листинг определения разворота по складу счета
//////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Вложенный.Ссылка,
НЕ МАКСИМУМ(Вложенный.ИспользоватьРазворотПоСкладу) КАК НеИспользоватьРазворотПоСкладу,
МАКСИМУМ(Вложенный.ИспользоватьРазворотПоСкладу) КАК ИспользоватьРазворотПоСкладу
ПОМЕСТИТЬ Счета
ИЗ
(ВЫБРАТЬ
Хозрасчетный.Ссылка КАК Ссылка,
ВЫБОР
КОГДА &НомерСубконтоСклад > 0
ТОГДА ИСТИНА
ИНАЧЕ Ложь
КОНЕЦ КАК ИспользоватьРазворотПоСкладу
ИЗ
ПланСчетов.Хозрасчетный.ВидыСубконто КАК Хозрасчетный
ГДЕ
Хозрасчетный.Ссылка В ИЕРАРХИИ(&Счет10)
И ВЫБОР КОГДА
&НомерСубконтоСклад > 0
ТОГДА Хозрасчетный.ВидСубконто = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады)
И Хозрасчетный.Суммовой
ИНАЧЕ ИСТИНА КОНЕЦ
ОБЪЕДИНИТЬ
ВЫБРАТЬ
Хозрасчетный.Ссылка,
ЛОЖЬ
ИЗ
ПланСчетов.Хозрасчетный КАК Хозрасчетный
ГДЕ
Хозрасчетный.Ссылка В ИЕРАРХИИ(&Счет10)) КАК Вложенный
СГРУППИРОВАТЬ ПО
Ссылка
//////////////////////////////////////////////////////////////////
а) Листинг получения данных по списанию
ВЫБРАТЬ
ТоварыПериоды.ДатаТаблицы КАК ДатаТаблицы,
ТоварыПериоды.Номенклатура КАК Номенклатура,
ТоварыПериоды.Склад КАК Склад,
ТоварыПериоды.Счет КАК СчетУчета,
СУММА(ЕСТЬNULL(Обороты.КоличествоОборотКт, 0)) КАК РасходВсего,
СУММА(ЕСТЬNULL(Обороты.СуммаОборотКт, 0)) КАК СуммаРасходВсего
ПОМЕСТИТЬ ПериодыОборотыРасхода_ПоДням
ИЗ
ТоварыПериоды КАК ТоварыПериоды //Таблица дней разрезе счета, номенклатуры и склада (опционально)
ЛЕВОЕ СОЕДИНЕНИЕ Счета КАК Счета ПО ТоварыПериоды.Счет = Счета.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Обороты(
,
&ДатаКон,
День,
Счет В
(ВЫБРАТЬ
Счета.Ссылка
ИЗ
Счета),
,
(Организация = &Организация) И (ВЫРАЗИТЬ(Субконто1 КАК Справочник.Номенклатура)) = &П,
,
) КАК Обороты
ПО ТоварыПериоды.ДатаТаблицы >= Обороты.Период
И ТоварыПериоды.Счет = Обороты.Счет
И (ТоварыПериоды.Номенклатура = ВЫРАЗИТЬ(Обороты.Субконто1 КАК Справочник.Номенклатура))
// ОПТИМИЗАЦИЯ
И НЕ (НЕ Счета.НеИспользоватьРазворотПоСкладу И НЕ ПериодыОборотыРасхода_ПоДням.Склад = ВЫРАЗИТЬ(Обороты.Субконто2 КАК Справочник.Склады))
//И (ВЫБОР КОГДА Счета.НеИспользоватьРазворотПоСкладу
// ТОГДА ИСТИНА
//ИНАЧЕ
// ТоварыПериоды.Склад = ВЫРАЗИТЬ(Обороты.Субконто2 КАК Справочник.Склады) КОНЕЦ)
СГРУППИРОВАТЬ ПО
ТоварыПериоды.ДатаТаблицы,
ТоварыПериоды.Номенклатура,
ТоварыПериоды.Склад,
ТоварыПериоды.Счет
ИМЕЮЩИЕ
(СУММА(ЕСТЬNULL(Обороты.КоличествоОборотКт, 0)) > 0
ИЛИ СУММА(ЕСТЬNULL(Обороты.СуммаОборотКт, 0)) > 0)
б) Приходы собираются по физическим таблицам движений и субконто регистра бухгалтерии, т.к. необходим разрез по регистратору.
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Вложенный.Период, ДЕНЬ) КАК Период,
Вложенный.Регистратор,
Вложенный.Номенклатура,
Вложенный.СчетУчета,
Вложенный.Склад КАК Склад,
ЕСТЬNULL(МАКСИМУМ(Вложенный.Контрагент), "Собственный") КАК Контрагент,
СУММА(Вложенный.Сумма) КАК Сумма,
СУММА(Вложенный.Количество) КАК Количество
ИЗ
(ВЫБРАТЬ
Движения.Период КАК Период,
ХозрасчетныйСубконто.Регистратор КАК Регистратор,
Движения.СчетДт КАК СчетУчета,
Движения.НомерСтроки КАК НомерСтроки,
Движения.Сумма КАК Сумма,
Движения.КоличествоДт КАК Количество,
ХозрасчетныйСубконто.Значение КАК Номенклатура,
ВЫБОР
КОГДА НЕ Счета.ИспользоватьРазворотПоСкладу
ТОГДА NULL
ИНАЧЕ ХозрасчетныйСубконтоСклады.Значение
КОНЕЦ КАК Склад,
ХозрасчетныйСубконтоКонтрагенты.Значение КАК Контрагент
ИЗ
РегистрБухгалтерии.Хозрасчетный.Субконто КАК ХозрасчетныйСубконто
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТоварыДляОтбора КАК ТоварыДляОтбора
ПО (ТоварыДляОтбора.Номенклатура = (ВЫРАЗИТЬ(ХозрасчетныйСубконто.Значение КАК Справочник.Номенклатура)))
И (ХозрасчетныйСубконто.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияБухгалтерии.Дебет))
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный КАК Движения
ПО (ТоварыДляОтбора.Счет = Движения.СчетДт)
И ХозрасчетныйСубконто.Регистратор = Движения.Регистратор
И ХозрасчетныйСубконто.НомерСтроки = Движения.НомерСтроки
И (Движения.Период <= &ДатаКон)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Счета КАК Счета
ПО (Движения.СчетДт = Счета.Ссылка)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Субконто КАК ХозрасчетныйСубконтоСклады
ПО (ХозрасчетныйСубконтоСклады.Регистратор = Движения.Регистратор)
И ХозрасчетныйСубконто.НомерСтроки = ХозрасчетныйСубконтоСклады.НомерСтроки
И ХозрасчетныйСубконто.ВидДвижения = ХозрасчетныйСубконтоСклады.ВидДвижения
И (Счета.ИспользоватьРазворотПоСкладу)
И (ТоварыДляОтбора.Склад = (ВЫРАЗИТЬ(ХозрасчетныйСубконтоСклады.Значение КАК Справочник.Склады)))
ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Субконто КАК ХозрасчетныйСубконтоКонтрагенты
ПО (ХозрасчетныйСубконтоКонтрагенты.Регистратор = Движения.Регистратор)
И ХозрасчетныйСубконто.НомерСтроки = ХозрасчетныйСубконтоКонтрагенты.НомерСтроки
И (ХозрасчетныйСубконтоКонтрагенты.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияБухгалтерии.Кредит))
И (ВЫРАЗИТЬ(ХозрасчетныйСубконтоКонтрагенты.Значение КАК Справочник.Контрагенты) ЕСТЬ НЕ NULL )
ГДЕ ВЫБОР КОГДА Счета.ИспользоватьРазворотПоСкладу ТОГДА
ВЫРАЗИТЬ(ХозрасчетныйСубконтоСклады.Значение КАК Справочник.Склады) ЕСТЬ НЕ NULL
ИНАЧЕ ИСТИНА КОНЕЦ
СГРУППИРОВАТЬ ПО
Движения.Период,
ХозрасчетныйСубконто.Регистратор,
Движения.СчетДт,
Движения.НомерСтроки,
Движения.Сумма,
Движения.КоличествоДт,
ХозрасчетныйСубконто.Значение,
ХозрасчетныйСубконтоКонтрагенты.Значение,
ВЫБОР
КОГДА НЕ Счета.ИспользоватьРазворотПоСкладу
ТОГДА NULL
ИНАЧЕ ХозрасчетныйСубконтоСклады.Значение
КОНЕЦ) КАК Вложенный
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(Вложенный.Период, ДЕНЬ),
Вложенный.Регистратор,
Вложенный.Номенклатура,
Вложенный.СчетУчета,
Вложенный.Склад
//////////////////////////////////////////////////////////////////
Принцип построения отчета на примере из ЕРП 2.4/2.5
Отчет строится в разрезе Номенклатуры, Склада, СчетаУчета и Даты (до дня) оборота
а) Выбираются обороты списания по отобранной номенклатуре за выбранный период отчета.
Важно делать отбор по номенклатуре (в идеале до одной позиции)
б) Выбираются все поступления до даты конца отчета
в) Для того чтобы однозначно определить приход в рамках одного дня, рассчитывается системный период
г) К данным по оборотам списания (а) присоединяются все приходы в рассматриваемом разрезе отчета,
идущие до конца дня даты списания (в). По каждому подходящему поступлению,
подсчитывается разница между общим количеством поступления на момент данного прихода
и общей потребностью списания на конец дня списания.
Таким образом нарастающим итогом учитываются все списания, идущие до рассматриваемого.
д) Далее, еще через пару временных таблиц подсчитывается количество,
списанное по определенному приходу, если по рассматриваемому приходу есть остаток на конец дня списания (списание берется оборотами за день).
Так же рассчитывается сумма списания по данному приходу, исходя из формулы:
СуммаСписаноВПромежутке = РасходВсегоСумма * СписаноВПромежутке / РасходВсего
е) Далее таблица распределенных расходов по дням объединяется с таблицей оборотов приходов по датам приходов.
Данные группируются в итоговую таблицу (приходов за день и расходов, закрытых приходами).
На каждую дату результирующей таблицы получается начальный остаток, и последовательно по каждой строке рассчитывается конечный остаток.
ОСВ для данного примера:
Еще несколько тестов для других конфигураций
Расчет в БП 3 (склад - субконто3).
Расчет в КА 1.1 (склад - субконто2, не стоит признак "суммовой")
Универсально работает на всех бухгалтерских конфигурациях 1С (проверено ЕРП 2.4/2.5, Бухгалтерия 2.0/3.0, УПП 1.3, КА 1.1/2).
Тестировалось на:
- ЕРП 2.5.6.195
- БП 3.0.66.60
- БП 2.0.67.25
Проверено на следующих конфигурациях и релизах:
- 1С:ERP Управление предприятием 2, релизы 2.5.6.195
- Бухгалтерия предприятия, редакция 3.0, релизы 3.0.66.60
- Бухгалтерия предприятия, редакция 2.0, релизы 2.0.67.25