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