1с добавить реквизит в документ

Обновлено: 05.07.2024

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

Откроем документ "ПриходДенежныхСредств" и добавим реквизит "Договор" (Рисунок 1).

Укажем у реквизита "Договор" ссылку на справочник "Договоры" (Рисунок 1).

Теперь зайдем в пользователя и проверим изменения (Рисунок 2)!

Теперь я хочу сделать таким образом, что бы при выборе контрагента "Поставщик 3" показывались только те договоры, которые относятся к этому контрагенту! У нас для этого уже есть заготовки и просто необходимо включить этот функционал.

До этого мы указывали, что справочник "Договоры" является подчиненным для справочника "Контрагенты" - является владельцем.

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

Для этого нужно открыть свойства реквизита "Договор" и найти свойство "Связи параметров выбора" (Рисунок 3).

У этого свойства необходимо нажать на значок многоточия и откроется окно (Рисунок 4).

В этом окне нам необходимо перетащить реквизит, по которому будет делаться отбор - это Контрагент. Нужно выделить реквизит и нажать на значок стрелки вправо и он переместится в правое окно (Рисунок 5).

В правом окне необходимо установить значения, которые показаны на рисунке 5 и нажать "Ок".

Если поле (столбец) "Имя" не отображается как на рисунке, то необходимо по нему дважды щелкнуть и в выпадающем списке выбрать необходимое значение.

После этого нужно перейти в режим пользователя и проверить изменения (Рисунок 6).

На рисунке 6 видно, что реквизит сам добавился и на форму документа и на форму списка, а так же, отбор по владельцу работает.

Работает это так: как только вы выбрали в поле "Контрагент" какой-то элемент, так сразу для поля "Договор" срабатывает отбор и будет показываться только то, что относится к этому владельцу (контрагенту).

Давайте продолжим. Добавим реквизит "Договор" (Рисунок 8) в документ "РасходДенег" - он будет абсолютно таким же, как и в прошлом документе, то есть нужно в свойствах указать отбор по владельцу (если не помните как, то посмотрите выше, там это описано), но перед этим добавим форму документа на вкладке "Формы" (Рисунок 7), выберите необходимые реквизиты, которые будут отображаться на форме и нажмите "Готово".

Закройте форму, она пока нам не нужна и теперь перейдите на вкладку "Данные" и создадим реквизит "Договор" (Рисунок 8).

После этого запустить пользователя и проверить изменения (Рисунок 9).

Посмотрите на рисунок 9, на форме документа нет реквизита "Договор"! Как так и почему? Ведь мы же его создали, а он тут не отображается!

Но, если закрыть форму документа и посмотреть на форму списка (Рисунок 10), то мы увидим, что этот реквизит на этой форме есть!

Как так получается? Почему в одном месте его нет, а в другом есть?

Все очень просто, все точно так же как и в справочнике! Мы создали реквизит после того, как создали форму! А в этом случае платформа понимает: "как только создана форма, она уходит в сторону и все работу по добавлению чего-то нового на форму, отдает полностью пользователю"!

Мы создали форму документа, а потом только создали реквизит. Именно поэтому он не добавился на форму, так как нам нужно добавлять его на форму вручную, а форму списка мы не трогали и именно поэтому платформа сама его добавила!

Давайте добавим реквизит на форму! Для этого откроем объект на вкладке "Формы" и откроем форму документа (Рисунок 11).

Теперь необходимо в правой части окна раскрыть список "Объект" и там найти реквизит "Договор" (Договор 12).

Проверим изменения в пользовательском режиме (Рисунок 13).

Все так и работает: как только создаете какую-то форму, так сразу платформа перестает сама добавлять реквизиты на форму, но если вы до создания формы создали все реквизиты и потом создали форму, то автоматически все реквизиты появятся на форме.

Мало того, что реквизит появился на форме, так и отбор работает - показываются только те договоры, которые относятся к определенному контрагенту!

