Добрый день. Есть проблема, которую я сам не могу решить. Может подскажите)
1С:Предприятие 8.3 (8.3.18.1616)
Рассмотрим пример. Есть форма списка документа "Заявка на вывоз" (Далее Заявка). Нужно выводить информацию по данной заявке, а именно водителя(ей), кто произвел вывоз (указывается в документе "Путевой лист" (далее Путевой).
Пример. Документ заявка имеет 2 точки забора товаров. Получается, что в каждую точку заехало 2 разных водителя и сформированы 2 разных Путевых.
Нужно объединить это в одну через запятую. В СКД это делается функцией СоединитьСтроки(), но в запросе я не знаю как соединить 2 строки. Плюс использование временных таблиц в моей платформе в произвольном запросе не работает.
Думаю, решилась бы проблема, если бы в список подкинуть результат СКД. Можно ли так сделать? Или может есть какие идеи?
Сейчас на выходе:
Документ | Водитель Задание1 |Водитель1
Задание1 |Водитель2
А нужно:
Документ | Водитель Задание1 |Водитель1, Водитель2
В обычных формах решается методов ПриПолученииДанных, а вот в управляемых пытаюсь через произвольный запрос.
(9) к сожалению данный вариант отмел, так как документы создаются сегодня на завтра, после и тд. Путевые по факту уже создаются. Не хочется после записи путевого искать документ заявку и дописывать водителя туда. Это самый крайний вариант и он начнет действовать с даты доработки, а вот динамическое считывание подхватывает и старые документы
Это самый крайний вариант и он начнет действовать с даты доработки
Ничего не мешает дозаполнить старые документы.
Если в документе список водителей хранить не удобно, добавьте регистр сведений для этого. Непериодический, независимый.
Измерение - Задание, ресурс - Водители.
При проведении путевого листа/отмене проведения - заполняйте регистр списком водителей из проведенных путевых листов по документу задания путевого листа.
(1) То есть на 18 платформе еще не доступно расширение СКД динамического списка?
Тогда у тебя 2 варианта.
Вариант 1. Использовать событие списка "ПриПолученииДанныхНаСервере".
В запрос динамического списка добавь поле с пустой строкой:
ВЫБРАТЬ ВЫРАЗИТЬ("" КАК СТРОКА(1024)) КАК Водители
И в событии ПриПолученииДанныхНаСервере:
Ключи = Строки.ПолучитьКлючи();
Это массив ключей строк динамического списка. В твоем случае это будет массив ссылок на Заявки, которые отображаются на экране в данный момент. Используя его получаешь водителей для каждого ключа. Примерно так:
УстановитьПривилегированныйРежим(Истина);
Текст =
"ВЫБРАТЬ
|Заявка.Ссылка КАК Ключ,
|Задание.Водитель КАК Водитель
|ИЗ
|Документ.ЗаявкаНаВывоз КАК Заявка
|ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПутевойЛист КАК Задание
|ПО .....
|ГДЕ Заявка.Ссылка В (&Ключи)
|УПОРЯДОЧИТЬ ПО Водитель(.Наименование) // порядок водителей в строке всегда должен быть одинаковым
|ИТОГИ ПО Ключ";
Запрос = новый Запрос(Текст);
Запрос.УстановитьПараметр("Ключи", Ключи);
ВыборкаКлюч = Запрос.Выполнить.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Ключ");
Пока ВыборкаКлюч.Следующий() Цикл
Выборка = ВыборкаКлюч.Выбрать();
Водители = новый Массив;
Пока Выборка.Следующий() Цикл
Водители.Добавить(Выборка.Водитель);
КонецЦикла;
СтрокаДС = Строки.Получить(ВыборкаКлюч.Ключ);
СтрокаДС.Данные.Водитель = СтрСоединить(Водители, ", ");
КонецЦикла;
Показать
Минус этого способа в том, что по полю Водители не будет работать поиск и сортировка.
Вариант 2. (если поиск и сортировка по полю принципиальны)
Иметь хранимую в БД строку с водителями и поддерживать её в актуальном состоянии.
Хранить лучше в отдельном регистре, чтобы не вызывать запись Заявки при каждой записи Путевого. Надо иметь единую процедуру, которая при изменении любого Путевого поднимает ВСЕ путевые, связанные с заявкой, и вычисляет строку водителей. Выглядеть она будет примерно так же, как и в 1 варианте. Вызывать в Путевом листе ПриЗаписи(), и ПередУдалением(). И также вызывать из Заявки, если требуется. Смотря как у тебя путевой с заявкой связаны. Можно в модуле объекта, а можно в модуле формы. В последнем случае ты избегаешь лишнего запроса, например, при массовом перепроведении путевых.
Минусы: Возможно тебе понадобится процедура обработки смены наименования водителя, которая перезапишет все строки где он участвовал.
Плюсы: работает поиск по этой строке.
(19) в моей совместимости не доступно данное событие.
к сожалению, у меня стоит режим совместимости 8.2.3, что не доступно в данном режиме совместимости(
Табличный документ, скд, через макет сделать оформление похожее на форму дин.списка, добавить обработку расшифровки, с отборами проблем быть не должно, чтобы не тащить все данные сделать пагинацию(в скд есть служебное поле НомерПоПорядку).
пагинацию можно заменить постоянным отбором за период
Выбрать
Т.Задание КАК Задание,
Т.Водитель КАК Водитель1,
Значение(Справочник.Водители.ПустаяСсылка) КАК Водитель2
Где &УсловиеВодитель1
Объединить Все
Выбрать
Т.Задание КАК Задание,
Значение(Справочник.Водители.ПустаяСсылка) КАК Водитель1
Т.Водитель КАК Водитель2
Где &УсловиеВодитель2
или
Выбрать
Т.Задание КАК Задание,
Выбор Когда &УсловиеВодитель1 Тогда
Т.Водитель
Иначе Значение(Справочник.Водители.ПустаяСсылка)
Конец КАК Водитель1,
Выбор Когда &УсловиеВодитель2 Тогда
Т.Водитель
Иначе Значение(Справочник.Водители.ПустаяСсылка)
Конец КАК Водитель2
(8) объединение будет работать в случае, если в документе (в вашем случае) 2 реквизита Водитель1 и Водитель2. В нашем случае, 1 реквизит - Водитель. Разница в количестве строк (может быть и 3 водителя потом), поэтому объединнеие не, не подходит.
Вы не внимательно ознакомились с вопросом
(1) Только string_agg() в SQL есть для условно произвольного количества соединяемых значений. Но естьограничение на длину строки.
Во всех остальных случаях придется закладываться на несколько (3, 5, 10...), а далее рисовать многоточие.
Вариантов разных много в SQL - тот же Pivot.
В 1С более менее один вариант. Пронумеровать в разрезе документа. Далее для каждой колонки Максимум(выбор когда нпп = 1 тогда Водитель1 иначе null конец) +", " Максимум(выбор когда ... Сгруппировать по Документ
(17) ДС - это произвольную форму свою сделать, где выводить таблицу значений?
Плохо, не будет динамичесокое считывание данных. а сразу загрузка миллиона строк на форму
(22)Это вообще не проблема.
Добавляете в шапку поле Водитель, типа Ссылка на справочник Водители. И флаг ИспользоватьОтборПоВодителю.
При выборе водителя - устанавливаете флаг и в запросе отбираете ссылки на документы Заданий по которым есть путевые листы с нужными водителями.
Устанавливаете отбор ДС по Ссылка в списке и список ссылок из запроса.
При отключении флага - отключаете отбор по ссылке.