Добавление информации о заказе в список реализаций УТ11

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

Я уточнил, что могу по каждому заказу вытаскивать эти данные и выводить их в реализацию, так подойдет? Клиент подтвердил.

Начинаю работать. У заказа покупателя две формы списка, по внешнему виду (составу колонок табличной части) понимаем, что речь идет о ФормаСпискаДокументов:

Проанализируем текст запроса динамического списка Список по заказам:

Теперь посмотрим текст запроса списка документов реализации СписокРеализацииТоваровУслуг:

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


&НаСервере
Процедура дор_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

   
//Добавляем поля
   
МаркерПоля = «Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг»;
   
СписокРеализацииТоваровУслуг.ТекстЗапроса = СтрЗаменить(СписокРеализацииТоваровУслуг.ТекстЗапроса, МаркерПоля, МаркерПоля + «
    |ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияЗаказовКлиентов КАК СостоянияЗаказовКлиентов
    |ПО (СостоянияЗаказовКлиентов.Заказ = РеализацияТоваровУслуг.ЗаказКлиента)
    |»
);

   
//Поля скопированы из текста запроса по заказам
   
МаркерПоля = «ВЫБРАТЬ»;
   
ТекстПолей = «
    |ВЫБОР
    |    КОГДА (НЕ ДокументЗаказКлиента.Проведен)
    |        ТОГДА ЗНАЧЕНИЕ(Перечисление.СостоянияЗаказовКлиентов.ПустаяСсылка)
    |    ИНАЧЕ ЕСТЬNULL(СостоянияЗаказовКлиентов.Состояние, ЗНАЧЕНИЕ(Перечисление.СостоянияЗаказовКлиентов.Закрыт))
    |КОНЕЦ КАК Состояние,
    |ВЫБОР
    |    КОГДА (НЕ ДокументЗаказКлиента.Проведен)
    |        ТОГДА ЛОЖЬ
    |    КОГДА СостоянияЗаказовКлиентов.ДатаСобытия <> ДАТАВРЕМЯ(1, 1, 1)
    |    И &ДатаАктуальности > СостоянияЗаказовКлиентов.ДатаСобытия
    |        ТОГДА ИСТИНА
    |    ИНАЧЕ ЛОЖЬ
    |КОНЕЦ КАК Просрочен,
    |ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаОплаты, 0) КАК СуммаОплаты,
    |ЕСТЬNULL(СостоянияЗаказовКлиентов.ПроцентОплаты, 0) КАК ПроцентОплаты,
    |ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаОтгрузки, 0) КАК СуммаОтгрузки,
    |ЕСТЬNULL(СостоянияЗаказовКлиентов.ПроцентОтгрузки, 0) КАК ПроцентОтгрузки,
    |ВЫБОР
    |    КОГДА ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаДолга, 0) < 0
    |        ТОГДА ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаДолга, 0)
    |    ИНАЧЕ 0
    |КОНЕЦ КАК НашДолг,
    |ВЫБОР
    |    КОГДА ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаДолга, 0) > 0
    |        ТОГДА ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаДолга, 0)
    |    ИНАЧЕ 0
    |КОНЕЦ КАК ДолгКлиента,
    |ЕСТЬNULL(СостоянияЗаказовКлиентов.ПроцентДолга, 0) КАК ПроцентДолга,»
;
   
//В конце запятая, это важно, вставляем после ВЫБРАТЬ перед полями исходного запроса

    //Берем исходный текст из заказа, но заменяем на нужный путь к полю заказа
   
ТекстПолей = СтрЗаменить(ТекстПолей, «ДокументЗаказКлиента.», «РеализацияТоваровУслуг.ЗаказКлиента.»);

   
СписокРеализацииТоваровУслуг.ТекстЗапроса = СтрЗаменить(СписокРеализацииТоваровУслуг.ТекстЗапроса, МаркерПоля, МаркерПоля + ТекстПолей);

   
ПолеПеред = Элементы.СписокРеализацииТоваровУслугХозяйственнаяОперация; //В переменную, чтобы потом поменять место можно было легко
   
ДобавитьКолонкуСписка(ЭтаФорма, «Состояние», «Состояние», Элементы.СписокРеализацииТоваровУслуг, ПолеПеред);
   
