Как добавить колонки в табличную часть документа 1С без изменения конфигурации?

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

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

Стандартный механизм Изменить форму часто оказывается недостаточно гибким, так как он позволяет выводить только те данные, которые уже есть в реквизитах объекта или связаны с ними «через точку». Если же требуется расчет или запрос к регистрам (например, получение актуальной цены из регистра сведений), придется использовать более продвинутые методы — поможет колонки с весогабаритными характеристиками и их авторасчетом. Разберем подробно все доступные способы реализации этой задачи без снятия конфигурации с поддержки.

Способ 1. Использование расширений конфигурации (Программное создание колонок)

Расширения — это наиболее современный и рекомендуемый способ доработки системы. Мы можем вмешаться в процесс формирования формы документа и добавить туда нужные нам элементы управления программно. Рассмотрим ситуацию, когда нам нужно добавить колонку в форму документа ПриходнаяНакладная.

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


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Определяем таблицу, в которую будем добавлять колонку
    ТаблицаФормы = Элементы.Товары; 
    
    // Создаем новый элемент формы — поле
    НоваяКолонка = Элементы.Вставить("ТекущаяРозничнаяЦена", Тип("ПолеФормы"), ТаблицаФормы, ТаблицаФормы.ПодчиненныеЭлементы.Цена);
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
    НоваяКолонка.Заголовок = "Розн. цена (тек.)";
    НоваяКолонка.ТолькоПросмотр = Истина; // Поле будет информационным
    
    // Путь к данным — здесь кроется главная тонкость
    // Если мы не добавляли реквизит в расширение, данные нужно будет подгружать программно
    НоваяКолонка.ПутьКДанным = "Объект.Товары.РозничнаяЦена"; 
КонецПроцедуры

Важно понимать: чтобы ПутьКДанным заработал, сам реквизит РозничнаяЦена должен существовать в данных табличной части. Рассмотрим, как этого добиться в расширении правильно.

Способ 2. Добавление реквизита в структуру данных через расширение

Просто создать поле на форме недостаточно — 1С должна знать, где хранить эти данные. Самый стабильный метод — добавить реквизит непосредственно в табличную часть документа внутри расширения — для этого есть вывод штрихкодов товаров в табличные части документов.

  1. В дереве объектов расширения найдем нужный документ.
  2. Перейдем в раздел Табличные части, найдем нужную (например, Товары) и нажмем «Добавить в расширение».
  3. Внутри этой ТЧ в расширении создадим новый реквизит РозничнаяЦена с типом Число.

Теперь эта колонка физически существует в базе данных для этого документа. Выясним, как заполнить её данными. Нам нужно подписаться на событие ПриИзменении номенклатуры в строке или на событие ОбработкаВыбора. Проанализируем ситуацию: когда пользователь выбирает товар, система должна сходить в регистр сведений ЦеныНоменклатуры и подтянуть актуальное значение.

Пример кода для заполнения данных в расширении:


&НаКлиенте
&После("ТоварыНоменклатураПриИзменении")
Процедура Расш1_ТоварыНоменклатураПриИзменении(Элемент)
    СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
    Если СтрокаТЧ = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Вызываем серверную функцию для получения цены
    СтрокаТЧ.РозничнаяЦена = ПолучитьАктуальнуюРозничнуюЦену(СтрокаТЧ.Номенклатура);
    
    // Рассчитываем процент наценки, если нужно
    Если СтрокаТЧ.ЦенаЗакупки <> 0 Тогда
        СтрокаТЧ.ПроцентНаценки = ((СтрокаТЧ.РозничнаяЦена - СтрокаТЧ.ЦенаЗакупки) / СтрокаТЧ.ЦенаЗакупки) * 100;
    КонецЕсли;
КонецПроцедуры

Способ 3. Дополнительные реквизиты ТЧ (механизм БСП)

Многие пользователи не знают, что современные конфигурации на базе БСП (Библиотека стандартных подсистем) позволяют добавлять колонки в табличные части вообще без программирования — для этой задачи есть универсальный инструмент для настройки интерфейса без программирования. Это делается через раздел Администрирование — Общие настройки — Дополнительные реквизиты и сведения.

Рассмотрим алгоритм действий:

  1. Зайдем в список дополнительных реквизитов.
  2. Найдем в списке нужный документ и его табличную часть (например, Поступление товаров (Товары)).
  3. Добавим новый реквизит, например, Наценка.
  4. После сохранения этот реквизит автоматически появится в форме документа (иногда нужно включить его отображение через Изменить форму).

Нюанс этого метода: реквизит будет пустым. Чтобы он заполнялся автоматически («как в аптеке»), нам всё равно потребуется либо расширение (как в способе 2), либо внешняя обработка заполнения.

Способ 4. Внешние обработки заполнения табличных частей

Если расширения по каким-то причинам использовать нельзя (например, в облачных сервисах с жесткой модерацией), воспользуемся механизмом Дополнительные отчеты и обработки. Мы можем создать обработку с видом ЗаполнениеОбъекта.

Проанализируем механику работы: пользователь нажимает кнопку Заполнить над табличной частью, выбирает нашу обработку «Обновить цены и наценки», и код обработки обходит все строки документа, выполняет запросы к базе и заполняет нужные колонки. Это безопасный метод, так как он никак не меняет структуру конфигурации.

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


Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
    Для Каждого ДокументОбъект Из ОбъектыНазначения Цикл
        Для Каждого СтрокаТЧ Из ДокументОбъект.Товары Цикл
            // Логика получения цены и расчета наценки
            Цена = ПолучитьЦену(СтрокаТЧ.Номенклатура); 
            Наценка = ?(СтрокаТЧ.Цена <> 0, (Цена - СтрокаТЧ.Цена) / СтрокаТЧ.Цена * 100, 0);
            
            // Записываем данные в стандартное текстовое поле, чтобы не менять структуру
            СтрокаТЧ.Содержание = "Тек. цена: " + Цена + " (Наценка: " + СокрЛП(Наценка) + "%)";
        КонецЦикла;
        ДокументОбъект.Записать();
    КонецЦикла;
КонецПроцедуры

Способ 5. Информационные панели и дополнительные сведения

В последних релизах «1С:Розница» и «1С:УНФ» реализован механизм информационных панелей. Вместо того чтобы перегружать таблицу новыми колонками, можно настроить отображение информации о текущей строке в правой части экрана — для этого подойдёт панель с ценами, остатками и историей закупок.

Разберем, чем это удобно:

Подведем итоги

Выбор метода зависит от ваших навыков и требований к системе. Если вам нужно полноценное решение, которое работает «на лету» и позволяет сортировать данные по новой колонке — используйте Расширение с добавлением реквизита в ТЧ. Если нужно быстро предоставить пользователю справочную информацию без изменения структуры данных — подойдет Внешняя печатная форма или Внешняя обработка заполнения.

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

← На главную