Как вывести вес номенклатуры в отдельную колонку списка в 1С:Управление торговлей 10.3?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе со справочником Номенклатура в конфигурациях на обычных формах (например, «1С:Управление торговлей 10.3») часто возникает задача отобразить дополнительные физические параметры товара, такие как вес или объем, непосредственно в форме списка. Однако просто выбрать соответствующий реквизит в свойствах колонки не удается. Разберем особенности структуры хранения данных и пошагово реализуем вывод веса в список без потери производительности системы.

Особенности структуры данных и ограничения обычных форм

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

  1. В справочнике Номенклатура реквизит БазоваяЕдиницаИзмерения ссылается на классификатор ОКЕИ (КлассификаторЕдиницИзмерения), у которого нет весовых параметров.
  2. Физический вес и объем хранятся в элементах подчиненного справочника ЕдиницыИзмерения в реквизитах Вес и Объем.
  3. У позиции номенклатуры есть ссылки на ключевые единицы измерения: ЕдиницаХраненияОстатков, ЕдиницаДляОтчетов и ЕдиницаМест. В большинстве учетных задач вес определяется именно через единицу хранения остатков: Номенклатура.ЕдиницаХраненияОстатков.Вес.

На обычных формах источником данных для таблицы выступает объект СправочникСписок. В отличие от динамических списков на управляемых формах, он не позволяет настроить произвольный текст запроса с левыми соединениями через конфигуратор. Поэтому для вывода значений из подчиненных объектов создается расчетная колонка, которая заполняется программно в событии ПриПолученииДанных.

Пошаговая инструкция добавления колонки

Рассмотрим по шагам процесс добавления и настройки колонки в форме списка справочника Номенклатура:

  1. Открываем в конфигураторе форму списка справочника Номенклатура (ФормаСписка).
  2. Выделяем элемент управления ТабличноеПоле (список номенклатуры), открываем контекстное меню и выбираем пункт Вставить колонку.
  3. В палитре свойств созданной колонки указываем имя (например, Вес) и заголовок («Вес»).
  4. Важно: свойство Данные оставляем пустым. Если указать несуществующий реквизит или попытаться прописать путь через точку, форма выдаст ошибку или колонка останется пустой.
  5. Выделяем само табличное поле, переходим в палитру свойств на закладку События, находим событие ПриПолученииДанных и нажимаем кнопку открытия обработчика (значок лупы).

Типичные ошибки при реализации

Разберем ошибки, которые часто допускают разработчики при попытке заполнить колонку:

  1. Выполнение запроса в цикле по каждой строке: если внутри цикла по коллекции ОформленияСтрок отправлять отдельный запрос к базе на каждую строку, список начнет сильно зависать при прокрутке. Запрос должен быть строго один на всю видимую пачку строк.
  2. Ошибочная сигнатура процедуры: у события ПриПолученииДанных на обычных формах сигнатура строго фиксирована — (Элемент, ОформленияСтрок). Попытка объявить дополнительные параметры приводит к ошибкам компиляции и исполнения.
  3. Обращение к несуществующему реквизиту: запрос вида ВЫБРАТЬ Номенклатура.Вес вызовет ошибку, так как у справочника Номенклатура нет реквизита Вес (он находится в единице измерения).
  4. Отсутствие привязки события: если код написан в модуле формы, но имя процедуры не указано в палитре свойств таблицы в поле события ПриПолученииДанных, процедура вызываться не будет.

Оптимальный алгоритм заполнения данных

Посмотрим на пример правильной обработки события. Мы собираем массив ссылок видимых на экране строк, выполняем один пакетный запрос через конструкцию В (&МассивСсылок) и сопоставляем результаты через объект Соответствие.


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

Альтернативные варианты отображения

Проанализируем другие способы решения задачи в зависимости от требований пользователей:

  1. Вывод веса на информационной панели: если колонка в самом списке не обязательна, а вес нужен только для текущей позиции, размещаем под списком поле надписи (например, НадписьВес) и в событии списка ПриАктивизацииСтроки устанавливаем текст:
    
    Процедура СписокПриАктивизацииСтроки(Элемент)
        ТекущиеДанные = Элемент.ТекущиеДанные;
        Если ТекущиеДанные <> Неопределено И НЕ ТекущиеДанные.ЭтоГруппа Тогда
            ЭлементыФормы.НадписьВес.Заголовок = "Вес: " + ТекущиеДанные.ЕдиницаХраненияОстатков.Вес;
        Иначе
            ЭлементыФормы.НадписьВес.Заголовок = "";
        КонецЕсли;
    КонецПроцедуры
    
  2. Добавление реквизита в сам справочник: следует помнить, что расчетная колонка в событии ПриПолученииДанных не поддерживает стандартную сортировку платформы и отборы по значению. Если по весу требуется выполнять быстрый поиск, сортировку и устанавливать фильтры в списке, оптимальным решением будет создание отдельного реквизита Вес непосредственно в справочнике Номенклатура с автоматической синхронизацией его значения при записи единицы измерения.
← На главную