1с добавить реквизит в документ
Долгое время искал способ программного добавления реквизитов на обычную форму. Не хотелось изменять и включать возможность редактирования у типовой формы, так как это вызывает трудности при обновлении типовой конфигурации. Но в виду того что надо было добавить один - два реквизита в один - два типовых документам, острой необходимости не было. И вот потребовалось добавить в более чем 30 документах реквизит "Подразделение организации" с типом справочник "Подразделения организаций", справочник типовой.
Итак. В данном случае выводим новые реквизиты снизу формы. Исходим от того, что у нас в типовых формах есть процедура обновления заголовка, которая выводить текущее состояние документа (новый, проведен, не проведен или записан), в ней и вызовем процедуру вывода новых реквизитов.
Вкраце последовательность действий:
1. Выводиться форма
2. Увеличиваем высоту формы на общую высоту добавляемых реквизитов (некая высота - n) .
3. Обратно уменьшаем высоту растягиваемых элементов на n, а остальные элементы формы, которые прикреплены к нижнему краю, смещаем на n вверх.
4. Добавляем новые реквизиты, устанавливаем их свойства и привязки. Profit!
На форме появляются новые реквизиты, привязки корректно отрабатывают, так как мы их не трогали и не меняли. Раньше моя ошибка заключалась в том что я пытался отключить привязку элементов к нижней границе формы, а после добавления новых элементов, пытался их восстановить. В итоге формы нещадно глючили, ломались привязки. А решение оказалось на поверхности. Не надо трогать привязки, все корректируется высотой и положением самого элемента.
З.Ы. Возможно будут проблемы с элементами которые привязаны к нижней границе через другой элемент, но в моих 30 документах такого не наблюдалось. В крайнем случае можно сохранить параметры всех элементов на форме: верхняя точка и высота элемента. И после увеличения высоты формы восстановить эти параметры.
Примеры кода, думаю комментариев будет достаточно:
Функция ВыводитьДополнительныеРеквизиты ( ДокументОбъект , ФормаДокумента )
Если ДокументОбъект . Метаданные (). Реквизиты . Найти ( "ПодразделениеОрганизации" ) <> Неопределено Тогда
Для Каждого Стр из ФормаДокумента . ЭлементыФормы Цикл
Если Стр . Данные = "ПодразделениеОрганизации" Тогда
Процедура ВыводДополнительныхРеквизитов ( ДокументОбъект , ФормаДокумента ) Экспорт
// Проверка на наличие дополнительных реквизитов
Если Не ВыводитьДополнительныеРеквизиты ( ДокументОбъект , ФормаДокумента ) Тогда Возврат КонецЕсли;
// Вывод или сохранение дополнительных реквизитов
// Если элемент формы существует то сохраняем значение
Элемент = ФормаДокумента . ЭлементыФормы . Найти ( "_ПодразделениеОрганизации" );
Если Элемент = Неопределено Тогда
ВысотаОбщаяДобавляемыхЭлементовПоВертикали = 27 ; // Общая высота всех добавляемых элементов
ВысотаНижнейПанели = 0 ; // будет вычислятся если нижняя панель есть
ФормаДокумента . Высота = ФормаДокумента . Высота + ВысотаОбщаяДобавляемыхЭлементовПоВертикали ;
// Обработка элементов формы
Для Каждого Стр из ФормаДокумента . ЭлементыФормы Цикл
Стр . ПолучитьПривязку ( ГраницаЭлементаУправления . Низ , _ПервыйЭлемент , _ГраницаПервогоЭлемента , _ВторойЭлемент , _ГраницаВторогоЭлемента );
Если _ПервыйЭлемент = ФормаДокумента . Панель И _ГраницаПервогоЭлемента = ГраницаЭлементаУправления . Низ Тогда
// Исключаем нижнюю панель команд
Если ВРЕГ ( СокрЛП ( Стр . Имя )) = "ОСНОВНЫЕДЕЙСТВИЯФОРМЫ" Тогда
ВысотаНижнейПанели = Стр . Высота ;
// У растягиваемых элементов уменьшаем высоту, а элементы с фиксированной высотой смещаем вверх
Стр . ПолучитьПривязку ( ГраницаЭлементаУправления . Верх , _ПервыйЭлемент , _ГраницаПервогоЭлемента , _ВторойЭлемент , _ГраницаВторогоЭлемента );
Если _ПервыйЭлемент = ФормаДокумента . Панель И _ГраницаПервогоЭлемента = ГраницаЭлементаУправления . Низ Тогда
Стр . Верх = Стр . Верх - ВысотаОбщаяДобавляемыхЭлементовПоВертикали ;
Стр . Высота = Стр . Высота - ВысотаОбщаяДобавляемыхЭлементовПоВертикали ;
ПоложениеПервогоЭлемента = ФормаДокумента . Высота - ВысотаОбщаяДобавляемыхЭлементовПоВертикали - ВысотаНижнейПанели - ВысотаОбщаяДобавляемыхЭлементовПоВертикали ;
Элемент = ФормаДокумента . ЭлементыФормы . Добавить ( Тип ( "Надпись" ), "_ЗаголовокПодразделениеОрганизации" , Истина, ФормаДокумента . Панель );
Элемент . Заголовок = "Подразделение организации:" ;
Элемент . Лево = РасстояниеМеждуЭлементами ;
Элемент . Верх = ПоложениеПервогоЭлемента ;
Элемент . Высота = ВысотаОдногоЭлемента ;
Элемент . Ширина = 155 ;
Элемент . УстановитьПривязку ( ГраницаЭлементаУправления . Верх , ФормаДокумента . Панель , ГраницаЭлементаУправления . Низ );
Элемент . УстановитьПривязку ( ГраницаЭлементаУправления . Низ , ФормаДокумента . Панель , ГраницаЭлементаУправления . Низ );
Элемент . УстановитьПривязку ( ГраницаЭлементаУправления . Право , ФормаДокумента . Панель , ГраницаЭлементаУправления . Лево );
Элемент . УстановитьПривязку ( ГраницаЭлементаУправления . Лево , ФормаДокумента . Панель , ГраницаЭлементаУправления . Лево );
// Создание поле ввода
Элемент = ФормаДокумента . ЭлементыФормы . Добавить ( Тип ( "ПолеВвода" ), "_ПодразделениеОрганизации" , Истина, ФормаДокумента . Панель );
Элемент . ТипЗначения = Новый ОписаниеТипов ( "СправочникСсылка.ПодразделенияОрганизаций" );
Элемент . Данные = "ПодразделениеОрганизации" ;
Элемент . Лево = РасстояниеМеждуЭлементами + 155 + РасстояниеМеждуЭлементами ;
Элемент . Верх = ПоложениеПервогоЭлемента ;
Элемент . Высота = ВысотаОдногоЭлемента ;
Элемент . Ширина = ФормаДокумента . Ширина - ( РасстояниеМеждуЭлементами * 3 ) - 155 ;
Элемент . УстановитьПривязку ( ГраницаЭлементаУправления . Верх , ФормаДокумента . Панель , ГраницаЭлементаУправления . Низ );
Элемент . УстановитьПривязку ( ГраницаЭлементаУправления . Низ , ФормаДокумента . Панель , ГраницаЭлементаУправления . Низ );
Элемент . УстановитьПривязку ( ГраницаЭлементаУправления . Право , ФормаДокумента . Панель , ГраницаЭлементаУправления . Право );
Элемент . УстановитьПривязку ( ГраницаЭлементаУправления . Лево , ФормаДокумента . Панель , ГраницаЭлементаУправления . Лево );
Если ДокументОбъект . ЭтоНовый () Тогда
Элемент . Значение = УправлениеПользователями . ПолучитьЗначениеПоУмолчанию ( глЗначениеПеременной ( "глТекущийПользователь" ), "ОсновноеПодразделениеОрганизации" );
В ЗУП 3 возникла задача добавить реквизит в справочник не внося изменений в конфигурацию. БСП с механизмом дополнительных реквизитов использовать было нежелательно, поэтому был использован механизм расширений. Для вывода данного реквизита на форму добавлять саму форму в расширение не хотелось по ряду причин, описанных ниже. Создание реквизита и элемента формы, соответствующего данному реквизиту было решено сделать программно в самом расширении, следуя принципу минимального воздействия на конфигурацию.
Начиная с платформы 1С версии 8.3.12 и выше появилась возможность добавлять реквизиты объектов в расширениях, чем я и воспользовался:
Но для вывода данного реквизита на форму элемента добавлять саму форму в расширение совсем не хотелось.
Во-первых добавление (заимствование) формы в расширение может привести к некоторым нежелательным эффектам, которые могут возникнуть после обновления конфигурации. Приведем немного теории.
Платформа использует сразу три формы:
- Форму из основной конфигурации
- Сохраненную форму
- Форму из расширения
Данные формы взаимодействуют между собой и в результате такого взаимодействия получается Результирующая форма, которую видит пользователь. В ходе взаимодействия указанных форм может возникнуть нежелательная ситуация, например, мы доработали форму в расширении, потом в новом релизе добавились реквизиты и они на форме не отображаются! Более подробно тут.
Во-вторых добавление формы в расширение привело бы к автоматическому добавлению всех реквизитов этого объекта и объектов метаданных (соответствующих ссылочным типам реквизитов объекта) в данное расширение, что загромождало бы само расширение и также не желательно.
Поэтому возникла задача программного создания элемента формы для добавленного реквизита в самом расширении, этому и посвящена данная публикация.
Посмотрев начало процедуры ПриСозданииНаСервере() модуля формы объекта, видим что вызываются экспортные методы ПриСозданииНаСервере() общих модулей подсистем БСП:
Было принято решение код для программного добавления реквизита формы объекта добавить в метод ПриСозданииНаСервере() общего модуля УправлениеСвойствами. Данный модуль предназначен для работы с дополнительными реквизитами и сведениями, но переопределив его в расширении он вполне сгодится и для наших целей.
Добавляем общий модуль УправлениеСвойствами в наше расширение:
и создаем обработчик события НП_ПриСозданииНаСервере(), вызываемый после типовой процедуры УправлениеСвойствами.ПриСозданииНаСервере().
Ниже приведен готовый код, код снабжен комментариями и разбит на области для лучшего понимания:
При разработке решений возникает необходимость добавить реквизит формы, состав и типы которых зависят от данных. Например при построении динамических деревьев с периодами, или при выводе контактной информации и т.д.
Задача
Для наглядности разберем простой пример, в котором можно было обойтись только элементами формы, но мы создадим и реквизиты.
Есть некая конфигурация, в форме элемента справочника Номенклатура необходимо программно создавать реквизиты формы и элементы к ним:
- ЯчейкаХранения, тип СправочникСсылка.ЯчейкиХранения;
- ТекущийОстаток, тип Число.
Элементы объединить в группу с горизонтальной группировкой. На текущий момент форма имеет следующий вид:
Добавление реквизитов
В обработчике формы ПриСозданииНаСервере() опишем код, который разбивается на 3 этапа:
- Описание и создание реквизитов формы;
- Создание элементов формы, объединение в группу без отображения;
- Заполнение данных.
Ниже приведен готовый код, код снабжен комментариями и разбит на области для лучшего понимания
После выполнения приведенного кода форма будет выглядеть так:
Удаление реквизитов
Для удаления необходимо передать массив содержащий пути реквизитов в качестве второго параметра метода формы ИзменитьРеквизиты().
Внимание. Удалять можно только реквизиты созданные программно.
Добавление реквизита табличной части
Добавление реквизита и элемента формы для табличной части почти ничем не отличается, необходимо только указать путь «Объект.». Ниже пример добавления реквизита Ячейка в ТЧ Комплектация.
Добавление реквизита с типом Произвольный
В одной из задач стало необходимо добавить реквизит с типом Произвольный, но ни СП, ни интернеты ответа не дали. В итоге через несколько попыток было найдено решение
Внимание. Данные добавленного реквизита сохраняться в ИБ не будут.
В связи с развитием системы расширений многие разработчики 1С сталкиваются с проблемой: если форма захвачена и на ней произведены изменения, то после обновления в основной конфигурации формы, эти изменения не будут отражены на захваченной форме. Получается, что форму после обновления надо каждый раз проверять. Это трудно и "убивает" все плюсы расширения. Но из любой непростой ситуации есть выход, если знать, где его искать. Можно захватить форму в расширение и не изменять её, а все новые реквизиты добавить программно. Тогда при обновлении формы в основной конфигурации 1С 8.3, форма измениться в расширении, и добавленные реквизиты будут корректно отображаться в ней.
В этой статье я постараюсь собрать все основные методы создания реквизитов на форме.
1. Добавляем реквизит
Начнем с самого простого. Мы добавили реквизит "МоеРасширение_НаименованиеНаАнглийском" в справочник контрагентов.
Для того, чтобы вывести его на форму програмно, пишем код процедуры "МоеРасширение_ПриСозданииНаСервереПосле" (Отказ, Стандартная Обработка).
НовыйЭлемент = Элементы.Добавить ("МоеРасширение_НаименованиеНаАнглийском", Тип("ПолеФормы"));
НовыйЭлемент.ПутьКДанным = "Объект. МоеРасширение_НаименованиеНаАнглийском";
Теперь мы добавим на форму реквизит, которого нет в конфигурации. Например, выведем на форму текущую задолженность: реквизит "МоеРасширение_ТекущаяЗадолженность".
Сначала создадим реквизит:
ДобавляемыеРеквизиты = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы("МоеРасширение_ТекущаяЗадолженность"), Новый ОписаниеТипов ("Число", "Текущая задолженность");
Затем выведем его на форму таким же образом, как и добавленный в конфигурацию реквизит, разница только в поле "ПутьКДанным" – здесь мы пишем наименование только что созданного реквизита:
НовыйЭлемент = Элементы.Добавить("МоеРасширение_НаименованиеНаАнглийском", Тип("ПолеФормы"));
Теперь переместим наши реквизиты под поле "Полное наименование". Для этого надо определить на форме место добавления, в нашем случаем – над группой "ГруппаКолонки":
Для того, чтобы отрабатывались процедуры событий для этих реквизитов, можем указать действия:
Элементы. МоеРасширение_ТекущаяЗадолженность.УстановитьДействие("ПриИзменении", "МоеРасширение_РасшифроватьЗадолженность").
2. Добавление кнопки
Для того, чтобы произвести добавление кнопки на форму, сначала надо програмно добавить команду.
НоваяКоманда.Заголовок = "Показать ОСВ".
ВАЖНО!! В поле действие пишется имя процедуры.
Теперь добавляем саму кнопку:
НоваяКнопка = Элементы.Добавить("МоеРасширение_Кнопка_ПоказатьОСВ", Тип("КнопкаФормы"));
3. Добавление группы
Для добавления группы переместим кнопку к полю "Текущая задолженность". На этом этапе нам надо создать группу и переместить в нее уже созданные наши элементы.
Создаем группу и помещаем ее под наименованием. Затем переносим в нее реквизит "Текущая задолженность" и кнопку "Показать ОСВ":
НоваяГруппа =Элементы.Добавить("МоеРасширение_ГруппаЗадолженность", Тип("ГруппаФормы"));
4. Добавляем табличную часть 1С
Добавим к контрагенту табличную часть 1С "МоеРасширение_Номенклатура" с реквизитом "Номенклатура" и выведем ее на форму.
Сначала мы добавляем табличную часть на форму, после чего описываем все колонки, которые должны отображаться на форме.
ВАЖНО! При создании реквизитов таблицы родителем указывается реквизит формы "Табличная часть".
НоваяТабличнаяЧасть = Элементы.Добавить("МоеРасширение_ТаблицаНоменклатура", Тип("ТаблицаФормы"));
НовыйРеквизитТабличнойЧасти = Элементы.Добавить("МоеРасширение_Номенклатура", Тип("ПолеФормы"),НоваяТабличнаяЧасть);
Используя этот базовый набор, можно изменить любую форму программно. И при обновлениях форма всегда будет подстраиваться под выбранный алгоритм. Если форма поменяется глобально, то расширение выдаст ошибку. Тогда, переписав несколько строчек кода, мы снова получим рабочую форму. Это быстрее и проще, чем каждый раз анализировать диалоговую форму.
Специалист компании «Кодерлайн»
Вас могут заинтересовать следующие статьи:
Дополнительные реквизиты в 1С УТ используются для возможности настройки хранения дополнительных полей в справочниках и документах программы. Их добавление выполняется в пользовательском режиме и не требует изменения конфигурации.
Добавленный в справочник или документ дополнительный реквизит выглядит как обычное поле, в котором настроено использование каких-либо данных информационной системы.
Далее разберем примеры добавления и работы с дополнительными реквизитами в 1С УТ 11.
В первую очередь необходимо включить настройки.
1. Настройки 1С УТ 11
Первый флаг (см. скриншот) отвечает в целом за доступность ведения в базе 1С 8.3 УТ 11 дополнительных реквизитов.
Второй флаг отвечает за возможность ведения реквизитов с общим список значений. Данную настройку можно включить, например, если в справочник «Клиенты» необходимо добавить реквизит «Регион клиента», в справочник «Поставщики» – «Регион поставщика», при этом для обоих дополнительных реквизитов должен использоваться единый список значений – Федеральные округа РФ.
Активация функции «Общие реквизиты и сведения» дает возможность создавать дополнительные реквизиты в 1С УТ сразу для нескольких справочников. Например, создать реквизит «Категория надежности», который будет использоваться и для клиентов, и для поставщиков.
Настройки использования реквизитов в 1С 8.3 УТ 11 могут быть различными. Использовать ли общие наборы, общие списки и, если да, то как именно – зависит от потребностей пользователя и банального удобства работы. Примеры, которые будут описаны далее, приведены для общего понимания работы с возможностями конфигурации в части использования реквизитов.
Добавление новых реквизитов выполняется из справочника. Открыть его можно там же, где включается настройка использования доп. реквизитов.
2. Как добавить новый реквизит в 1С
Добавим новый реквизит в 1С, не связанный с другими реквизитами и посмотрим, какие данные можно указать в нем. Например, в справочник «Физические лица» добавим реквизит «Подразделение».
В левой части окна программы надо выбрать объект системы, к которому добавляется реквизит (в нашем случае это «Физические лица») и нажать кнопку «Добавить → Новый».
В открывшемся окне заполняем «Наименование» и «Тип значения».
Тип значения определяет тип используемых данных в новом реквзите 1С. Типы данных могут быть различными. Из можно распределить по группам:
· дата, строка, число – точные заполняемые значения;
· булево в 1С – значение «Да» или «Нет» (в форме представляет собой поле для установки флажка);
· дополнительное значение – используется для ввода списка нужных значений;
· Организация, Партнер, Статья доходов и т.д – используется для выбора значения из действующих справочников.
Здесь же можно использовать сразу несколько типов данных, установив флаг «Составной тип данных».
В нашем примере нам надо выбрать тип данных «Подразделения». Тогда в карточке физического лица будет доступны к выбору данные справочника «Структура педприятия».
После записи реквизита 1С, он отобразится в соответствующем справочнике, и в нем будет доступен указанный тип данных.
При необходимости для реквизита можно внести дополнительные настройки:
· если установить флаг «Выводить в виде гиперссылки», то после заполнения реквизита значение будет представлено в ввиде ссылки;
· возможно сделать настройку критериев видимости и доступности реквизита по форме в зависимости от выполнения условий;
· можно установить обязательность заполнения данного реквизита в целом или при выполнении каких-либо условий;
· для поля можно установить всплывающую подсказку о его назначении.
Рассмотрим другой пример. Представим, что все договоры должны быть согласованы ответсвенным лицом, которое в базе не работает. Менеджер, ведущий контрагента, отправляет договоры на согласование по почте, скайпу и т.п., а в базе должен отметить лишь результат: согласовано и дата.
В этом случае у нас задействован один объект системы («Договоры с контрагентами») и два реквизита: «согласовано» (да/нет) и «дата согласования».
Реквизит 1 – тип данных «булево в 1С».
Реквизит 2 – тип даннх «дата». Здесь также надо указать состав даты.
Сохраним реквизиты и проверим результат – в карточке договора должен появиться раздел с этими реквизитами.
Добавление нового реквизита и его заполнение рассмотрели. Перейдем к более сложному варианту.
3. Реквизиты 1С УТ с общим списком
Допустим, для покупателей надо добавить реквизит «Регион клиента», для поставщиков реквизит «Регион поставщика». Названия реквизитов разные, но список значений един – Федеральные округа РФ.
Удобство этого варианта заключается в том, что нет необходимости дважды заполнять перечень значений. При создании списка в одном реквизите он тотчас будет доступен и для второго, а при добавлении/редактировании/удалении данных в одном реквизите все изменения также отразятся в списке второго.
Добавим реквизит для клиентов. Создаем новый, указываем тип «Дополнительные значения» и вносим список значений. Заполнять его на этом этапе не обязательно. Позже список значений можно будет дополнить непосредственно из объекта системы. Но сейчас внесем его, чтобы наглядно увидеть отражение общего списка и во втором реквизите.
Теперь добавим реквизит для поставщика. Создание выполняется иначе, чем для первого реквизита.
Нажимаем «Добавить → Из другого набора». В открывшемся окне находим и выделяем созданный ранее реквизит для клиента и нажимаем «Далее».
Выбираем вариант «Сделать копию реквизита по образцу (с общим списком значений)» и нажимаем «Далее».
В созданном реквизите уже определен тип данных и заполнен перечень значений. Остается только присвоить наименование.
Новые значения в общий список можно добавлять непосредственно из карточек партнеров.
4. Общие реквизиты в 1С
Сделать реквизиты общими (единое название и единый список значений для нескольких объектов) можно следующим образом:
ввести реквизит для одного объекта;
добавить реквизит из набора первого объекта и сделать его общим.
Все добавленные реквизиты после их записи становятся доступными в соответствующих объектах системы.
5. Отображение реквизитов в отчетах 1С и списках
Для удобства работы реквизиты можно вывести в список объектов и добавить в настройки отчетов.
Например, выведем реквизит «Согласовано», описанный выше, в справочник.
Открываем меню «Еще → Изменить форму». В списке полей выделяем строку «Ссылка» и нажимаем кнопку «Добавить поле». В предложенном списке выбираем «Согласовано (Договоры с контрагентами)» и нажимаем «ОК».
В списке полей добавится выбранный реквизит. Перемещаем его вверх, меняем заголовок и нажимаем «ОК».
Колонка добавлена в список, теперь по ней можно осуществлять поиск.
Также для примера выведем дополнительный реквизит в отчет 1С «Задолженность клиентов» – категорию клиента.
Открываем «Настройки», выбираем вид «Расширенный» и добавляем новое поле. В окне выбора поля разворачиваем поле «Клиент», после чего разворачиваем список «Дополнительные реквизиты» и выбираем «Категория».
Поле добавлено в отчет. Также это поле можно включить в отборы или в общую структуру отчета.
Специалист компании ООО «Кодерлайн»
Косьяненко Зоя Владимировна
Вас могут заинтересовать следующие статьи:
94 [PROP_CODE] => TAGS2 [TITLE] => Вас могут заинтересовать следующие семинары: ) --> 95 [PROP_CODE] => TAGS [TITLE] => Вас могут заинтересовать следующие вебинары: ) -->
Вас могут заинтересовать следующие вебинары:
Читайте также: