В конфигурации УТ 11.5 неожиданно исчезла скрепка, показывающая наличие прикрепленных файлов к документу, которая многим нужна.
Но есть решение: это или других коллег по инфостарту.
Данное отличается тем, что оно относительно универсальное и скрепка отображается практически во всех списках документов, для которых предусмотрено прикрепление файлов.
Как и у других решений, данное основано на изменении запроса динамического списка путем соединения с регистром сведений НаличиеФайлов.
Относительная универсальность решения достигается за счет использования объекта СхемаЗапроса.
Кому интересно, алгоритм следующий:
В УТ есть общий модуль МодификацияКонфигурацииПереопределяемый, в котором среди прочих реализована процедура ПриСозданииНаСервере, вызываемая из открываемых форм. Перехватываем данный метод в расширении с директивой &После
Процедура Karg_ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка)
РеквСписок = ИмяРеквизитаДинамическогоСписка(Форма);
Если ПустаяСтрока(РеквСписок) Тогда
Возврат;
ИначеЕсли Форма[РеквСписок].ПроизвольныйЗапрос = Ложь Тогда
Возврат;
ИначеЕсли Форма.Элементы.Найти("ЕстьФайлы") <> Неопределено
ИЛИ Форма.Элементы.Найти("ЕстьФайл") <> Неопределено Тогда
Возврат;
КонецЕсли;
// Смотрим на форму, и в зависимости от вида документа модифицируем запрос дин. списка и форму списка
ЧастиИмениФормы = СтрРазделить(Форма.ИмяФормы, ".", Ложь);
Если ЧастиИмениФормы[0] = "Документ" Тогда
ИмяДокумента = ЧастиИмениФормы[1];
ИмяСправочника = ИмяДокумента + "ПрисоединенныеФайлы";
Если Метаданные.Справочники.Найти(ИмяСправочника) = Неопределено Тогда
Возврат;
КонецЕсли;
// справочник есть, модифицируем запрос списка
karg_ОбработатьСписокДокументов(Форма[РеквСписок], ИмяДокумента);
karg_ДобавитьКолонкуНаФорму(Форма, РеквСписок);
ИначеЕсли ЧастиИмениФормы[1] = "ЖурналДокументовЗакупки"
ИЛИ ЧастиИмениФормы[1] = "ЖурналДокументовПродажи" Тогда
karg_ОбработатьСписокДокументов(Форма[РеквСписок], Неопределено); // тот же подход теперь, но оставил в отдельной ветке пока
karg_ДобавитьКолонкуНаФорму(Форма, РеквСписок);
КонецЕсли;
КонецПроцедуры
Использование такого способа не требует перехвата самих форм списков документов и не конфликтует с возможными другими доработками этих форм.
И так. Программно находим реквизит динамического списка документов. Для этого я использую способ, который попался мне у @ASHkins. В нем определяется имя реквизита списка простым перебором реквизитов (Источник: //infostart.ru/1c/articles/2191423/). Здесь выбирается первый реквизит с типом "Динамический список".
Я не проверял все формы, но думаю, в большинстве вариантов, найдем именно интересующий нас список документов.
Функция ИмяРеквизитаДинамическогоСписка(Форма)
Результат = "";
РеквизитыФормы = Форма.ПолучитьРеквизиты();
ТипДинамическогоСписка = Новый ОписаниеТипов("ДинамическийСписок");
Для Каждого РеквизитФормы Из РеквизитыФормы Цикл
Если РеквизитФормы.ТипЗначения = ТипДинамическогоСписка Тогда
Результат = РеквизитФормы.Имя;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Также проверим стандартное имя для такой скрепки "ЕстьФайл". И если на форме уже есть такой реквизит, то выходим из процедуры
РеквСписок = ИмяРеквизитаДинамическогоСписка(Форма);
Если ПустаяСтрока(РеквСписок) Тогда
Возврат;
ИначеЕсли Форма[РеквСписок].ПроизвольныйЗапрос = Ложь Тогда
Возврат;
ИначеЕсли Форма.Элементы.Найти("ЕстьФайлы") <> Неопределено
ИЛИ Форма.Элементы.Найти("ЕстьФайл") <> Неопределено Тогда
Возврат;
КонецЕсли;
Далее проверяем в метаданных наличие справочника с присоединенными файлами для интересующего нас вида документов. В типовой УТ имя строится по схеме:
ИмяСправочника = ИмяДокумента + "ПрисоединенныеФайлы",
т.е. например "СчетНаОплатуКлиентуПрисоединенныеФайлы" или "РеализацияТоваровУслугПрисоединенныеФайлы"
Можно бы соединятся с конкретными справочниками, но УТ поддерживает РегистрСведений.НаличиеФайлов, с которым и следует соединиться левым соединением.
Для наибольшей универсальности, воспользуемся объектом СхемаЗапроса. В схеме возьмем первый пакет запросов, в нем первый оператор и первый источник, т.к. основная таблица списка обычно ставится первой. (В случае выявление исключений, их можно быстро учесть в данном алгоритме).
Например, в одной из форм при построении в запросе соединения с основной таблицей необходимо соединяться не с полем "Ссылка", а с полем "ДокументПоступления". При выявлении таких нюансов их нужно учесть в коде, пишите, буду корректировать расширение.
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(ДинСписок.ТекстЗапроса);
ПсевдонимОснТаблицы = СхемаЗапроса.ПакетЗапросов[0].Операторы[0].Источники[0].Источник.Псевдоним;
ИсточникФайлы = СхемаЗапроса.ПакетЗапросов[0].Операторы[0].Источники.Добавить("РегистрСведений.НаличиеФайлов", "karg_ФайлыСписка");
БазовыйРеквизит = "Ссылка";
Если ИмяДокумента = "ТаможеннаяДекларацияИмпорт" Тогда
БазовыйРеквизит = "ДокументПоступления";
КонецЕсли;
СоединениеФайлы = СхемаЗапроса.ПакетЗапросов[0].Операторы[0].Источники[0].Соединения.Добавить(ИсточникФайлы,
ПсевдонимОснТаблицы + "." + БазовыйРеквизит + " = karg_ФайлыСписка.ОбъектСФайлами");
ПолеФайла = СхемаЗапроса.ПакетЗапросов[0].Операторы[0].ВыбираемыеПоля.Добавить("ЕстьNULL(karg_ФайлыСписка.ЕстьФайлы, Ложь)");
СхемаЗапроса.ПакетЗапросов[0].Колонки.Найти(ПолеФайла).Псевдоним = "karg_ЕстьФайл";
ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
ДинСписок.ТекстЗапроса = ТекстЗапроса;
Оформляем на форме колонку со скрепкой. Указываем картинку для шапки и для значения.
Элементы = Форма.Элементы;
Если Элементы.Найти("Номер") <> Неопределено Тогда
КолонкаОриентир = "Номер";
ИначеЕсли Элементы.Найти(ИмяСписка + "Номер") <> Неопределено Тогда
КолонкаОриентир = ИмяСписка + "Номер";
Иначе
КолонкаОриентир = Неопределено;
КонецЕсли;
Если ЗначениеЗаполнено(КолонкаОриентир) Тогда
НовыйЭлемент = Элементы.Вставить("karg_ЕстьФайл", Тип("ПолеФормы"), Элементы[ИмяСписка], Элементы[КолонкаОриентир]);
Иначе
НовыйЭлемент = Элементы.Добавить("karg_ЕстьФайл", Тип("ПолеФормы"), Элементы[ИмяСписка]);
КонецЕсли;
НовыйЭлемент.Вид = ВидПоляФормы.ПолеКартинки;
НовыйЭлемент.ПутьКДанным = ИмяСписка + ".karg_ЕстьФайл";
НовыйЭлемент.Подсказка = "Признак наличия присоединенного файла";
НовыйЭлемент.КартинкаЗначений = БиблиотекаКартинок.Скрепка;
НовыйЭлемент.КартинкаШапки = БиблиотекаКартинок.Скрепка;
НовыйЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
Если выявите ошибку, прошу писать, буду стараться устранять проблемы относительно оперативно.
Проверено на следующих релизах:
11.5.20.66;
11.5.24.43
Не забываем отключить безопасный режим у расширения.