Ошибка при заполнении поля динамического списка (СписокПриПолученииДанныхНаСервере)

1. pusal 26.10.23 19:22 Сейчас в теме
Всем привет. Пытаюсь в динамический список документов предприятия (Документооборот 3, форма списка документов) добавить поле со списком проектов (строкой), сам список проектов хранится в отдельном РС псСписокПроектовДокумента. По умолчанию 1С Документооборот позволяет хранить только лишь один проект на договор, а нужно иметь возможность указывать несколько.

Добавил в динамический список строковое поле "ПроектыДокумента" и пытаюсь его заполнить с помощью событие списка "СписокПриПолученииДанныхНаСервере".

Пользуясь данной статьей с Wonderland (https://wonderland.v8.1c.ru/blog/obrabotka-i-oformlenie-dannykh-dinamicheskogo-spiska/), написал следующий код в процедуре "СписокПриПолученииДанныхНаСервере", где в качестве параметра передаю таблицей значений список ссылок, сформированный из параметра "Строки", у которого есть метод "Получить ключи":

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


При открытии формы получаю ошибку, что "Значение, соответствующее ключу, не задано". Посмотрел отладчиком, обнаружил, что в ключе содержится значение с типом РегистрСведенийКлючЗаписи.ДанныеДокументовПредприятия (см. скрин) - в этом ли проблема, или я где-то накосячил? Буду рад любой наводке на решение. Спасибо.
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. pusal 27.10.23 17:32 Сейчас в теме
Нашёл решение самостоятельно. Вряд ли оптимальное, но иначе не смог:

&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
	
	МассивСтрок = Строки.ПолучитьКлючи();
	МассивСтрокТЗ = Новый ТаблицаЗначений;
	МассивСтрокТЗ.Колонки.Добавить("Документ", Новый ОписаниеТипов("СправочникСсылка.ДокументыПредприятия"));
	
	Для Каждого Стр Из МассивСтрок Цикл
		НоваяСтрока = МассивСтрокТЗ.Добавить();
		НоваяСтрока.Документ = Стр.Документ;
	КонецЦикла;
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	| МассивСсылок.Документ КАК Документ
	|ПОМЕСТИТЬ втМассивСсылок
	|ИЗ
	| &МассивСсылок КАК МассивСсылок
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	| втМассивСсылок.Документ КАК Документ,
	| псСписокПроектовДокумента.Проект КАК Проект
	|ИЗ
	| втМассивСсылок КАК втМассивСсылок
	| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.псСписокПроектовДокумента КАК псСписокПроектовДокумента
	| ПО втМассивСсылок.Документ = псСписокПроектовДокумента.Документ
	|ИТОГИ ПО
	| Документ";
	
	Запрос.УстановитьПараметр("МассивСсылок", МассивСтрокТЗ);
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаПроект = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	
	Пока ВыборкаПроект.Следующий() Цикл
		
		ПроектыДокумента = "";
		
		ВыборкаДетальныеЗаписи = ВыборкаПроект.Выбрать();
		Сч = 0;
		Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
			ПроектыДокумента = ПроектыДокумента + ?(ПроектыДокумента="", "", ", ") + ВыборкаДетальныеЗаписи.Проект;
		КонецЦикла;
		
		Для Каждого Строка Из Строки Цикл
			Если Строка.Ключ.Документ = ВыборкаПроект.Документ Тогда
				Строки[Строка.Ключ].Данные["ПроектыДокумента"] = ПроектыДокумента;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
КонецПроцедуры
Показать
3. Sashares 35 27.10.23 17:36 Сейчас в теме
(2)Какой-то сложный у вас запрос. Почему сразу не выбирать из РС? Зачем эта временная таблица?
Достаточно так:
 "ВЫБРАТЬ
    | псСписокПроектовДокумента.Документ КАК Документ,
    | псСписокПроектовДокумента.Проект КАК Проект
    |ИЗ
    | РегистрСведений.псСписокПроектовДокумента КАК псСписокПроектовДокумента
    | ГДЕ псСписокПроектовДокумента.Документ В (&МассивСсылок)
    |ИТОГИ ПО
    | Документ";


И остальное тоже можно исправить:
СоответствиеДанных = Новый Соответствие;
 Пока ВыборкаПроект.Следующий() Цикл
        
        ПроектыДокумента = "";
        
        ВыборкаДетальныеЗаписи = ВыборкаПроект.Выбрать();
        Сч = 0;
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            ПроектыДокумента = ПроектыДокумента + ?(ПроектыДокумента="", "", ", ") + ВыборкаДетальныеЗаписи.Проект;
        КонецЦикла;
        СоответствиеДанных.Вставить(ВыборкаПроект.Документ,ПроектыДокумента );
       
    КонецЦикла;

    Для Каждого Строка Из Строки Цикл
          ПроектыДокумента =  СоответствиеДанных[Строка.Ключ.Документ];
          Строки[Строка.Ключ].Данные["ПроектыДокумента"] = ?(ЗначениеЗаполнено(ПроектыДокумента),ПроектыДокумента,"");
     КонецЦикла;
Показать
4. soft_wind 27.10.23 17:44 Сейчас в теме
еще проще, сразу в запрос динамического списка добавьте левым соединением свой регистр
и вытащите из него нужное поле (только уникальность документа должна соблюдатся)
Оставьте свое сообщение

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