Произвольный запрос на форме списка

1. Slypower 3 02.11.23 16:18 Сейчас в теме
Добрый день. Есть проблема, которую я сам не могу решить. Может подскажите)

1С:Предприятие 8.3 (8.3.18.1616)

Рассмотрим пример. Есть форма списка документа "Заявка на вывоз" (Далее Заявка). Нужно выводить информацию по данной заявке, а именно водителя(ей), кто произвел вывоз (указывается в документе "Путевой лист" (далее Путевой).
Пример. Документ заявка имеет 2 точки забора товаров. Получается, что в каждую точку заехало 2 разных водителя и сформированы 2 разных Путевых.
Нужно объединить это в одну через запятую. В СКД это делается функцией СоединитьСтроки(), но в запросе я не знаю как соединить 2 строки. Плюс использование временных таблиц в моей платформе в произвольном запросе не работает.
Думаю, решилась бы проблема, если бы в список подкинуть результат СКД. Можно ли так сделать? Или может есть какие идеи?

Сейчас на выходе:
Документ | Водитель
Задание1 |Водитель1
Задание1 |Водитель2

А нужно:
Документ | Водитель
Задание1 |Водитель1, Водитель2

В обычных формах решается методов ПриПолученииДанных, а вот в управляемых пытаюсь через произвольный запрос.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
9. Sashares 33 03.11.23 10:20 Сейчас в теме
(1)Как вариант - добавить в документ строковый реквизит Водители, и заполнять его перед записью.
Ну и выводить его в списке соответственно.
11. Slypower 3 03.11.23 10:25 Сейчас в теме
(9) к сожалению данный вариант отмел, так как документы создаются сегодня на завтра, после и тд. Путевые по факту уже создаются. Не хочется после записи путевого искать документ заявку и дописывать водителя туда. Это самый крайний вариант и он начнет действовать с даты доработки, а вот динамическое считывание подхватывает и старые документы
12. Sashares 33 03.11.23 10:34 Сейчас в теме
(11)
Это самый крайний вариант и он начнет действовать с даты доработки

Ничего не мешает дозаполнить старые документы.

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

Измерение - Задание, ресурс - Водители.

При проведении путевого листа/отмене проведения - заполняйте регистр списком водителей из проведенных путевых листов по документу задания путевого листа.
13. Slypower 3 03.11.23 10:44 Сейчас в теме
(12) регистр так же будет неудобен, как и в документе, поэтому из 2х зол хранить в документе лучше
15. Sashares 33 03.11.23 11:48 Сейчас в теме
(13)Ну, еще вариант - поднять режим совместимости))
19. schweigen 03.11.23 13:13 Сейчас в теме
(1) То есть на 18 платформе еще не доступно расширение СКД динамического списка?
Тогда у тебя 2 варианта.

Вариант 1. Использовать событие списка "ПриПолученииДанныхНаСервере".
В запрос динамического списка добавь поле с пустой строкой:
 ВЫБРАТЬ ВЫРАЗИТЬ("" КАК СТРОКА(1024)) КАК Водители

И в событии ПриПолученииДанныхНаСервере:
Ключи = Строки.ПолучитьКлючи();

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

Минус этого способа в том, что по полю Водители не будет работать поиск и сортировка.

Вариант 2. (если поиск и сортировка по полю принципиальны)
Иметь хранимую в БД строку с водителями и поддерживать её в актуальном состоянии.
Хранить лучше в отдельном регистре, чтобы не вызывать запись Заявки при каждой записи Путевого. Надо иметь единую процедуру, которая при изменении любого Путевого поднимает ВСЕ путевые, связанные с заявкой, и вычисляет строку водителей. Выглядеть она будет примерно так же, как и в 1 варианте. Вызывать в Путевом листе ПриЗаписи(), и ПередУдалением(). И также вызывать из Заявки, если требуется. Смотря как у тебя путевой с заявкой связаны. Можно в модуле объекта, а можно в модуле формы. В последнем случае ты избегаешь лишнего запроса, например, при массовом перепроведении путевых.