Теперь проверим изменения в пользователе и убедимся в том, что она не появилась на форме документа - значит, нужно переместить ее сначала на форму в режиме разработчика (Рисунок 15).

Теперь проверим пользователя и будет выглядеть вот так (Рисунок 16).

Как видим по рисунку 16, табличка появилась выше первых двух таблиц, а не стала после таблички "Услуги" как на рисунке 17.

Так, как на рисунке 16, программа тоже будет работать, но не удобно будет, слишком много места занимает одна таблица, а нужно так, как на рисунке 17 - для экономии места и удобности.

Для этого перейдем на форму в режиме разработчика и сделаем следующее:

3. Рисунок 20 - Переименовать новую группу (Имя и Синоним)

4. Рисунок 21 - Переместить в папку "Дополнительно" таблицу "Дополнительно"

5. Рисунок 22 - Запустить пользователя и проверить изменения .

Рисунок 22 - Отображение таблицы в пользовательском режиме Рисунок 22 - Отображение таблицы в пользовательском режиме

Теперь место сэкономлено, стало более удобнее работать!

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

На этом статья урока подходит к концу. Попробуйте выполнить все действия, которые описаны в этом уроке. Если что-то не получается, то вы всегда сможете написать вопрос о том. что вам непонятно или вернуться к предыдущим урокам и посмотреть их - ссылки внизу!

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

1С. Программное добавление и удаление реквизитов формы

Задача

Для наглядности разберем простой пример, в котором можно было обойтись только элементами формы, но мы создадим и реквизиты.

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

  • ЯчейкаХранения, тип СправочникСсылка.ЯчейкиХранения;
  • ТекущийОстаток, тип Число.

Элементы объединить в группу с горизонтальной группировкой. На текущий момент форма имеет следующий вид:

добавить реквизит формы

Добавление реквизитов

В обработчике формы ПриСозданииНаСервере() опишем код, который разбивается на 3 этапа:

  1. Описание и создание реквизитов формы;
  2. Создание элементов формы, объединение в группу без отображения;
  3. Заполнение данных.

Ниже приведен готовый код, код снабжен комментариями и разбит на области для лучшего понимания

После выполнения приведенного кода форма будет выглядеть так:

реквизит программно

Удаление реквизитов

Для удаления необходимо передать массив содержащий пути реквизитов в качестве второго параметра метода формы ИзменитьРеквизиты().

Внимание. Удалять можно только реквизиты созданные программно.

Добавление реквизита табличной части

Добавление реквизита с типом Произвольный

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

Внимание. Данные добавленного реквизита сохраняться в ИБ не будут.

К примеру, необходимо при каждой записи документа сохранять пользователя, который выполнил изменения в документе. В типовых конфигурациях у большинства объектов есть реквизит «ответственный», но в данный реквизит записывается только создатель документа. Чтобы сохранить также и пользователя, вносившего изменения в объект, можно добавить новый реквизит – «Редактор». Можно пойти долгим путем добавления в каждый требуемый объект нового реквизита, последующего вынесения на форму и т.д., а можно добавить в конфигурацию один общий реквизит документов, и указать, где он будет использоваться (Рисунок 1).


Взаимодействие с общими реквизитами 1С, по сути, ничем не отличается от взаимодействия с обычными, за исключением того, что общие реквизиты не отображаются у выбранных объектов в свойствах в дереве метаданных.

Соответственно, обращение к общему реквизиту 1С также ничем не отличается от обращения к реквизитам других типов (Рисунок 2).


При работе с формой объекта 1С 8.3, обращение к реквизитам также не отличается, и, чтобы вынести данный реквизит на форму объекта, достаточно его просто перетащить на форму (Рисунок 3).


Разделение данных 1С

Второй вариант использования общих реквизитов – Разделение данных 1С.

