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