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

На чтение 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С возможна только на стороне клиента. В то же время поиск и изменение данных возможны только на стороне сервера.

   men-ken

04.02.15 — 12:28

Добрый день!

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

Процедура ОбработкаПроведения(Отказ, Режим)

    
    Для Каждого ТекСтрокаКонтрагенты Из Контрагенты Цикл

        
        Контрагент = ТекСтрокаКонтрагенты.Контрагент.ПолучитьОбъект();

        Контрагент.ОсновнойМенеджер = ЭтотОбъект.ОсновнойМенеджер;

        Контрагент.Записать();    

        
    КонецЦикла;

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

При проведении вот что он мне пишет:

Ошибка при выполнении обработчика — ‘ОбработкаПроведения’

по причине:

{Документ.ИФЮ_НазначениеОтветственных.МодульОбъекта(26)}: Поле объекта недоступно для записи (ОсновнойМенеджер)

        Контрагент.ОсновнойМенеджер = ЭтотОбъект.ОсновнойМенеджер;

Непонятно почему поле ОсновнойМенеджер недоступно для записи?

  

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

   Господин ПЖ

1 — 04.02.15 — 12:29

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

за такие штуки принято ипашить по рукам…

   Naumov

2 — 04.02.15 — 12:29

у тебя конфа, тебе виднее

   men-ken

3 — 04.02.15 — 12:32

(1) объясните что не так?

   barrgand

4 — 04.02.15 — 12:36

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

   zalexey

5 — 04.02.15 — 12:43

Потому что у тебя Контрагент — это реквизит документа с типом ссылка.

Об остальном тебе уже выше написали )

   ktvladimir

6 — 04.02.15 — 12:46

(1) я видел такие штуки в типовых решениях ) начнем с них?

навскидку… Управление инженерными данными

   men-ken

7 — 04.02.15 — 12:48

В конфигурации уже есть регистр, в котором отражаются изменения реквизитов Справочника Контрагенты. Я так понимаю, что если программно изменить реквизиты, то старые будут храниться в регистре.

(6) ЭтотОбъект.ОсновнойМенеджер — это же тоже ссылка

   Naumov

8 — 04.02.15 — 12:48

(6) За некоторые приемы из типовых выгоняют с экзамена, как за недопустимое. Но ничего, живут типовые своей жизнью.

   Naumov

9 — 04.02.15 — 12:49

(7) А ты код не на клиенте случаем выполняешь?

   ktvladimir

10 — 04.02.15 — 12:50

(7) тебе говорят о том что у документа наверняка есть реквизит «Контрагент»

то что ты потом объявляешь ТекСтрокаКонтрагенты.Контрагент.ПолучитьОбъект();

не говорит о том что он станет объектом

   Naumov

11 — 04.02.15 — 12:50

или это не УФ?

   ktvladimir

12 — 04.02.15 — 12:50

и ты меняешь менеджера не у объекта а у ссылки

   hhhh

13 — 04.02.15 — 12:52

(7) так пробуй

        ОфигенныйКонтрагент = ТекСтрокаКонтрагенты.Контрагент.ПолучитьОбъект();

        ОфигенныйКонтрагент.ОсновнойМенеджер = ЭтотОбъект.ОсновнойМенеджер;

        ОфигенныйКонтрагент.Записать();

   Господин ПЖ

14 — 04.02.15 — 12:53

>я видел такие штуки в типовых решениях ) начнем с них?

я и запрос в цикле видел

   2083

15 — 04.02.15 — 13:00

(1) ну зачем по рукам-то сразу? когда в РАУЗ движения пишутся, создаются же ключи аналитики в справочниках

   ktvladimir

16 — 04.02.15 — 13:02

(14) ну это смотря какая задача) иногда бывает что это оправдано)

   2083

17 — 04.02.15 — 13:05

(16) например?

   barrgand

18 — 04.02.15 — 13:05

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

   Naumov

19 — 04.02.15 — 13:20

(15) Создаются только отсутствующие элементы, но не изменяются. Согласись немного не такая задача.

   yukon

20 — 04.02.15 — 13:21

(15) Ключевое слово «создаются», не обновляются как в (0), а создаются, причем всего 1 раз.

   yukon

21 — 04.02.15 — 13:21

(19) Опередил :)

   Defender aka LINN

22 — 04.02.15 — 13:22

(0) А при отмене проведения что происходит?

   Огурцы

23 — 04.02.15 — 13:23

(0)не делай так, добавь новый РС «МенеджерыКлиентов» и пиши туда при проведении.

   Огурцы

24 — 04.02.15 — 13:24

мало ли сколько гвно-кодеров типовые пишут, ты же не такой , правда?

   yukon

25 — 04.02.15 — 13:26

(23) Что в лоб, что по лбу. Опять же вопрос, что делать при отмене проведения.

Есть вариант с периодическим регистром сведений с периодом по позиции регистратора.

   Огурцы

26 — 04.02.15 — 13:28

(25)при отмене проведения, запись удалится сама. Какой Смысл в записи если отменили проведение документу по сути отменили само действие?

   Огурцы

27 — 04.02.15 — 13:29

(25)можно и периодический

   Крошка Ру

28 — 04.02.15 — 13:37

(0) Отладчиком воспользуйся.

   ktvladimir

29 — 04.02.15 — 13:39

(17) когда в параметры нужно загонять данные обработанные на предыдущем этапе

   Defender aka LINN

30 — 04.02.15 — 14:15

(26) С автора же станется независимый регистр захреначить

   FIXXXL

31 — 04.02.15 — 14:23

точно Контрагент.ОсновнойМенеджер

а не ОсновнойМенеджерПокупателя ?

   ksupalo

32 — 04.02.15 — 14:27

(0) В 1С Документооборот в справочнике «Проектные задачи» вначале так и было — даты начала и окончания задачи (план и факт) были в проектной задаче. При изменении задач, график пересчитывался, реквизиты элементов справочника менялись массово со всеми вытекающими.

С версии 1.3.х сделали регистр сведений, в которых хранят даты проектных задач — все стало хорошо — меняются записи регистра, а проектные задачи как были так и есть. График пересчитывается быстрее. Красота!

Мораль: не надо менять реквизиты справочника, если ты не в форме справочника.

  

FIXXXL

33 — 04.02.15 — 15:20

(32) если это поле имеет такой же смысл как в УТ10,3, то ничего криминального в (0) нет. Ибо поле это перезаписывать может много кто и без контроля.

Наоборот, будет видно кто манагеров тусует, если заблочить кнопку «Установить основным» на форме элемента справочника :)

Если же нужна «история» ведения клиента манагерами — тогда несомненно РС.

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

В данной статье мы рассмотрим, как можно изменить реквизиты сразу у нескольких элементов какого-либо документа или справочника. В качестве примера все действия будут производиться на демо-базе 1С 8.3 Бухгалтерия 3.0.

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

В программе 1С 8.3 (на управляемых формах) существуют два основных способа групповой обработки справочников и документов:

  • из формы списка;
  • при помощи стандартной обработки.

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

Давайте начнем от простого к сложному. Рассмотрим как пользоваться обработкой в первом варианте.

Содержание

  • Изменение справочников и документов из формы списка
  • Стандартная обработка «Групповое изменение реквизитов»
    • Введение новых значений
    • С помощью произвольного алгоритма

Изменение справочников и документов из формы списка

Наша команда предоставляет услуги по консультированию, настройке и внедрению 1С.

Связаться с нами можно по телефону +7 499 350 29 00.

Услуги и цены можно увидеть по ссылке.

Будем рады помочь Вам!

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

Выделите те позиции, которые должны подвергнуться изменению. Это можно сделать левой кнопкой мыши и зажатой клавишей на клавиатуре «Ctrl» или «Shift». Если все элементы идут подряд, то их можно выделить не мышкой, а стрелками вверх и вниз на клавиатуре.

Не снимая выделения, нажмите по одному из элементов правой кнопкой мыши и выберите пункт «Изменить выделенные» в появившемся контекстном меню.

изменить выделенные

Далее перед вами откроется окно, в левом верхнем углу которого будет отображаться, сколько элементов подлежит изменению. В табличной части ниже укажите, какие реквизиты нужно изменить, и какое значение им задать. В нашем случае мы установим у всех номенклатурных позиций в поле «% НДС» — «Без НДС».

без НДС

Так же, данная обработка позволяет изменять не только несколько элементов одновременно, но и несколько групп со всеми подчиненными элементами. Для этого в форме настройки реквизитов нажмите на кнопку «Дополнительные параметры» и в открывшемся окне установите флаг в пункте «Обрабатывать дочерние элементы».

обрабатывать дочерние элементы

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

успешная обработка справочника

Теперь в той же форме списка мы видим, что процент НДС изменился во всех выделенных нами позициях.

список элементов

Стандартная обработка «Групповое изменение реквизитов»

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

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

Перед вами откроется форма самой обработки. В верхнем поле «Изменять» мы выберем документы «Реализация (акты, накладные)». Правее появится гиперссылка «Все элементы». Нажав на нее можно настроить отбор для выбора не всех документов, а лишь части по какому-то критерию.

что изменять

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

условие отбора документов

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

Введение новых значений

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

ввести новые значения

Для простоты примера мы будем устанавливать везде в качестве склада «Основной склад». После внесения всех изменений, нажмите на кнопку «Изменить реквизиты».

список реквизитов для изменения

При нажатии на кнопку «Дополнительные параметры» вы можете немного расширить возможность настроек изменения реквизитов, например, изменять служебные реквизиты.

дополнительные параметры

С помощью произвольного алгоритма

Данный режим более гибкий, чем предыдущий, но тут не обойтись без базовых навыков в программировании. Включить его можно, нажав на кнопку «Выполнить произвольный алгоритм».

выполнить произвольный алгоритм

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

НайтиПоКоду

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Содержание

  • Групповое изменение реквизитов в 1С 8.3 с использованием формы списка
  • Групповая обработка документов в 1С 8.3 Бухгалтерия 3.0
  • Применение обработки Групповое изменение реквизитов

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

В нашем примере изменим единицу измерения Шт на Кг.

Для того чтобы выделить несколько элементов, при их выборе удерживаем кнопку Shift или Ctrl и нажав правой кнопкой мышки выбираем пункт Изменить выделенные.

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

Замена выполнена.

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

Групповая обработка документов в 1С 8.3 Бухгалтерия 3.0

Обработка Групповое изменение реквизитов в 1С 8.3 имеет больше функциональных возможностей. Она позволяет массово изменять табличные части и реквизиты выбранных объектов — справочников, документов. Она имеется во всех программах 1С. Так, в программе 1С 8.3 Бухгалтерия предприятия 3.0 ее найти можно в разделе меню Администрирование — Обслуживание.

Далее открываем раздел Корректировка данных и видим нужную нам ссылку Групповое изменение реквизитов.

Если вы по каким-то причинам не можете найти обработку, то она также доступна через раздел Все функции.

Если его не видно в меню, включить его можно в разделе Сервис — Параметры, установив галочку Отображать команду Все функции.

Применение обработки Групповое изменение реквизитов

Ситуации для применения обработки могут быть различные, мы для примера рассмотрим изменение договора во всех введенных документах. Сформировав Оборотно-сальдовую ведомость по счету 60 — Расчеты с поставщиками и подрядчиками (меню Отчеты — Оборотно-сальдовая ведомость по счету) мы видим, что при проведении документов с контрагентом ФГУП Почта России за год ошибочно был использован старый договор и нам надо заменить его на договор 2018 года. Такая ошибка может возникнуть вследствие невнимательного копирования документов.

Для его изменения воспользуемся обработкой Групповое изменение реквизитов.

В поле выбора элементов для изменения, используя кнопку выбора указываем реквизит — документ Поступление (акты, накладные), т.к. именно в нем нам необходимо произвести замену реквизита Договор. При этом, в форме выбора можно найти нужную строчку, начав вводить текст и программа 1С 8.3 автоматически осуществит поиск вводимого элемента.

Далее, нам необходимо из всех документов отобрать документы по контрагенту ФГУП Почта России за период 2018 год. Для этого, нажав ссылку Все элементы, настроим отбор. Нажав кнопку Добавить условия отбора, указываем контрагент равно ФГУП Почта России и Дата, Больше, Начало этого года.

Далее нажав кнопку ОК мы ищем в реквизитах поле Договор и устанавливаем новое значение Договор  Почта России от 01.01.2018.

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

После обработки документов, снова формируем Оборотно-сальдовую ведомость и проверяем договор. Все операции отражены на нужном договоре.

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

После чего в нашем списке станут доступны эти действия.

См. также:

  • Групповое перепроведение документов в 1С 8.3 Бухгалтерия 3.0
  • Как удалить помеченные на удаление документы в 1С 8.3
  • Сбилась нумерация документов в 1С 8.3: как исправить
  • Тестирование и исправление базы 1С 8.3: какие галочки ставить
  • Горячие клавиши в 1С
  • Как выгрузить документ, отчет из 1С 8.3 в Excel
  • Выгрузка в 1С из xml: как выгрузить данные из 1С 8.3 и загрузить в 1С 8.3

Если Вы еще не являетесь подписчиком системы БухЭксперт8:

Активировать демо-доступ бесплатно →

или

Оформить подписку на Рубрикатор →

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

Подписывайтесь на наши YouTube и Telegram чтобы не пропустить
важные изменения 1С и законодательства

Помогла статья?

Получите еще секретный бонус и полный доступ к справочной системе БухЭксперт8 на 14 дней бесплатно

Понравилась статья? Поделить с друзьями:
  • Измененные реквизиты для оплаты госпошлины
  • Изменились реквизиты поставщика в договоре
  • Измерения ресурсы реквизиты в регистре это
  • Измерителем роста компании обычно является
  • Изолятор временного содержания часы работы