Добавление информации о заказе в список реализаций УТ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 час.