Разделение данных 1С – это аналогичный ограничению доступа на уровне записей механизм, однако работающий по другому принципу. Если ограничение доступа на уровне записей – это дополнительные условия в запросе 1С 8.3, ограничивающие список, то разделитель данных 1С – это дополнительный столбец в таблицах на уровне СУБД. Соответственно, благодаря разделению данных 1С система будет работать несколько быстрее.

1. Создается общий реквизит документов и определяется состав справочников, регистров и документов, которые будут разделяться;

2. При разделении данных конфигуратор предложит создать два параметра сеанса 1С: значение реквизита объекта и признак использования.

После включения настройки «Разделение данных» 1С покажет в свойствах общего реквизита дополнительные поля (Рисунок 4):

· Свойство «Использовать разделение данных» имеет два значения — «Независимо», позволяющее полностью разделить базу на независимые участки, и «Независимо и совместно», позволяющее работать как в независимом режиме, так и в обычном.


· Свойства «Разделение пользователей» и «Разделение аутентификации» позволяет создавать отдельные списки пользователей для каждой области базы.

· Свойство «Условное разделение» позволяет использовать какие-либо условия для включения или отключения общего реквизита-разделителя.

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

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

Вкраце последовательность действий:

1. Выводиться форма

2. Увеличиваем высоту формы на общую высоту добавляемых реквизитов (некая высота - n) .

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

4. Добавляем новые реквизиты, устанавливаем их свойства и привязки. Profit!

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

З.Ы. Возможно будут проблемы с элементами которые привязаны к нижней границе через другой элемент, но в моих 30 документах такого не наблюдалось. В крайнем случае можно сохранить параметры всех элементов на форме: верхняя точка и высота элемента. И после увеличения высоты формы восстановить эти параметры.

Примеры кода, думаю комментариев будет достаточно:


Функция ВыводитьДополнительныеРеквизиты ( ДокументОбъект , ФормаДокумента )

Если ДокументОбъект . Метаданные (). Реквизиты . Найти ( "ПодразделениеОрганизации" ) <> Неопределено Тогда

Для Каждого Стр из ФормаДокумента . ЭлементыФормы Цикл

Если Стр . Данные = "ПодразделениеОрганизации" Тогда

Процедура ВыводДополнительныхРеквизитов ( ДокументОбъект , ФормаДокумента ) Экспорт

// Проверка на наличие дополнительных реквизитов

Если Не ВыводитьДополнительныеРеквизиты ( ДокументОбъект , ФормаДокумента ) Тогда Возврат КонецЕсли;

// Вывод или сохранение дополнительных реквизитов

// Если элемент формы существует то сохраняем значение

Элемент = ФормаДокумента . ЭлементыФормы . Найти ( "_ПодразделениеОрганизации" );

Если Элемент = Неопределено Тогда

ВысотаОбщаяДобавляемыхЭлементовПоВертикали = 27 ; // Общая высота всех добавляемых элементов

ВысотаНижнейПанели = 0 ; // будет вычислятся если нижняя панель есть

ФормаДокумента . Высота = ФормаДокумента . Высота + ВысотаОбщаяДобавляемыхЭлементовПоВертикали ;

// Обработка элементов формы

Для Каждого Стр из ФормаДокумента . ЭлементыФормы Цикл

Стр . ПолучитьПривязку ( ГраницаЭлементаУправления . Низ , _ПервыйЭлемент , _ГраницаПервогоЭлемента , _ВторойЭлемент , _ГраницаВторогоЭлемента );

Если _ПервыйЭлемент = ФормаДокумента . Панель И _ГраницаПервогоЭлемента = ГраницаЭлементаУправления . Низ Тогда

// Исключаем нижнюю панель команд

Если ВРЕГ ( СокрЛП ( Стр . Имя )) = "ОСНОВНЫЕДЕЙСТВИЯФОРМЫ" Тогда

ВысотаНижнейПанели = Стр . Высота ;

