Как добавить все поля документа в расширение 1С, не перетаскивая их по одному?

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

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

Использование функции "Добавить все свойства объекта в расширение"

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

  1. Откройте конфигуратор 1С:Предприятия и выберите ваше расширение в дереве конфигурации. Убедитесь, что вы работаете именно с расширением, а не с основной конфигурацией.

  2. В дереве объектов конфигурации расширения найдите раздел, соответствующий типу объекта, который вы хотите расширить (например, Документы).

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

  4. После того как документ появится в вашем расширении (например, Документ.МойДокумент), найдите его в ветке расширения, относящейся к вашему расширению.

  5. Кликните правой кнопкой мыши по добавленному объекту (Документ.МойДокумент) непосредственно в дереве объектов вашего расширения. В контекстном меню вы должны увидеть опцию, похожую на "Добавить в расширение", а внутри нее — "Все свойства объекта" или "Все реквизиты объекта". Выберите эту опцию.

Эта функция предназначена для автоматического переноса всех реквизитов выбранного объекта в ваше расширение. Однако, важно отметить, что в некоторых случаях пользователи сообщали о смешанных результатах: этот метод мог успешно работать в типовых конфигурациях, но не срабатывал в самописных. Всегда проверяйте результат после выполнения этой операции, чтобы убедиться, что все необходимые реквизиты были добавлены.

Автоматическое добавление полей через конструктор запроса (начиная с версии 8.3.23)

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

Как это работает, разберем подробнее:

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

  2. По мере того как вы добавляете поля в запрос конструктора, платформа автоматически анализирует текст вашего запроса.

  3. Если в запросе используются поля (реквизиты) основного объекта, которые еще не были добавлены в расширение, система сама обнаружит их отсутствие.

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

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

Ручное добавление реквизитов через форму документа

Если автоматические методы по какой-либо причине не подходят или не работают, существует более традиционный, но всё же структурированный подход через форму документа. Он позволяет добавить необходимые реквизиты, фокусируясь на контексте формы.

  1. Сначала добавьте форму нужного документа в расширение. Для этого найдите форму документа в основной конфигурации (например, в ветке Документы -> МойДокумент -> Формы -> ФормаДокумента), кликните по ней правой кнопкой мыши и выберите "Добавить в расширение". Убедитесь, что форма появилась в ветке вашего расширения.

  2. Откройте эту форму в конфигураторе, кликнув по ней в дереве объектов вашего расширения. Убедитесь, что вы работаете в контексте расширения (это будет указано в заголовке окна формы).

  3. В панели Реквизиты формы, найдите основной реквизит формы, который связан с объектом документа. Обычно он называется Объект и имеет тип вашего документа (например, ДокументОбъект.МойДокумент).

  4. Разверните этот реквизит Объект в дереве реквизитов формы. Вы увидите список всех доступных полей документа, к которым имеет доступ форма.

  5. Выберите те реквизиты документа, которые вы хотите добавить в расширение. Вы можете выделить несколько реквизитов с помощью клавиш Ctrl (для выборочного добавления) или Shift (для добавления диапазона полей).

  6. Кликните правой кнопкой мыши по выделенным реквизитам и выберите "Добавить в расширение". Платформа перенесет выбранные реквизиты из основного объекта документа в ваше расширение, делая их доступными для модификации или использования в коде расширения.

Этот метод всё еще требует ручного выбора реквизитов, но он может быть удобнее, чем поиск каждого реквизита в общей структуре документа, особенно если вы уже сосредоточены на работе с конкретной формой и знаете, какие поля вам нужны.

Программное изменение запросов для динамических списков

Иногда, вместо того чтобы добавлять все реквизиты в расширение, целесообразно изменить запрос динамического списка программно. Этот подход требует более глубоких навыков программирования и понимания архитектуры 1С, но позволяет сохранить расширение "чистым", избегая добавления ненужных реквизитов основного объекта, которые могут использоваться только в одном конкретном запросе.

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

Как это реализовать, рассмотрим на примере:

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

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


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

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

Редактирование XML-файлов конфигурации (не рекомендуется)

Теоретически существует возможность выгрузить расширение в XML-файлы, вручную отредактировать эти файлы, добавив нужные реквизиты в соответствующие разделы, и затем загрузить расширение обратно из XML. Однако этот метод является крайне трудоемким, требует глубокого и детального понимания внутренней структуры конфигурации 1С и очень сильно подвержен ошибкам. Мы настоятельно не рекомендуем использовать этот подход для рутинных задач, поскольку он может привести к повреждению расширения или основной конфигурации, а также к потере данных или нарушению работоспособности системы. Используйте его только как крайнюю меру при наличии экспертных знаний и резервных копий.

Рекомендации и лучшие практики

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

  1. Добавляйте только то, что действительно необходимо: Всегда старайтесь добавлять в расширение только те объекты, реквизиты и метаданные, которые абсолютно нужны для реализации вашего функционала. Избыточное добавление может утяжелить расширение, увеличить его размер, усложнить отладку, тестирование и обслуживание. Каждое добавленное поле увеличивает объем метаданных, обрабатываемых платформой.

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

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

  4. Рассматривайте альтернативные подходы: Для сложных случаев, особенно при работе с динамическими списками, где требуется высокая гибкость или нужно избежать 'засорения' расширения, рассмотрите возможность программной модификации запросов. Этот подход дает наибольший контроль и гибкость, позволяя точно определить, какие данные и как будут отображаться, без необходимости добавления всех реквизитов в расширение.

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

← На главную