Недавно встала задача в конфигурации ERP в форме списка документов "Заказы клиентов", выводить дополнительную информацию в виде "скрепки" которая бы говорила о том что данный документ имеет прикрепленные скан копии документов подтверждающие его значимость.

В стандартной конфигурации за вывод списка документов отвечает динамический список, там нужная информация отсутствует рис 1-2.

Форму списка Заказов клиента формирует динамический список.
Форму списка Заказов клиента формирует динамический список.

Рис 1.

Открыв содержимое списка видим что нет ни какой информации о присоединённых файлах!
Открыв содержимое списка видим что нет ни какой информации о присоединённых файлах!

Рис 2.

Сама форма списка выглядит пока вот так рис 3. Кроме того что заказ проведен не видим ни каких других картинок

Рис 3.

Решение .

Оно заключается в двух вариантах назовем их так:

  1. Меняем жестко динамический список

  2. Меняем мягко динамический список

1. Меняем динамический список на уровне запросов

Поискал где и информация о том что к документу прикреплены скан копии файлы документов.

Они конечно же в регистре сведений "Наличие файлов", разработку ведем в расширении,

заимствуя туда необходимые объекты рис 4.

Расширении в котором ведем доработку
Расширении в котором ведем доработку

Заходи на "ФормуСпискаДокументов" ( а не на "Форму Списка" !) и меняем динамический список добавив регистр "Наличие файлов" и создав "Левое соединение" с регистром . рис 5-6.

Добавляем регистр кв динамический список.
Добавляем регистр кв динамический список.

Рис 5.

Создаем связь  регистра с Документами "Заказ клиента"
Создаем связь регистра с Документами "Заказ клиента"

В динамическом списке появилось новое поле "ЕстьФайл" типа булево. Рис 7.

Рис 7.

В свойствах поля устанавливаем тип "картинка" и назначаем картинку "скрепку" в том числе и в шапке поля Рис 8.

Выводим скрепку в форму списка
Выводим скрепку в форму списка

Все готово осталось посмотреть на результат Рис 9.

Результат решения задачи
Результат решения задачи

2. Минимальное изменение запроса в динамическом списке, вывод дополнительной информации при обработке списка.

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

Какой же вариант в этом случае? Он заключается в добавление в запрос лишь полей которые будут выводится на форме. Рис 2.1

Рис 2.1       Добавили поле "ЕстьФайл" с типом булево.
Рис 2.1 Добавили поле "ЕстьФайл" с типом булево.

По умолчанию это поле всегда имеет значение = Ложь, поле появилось у нас в динамическом списке, выносим его на форму установив вид "Поле Картинки" и установив значение поля "Картинка значений" в виде картинки скрепки Рис 2.2

Рис 2.2   Расположение дополнительного поля на форму и назначение ему нужных свойств.
Рис 2.2 Расположение дополнительного поля на форму и назначение ему нужных свойств.

Ну и теперь остается получить каким то образом доступ к дополнительным реквизитам чтобы присвоить им значения при выводе формы списка (Заказы клиента).

За это отвечает метод модуля формы - "СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)", в этом методе параметр "Строки" поможет реализовать заполнение при выводе списка. Заимствуем этот метод в расширение из основной конфигурации с директивой "&Изменение Контроль" и пропишем в нем необходимы код. Рис 2.3

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

	#КонецВставки
	
	// ЭлектронноеВзаимодействие.СервисEDI
	ДокументыEDIИнтеграция.ПриПолученииДанныхНаСервереСписокДокументов(Перечисления.ТипыДокументовEDI.ЗаказКлиента, ИмяЭлемента, Настройки, Строки);
	// Конец ЭлектронноеВзаимодействие.СервисEDI
	
КонецПроцедуры

Рис 2.3

В этом коде очень важным является параметр - "Строки" у него есть ключи это ссылки на документы и значение этих ключей в виде данных. "Строки.ПолучитьКлючи()" функция позволяет получить все содержимое динамического списка, для его использования в дальнейшем для внесения информации и отображении уже с внесенной информацией.

Первоначально значения поля динамического списка "ЕстьФайл" имеет значение ложь Рис 2.4.

Рис 2.4        Используем ключи и значение строк динамического списка
Рис 2.4 Используем ключи и значение строк динамического списка

Подготовим запросом (который мы в первом варианте включали в текст запроса динамического списка) необходимые данные - документы в которых есть присоединенные файлы.

Используя виде ключа ссылки ("ОбъектСФайлами") на документы заказ клиента, подставим необходимые данные

СтрокаСписка = Строки[Выборка.ОбъектСФайлами];
СтрокаСписка.Данные.ЕстьФайл = Выборка.ЕстьФайлы; 	

и результат это список документов с дополнительными реквизитами или обработкой списка, можно назначить цвет, шрифт, вычислить какое то значение и другое при выводе списка.

Вывод дополнительной информации в динамическом списке.
Вывод дополнительной информации в динамическом списке.

Заключение:

Динамические списки мощный элемент в разработке на 1С, буду рад если для кого то материал статьи будет интересным.

До новых встреч на HABR .

(SPS).

Комментарии (3)


  1. sevenlis
    20.06.2025 12:56

    а что в ЕРП разве нет функционала БСП?


  1. Naf2000
    20.06.2025 12:56

    В первом варианте я бы сделал изменение запроса программно, например через схему запроса. Во 2-м тоже, но там изменения минимальны.

    По поводу второго:

        РезультатЗапроса = Запрос.Выполнить();
    	Выборка = РезультатЗапроса.Выбрать();
    	
    	Если  Выборка <> неопределено Тогда
    		Пока Выборка.Следующий() Цикл

    Зачем проверка на неравенство Неопределено?


  1. vis_inet
    20.06.2025 12:56

    А при каком способе список быстрее работает?