Добавление колонки остатка в заказ клиента

Клиенту понадобилось в заказе клиента видеть остаток по каждой позиции при работе с документом заказа.

Добавил форму в расширении и там прописал код:

&НаСервере
Процедура дор_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
   
НовыеКолонки = Новый Массив;
   
НовыеКолонки.Добавить(Новый РеквизитФормы(«дор_Остаток», Новый ОписаниеТипов(«Число», Новый КвалификаторыЧисла(10, 2)), «Объект.Товары», «Остаток»));
   
ИзменитьРеквизиты(НовыеКолонки); // ключевая процедура, которая добавляет ревизиты


   
Элемент = Элементы.Вставить(«дор_Остаток», Тип(«ПолеФормы»), Элементы.Товары, Элементы.ТоварыКоличествоУпаковок);
   
Элемент.Вид = ВидПоляФормы.ПолеВвода;
   
Элемент.ПутьКДанным = «Объект.Товары.дор_Остаток»;
   
//Элемент.Заголовок = «Остаток»;

   
дор_ПолучитьОстатки(); //Получаем остатки
КонецПроцедуры

&НаСервере
Процедура дор_ПолучитьОстатки(ИдентификаторСтроки = Неопределено) Экспорт
   
ТЗ = Объект.Товары.Выгрузить(, «НомерСтроки, Номенклатура»);
   
З = Новый Запрос();
   
З.Текст =
   
«ВЫБРАТЬ
    |   Т.НомерСтроки КАК НомерСтроки,
    |   Т.Номенклатура КАК Номенклатура
    |ПОМЕСТИТЬ ТН
    |ИЗ
    |   &ТЗ КАК Т
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |   ТН.НомерСтроки КАК НомерСтроки,
    |   Т.ВНаличииОстаток КАК Остаток
    |ИЗ
    |   ТН КАК ТН
    |       ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, ) КАК Т
    |       ПО ТН.Номенклатура = Т.Номенклатура»
;
   
З.УстановитьПараметр(«Дата», ТекущаяДата());
   
З.УстановитьПараметр(«ТЗ», ТЗ);


   
Выборка = З.Выполнить().Выбрать();
    Пока
Выборка.Следующий() Цикл
       
Остаток = Выборка.Остаток;
       
Объект.Товары[Выборка.НомерСтроки 1].дор_Остаток = Остаток;
    КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура дор_ТоварыПриИзмененииПосле(Элемент)
   
дор_ПолучитьОстатки();
КонецПроцедуры

Как видно из кода, остатки пересчитываются по всем позициям товарного состава документов и заносятся в строки табличной части.

При этом реквизит добавляется программно. Расширение, конечно, позволяет добавлять реквизиты интерактивно, но я все же приверженец old-school.

Процедура дор_ТоварыПриИзмененииПосле — это обработчик события ПриИзменении табличной части Товары. Позволяет отловить измненения в табличной части и пересчитать остатки.

Результат выглядит так:

Аналогичным способом можно вывести остаток и в любой произвольный документ УТ, например, в «Заказ поставщику».

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментария 4

  1. Zuko:

    1. Где отбор по складу?

    2. Почему виртуальная таблица по всем товарам?

    3. Зачем в процедуре неиспользуемый параметр?

    4. Как перечитать данные по остаткам?

    5. Нет данных по доступному остатку и резервам

    6. Зачем при изменении одного товара перечитываются все остатки?

    7. Как единица измерения остатков сопоставлена с единицей товара в заказе?

    • >> 1. Где отбор по складу?
      Не требовалось, один склад.
      >> 2. Почему виртуальная таблица по всем товарам?
      Согласен, можно оптимизировать.
      >> 3. Зачем в процедуре неиспользуемый параметр?
      Первоначально планировалось, что будет отрабатывать для одной строки, но потом оказалось, что проще для всей таблицы сделать.
      >> 4. Как перечитать данные по остаткам?
      Нет такой потребности.
      >> 5. Нет данных по доступному остатку и резервам
      Резервы у клиента не используются.
      >> 6. Зачем при изменении одного товара перечитываются все остатки?
      Почему бы и нет? Там нет больших накладных, более 50 строк.
      >> 7. Как единица измерения остатков сопоставлена с единицей товара в заказе?
      Там нет сложных единиц.

      Спасибо за вопросы, как раз на них удалось показать, чем программирование для реальной жизни отличается от академического.

  2. Zuko:

    А почему бы не написать универсально, чтобы не пришлось повторять код в других документах?

    • Универсально — это как? Не думаю, что у меня прям поток будет таких доработок. Но если будет, скопирую код с этой странички.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *