Добавление информации о заказе в список реализаций УТ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 час.
1. «В тексте запроса определяем уникальные маркеры» это уже какие-то анахронизмы при наличии объекта схема запроса.
2. По учету — Если расчеты по накладным, то о проценте оплат каких заказов идет вообще речь?
Если есть накладная, которая составлена из трех заказов, два из которых в ней участвуют частично, то непонятно что выводить?
А чем объект кардинально лучше? С ним только поля добавлять проще. А так все равно надо определять есть поля к которым можно прицепиться или нет
Ага
я не вдавался в детали, при открытии реализации рассчитывается статус ее оплаты.
т.е. там расчеты по накладным.
Например, отгрузили по накладной на 10.000, а клиент оплатил 2.000, будет 20%.
ОК?
Что касается схемы запроса, возможно и да, но как-то нет к ней доверия. Хотя с этим объектом я и работал. Помню, словил один глюк, когда она собиралась не так, как была, так что я уж лучше текстом.
>>ОК?
вопрос был о проценте оплаты заказов
в итоге выяснили, что о проценте оплаты накладных.