Добавление колонки остатка в заказ клиента
Клиенту понадобилось в заказе клиента видеть остаток по каждой позиции при работе с документом заказа.
Добавил форму в расширении и там прописал код:
&НаСервере
Процедура дор_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
НовыеКолонки = Новый Массив;
НовыеКолонки.Добавить(Новый РеквизитФормы(«дор_Остаток», Новый ОписаниеТипов(«Число», Новый КвалификаторыЧисла(10, 2)), «Объект.Товары», «Остаток»));
ИзменитьРеквизиты(НовыеКолонки); // ключевая процедура, которая добавляет ревизиты
Элемент = Элементы.Вставить(«дор_Остаток», Тип(«ПолеФормы»), Элементы.Товары, Элементы.ТоварыКоличествоУпаковок);
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = «Объект.Товары.дор_Остаток»;
//Элемент.Заголовок = «Остаток»;
дор_ПолучитьОстатки(); //Получаем остатки
КонецПроцедуры
&НаСервере
Процедура дор_ПолучитьОстатки(ИдентификаторСтроки = Неопределено) Экспорт
ТЗ = Объект.Товары.Выгрузить(, «НомерСтроки, Номенклатура»);
З = Новый Запрос();
З.Текст =
«ВЫБРАТЬ
| Т.НомерСтроки КАК НомерСтроки,
| Т.Номенклатура КАК Номенклатура
|ПОМЕСТИТЬ ТН
|ИЗ
| &ТЗ КАК Т
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТН.НомерСтроки КАК НомерСтроки,
| Т.ВНаличииОстаток КАК Остаток
|ИЗ
| ТН КАК ТН
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, ) КАК Т
| ПО ТН.Номенклатура = Т.Номенклатура»;
З.УстановитьПараметр(«Дата», ТекущаяДата());
З.УстановитьПараметр(«ТЗ», ТЗ);
Выборка = З.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Остаток = Выборка.Остаток;
Объект.Товары[Выборка.НомерСтроки — 1].дор_Остаток = Остаток;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура дор_ТоварыПриИзмененииПосле(Элемент)
дор_ПолучитьОстатки();
КонецПроцедуры
Как видно из кода, остатки пересчитываются по всем позициям товарного состава документов и заносятся в строки табличной части.
При этом реквизит добавляется программно. Расширение, конечно, позволяет добавлять реквизиты интерактивно, но я все же приверженец old-school.
Процедура дор_ТоварыПриИзмененииПосле — это обработчик события ПриИзменении табличной части Товары. Позволяет отловить измненения в табличной части и пересчитать остатки.
Результат выглядит так:
Аналогичным способом можно вывести остаток и в любой произвольный документ УТ, например, в «Заказ поставщику».
1. Где отбор по складу?
2. Почему виртуальная таблица по всем товарам?
3. Зачем в процедуре неиспользуемый параметр?
4. Как перечитать данные по остаткам?
5. Нет данных по доступному остатку и резервам
6. Зачем при изменении одного товара перечитываются все остатки?
7. Как единица измерения остатков сопоставлена с единицей товара в заказе?
>> 1. Где отбор по складу?
Не требовалось, один склад.
>> 2. Почему виртуальная таблица по всем товарам?
Согласен, можно оптимизировать.
>> 3. Зачем в процедуре неиспользуемый параметр?
Первоначально планировалось, что будет отрабатывать для одной строки, но потом оказалось, что проще для всей таблицы сделать.
>> 4. Как перечитать данные по остаткам?
Нет такой потребности.
>> 5. Нет данных по доступному остатку и резервам
Резервы у клиента не используются.
>> 6. Зачем при изменении одного товара перечитываются все остатки?
Почему бы и нет? Там нет больших накладных, более 50 строк.
>> 7. Как единица измерения остатков сопоставлена с единицей товара в заказе?
Там нет сложных единиц.
Спасибо за вопросы, как раз на них удалось показать, чем программирование для реальной жизни отличается от академического.
А почему бы не написать универсально, чтобы не пришлось повторять код в других документах?
Универсально — это как? Не думаю, что у меня прям поток будет таких доработок. Но если будет, скопирую код с этой странички.