Еще вопрос по бухгалтерской задаче . Смотрю у некоторых по разному вычисляються ОбщееКоличество и общая сумма . т.е. без учета сроков годности.
например у Niczzz эти значения берутся просто из итогов Регистра по срокам годности и затем при переборе сроков годности происходит вычитание списанных сумм и количества из
этих общих сумм(!) :
Запрос.Текст =
"ВЫБРАТЬ
| ДокТЧ.Номенклатура КАК Номенклатура,
| ДокТЧ.Номенклатура.Представление,
| УправленческийОстатки.Субконто2 КАК СрокГодности,
| ДокТЧ.Количество КАК Количество,
| ЕСТЬNULL(УправленческийОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ЕСТЬNULL(УправленческийОстатки.СуммаОстаток, 0) КАК СуммаОстаток
|ИЗ
| ДокТЧ КАК ДокТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки(
| &МоментВремени,
| Счет = &Товары,
| &Субконто,
| Субконто1 В
| (ВЫБРАТЬ
| ДокТЧ.Номенклатура
| ИЗ
| ДокТЧ КАК ДокТЧ)) КАК УправленческийОстатки
| ПО ДокТЧ.Номенклатура = УправленческийОстатки.Субконто1
|
|УПОРЯДОЧИТЬ ПО
| СрокГодности
|ИТОГИ
| МИНИМУМ(Количество),
| СУММА(КоличествоОстаток),
| СУММА(СуммаОстаток)
|ПО
| Номенклатура";
Субконто = Новый Массив;
Субконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура);
Субконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.СрокГодности);
Запрос.УстановитьПараметр("Субконто", Субконто);
Запрос.УстановитьПараметр("Товары", ПланыСчетов.Управленческий.Товары);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаНоменклатура.Следующий() Цикл
// Вставить обработку выборки ВыборкаНоменклатура
Если ВыборкаНоменклатура.Количество > ВыборкаНоменклатура.КоличествоОстаток Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Недостаточно товара " + ВыборкаНоменклатура.НоменклатураПредставление + " есть только " + ВыборкаНоменклатура.КоличествоОстаток;
Сообщение.Сообщить();
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
ОсталосьСписать = ВыборкаНоменклатура.Количество;
КоличествоОбщийОстаток = ВыборкаНоменклатура.КоличествоОстаток;
СуммаОбщийОстаток = ВыборкаНоменклатура.СуммаОстаток;
ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();
Пока ОсталосьСписать > 0 И ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.СрокГодности = Null Тогда
Продолжить;
КонецЕсли;
// регистр Управленческий
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.СчетКт = ПланыСчетов.Управленческий.Товары;
Движение.Период = Дата;
Движение.КоличествоКт = Мин(ОсталосьСписать, ВыборкаДетальныеЗаписи.КоличествоОстаток);
Движение.Сумма = Движение.КоличествоКт / КоличествоОбщийОстаток * СуммаОбщийОстаток;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.СрокГодности] = ВыборкаДетальныеЗаписи.СрокГодности;
ОсталосьСписать = ОсталосьСписать - Движение.КоличествоКт;
КоличествоОбщийОстаток = КоличествоОбщийОстаток - Движение.КоличествоКт;
СуммаОбщийОстаток = СуммаОбщийОстаток - Движение.Сумма;
КонецЦикла;
КонецЦикла;
А у других делаеться еще одно левое соединение к регистру С субконто без Срока годности:
Субконто1 = Новый Массив;
Субконто1.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура);
Субконто2 = Новый Массив;
Субконто2.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура);
Субконто2.Добавить(ПланыВидовХарактеристик.ВидыСубконто.СрокГодности);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество
|ПОМЕСТИТЬ ТабДок
|ИЗ
| Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
|ГДЕ
| РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
| И РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры <> &Услуга
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТабДок.Номенклатура КАК Номенклатура,
| ТабДок.Количество КАК Количество,
| ЕСТЬNULL(БезСрока.КоличествоОстаток, 0) КАК КоличествоОбщее,
| ЕСТЬNULL(БезСрока.СуммаОстаток, 0) КАК СуммаОбщее,
| СоСроком.Субконто2 КАК СрокГодности,
| ЕСТЬNULL(СоСроком.КоличествоОстаток, 0) КАК КоличествоПоСрокам,
| ТабДок.Номенклатура.Представление
|ИЗ
| ТабДок КАК ТабДок
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки(
| &МоментВремени,
| Счет = &Товары,
| &Субконто1,
| Субконто1 В
| (ВЫБРАТЬ
| ТабДок.Номенклатура
| ИЗ
| ТабДок КАК ТабДок)) КАК БезСрока
| ПО ТабДок.Номенклатура = БезСрока.Субконто1
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки(
| &МоментВремени,
| Счет = &Товары,
| &Субконто2,
| Субконто1 В
| (ВЫБРАТЬ
| ТабДок.Номенклатура
| ИЗ
| ТабДок КАК ТабДок)) КАК СоСроком
| ПО ТабДок.Номенклатура = СоСроком.Субконто1
|
|УПОРЯДОЧИТЬ ПО
| СрокГодности
|ИТОГИ
| МАКСИМУМ(Количество),
| СУММА(КоличествоПоСрокам)
|ПО
| Номенклатура";
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Субконто1", Субконто1);
Запрос.УстановитьПараметр("Субконто2", Субконто2);
Запрос.УстановитьПараметр("Товары", ПланыСчетов.Управленческий.Товары);
Запрос.УстановитьПараметр("Услуга", Перечисления.ВидыНоменклатуры.Услуга);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаНоменклатура = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаНоменклатура.Следующий() Цикл
Нехватка = ВыборкаНоменклатура.Количество - ВыборкаНоменклатура.КоличествоПоСрокам;
Если Нехватка >0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "В документе № " + Номер + " не хватает " + ВыборкаНоменклатура.НоменклатураПредставление + " в количестве " + Нехватка ;
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Если НЕ Отказ Тогда
ОсталосьСписать = ВыборкаНоменклатура.Количество;
Выборка = ВыборкаНоменклатура.Выбрать();
Пока Выборка.Следующий() И ОсталосьСписать>0 Цикл
Списать = МИН(ОсталосьСписать, Выборка.КоличествоПоСрокам);
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Управленческий.ПрибылиУбытки;
Движение.СчетКт = ПланыСчетов.Управленческий.Товары;
Движение.Период = Дата;
Движение.КоличествоКт = Списать;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.СрокГодности] = Выборка.СрокГодности;
Если Списать = Выборка.КоличествоОбщее Тогда
Движение.Сумма = Выборка.СуммаОбщее;
Иначе
Движение.Сумма = Списать * Выборка.СуммаОбщее / Выборка.КоличествоОбщее;
КонецЕсли;
ОсталосьСписать = ОсталосьСписать - Списать;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Это просто два разных ПРАВИЛЬНЫХ варианта решения одной задачи или все таки есть принципиальное различие? Мне лично Первый вариант кажется немного сомнительным.
Интересно ваше мнение.
Спасибо.