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

На чтение 6 мин Просмотров 11.2к. Опубликовано 26.04.2017

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

  • Создание элемента справочника
  • Поиск элементов справочника
  • Изменение элементов справочника
  • Удаление элементов справочника
  • Обход элементов справочника
  • Выбор элементов справочника запросом
  • Открытие форм справочника

Содержание

  1. Создание элемента справочника
  2. Поиск элементов справочника
  3. Изменение элементов справочника
  4. Удаление элементов справочника
  5. Обход элементов справочника
  6. Выбор элементов справочника запросом
  7. Открытие форм справочника

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

Создание новых элементов и групп справочника производится с помощью программного объекта СправочникМенеджер.<Имя справочника>. Данный объект доступен только на сервере.
Создание нового элемента или группы справочника состоит из следующих этапов:

  1. Создание элемента или группы;
  2. Заполнение владельца (если справочник подчиненный);
  3. Заполнение родителя (если справочник иерархический);
  4. Заполнение наименования и реквизитов (если не задана автоматическая нумерация, то и кода);
  5. Заполнение табличных частей;
  6. Запись элемента.

Создание новой группы:
НоваяГруппа = Справочники.Контрагенты.СоздатьГруппу(); // Создание группы
НоваяГруппа.Наименование = "Покупатели"; // Заполнение наименования
НоваяГруппа.Записать
(); // Запись группы

Создание нового элемента:
НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент(); // Создание элемента
НовыйЭлемент.Родитель = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели"); // Заполнение родителя
НовыйЭлемент.Наименование = "Ромашка ООО"; // Заполнение наименования
НовыйЭлемент.ИНН = "123456789"; // Заполнение реквизита

// Добавление новой строки табличной части
НоваяСтрока = НовыйЭлемент.КонтактнаяИнформация.Добавить();
НоваяСтрока.Тип = "Адрес";
НоваяСтрока.Представление = "Москва";

НовыйЭлемент.Записать(); // Запись элемента

Поиск элементов справочника

Для поиска элементов справочников в языке программирования 1С предусмотрено несколько методов:

  • НайтиПоКоду(<Код>, <ПоискПоПолномуКоду>, <Родитель>, <Владелец>)
  • НайтиПоНаименованию(<Наименование>, <ТочноеСоответствие>, <Родитель>, <Владелец>)
  • НайтиПоРеквизиту(<ИмяРеквизита>, <ЗначениеРеквизита>, <Родитель>, <Владелец>)

Во всех методах если поиск успешный, то будет возвращена ссылка на найденный элемент.
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123"); // Поиск контрагента с кодом "123"
НайденныйДоговор = Справочники.ДоговорыКонтрагентов.НайтиПоКоду("1", , , НайденныйКонтрагент); // Поиск подчиненного найденному контрагенту договора с номером "1"
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели"); // Поиск элемента с наименованием "Покупатели"
НайденныйКонтрагент1 = Справочники.Контрагенты.НайтиПоНаименованию("Ромашка ООО", , НайденныйКонтрагент); // Поиск элемента с наименованием "Ромашка ООО" в группе "Покупатели"
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту
("ИНН", "123456789"); // Поиск контрагента с ИНН "123456789"

Изменение элементов справочника

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

  1. Получить объект элемента справочника (метод ПолучитьОбъект(), возвращает тип СправочникОбъект.<Имя справочника>);
  2. Присвоить новые значения реквизитам объекта;
  3. Записать объект элемента справочника.

Программное изменение справочника возможно только на стороне сервера.

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

Удаление элементов справочника

Элементы справочника могут быть помечены на удаление и удалены из базы непосредственно.

Непосредственное удаление – операция необратимая, в то время как пометку на удаление можно отменить. Пометка на удаление хранится в предопределенном реквизите ПометкаУдаления. В пользовательском режиме помеченные на удаление элементы и группы справочника помечаются красным крестиком.

Пометку на удаление можно установить/снять двумя разными способами:
// Способ 1. Использование метода УстановитьПометкуУдаления()
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123");
КонтрагентОбъект = НайденныйКонтрагент.ПолучитьОбъект();
КонтрагентОбъект.УстановитьПометкуУдаления(Истина);

// Способ 2. Изменение свойства ПометкаУдаления
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123");
КонтрагентОбъект = НайденныйКонтрагент.ПолучитьОбъект();
КонтрагентОбъект.ПометкаУдаления = Истина;
КонтрагентОбъект.Записать();

