1с создать элемент справочника программно

Обновлено: 04.07.2024

Введение в управляемая форма 1С реквизиты элементы команды

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

Программное переопределение обработчиков событий формы и элементов формы

В теле модуля формы:

А в новой процедуре нужно добавить вызов основной, если такая процедура есть.

Аналогично можно поступить и с обработчиками элементов формы:

Программное создание групп формы.

Доступные виды групп формы:


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

Удалить команду можно при помощи метода коллекции формы команд: Команды.Удалить(<Команда>). Удалять можно только те команды, которые были созданы программно.

Программное создание декораций форм.

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

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

Вывод реквизитов на форму.

Вызов процедур при создании на сервере 1С

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

Некоторые советы при программном редактировании формы


Итак, взглянем на получившийся результат. Все элементы на форме созданы программно:


Модуль объекта есть почти у всех основных прикладных объектов конфигурации в 1С.


Также модуль объекта можно открыть из контекстного меню объекта:


Или из меню Действия:


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

Вызов методов модуля объекта


В модуле объекта напишем следующий код:

Теперь создадим обработку с одной формой и в модуле обработки в событии ПриСозданииНаСервере напишем следующий код:

Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ; //заполняем экспортную переменную модуля объекта вызвав экспортную функцию ОбъектНоменклатура . ОбщийОстаток = ОбъектНоменклатура . ОбщийОстаток ( ) ;

Здесь мы сначала создаем новый программный объект справочника Номенклатура вызвав встроенный метод Справочники.Номенклатура.СоздатьЭлемент(). Потом через ссылку на этот объект обращаемся к экспортным переменной и функции объекта.

Теперь поменяем код в модуле формы обработки на следующий:

Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ; //пытаемся заполнить переменную модуля объекта вызвав функцию модуля объекта ОбъектНоменклатура . ПолноеНаименование = ОбъектНоменклатура . ПолноеНаименованиеНоменклатуры ( ) ; Сообщить ( ОбъектНоменклатура . ПолноеНаименование ) ; //ошибка

Здесь мы делаем все то же самое, но обращаемся к не экспортным переменной и функции.


Так как переменная ПолноеНаименование не является экспортной, то к ней нет доступа из других модулей.

Теперь попробуем обратиться к не экспортной функции модуля объекта. Вставим в модуль формы следующий код и откроем обработку:

Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ; Сообщить ( ОбъектНоменклатура . ПолноеНаименованиеНоменклатуры ( ) ) ; //опять ошибка


Теперь вставим в форму обработки такой код и откроем обработку:

Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ;

Здесь мы вызываем экспорную процедуру модуля объекта, а потом встроенным методом Записать записываем объект в базу данных.

В результате в базе данных будет создан новый элемент, у которого заполнен артикул и добавлены 2 строки в табличную часть:


В методе ЗаполнитьРеквизиты() мы обращались напрямую к реквизитам объекта, после чего записали его методом Записать(). Значения реквизитов сохранились в базе данных.

Обработчики событий


В результате откроется список возможных событий:


Рассмотрим основные события модуля объекта:

Для примера создадим в модуле объекта 3 обработчика события и вставим в них следующий код:

// Описание:
// создает новый элемент и копирует в его реквизиты значения реквизитов источника
// Параметры:
// элИсточник - источник
// КопироватьИсторию - для периодических реквизитов копируется история: 0 - не копируется, 1 - полностью, 2 - только последнее значение реквизита
// ОткрытьНовый - открыть на экране
Функция СкопироватьЭлемент(элИсточник, КопироватьИсторию = 0, ОткрытьНовый = 0)

Перем спр;
Перем спрМД;

Если ПустоеЗначение(элИсточник) = 1 Тогда
Возврат 0;
КонецЕсли;

спр = СоздатьОбъект("Справочник." + элИсточник.Вид());
спр.ИспользоватьРодителя(элИсточник.Родитель);
спр.ИспользоватьВладельца(элИсточник.Владелец);
спр.Новый();
спрМД = Метаданные.Справочник(элИсточник.Вид());

Для н = 1 По спрМД.Реквизит() Цикл
рек = спрМД.Реквизит(н);

Если рек.Периодический = 0 Тогда
рек = рек.Идентификатор;
зн = элИсточник.ПолучитьАтрибут(рек);
спр.УстановитьАтрибут(рек, зн);
КонецЕсли;

Попытка
спр.Записать();
ЗаписьЖурналаРегистрации(, "Записан новый элемент справочника", "Записан новый элемент справочника", спр.ТекущийЭлемент(), 2);
Исключение
Возврат 0;
КонецПопытки;

Если КопироватьИсторию > 0 Тогда
перИст = СоздатьОбъект("Периодический");
перПри = СоздатьОбъект("Периодический");

Для н = 1 По спрМД.Реквизит() Цикл
рек = спрМД.Реквизит(н);

Если рек.Периодический = 1 Тогда
рек = рек.Идентификатор;
перПри.ИспользоватьОбъект(рек, спр.ТекущийЭлемент());
перИст.ИспользоватьОбъект(рек, элИсточник);

Если КопироватьИсторию = 2 Тогда
перИст.ОбратныйПорядок(1);
КонецЕсли;

Пока перИст.ПолучитьЗначение() = 1 Цикл
перПри.Значение = перИст.Значение;
перПри.ДатаЗнач = перИст.ДатаЗнач;
перПри.Записать();

Если КопироватьИсторию = 2 Тогда
Прервать;
КонецЕсли;

Если ОткрытьНовый = 1 Тогда
ОткрытьФорму(спр.ТекущийЭлемент());
КонецЕсли;

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