Добавление новой табличной части (ТЧ) в типовой документ — одна из самых частых задач при адаптации конфигурации под нужды конкретного бизнеса. Однако, работая с типовым решением, мы всегда должны помнить о последующих обновлениях. Если внести изменения «в лоб», каждое обновление превратится в трудоемкий процесс сравнения и объединения. В этой статье мы разберем современные подходы, которые позволяют добавить функционал максимально «чисто».
Прежде чем приступить к разработке, проанализируем ситуацию. Существует три основных способа добавления ТЧ:
Рассмотрим подробнее наиболее гибкий и современный вариант — использование расширений в сочетании с программными методами.
Этот способ считается наиболее правильным для версий платформы 8.3.11 и выше. Он позволяет сохранить основную конфигурацию на полной поддержке. Разберем этот процесс по шагам.
Шаг 1. Создание расширения. Сначала мы создаем новое расширение (или используем существующее). Важно убедиться, что назначение расширения установлено в значение «Адаптация» или «Дополнение».
Шаг 2. Заимствование документа. Находим нужный типовой документ в дереве конфигурации, нажимаем правую кнопку мыши и выбираем «Добавить в расширение». Теперь документ доступен нам для модификации.
Шаг 3. Добавление ТЧ в расширении. В заимствованном документе (внутри расширения) создаем новую табличную часть. Важный совет: всегда используйте уникальные префиксы для имен (например, пр_Товары), чтобы избежать конфликтов имен при будущих обновлениях от вендора.
Анализируем риски: стоит помнить, что данные табличных частей, созданных в расширении, хранятся в СУБД в отдельных таблицах. Если расширение будет удалено из базы, все данные в этой ТЧ будут безвозвратно потеряны. Простое отключение расширения данные не удаляет, но риск остается.
Даже если мы добавили ТЧ в метаданные расширения, у нас есть выбор: добавить ее на форму визуально (перетаскиванием в редакторе формы расширения) или программно. Профессиональное сообщество часто склоняется к программному выводу. Выясним причину: программная доработка формы не «перекрывает» изменения поставщика. Если 1С изменит типовую форму в обновлении, ваша программная доработка просто отработает поверх новой формы, не вызывая конфликтов сопоставления.
Для программного добавления таблицы на форму мы используем процедуру, которую вызываем в событии ПриСозданииНаСервере. Рассмотрим пример кода:
// В модуле формы расширения или в обработчике события
&После("ПриСозданииНаСервере")
Процедура пр_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Если ТЧ уже есть в метаданных расширения, она доступна через Объект.
// Нам нужно создать только элемент формы (визуальную таблицу).
ИмяТЧ = "пр_ДополнительныеСведения";
ТаблицаФормы = Элементы.Добавить(ИмяТЧ, Тип("ТаблицаФормы"), ЭтаФорма);
ТаблицаФормы.ПутьКДанным = "Объект." + ИмяТЧ;
// Добавляем колонки программно
НоваяКолонка = Элементы.Добавить(ИмяТЧ + "Номенклатура", Тип("ПолеФормы"), ТаблицаФормы);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.ПутьКДанным = "Объект." + ИмяТЧ + ".Номенклатура";
КонецПроцедуры
Этот метод позволяет динамически управлять интерфейсом. Если в будущем нам потребуется перенести этот функционал в другой документ, мы сможем просто скопировать код, минимально меняя настройки.
Иногда задача стоит иначе: пользователю нужна таблица на форме для промежуточных расчетов, данные которой не нужно записывать в базу. В этом случае мы вообще не трогаем метаданные документа. Мы создаем Реквизит формы.
Разберем, как это сделать программно с помощью метода ИзменитьРеквизиты():
&НаСервере
Процедура ДобавитьПрограммнуюТЧ()
МассивДобавляемыхРеквизитов = Новый Массив;
// Описываем саму таблицу
РеквизитТЧ = Новый РеквизитФормы("ВременнаяТЧ", Новый ОписаниеТипов("ТаблицаЗначений"));
МассивДобавляемыхРеквизитов.Добавить(РеквизитТЧ);
// Описываем колонки таблицы
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Количество", Новый ОписаниеТипов("Число"), "ВременнаяТЧ"));
// Применяем изменения к форме
ЭтаФорма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
// Теперь создаем визуальный элемент, как в предыдущем примере
ЭлементТЧ = Элементы.Добавить("ТаблицаВременная", Тип("ТаблицаФормы"));
ЭлементТЧ.ПутьКДанным = "ВременнаяТЧ";
КонецПроцедуры
Такой подход максимально безопасен для обновлений, так как данные «живут» только в памяти формы.
Добавить визуальную таблицу — это только первый этап. Если данные из новой ТЧ должны формировать движения по регистрам (например, влиять на остатки), нам необходимо вмешаться в процесс проведения.
Проанализируем ситуацию: в расширении мы можем использовать аннотацию &После для процедуры ОбработкаПроведения. Это позволит нам дописать свой код, который будет считывать данные из нашей новой ТЧ и формировать дополнительные записи в регистры накопления или бухгалтерии.
Важно: если вы используете типовые механизмы (например, БСП), проверьте, не нужно ли регистрировать новую ТЧ в функциональных опциях или параметрах регистрации объектов. В некоторых конфигурациях (ERP, КА, УТ) проведение сильно формализовано и требует корректного встраивания в цепочку формирования движений через дополнительные процедуры модулей менеджера.
Мы выяснили, что оптимальный путь для современного разработчика 1С — это комбинированный подход:
ИзменитьРеквизиты или просто созданием элементов (для обеспечения стабильности при обновлениях).Такой метод гарантирует, что ваша доработка будет легко переносимой, не «сломает» типовой функционал и значительно упростит жизнь специалисту, который будет заниматься поддержкой системы в будущем.