Пример непосредственного удаления элемента справочника:
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоКоду("123");
КонтрагентОбъект = НайденныйКонтрагент.ПолучитьОбъект();
КонтрагентОбъект.Удалить
();

Обход элементов справочника

Для обхода элементов справочника в языке программирования 1С предусмотрено два метода:

  • Выбрать(<Родитель>, <Владелец>, <Отбор>, <Порядок>)
  • ВыбратьИерархически(<Родитель>, <Владелец>, <Отбор>, <Порядок>)

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

Рассмотрим примеры обхода элементов справочника:
// Обход всех элементов справочника Контрагенты
Выборка = Справочники.Контрагенты.Выбрать(); // Получение выборки всех элементов справочника
Пока Выборка.Следующий() Цикл
//действия с очередным элементом
Сообщить(Выборка.Наименование);
КонецЦикла;

// Обход контрагентов из группы "Покупатели"
ГруппаПокупатели = Справочники.Контрагенты.НайтиПоНаименованию("Покупатели");
Выборка = Справочники.Контрагенты.Выбрать(ГруппаПокупатели);
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;

// Обход договоров контрагента "Ромашка ООО"
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию("Ромашка ООО");
Выборка = Справочники.ДоговорыКонтрагентов.Выбрать(, НайденныйКонтрагент);
Пока
Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;

// Обход контрагентов с пустым ИНН
// Реквизит ИНН должен быть проиндексирован!
Отбор = Новый Структура("ИНН", ""); // Структура может содержать только один элемент
Выборка = Справочники.Контрагенты.Выбрать(, , Отбор);
Пока
Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;

Выбор элементов справочника запросом

Поиск данных в базе 1С предпочтительнее выполнять при помощи запросов. Запрос позволяет описать практически любые условия для отбора, в отличие от методов Выбрать() и ВыбратьИерархически(), на которые накладываются существенные ограничения. К тому же, в большинстве случаев работа с использованием запросов быстрее, чем работа с использованием программного кода.

Простой пример поиска и вывода товаров со стоимостью больше 1000:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Наименование
|ИЗ
| Справочник.Товары КАК Товары
|ГДЕ
| Товары.Стоимость > 1000"
;
Выборка = Запрос.Выполнить().Выбрать();
Пока
Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование
);
КонецЦикла;

Открытие форм справочника

Для открытия любых форм справочников рекомендуется использовать метод
ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>, <ОписаниеОповещенияОЗакрытии>, <РежимОткрытияОкна>)

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

Кроме методов ОткрытьФорму() и ПоказатьЗначение() есть и другие (ОткрытьФормуМодально, ОткрытьЗначение, ПолучитьФорму), но их использование не рекомендуется, т.к. часть этих методов использует режим модального открытия, часть противоречит свежим рекомендациям фирмы 1С.

Приведем примеры программного открытия форм справочника:
// Открыть форму списка
ОткрытьФорму("Справочник.Контрагенты.ФормаСписка");

// Открыть форму элемента
// Контрагент – реквизит формы, заполняемый пользователем интерактивно

ПоказатьЗначение(, Контрагент);

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

// Открыть форму группы
// ГруппаКонтрагентов– реквизит формы, заполняемый пользователем интерактивно

ПоказатьЗначение(, ГруппаКонтрагентов);

// Еще один способ открытия формы группы
ПараметрыОткрытия = Новый Структура("Ключ", ГруппаКонтрагентов);
ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаГруппы", ПараметрыОткрытия);


Внимание!

Следует понимать, что интерактивная работа (в том числе открытие форм) в 1С возможна только на стороне клиента. В то же время поиск и изменение данных возможны только на стороне сервера.

Программно изменить реквизит справочника

Я
   Alexey84

26.10.07 — 17:46

ДОброго времени суток, товарищи помогите решить вот такую проблему,

ну могу программно записать в справочнике «Контрагенты»  — реквизит -(Справочники.Организации) т.е. справочник.Организации подчинен контрагентам, как можно вписать туда значение?

Заранее спасибо!

  

Партнерская программа EFSOL Oblako

   Scooter

1 — 26.10.07 — 17:49

Владелец

ПолучитьОбъект

Записать

+ код в студию

   Alexey84

2 — 26.10.07 — 17:49

еще небольшая добавка

Имею Справочник контрагентов, в него надо добавить коды из XLS файла

Все считывается но никак не могу записать реквизит… при записи выходит сообщение «реквизит недоступен для редактиварония»

   Alexey84

3 — 26.10.07 — 17:51

можно чуть чуть подробнее, я не сильно понял что куда девать

   Fram

4 — 26.10.07 — 18:03

надо работать собъектом а не со ссылкой на него. судя по (2) работаешь со ссылкой

   Alexey84

5 — 26.10.07 — 18:12

СпрКОнтр = Справочники.Контрагенты;

   СпрСегмент = Справочники.СегментацияКлиентов;

   Для Ячейка = 1 По 1419 Цикл

       
      КодКонтрагента = СокрЛП(ТекЛист.Cells(Ячейка,1).Value);

      Классификатор  = СокрЛП(ТекЛист.Cells(Ячейка,2).Value);

     
     
      НайденныйЭлемент = СпрКонтр.НайтиПоКоду(КодКонтрагента);

      ТекущийОБъект = НайденныйЭлемент.ПолучитьОбъект();          

      ТекущийОБъект.СегментацияКонтрагентов = СпрСегмент.НайтиПоНаименованию(Классификатор);

     
      ТекущийОБъект.Записать();

   КонецЦикла;

вот код, кто нибудь может подсказать где ошибка

   Scooter

6 — 26.10.07 — 18:16

(5)а какая ошибка?

   Alexey84

7 — 26.10.07 — 18:20

Не удается все это дело записать

   Terv

8 — 26.10.07 — 18:21

СпрКОнтр = Справочники.Контрагенты;

   СпрСегмент = Справочники.СегментацияКлиентов;

   Для Ячейка = 1 По 1419 Цикл

       
      КодКонтрагента = СокрЛП(ТекЛист.Cells(Ячейка,1).Value);

      Классификатор  = СокрЛП(ТекЛист.Cells(Ячейка,2).Value);

     
     
      НайденныйЭлемент = СпрКонтр.НайтиПоКоду(КодКонтрагента);

      Если НайденныйЭлемент = СпрКонтр.ПустаяСсылка() Тогда

           Сообщить(«Я долпоёБ!!!!»);

           Продолжить;

      КонецЕсли;

      ТекущийОБъект = НайденныйЭлемент.ПолучитьОбъект();          

      ТекущийОБъект.СегментацияКонтрагентов = СпрСегмент.НайтиПоНаименованию(Классификатор);

     
      ТекущийОБъект.Записать();

   КонецЦикла;

   Alexey84

9 — 26.10.07 — 18:21

{Форма.Форма(20)}: Ошибка при вызове метода контекста (Записать): Операция не выполнена!

      ТекущийОБъект.Записать();

по причине:

Операция не выполнена!

и при этом сообщает что такая запись уже есть

   Scooter

10 — 26.10.07 — 18:25

СегментацияКонтрагентов — это точно реквизит?

   Alexey84

11 — 26.10.07 — 18:26

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

   Scooter

12 — 26.10.07 — 18:30

(11)да там скорее всего при записи «Контрагента» происходит создание/запись еще чегото

смотри ПриЗаписи в модулеФормы/модулеОбъекта

   Terv

13 — 26.10.07 — 18:33

а еще было бо неплохо пройтись отладчиком.

   Alexey84

14 — 26.10.07 — 18:35

да ну видать пока что ума не хватает на решение, отладчиком я проходился… ничего не нашел…ну в любом случае спасибо за рекомендт

   Terv

15 — 26.10.07 — 18:40

(14) отладчиком, ПередЗаписью и ПриЗаписи, модуля объекта справочника прошелся?

смотри может где при записи в РС вылетает

  

13th

16 — 26.10.07 — 18:50

А открытых элеметов справочника «Контрагентов» нет в это время?

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

СправочникиМенеджер

Объект СправочникиМенеджер предназначен для управления всеми справочниками конфигурации. Через цикл можно получить доступ к менеджеру каждого справочника:

//перебор всех менеджеров справочников: Для Каждого Мен Из Справочники Цикл //Мен - менеджер конкретного справочника КонецЦикла;

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

//Получение менеджера конкретного справочника:
МенТовары = Справочники.Товары;
МенТовары = Справочники[«Товары»];

Также через СправочникиМенеджер можно проверить является ли ссылка справочником:

//какая-то ссылка, нужно узнать это ссылка на справочник или нет ПростоСсылка = ПолучитьКакуюТоСсылку(); //получим описание типов со всеми типами справочников конфигурации ВсеСправочникиКонфигурации = Справочники.ТипВсеСсылки(); //проверяем Если ВсеСправочникиКонфигурации.СодержитТип(ТипЗнч(ПростоСсылка)) Тогда //да, это справочник Иначе //нет, что-то другое КонецЕсли;

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

