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