ДобавитьКолонкуСписка(ЭтаФорма, «ПроцентОплаты», «% опл.», Элементы.СписокРеализацииТоваровУслуг, ПолеПеред);
   
ДобавитьКолонкуСписка(ЭтаФорма, «ПроцентОтгрузки», «% отгр.», Элементы.СписокРеализацииТоваровУслуг, ПолеПеред);



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

Функция
ДобавитьКолонкуСписка(Форма, Имя, Заголовок, ЭлементСписка, ПолеПеред) Экспорт

   
Элемент = Форма.Элементы.Вставить(«дор_» + Имя, Тип(«ПолеФормы»), ЭлементСписка, ПолеПеред);
   
Элемент.Вид = ВидПоляФормы.ПолеКартинки;
   
Элемент.ПутьКДанным = «СписокРеализацииТоваровУслуг.» + Имя;
   
Элемент.АвтоМаксимальнаяШирина = ложь;
   
Элемент.РастягиватьПоГоризонтали = ложь;
   
Элемент.Заголовок = Заголовок;

КонецФункции

Колонки выводятся в список документов реализации.

Но тут меня начинают терзать смутные предчувствия и я спрашиваю клиента, речь идет о списке документов реализации. Увы, клиенту нужно было добавить и в список «Документы продажи».

Что же, открываю эту обработку и смотрю ее список:

Копирю уже написанный код, меняю в нем только идентификаторы:


&НаСервере
Процедура дор_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

   
//Добавляем поля
   
МаркерПоля = «РегистрСведений.РеестрДокументов КАК РеестрДокументовПереопределяемый»;
   
СписокДокументыПродажи.ТекстЗапроса = СтрЗаменить(СписокДокументыПродажи.ТекстЗапроса, МаркерПоля, МаркерПоля + «
    |ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияЗаказовКлиентов КАК СостоянияЗаказовКлиентов
    |ПО (СостоянияЗаказовКлиентов.Заказ = РеестрДокументовПереопределяемый.Ссылка.ЗаказКлиента)
    |»
);

   
//Поля скопированы из текста запроса по заказам
   
МаркерПоля = «ВЫБРАТЬ»;
   
ТекстПолей = «
    |ВЫБОР
    |    КОГДА (НЕ ДокументЗаказКлиента.Проведен)
    |        ТОГДА ЗНАЧЕНИЕ(Перечисление.СостоянияЗаказовКлиентов.ПустаяСсылка)
    |    ИНАЧЕ ЕСТЬNULL(СостоянияЗаказовКлиентов.Состояние, ЗНАЧЕНИЕ(Перечисление.СостоянияЗаказовКлиентов.Закрыт))
    |КОНЕЦ КАК Состояние,
    |ВЫБОР
    |    КОГДА (НЕ ДокументЗаказКлиента.Проведен)
    |        ТОГДА ЛОЖЬ
    |    КОГДА СостоянияЗаказовКлиентов.ДатаСобытия <> ДАТАВРЕМЯ(1, 1, 1)
    |    И &ДатаАктуальности > СостоянияЗаказовКлиентов.ДатаСобытия
    |        ТОГДА ИСТИНА
    |    ИНАЧЕ ЛОЖЬ
    |КОНЕЦ КАК Просрочен,
    |ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаОплаты, 0) КАК СуммаОплаты,
    |ЕСТЬNULL(СостоянияЗаказовКлиентов.ПроцентОплаты, 0) КАК ПроцентОплаты,
    |ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаОтгрузки, 0) КАК СуммаОтгрузки,
    |ЕСТЬNULL(СостоянияЗаказовКлиентов.ПроцентОтгрузки, 0) КАК ПроцентОтгрузки,
    |ВЫБОР
    |    КОГДА ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаДолга, 0) < 0
    |        ТОГДА ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаДолга, 0)
    |    ИНАЧЕ 0
    |КОНЕЦ КАК НашДолг,
    |ВЫБОР
    |    КОГДА ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаДолга, 0) > 0
    |        ТОГДА ЕСТЬNULL(СостоянияЗаказовКлиентов.СуммаДолга, 0)
    |    ИНАЧЕ 0
    |КОНЕЦ КАК ДолгКлиента,
    |ЕСТЬNULL(СостоянияЗаказовКлиентов.ПроцентДолга, 0) КАК ПроцентДолга,»
;
   
//В конце запятая, это важно, вставляем после ВЫБРАТЬ перед полями исходного запроса

    //Берем исходный текст из заказа, но заменяем на нужный путь к полю заказа
   
ТекстПолей = СтрЗаменить(ТекстПолей, «ДокументЗаказКлиента.», «РеестрДокументовПереопределяемый.Ссылка.ЗаказКлиента.»);

   
СписокДокументыПродажи.ТекстЗапроса = СтрЗаменить(СписокДокументыПродажи.ТекстЗапроса, МаркерПоля, МаркерПоля + ТекстПолей);

   
ПолеПеред = Элементы.ПредставлениеСостояния; //В переменную, чтобы потом поменять место можно было легко
   
ДобавитьКолонкуСписка(ЭтаФорма, «Состояние», «Состояние», Элементы.СписокДокументыПродажи, ПолеПеред, 8);
   
ДобавитьКолонкуСписка(ЭтаФорма, «ПроцентОплаты», «% опл.», Элементы.СписокДокументыПродажи, ПолеПеред, 3);
   
ДобавитьКолонкуСписка(ЭтаФорма, «ПроцентОтгрузки», «% отгр.», Элементы.СписокДокументыПродажи, ПолеПеред, 3);



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

Функция
ДобавитьКолонкуСписка(Форма, Имя, Заголовок, ЭлементСписка, ПолеПеред, Ширина) Экспорт

   
Элемент = Форма.Элементы.Вставить(«дор_» + Имя, Тип(«ПолеФормы»), ЭлементСписка, ПолеПеред);
   
Элемент.Вид = ВидПоляФормы.ПолеВвода;
   
Элемент.ПутьКДанным = «СписокДокументыПродажи.» + Имя;
   
Элемент.Ширина = Ширина;
   
Элемент.АвтоМаксимальнаяШирина = ложь;
   
Элемент.РастягиватьПоГоризонтали = ложь;
   
Элемент.Заголовок = Заголовок;

КонецФункции

Меня смущает только, что все колонки процент оплаты и отгрузки пустые. Никак не могу понять, почему.

Приходится отладить запрос, запускаю, по всем накладным работает долго:

Тогда ограничиваю только по накладной 171:

Консоль запроса показывает, что запрос отрабатывает правильно.

Меняю в запросе нули на девятки в полях процентов:

Девятки не выводятся. Понимаю, что что-то не так в создаваемых программно полях, смотрю код:

Путь к данным вроде бы нормальный, а вот вид поля — картинка. Поэтому данные не выводятся, ошибка!

Поправляю, получаю, что данные начинают выводиться:

Решаю, что колонки слишком широкие и добавляю еще указание ширины для каждой колонки. После этого все выглядит более красиво:

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

Я напоминаю, что задача был о другом.

Он спрашивает, а можно ли сделать для реализаций, ведь если открыть реализацию, то там показана сумма оплаты реализации:

Я подозреваю, что сумма оплаты там рассчитывается сложным кодом, а не запросом. Но решаю проверить.

Отлаживаю код и нахожу процедуру, где рассчитывается сумма оплаты накладной:

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

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

Время факт: 1,2 час.

fixin

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

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

комментариев 6

  1. Zuko:

    1. «В тексте запроса определяем уникальные маркеры» это уже какие-то анахронизмы при наличии объекта схема запроса.
    2. По учету — Если расчеты по накладным, то о проценте оплат каких заказов идет вообще речь?
    Если есть накладная, которая составлена из трех заказов, два из которых в ней участвуют частично, то непонятно что выводить?

    • Павел:

      А чем объект кардинально лучше? С ним только поля добавлять проще. А так все равно надо определять есть поля к которым можно прицепиться или нет

    • я не вдавался в детали, при открытии реализации рассчитывается статус ее оплаты.
      т.е. там расчеты по накладным.
      Например, отгрузили по накладной на 10.000, а клиент оплатил 2.000, будет 20%.
      ОК?

      Что касается схемы запроса, возможно и да, но как-то нет к ней доверия. Хотя с этим объектом я и работал. Помню, словил один глюк, когда она собиралась не так, как была, так что я уж лучше текстом.

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

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