Минусы: Возможно тебе понадобится процедура обработки смены наименования водителя, которая перезапишет все строки где он участвовал.
Плюсы: работает поиск по этой строке.
21. Slypower 3 03.11.23 13:47 Сейчас в теме
(19) в моей совместимости не доступно данное событие.
к сожалению, у меня стоит режим совместимости 8.2.3, что не доступно в данном режиме совместимости(
24. schweigen 03.11.23 14:50 Сейчас в теме
(21) у модуля формы нет события ПередУдалением. это я тупанул конечно.
Тогда в модуле формы ПередЗаписьюНаСервере делаешь:
ТекущийОбъект.ДополнительныеСвойства.Вставить("ЭтоЗаписьИзФормы", Истина);

И в модуле объекта уже:
Если ЭтоНовый Или ДополнительныеСвойства.Свойство("ЭтоЗаписьИзФормы") Тогда
   ЗаполнитьВодителей(Заявка);
КонецЕсли;

Думаю ты понял. Идея в том, что если запись идет не из формы, то и состав водителей не менялся. Наверно.
25. independ 1556 03.11.23 15:25 Сейчас в теме
Табличный документ, скд, через макет сделать оформление похожее на форму дин.списка, добавить обработку расшифровки, с отборами проблем быть не должно, чтобы не тащить все данные сделать пагинацию(в скд есть служебное поле НомерПоПорядку).
пагинацию можно заменить постоянным отбором за период
2. soft_wind 02.11.23 16:39 Сейчас в теме
в управляемых так же можно, в событии ПриПолученииДанных(...)
посмотрите это описание, попробуйте.
Прикрепленные файлы:
ДинСписокПолучениеДанных.docx
Sashares; +1 Ответить
3. Slypower 3 03.11.23 08:14 Сейчас в теме
(2)
ПриПолученииДанных(...)

к сожалению, у меня стоит режим совместимости 8.2.3, что не доступно в данном режиме совместимости(
4. Дмитрий74Чел 240 03.11.23 09:48 Сейчас в теме
СоединитьСтроки() появилось в СКД вроде с 8.2.14
Надо поднимать режим совместимости.
5. Slypower 3 03.11.23 09:52 Сейчас в теме
(4) Режим совместимости - Версия 8.2.13 (проверено)
6. Дмитрий74Чел 240 03.11.23 09:53 Сейчас в теме
7. Slypower 3 03.11.23 09:59 Сейчас в теме
(6)Обработчик вызывается в режиме совместимости конфигурации Версия8_3_8 и выше.
16. Дмитрий74Чел 240 03.11.23 11:51 Сейчас в теме
(7) Надо поднимать режим совместимости.
8. VmvLer 03.11.23 10:13 Сейчас в теме
В произвольном запросе объединение работает/нет?

Выбрать 
Т.Задание КАК Задание,
Т.Водитель КАК Водитель1,
Значение(Справочник.Водители.ПустаяСсылка) КАК Водитель2
Где &УсловиеВодитель1

Объединить Все

Выбрать 
Т.Задание КАК Задание,
Значение(Справочник.Водители.ПустаяСсылка) КАК Водитель1
Т.Водитель КАК Водитель2
Где &УсловиеВодитель2

или 


Выбрать 
Т.Задание КАК Задание,
Выбор Когда &УсловиеВодитель1 Тогда
Т.Водитель
Иначе Значение(Справочник.Водители.ПустаяСсылка) 
Конец КАК Водитель1,
Выбор Когда &УсловиеВодитель2 Тогда
Т.Водитель
Иначе Значение(Справочник.Водители.ПустаяСсылка) 
Конец КАК Водитель2
Показать
10. Slypower 3 03.11.23 10:23 Сейчас в теме
(8) объединение будет работать в случае, если в документе (в вашем случае) 2 реквизита Водитель1 и Водитель2. В нашем случае, 1 реквизит - Водитель. Разница в количестве строк (может быть и 3 водителя потом), поэтому объединнеие не, не подходит.
Вы не внимательно ознакомились с вопросом
14. Said-We 03.11.23 11:45 Сейчас в теме
(1) Только string_agg() в SQL есть для условно произвольного количества соединяемых значений. Но естьограничение на длину строки.
Во всех остальных случаях придется закладываться на несколько (3, 5, 10...), а далее рисовать многоточие.
Вариантов разных много в SQL - тот же Pivot.

В 1С более менее один вариант. Пронумеровать в разрезе документа. Далее для каждой колонки Максимум(выбор когда нпп = 1 тогда Водитель1 иначе null конец) +", " Максимум(выбор когда ... Сгруппировать по Документ
17. SlavaKron 03.11.23 12:29 Сейчас в теме
Как вариант, переделать ДС на таблицу значений.
18. Slypower 3 03.11.23 12:45 Сейчас в теме
(17) ДС - это произвольную форму свою сделать, где выводить таблицу значений?
Плохо, не будет динамичесокое считывание данных. а сразу загрузка миллиона строк на форму
20. Sashares 33 03.11.23 13:24 Сейчас в теме
(1)Еще вариант - выводить водителей не в списке, а рядом - по данным текущей строки.
22. Slypower 3 03.11.23 13:48 Сейчас в теме
(20) нужен отбор по водителю(((
23. Sashares 33 03.11.23 13:52 Сейчас в теме
(22)Это вообще не проблема.
Добавляете в шапку поле Водитель, типа Ссылка на справочник Водители. И флаг ИспользоватьОтборПоВодителю.
При выборе водителя - устанавливаете флаг и в запросе отбираете ссылки на документы Заданий по которым есть путевые листы с нужными водителями.
Устанавливаете отбор ДС по Ссылка в списке и список ссылок из запроса.
При отключении флага - отключаете отбор по ссылке.
Дмитрий74Чел; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот