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