Для программного создания элементов есть метод СоздатьЭлемент. Для программного создания групп — метод СоздатьГруппу:

НовыйТовар = Справочники.Товары.СоздатьЭлемент(); НовыйТовар.Наименование = "Клавиатура"; //...заполнение прочих реквизитов //запись в базу НовыйТовар.Записать(); НоваяГруппаТоваров = Справочники.Товары.СоздатьГруппу(); НоваяГруппаТоваров.Наименование = "Комплектующие"; //...заполнение прочих реквизитов //запись в базу НоваяГруппаТоваров.Записать();

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

Для того чтобы изменить реквизиты уже существующего элемента справочника нужно через ссылку получить объект методом ПолучитьОбъект, через объект изменить значения реквизитов и записать измененный объект в базу данных:

//функция вернула какую-то ссылку на справочник Товары СсылкаНаТовар = СсылкаНаТовар(); //получам объект из ссылки ТоварОбъект = СсылкаНаТовар.ПолучитьОбъект(); //меняем наименование ТоварОбъект.Наименование = ТоварОбъект.Наименование + " (изменение)"; //записываем ТоварОбъект.Записать();

Программное копирование элемента справочника

Методом Скопировать можно создать копию элемента справочника. Данный метод можно вызывать как у ссылки, так и у объекта:

//через ссылку КопияИзСсылки = СсылкаНаТовар.Скопировать(); КопияИзСсылки.Записать(); //через объект ТоварОбъект = СсылкаНаТовар.ПолучитьОбъект(); КопияИзОбъекта = ТоварОбъект.Скопировать(); КопияИзОбъекта.Записать();

Программное удаление элемента справочника

Для удаления применяются два метода: УстановитьПометкуУдаления и Удалить. Метод УстановитьПометкуУдаления только установит пометку на удаление, сам элемент не будет удален из базы данных. Метод Удалить удалит элемент из базы данных без проверки ссылочной целостности. То есть, если на этот элемент были ссылки в других местах, то теперь вместо ссылки будет надпись «Объект не найден». Не рекомендуется пользоваться методом Удалить. Важно отметить, что вызов метода УстановитьПометкуУдаления вызывает запись объекта. Дополнительно записывать объект не нужно.

ТоварОбъект = СсылкаНаТовар.ПолучитьОбъект(); ТоварОбъект.УстановитьПометкуУдаления(Истина); //также будут помечены на удаление все подчиненные элементы //без пометки удаления подчиненных элементов: ТоварОбъект.УстановитьПометкуУдаления(Истина, Ложь); //снятие пометки на удаление ТоварОбъект.УстановитьПометкуУдаления(Ложь); //удаление без проверки ссылочной целостности ТоварОбъект.Удалить(); //также удалит все вложенные элементы

Программный поиск по справочнику

Для поиска используются методы НайтиПоКоду, НайтиПоНаименованию и НайтиПоРеквизиту.

НайтиПоКоду

//поиск по коду ТоварСсылка = Справочники.Товары.НайтиПоКоду("000000008"); //по полному коду. Полный код включает в себя все коды родителей: //код родителя/код элемента ТоварСсылка = Справочники.Товары.НайтиПоКоду("000000003/000000008", Истина); //поиск в пределах одной группы, Группа - ссылка на группу справочника ТоварСсылка = Справочники.Товары.НайтиПоКоду("000000008",, Группа); //поиск в пределах владельца, Владелец - ссылка на владельца ТоварСсылка = Справочники.Товары.НайтиПоКоду("000000008",,, Владелец);

НайтиПоНаименованию

//поиск по наименованию, должна совпадать левая часть ТоварСсылка = Справочники.Товары.НайтиПоНаименованию("Смартфон"); //будут найдены и "Смартфон" и "Смартфон самсунг", но метод вернет первый //попавшийся элемент //точное совпадение, кроме хвостовых пробелов //будет найден только Смартфон ТоварСсылка = Справочники.Товары.НайтиПоНаименованию("Смартфон", Истина); //поиск в пределах одной группы, Группа - ссылка на группу справочника ТоварСсылка = Справочники.Товары.НайтиПоНаименованию("Смартфон",, Группа); //поиск в пределах владельца, Владелец - ссылка на владельца ТоварСсылка = Справочники.Товары.НайтиПоНаименованию("Смартфон",,,Владелец);

Для обоих методов если элемент не будет найден, то метод вернет пустую ссылку. Если для справочника указана нулевая длина кода или наименования, то метод вернет Неопределено.

НайтиПоРеквизиту

//поиск по реквизиту, 1-ый параметр имя реквизита, 2-ой значение ТоварСсылка = Справочники.Товары.НайтиПоРеквизиту("Артикул", "Арт001"); //поиск в пределах одной группы, Группа - ссылка на группу справочника ТоварСсылка = Справочники.Товары.НайтиПоРеквизиту("Артикул", "Арт001", Группа); //поиск в пределах владельца, Владелец - ссылка на владельца ТоварСсылка = Справочники.Товары.НайтиПоРеквизиту("Артикул","Арт1",,Владелец);

Если элемент не будет найден, то метод вернет пустую ссылку. Если есть несколько элементов с таким значением реквизита, то вернется первый попавшийся элемент.

Выборка справочника

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

//отбор по артикулу. Поле артикул должно быть проиндексировано //в отборе может быть только одно поле. ОтборАрт = Новый Структура("Артикул", ""); ВыборкаСпр = Справочники.Товары.Выбрать(,, ОтборАрт, "Наименование Убыв"); Пока ВыборкаСпр.Следующий() Цикл Сообщить(ВыборкаСпр.Наименование); КонецЦикла; //выборка будет отсортирована по убыванию поля Наименование //по умолчанию сортируется по основному представлению. Можно указать только //Код, наименование или проиндексированный реквизит примитивного типа. //отбор по родителю или владельцу: ВыборкаСпр = Справочники.Товары.Выбрать(Группа); ВыборкаСпр = Справочники.Товары.Выбрать(, Владелец); //иерархическая выборка, сначала группы, потом элементы из этой группы ВыборкаСпр = Справочники.Товары.ВыбратьИерархически(); //можно получить уровень элемента (для верхнего = 0) Сообщить(ВыборкаСпр.УровеньВВыборке()); //из выборки можно получить объект Пока ВыборкаСпр.Следующий() Цикл ТоварОбъект = ВыборкаСпр.ПолучитьОбъект(); КонецЦикла;

Получение ссылки по уникальному идентификатору

С помощью метода УникальныйИдентификатор можно получить уникальный идентификатор от ссылки справочника. Чтобы через уникальный идентификатор получить ссылку на справочник используется метод ПолучитьСсылку:

//получение УИД ссылки УИДСпр = ТоварСсылка.УникальныйИдентификатор(); //получение ссылки по УИД ТоварСсылка = Справочники.Товары.ПолучитьСсылку(УИДСпр); ТоварОбъект = Ссылка.ПолучитьОбъект(); //если после получения объекта от ссылки он равен Неопределено, //значит этой ссылки не соответствует ни один объект базы данных Если ТоварОбъект = Неопределено Тогда //нет такого объекта КонецЕсли;

Также с помощью метода УстановитьСсылкуНового можно установить новому объекту определенный идентификатор. Например, из другой базы был выгружен элемент справочника. В текущей базе нужно создать новый элемент с таким же идентификатором. Для этого можно воспользоваться следующим кодом:

//переменная УИДСтрокой - это строка с идентификатором из другой базы УИДСпр = Новый УникальныйИдентификатор(УИДСтрокой); ТоварСсылка = Справочники.Товары.ПолучитьСсылку(УИДСпр); ТоварОбъект = Справочники.Товары.СоздатьЭлемент(); ТоварОбъект.УстановитьСсылкуНового(ТоварСсылка); //параметром передается именно ссылка, а не идентификатор //...заполнение реквизитов ТоварОбъект.Записать(); //уникальный идентификатор нового объекта будет равен уникальному //идентификатору из другой базы

Прочие методы

//получение макета МакетСпр = Справочники.Товары.ПолучитьМакет("ИмяМакета"); //можно через объект МакетСпр = ТоварОбъект.ПолучитьМакет("ИмяМакета"); //получить полное наименование или код с учетом вложенности через / ПолноеНаименование = ТоварСсылка.ПолноеНаименование(); ПолныйКод = ТоварСсылка.ПолныйКод(); //принадлежит ли элемент определенной группе Если ТоварСсылка.ПринадлежитЭлементу(СсылкаНаГруппу) Тогда Сообщить("Принадлежит"); КонецЕсли; //уровень вложенности, если не в группе, то вернет 0 УровеньИерархии = ТоварСсылка.Уровень(); //определить пустая ссылка или нет Если ТоварСсылка.Пустая() Тогда //пустая КонецЕсли; //получение пустой ссылки ПустойТовар = Справочники.Товары.ПустаяСсылка();

Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра «Кто хочет стать миллионером?» с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

На чтение 6 мин Просмотров 1.4к. Опубликовано 05.10.2020

Содержание

  1. Изменение команд формы
  2. Изменение реквизитов формы
  3. Изменение элементов формы
  4. Комментарии

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

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

  • При доработке типовых конфигураций для облегчения процедуры последующего обновления. В этом случае будет изменен только модуль формы. Модули намного проще обновлять, чем форму.
  • При реализации некоторых общих алгоритмов. Например, в подсистеме БСП «Запрет редактирования реквизитов объектов» для всех подключенных к подсистеме объектов предусмотрено программное создание кнопки для включения возможности редактирования реквизитов.
  • При реализации некоторых специфических алгоритмов. Например, в справочнике Номенклатура создаются поля для редактирования дополнительных реквизитов.

В управляемой форме можно программно добавить, изменить и удалить:

Все указанные операции возможны только на сервере.

Программное изменение формы имеет ограничения:

  • Удалить можно только программно добавленные реквизиты/команды/элементы. Нельзя программно удалить объекты, созданные в конфигураторе.
  • Нельзя назначить реквизит основным.

Изменение команд формы

Для управления составом команд у объекта УправляемаяФорма есть коллекция Команды . У коллекции есть несколько методов:

Коллекция Команды доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Добавить () и Удалить () ) можно только на сервере. Искать и получать количество элементов (методы Найти () и Количество () ) можно как на клиенте, так и на сервере.

В качестве примера работы с командами формы создадим новую команду ИсторияИзменений с заголовком «История изменений…», которая будет вызвать обработчик ОтобразитьИсторию () . Создание выполняется при открытии формы.

&НаСервере
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка )
Команда = Команды . Добавить ( «ИсторияИзменений» );
Команда . Действие = «Подключаемый_ОтобразитьИсторию» ;
Команда . Заголовок = «История изменений…» ;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОтобразитьИсторию ( Команда )
// действия команды
КонецПроцедуры

Обработчик команды должен располагаться в форме и иметь директиву компиляции &НаКлиенте .

Изменение реквизитов формы

Чтение состава реквизитов формы выполняется функцией ПолучитьРеквизиты ( Путь >) , возвращающей массив типа РеквизитФормы . Параметр функции указывает путь к родительскому реквизиту (в виде строки). Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.

Изменение реквизитов выполняется методом ИзменитьРеквизиты ( ДобавляемыеРеквизиты >, УдаляемыеРеквизиты >) объекта УправляемаяФорма . В параметры ДобавляемыеРеквизиты и УдаляемыеРеквизиты передаются массивы с элементами типа РеквизитФормы .

Внимание!

Процесс изменения состава реквизитов является достаточно ресурсоемким. Фактически выполняется пересоздание формы. В связи с этим работа с реквизитами формы выполняется в пакетном режиме.

Создадим новый реквизит формы с именем Покупатель:

// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив ;
ДобавляемыеРеквизиты . Добавить(Новый РеквизитФормы («Покупатель», Новый ОписаниеТипов ( «СправочникСсылка.Контрагенты» ), , «Клиент» ));

// Изменения состава реквизитов
ИзменитьРеквизиты ( ДобавляемыеРеквизиты );

Изменение элементов формы

Для управления составом элементов у объекта УправляемаяФорма есть коллекция Элементы . У коллекции есть несколько методов:

Коллекция Элементы доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Вставить () , Добавить () , Переместить () и Удалить () ) можно только на сервере. Искать и получать количество элементов (методы Найти () и Количество () ) можно как на клиенте, так и на сервере. Элементами коллекции могут быть:

Элементам формы можно программно назначить обработчики событий. Для этих целей предназначен метод УстановитьДействие ( ИмяСобытия >, Действие >) .

Рассмотрим несколько наиболее распространенных на практике примеров работы с командами, реквизитами и элементами формы.

Добавление команды и связанной с ней кнопки:

// Создание команды
Команда = Команды . Добавить ( «ИсторияИзменений» );
Команда . Действие = «Подключаемый_ОтобразитьИсторию» ; // В форме должна быть процедура с указанным наименованием
Команда . Заголовок = «История изменений…» ;
// Создание кнопки и связь ее с командой
Элемент = Элементы . Добавить ( «ИсторияИзменений» , Тип ( «КнопкаФормы» ));
Элемент.ИмяКоманды = «ИсторияИзменений» ;

Добавление реквизита и связанного с ним поля ввода:

// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты . Добавить (Новый РеквизитФормы ( «Покупатель» , Новый ОписаниеТипов ( «СправочникСсылка.Контрагенты» ), , «Клиент» ));
// Изменение состава реквизитов
ИзменитьРеквизиты ( ДобавляемыеРеквизиты );
// Создание поля ввода и связь с реквизитом
Элемент = Элементы . Добавить ( «Покупатель» , Тип ( «ПолеФормы» ));
Элемент . Вид = ВидПоляФормы . ПолеВвода ;
Элемент . ПутьКДанным = «Покупатель» ;

Назначение элементу формы обработчика события:

ЭлементПокупатель . УстановитьДействие ( «ПриИзменении» , «Подключаемый_ПокупательПриИзменении» );

&НаКлиенте
Процедура Подключаемый_ПокупательПриИзменении ( Элемент )
// Действия события
КонецПроцедуры

Внимание!

Процедурам, которые устанавливаются в качестве обработчиков событий из кода с помощью метода УстановитьДействие () , рекомендуется задавать префикс Подключаемый_.

Внимание!

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

Остались вопросы?
Спросите в комментариях к статье.

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

Как получить значение дополнительного реквизита:

Пример: мы делаем печатную форму документа «Заказ клиента» и хотим вывести на неё значение определённого дополнительного реквизита — «Должность покупателя».

Используем вложенный запрос, в котором соединяем левым соединением таблицу «Дополнительные реквизиты» документа «Заказ клиента» с Планом видов характеристик «Дополнительные реквизиты и сведения». Устанавливаем условие: заголовок дополнительного реквизита должен быть таким – «Должность покупателя». Таблицы соединяем по ссылке на «Заказ клиента».

Получается вот такой запрос:

Также можно использовать метод НайтиПоНаименованию ( «***» ) .

Переменная Ссылка – это ссылка на «Договор контрагента».

Проверка на предмет того, что дополнительный реквизит заполнен:

Как изменить значения дополнительных реквизитов:

Задействуем общий модуль УправлениеСвойствами , который входит в состав БСП.

Комментарии

У вас ошибка в коде:
МассивСтруктур.Добавить(Новый Структура(«Свойство, Значение», ДопРеквизитДатаОтправки, ТекущаяДата());

Не хватает закрывающей скобки.

У вас ошибка в коде:
МассивСтруктур.Добавить(Новый Структура(«Свойство, Значение», ДопРеквизитДатаОтправки, ТекущаяДата());

Посмотрим, как можно программно добавить реквизиты и новые элементы на форму. В форме элемента справочника «Номенклатура» создадим два реквизита формы и элементы для них. Новые элементы объединим в группу с горизонтальной группировкой.

Сейчас форма имеет следующий вид:

После добавления новых элементов она будет иметь вид:

Итак, добавляем реквизиты:

  • ЕдиницаИзмерения , тип СправочникСсылка.ЕдиницыИзмерения ;
  • ТекущийОстаток , тип Число .

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

Теперь посмотрим, как можно изменить основной реквизит формы. Изменим табличную часть Состав документа РасходнаяНакладная :

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

  • Распечатать

Оцените статью:

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1

(0 голосов, среднее: 0 из 5)

Поделитесь с друзьями!

 0 

   

Распечатать

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

Нужно получить ссылку запросом или найти из справочника по: коду, наименованию или реквизиту.Например вот так:

Код 1C v 8.х

 Элемент = Справочники.Номенклатура.НайтиПоНаименованию("Товар").ПолучитьОбъект();
Элемент.Наименование = "Новое наименование";
Элемент.Записать();

или так:

Код 1C v 8.х

  номен = Справочники.Номенклатура;
элементСсылка = номен.НайтиПоНаименованию("Наименование-ля-ля");
Если НЕ элементСсылка.Пустая() тогда
Сообщить("Найден элемент " + элементСсылка);
конецЕсли;
элементОбъект = элементСсылка.ПолучитьОбъект();
элементОбъект.Наименование = "Новое Наименование - Тру -ля- ля";
элементОбъект.Записать();

Редактирование программно существующего элемента справочника


Posted: 28 апреля, 2012 in 1 с предприятие 8.2

Пример 1. Редактирование программно существующего элемента справочника на примере справочника «Сотрудники».

Создается обработка РаботаСоСправочникамиПример2 и форма обработки. Для редактирования элемента необходимо получить ссылку на элемент.

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

Для команды определяется обработчик действия Поменять(Команда). В обработчике осуществляется вызов серверной процедуры ПоменятьПолНаСервере  с передачей параметров Сотрудник и Пол:

&НаКлиенте

Процедура Поменять(Команда)

ПоменятьПолНаСервере(Сотрудник, Пол);

КонецПроцедуры

Процедура ПоменятьПолНаСервере:

&НаСервереБезКонтекста

Процедура ПоменятьПолНаСервере(Сотрудник, Пол)

//Получение объекта по ссылке:

СотрудникОбъект = Сотрудник.ПолучитьОбъект();

//Изменение реквизита:

СотрудникОбъект.Пол = Пол;

//Запись объекта:

СотрудникОбъект.Записать();

КонецПроцедуры

Установка пометки удаления элемента справочника и удаление элемента справочника.

На форму добавляется команда ПометитьНаУдаление  и обработчик этой команды, в котором осуществляется вызов процедуры ПометитьНаУдалениеНаСервере с передачей параметра Сотрудник:

&НаКлиенте

Процедура ПометитьНаУдаление(Команда)

ПометитьНаУдалениеНаСервере(Сотрудник);

КонецПроцедуры

Из курса Насипов и Фарит

«Вообще-то это имя и фамилия одного и того же человека…»

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

Pacan4ik

0 / 0 / 0

Регистрация: 16.02.2010

Сообщений: 7

1

Изменить значение реквизита справочника

16.02.2010, 12:38. Показов 24109. Ответов 4

Метки нет (Все метки)


Парни подскажите!

Хочу сменить вид номенклатуры с Продукции на Товар, в результате меняется наименование текущего Вида Номенклатуры, а не сам ВидНоменклатуры. Допереть сам не могу

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ОчиститьСообщения();
    док_от = Документы.ОприходованиеТоваров.НайтиПоНомеру("КНЗ00000012", Дата(2009, 12, 31);); 
    Если док_от.Пустая() Тогда
        Сообщить("Документ не открыт");
        Возврат;
    иначе
        ком = док_от.ПолучитьОбъект();
        табЧасть = ком.Товары;
        Для Каждого ТекущаяСтрока Из ком.Товары Цикл 
            полО = ТекущаяСтрока.Номенклатура.ВидНоменклатуры.ПолучитьОбъект();
            полО.Наименование = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товар");
            полО.Записать();    
        конецЦикла;
    конецесли;



0



Fenis

8 / 8 / 0

Регистрация: 15.02.2010

Сообщений: 17

16.02.2010, 13:11

2

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ОчиститьСообщения();
        док_от = Документы.ОприходованиеТоваров.НайтиПоНомеру("КНЗ00000012", Дата(2009, 12, 31);); 
        Если док_от.Пустая() Тогда
                Сообщить("Документ не открыт");
                Возврат;
        иначе
                ком = док_от.ПолучитьОбъект();
                табЧасть = ком.Товары;
                Для Каждого ТекущаяСтрока Из ком.Товары Цикл 
                        полО = ТекущаяСтрока.Номенклатура.ПолучитьОбъект();
                        полО.ВидНоменклатуры= Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товар");
                        полО.Записать();        
                конецЦикла;
        конецесли;

Если хочешь изменить вид номенклатуры у номенклатуры, тогда и меня у номенклатуры )))



0



0 / 0 / 0

Регистрация: 16.02.2010

Сообщений: 7

16.02.2010, 13:42

 [ТС]

3

Цитата
Сообщение от Fenis
Посмотреть сообщение

Если хочешь изменить вид номенклатуры у номенклатуры, тогда и меня у номенклатуры )))

Если бы знал как, то, непременно, сделал бы



0



8 / 8 / 0

Регистрация: 15.02.2010

Сообщений: 17

16.02.2010, 13:44

4

Код я подправил в своем посте.



1



0 / 0 / 0

Регистрация: 16.02.2010

Сообщений: 7

16.02.2010, 14:01

 [ТС]

5

Цитата
Сообщение от Fenis
Посмотреть сообщение

Код я подправил в своем посте.

Да уж, ответ лежал на поверхности, спасибо



0



Понравилась статья? Поделить с друзьями:
  • Яндекс это продуктовая или сервисная компания
  • Cis компании что это значит в банковской сфере
  • 1с как обратиться к реквизиту формы на клиенте
  • Яндекс это российская компания или зарубежная
  • Citibank реквизиты для международного перевода