Как добавить дополнительный реквизит в табличную часть документа в 1С:ERP?

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

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

В этой статье мы подробно разберем несколько вариантов решения этой задачи — от штатных методических механизмов 1С:ERP до программирования с использованием расширений конфигурации.

Почему БСП не поддерживает доп. реквизиты в табличных частях напрямую?

Выясним причину этого системного ограничения. Механизм дополнительных свойств БСП опирается на предопределенную табличную часть ДополнительныеРеквизиты, которая создается у объекта метаданных на этапе разработки. Свойства хранятся в виде пар "Свойство - Значение" для всего документа. Напрямую "привязать" эти пары к строкам другой произвольной табличной части документа (например, Товары) без изменения структуры метаданных невозможно, так как в типовой архитектуре для этого нет связующего звена.

Поэтому нам приходится использовать альтернативные пути. Рассмотрим подробнее каждый из них.

Решение 1. Использование механизма серий номенклатуры (Лучший методический путь)

Если вам требуется вести учет в разрезе индивидуальных номеров (например, указывать номера труб, кабельных барабанов, двигателей и т.д.), самым правильным решением будет задействовать встроенный механизм Серий номенклатуры.

Проанализируем преимущества этого подхода:

  1. Поддержка БСП: Справочник серий номенклатуры в 1С:ERP изначально поддерживает механизм дополнительных реквизитов. Вы можете создать любые пользовательские свойства для серии.
  2. Интеграция с ТЧ: Поле Серия уже выведено во все основные табличные части складских и финансовых документов.
  3. Сквозной учет: Параметры серии будут автоматически наследоваться во всей цепочке документов — от закупки до производства и реализации.

Разберем по шагам, как настроить данный механизм:

  1. Перейдем в настройки вида номенклатуры и включим использование серий.
  2. Настроим политику учета серий. Если нам нужно просто фиксировать номера для отчетов без жесткого складского контроля, выберем тип политики "Справочное указание серий". Это минимизирует нагрузку на складской учет.
  3. В режиме "1С:Предприятие" для справочника Серии номенклатуры добавим нужные дополнительные реквизиты (например, "Номер ниппеля" или "Толщина стенки").

Теперь при выборе номенклатуры в документе пользователь сможет создать или выбрать серию, заполнив прямо внутри неё все необходимые индивидуальные параметры.

Решение 2. Использование характеристик номенклатуры

Если параметры строки ТЧ определяют свойства самого товара (например, цвет, размер, марка стали), целесообразно использовать Характеристики номенклатуры. Как и серии, характеристики поддерживают дополнительные реквизиты БСП и выводятся в табличных частях большинства документов 1С:ERP.

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

Решение 3. Добавление реквизита ТЧ через расширение конфигурации

Если штатные методики не подходят (например, мы оформляем услугу, для которой серии не предусмотрены), перейдем к технической реализации. Самым простым техническим способом является использование расширений конфигурации (.cfe).

Разберем этот процесс по шагам:

  1. Создадим новое расширение конфигурации и снимем галочку "Безопасный режим".
  2. Заимствуем в расширение необходимый документ (например, РеализацияТоваровУслуг) и его табличную часть (Товары).
  3. В расширении добавим в табличную часть новый реквизит (например, НомерТрубы) с типом Строка.
  4. Заимствуем форму документа в расширение и перетащим добавленный реквизит на форму в состав элементов табличной части.

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

Решение 4. Связка "Форма документа - Нетиповой регистр сведений" через расширение

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

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

Выполним следующие шаги:

  1. Создадим в расширении независимый регистр сведений ДопСведенияТЧ со следующей структурой:
    • Измерение: ДокументСсылка (тип: документ-родитель).
    • Измерение: КлючСвязи (тип: Число).
    • Ресурс: НомерТрубы (тип: Строка).
    • Ресурс: НомерНиппеля (тип: Строка).
  2. В расширении добавим реквизит формы (колонку таблицы) на форму документа (не в объект, а именно в элементы формы). Назовем эти колонки НомерТрубы_Форма и НомерНиппеля_Форма.
  3. Напишем код для заполнения этих колонок при открытии формы. Перехватим событие ПриСозданииНаСервере:

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

Теперь нам необходимо обеспечить сохранение этих данных при записи документа. Перехватим процедуру ПослеЗаписиНаСервере:


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

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

Какое решение выбрать?

Резюмируя, при выборе оптимального варианта рекомендуем придерживаться следующей логики:

  1. Если вы ведете материальный (складской) учет данных позиций — однозначно используйте Серии номенклатуры. Это стандартный, поддерживаемый вендором путь.
  2. Если данные носят справочный характер, но строго привязаны к номенклатурным позициям — настройте Характеристики.
  3. Если требуется быстрое решение для одного-двух документов, где нужно просто сохранять текстовые комментарии по строкам — используйте расширение конфигурации для добавления реквизита непосредственно в нужную табличную часть.
  4. Для сложных систем со строгими правилами обновления идеально подойдет связка "Форма документа - Регистр сведений" через механизм расширений.
← На главную