// У растягиваемых элементов уменьшаем высоту, а элементы с фиксированной высотой смещаем вверх

Стр . ПолучитьПривязку ( ГраницаЭлементаУправления . Верх , _ПервыйЭлемент , _ГраницаПервогоЭлемента , _ВторойЭлемент , _ГраницаВторогоЭлемента );

Если _ПервыйЭлемент = ФормаДокумента . Панель И _ГраницаПервогоЭлемента = ГраницаЭлементаУправления . Низ Тогда

Стр . Верх = Стр . Верх - ВысотаОбщаяДобавляемыхЭлементовПоВертикали ;

Стр . Высота = Стр . Высота - ВысотаОбщаяДобавляемыхЭлементовПоВертикали ;

ПоложениеПервогоЭлемента = ФормаДокумента . Высота - ВысотаОбщаяДобавляемыхЭлементовПоВертикали - ВысотаНижнейПанели - ВысотаОбщаяДобавляемыхЭлементовПоВертикали ;

Элемент = ФормаДокумента . ЭлементыФормы . Добавить ( Тип ( "Надпись" ), "_ЗаголовокПодразделениеОрганизации" , Истина, ФормаДокумента . Панель );

Элемент . Заголовок = "Подразделение организации:" ;

Элемент . Лево = РасстояниеМеждуЭлементами ;

Элемент . Верх = ПоложениеПервогоЭлемента ;

Элемент . Высота = ВысотаОдногоЭлемента ;

Элемент . Ширина = 155 ;

Элемент . УстановитьПривязку ( ГраницаЭлементаУправления . Верх , ФормаДокумента . Панель , ГраницаЭлементаУправления . Низ );

Элемент . УстановитьПривязку ( ГраницаЭлементаУправления . Низ , ФормаДокумента . Панель , ГраницаЭлементаУправления . Низ );

Элемент . УстановитьПривязку ( ГраницаЭлементаУправления . Право , ФормаДокумента . Панель , ГраницаЭлементаУправления . Лево );

Элемент . УстановитьПривязку ( ГраницаЭлементаУправления . Лево , ФормаДокумента . Панель , ГраницаЭлементаУправления . Лево );

// Создание поле ввода

Элемент = ФормаДокумента . ЭлементыФормы . Добавить ( Тип ( "ПолеВвода" ), "_ПодразделениеОрганизации" , Истина, ФормаДокумента . Панель );

Элемент . ТипЗначения = Новый ОписаниеТипов ( "СправочникСсылка.ПодразделенияОрганизаций" );

Элемент . Данные = "ПодразделениеОрганизации" ;

Элемент . Лево = РасстояниеМеждуЭлементами + 155 + РасстояниеМеждуЭлементами ;

Элемент . Верх = ПоложениеПервогоЭлемента ;

Элемент . Высота = ВысотаОдногоЭлемента ;

Элемент . Ширина = ФормаДокумента . Ширина - ( РасстояниеМеждуЭлементами * 3 ) - 155 ;

Элемент . УстановитьПривязку ( ГраницаЭлементаУправления . Верх , ФормаДокумента . Панель , ГраницаЭлементаУправления . Низ );

Элемент . УстановитьПривязку ( ГраницаЭлементаУправления . Низ , ФормаДокумента . Панель , ГраницаЭлементаУправления . Низ );

Элемент . УстановитьПривязку ( ГраницаЭлементаУправления . Право , ФормаДокумента . Панель , ГраницаЭлементаУправления . Право );

Элемент . УстановитьПривязку ( ГраницаЭлементаУправления . Лево , ФормаДокумента . Панель , ГраницаЭлементаУправления . Лево );

Если ДокументОбъект . ЭтоНовый () Тогда

Элемент . Значение = УправлениеПользователями . ПолучитьЗначениеПоУмолчанию ( глЗначениеПеременной ( "глТекущийПользователь" ), "ОсновноеПодразделениеОрганизации" );

Читайте также: