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