Удаление элемента справочника
Внимание. Непосредственное удаление справочника ведет к нарушению целостности данных. Например если удалить Контрагента по которому были сделаны документы, то в этих документах будет пустая ссылка.
Поэтому — лучше на удаляемые объекты ставить пометку на удаление, а непосредственное удаление делать встроенной функцией:
в 1С 7.7 или 8.1 — Меню-Операции — Удаление помеченных объектов.
в 1С 8.2 — Меню — Все функции. — Стандартные — Удаление помеченных объектов.
Код 1C v 8.2 УП
Код 1C v 8.х
Как программно удалить в 1С
Из этой статьи вы узнаете, как в удалить в 1С объект при помощи программного кода, а также как поставить пометку на удаление.
В предыдущей статье, я рассказывал, как интерактивно удалить в 1С объект, и что для этого нужно настроить в правах конфигурации:
Программное удаление справочника в 1С
Для того чтобы программно удалить экземпляр справочника в 1С, необходимо воспользоваться методом Удалить объекта справочника. Для демонстрации разберу пример: разместим на форме обработки реквизит с ссылкой на справочник Контрагенты.
И при выполнении команды формы обработки, будем удалять этот экземпляр справочника.
В этом коде удаление экземпляра справочника я производил в серверном контексте. Сначала при помощи метода ПолучитьОбъект() из ссылки был получен экземпляр объекта справочника, а потом этот экземпляр удален при помощи метода Удалить(). В реквизит Контрагент управляемой формы я записал пустую ссылку, чтобы отображение ссылки удаленного объекта не вводило в заблуждение.
Замечу, что программное удаление произошло при таких правах на объект.
Право «Интерактивное удаление» снято, то есть мы не можем непосредственно удалять экземпляр этого объекта, но мы можем удалить его программно (благодаря установленному праву Удалить).
Замечу, что при программном удалении объекта контроль ссылочной целостности не происходит! Поэтом не следует злоупотреблять этой возможностью!
Программное удаление документа в 1С
Документ программным способом удаляется также, как и справочник: нужно воспользоваться методом Удалить() экземпляра объекта документа. Например, на форме этой обработки я размещу реквизит с ссылкой на документ.
А при выполнении команды документ будет удаляться.
Как и в случае справочника, программное удаление документа стало возможным благодаря установленному праву «Удалить».
Пометка на удаление программно в 1С
Для того, чтобы программно пометить на удаление объект необходимо воспользоваться методом объекта УстановитьПометкуУдаления.
Для документов он имеет следующий синтаксис: УстановитьПометкуУдаления(<ПометкаУдаления>), где параметр ПометкаУдаления имеет тип булево.
Если <ПометкаУдаления> — Истина, то пометка будет установлена, если Ложь – пометка будет снята.
Переделаем предыдущий пример: на форме разместим две команды.
Одна команда будет устанавливать пометку на удаление у документа в реквизите, вторая снимать.
В этом коде, в процедуре УстановитьНаСервере() мы устанавливаем пометку на удаление, передав в метод УстановитьПометкуУдаления параметр Истина, а в процедуре СнятьНаСервере() снимаем пометку, передав Ложь.
Для объектов справочников метод УстановитьПометкуУдаления имеет следующий синтаксис:
Параметр ВключаяПодчиненные имеет тип Булево, и если установлено Истина, то будут помечены на удаление подчиненные элементы (если справочник иерархический), а также все объекты подчиненного справочника (если есть).
Продемонстрируем работу второго параметра: на форму поместим реквизит с типом булево, реквизит с типом ссылка на справочник Контрагенты , и сделаем две команды: установить и снять.
В обработчиках команд будем устанавливать и снимать пометку на удаление.
У справочника Контрагенты включим иерархию.
И также сделаем подчиненный справочник.
Если мы установим пометку для группы с флажком подчиненные.
То будет помечена группа и все входящие в неё объекты.
А без установленного флага Подчиненные будет помечена только группа.
Тоже самое с объектами из подчиненного справочника. При установленном флаге Подчиненные.
Будет помечен на удаление и сам элемент справочника, и объекты подчиненного ему справочника.
А иначе, будет помечен только сам элемент.
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника.
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Программная работа со справочниками
Справочники в 1С — это объекты конфигурации, предназначенные для хранения данных, имеющих одинаковую структуру и носящие списочный характер. Например, в справочниках может храниться: перечень номенклатуры, контрагентов, сотрудников, банковских счетов и т.д. В статье рассматриваются базовые принципы работы с этим объектом метаданных.
Создание элемента справочника
Создание новых элементов и групп справочника производится с помощью программного объекта СправочникМенеджер.<Имя справочника>. Данный объект доступен только на сервере.
Создание нового элемента или группы справочника состоит из следующих этапов:
- Создание элемента или группы;
- Заполнение владельца (если справочник подчиненный);
- Заполнение родителя (если справочник иерархический);
- Заполнение наименования и реквизитов (если не задана автоматическая нумерация, то и кода);
- Заполнение табличных частей;
- Запись элемента.
Создание новой группы:
НоваяГруппа = Справочники . Контрагенты . СоздатьГруппу (); // Создание группы
НоваяГруппа . Наименование = «Покупатели» ; // Заполнение наименования
НоваяГруппа . Записать (); // Запись группы
Создание нового элемента:
НовыйЭлемент = Справочники . Контрагенты . СоздатьЭлемент (); // Создание элемента
НовыйЭлемент . Родитель = Справочники . Контрагенты . НайтиПоНаименованию ( «Покупатели» ); // Заполнение родителя
НовыйЭлемент . Наименование = «Ромашка ООО» ; // Заполнение наименования
НовыйЭлемент . ИНН = «123456789» ; // Заполнение реквизита
// Добавление новой строки табличной части
НоваяСтрока = НовыйЭлемент . КонтактнаяИнформация . Добавить ();
НоваяСтрока . Тип = «Адрес» ;
НоваяСтрока . Представление = «Москва» ;
НовыйЭлемент . Записать (); // Запись элемента
Поиск элементов справочника
Для поиска элементов справочников в языке программирования 1С предусмотрено несколько методов:
- НайтиПоКоду (< Код >, < ПоискПоПолномуКоду >, < Родитель >, < Владелец >)
- НайтиПоНаименованию (< Наименование >, < ТочноеСоответствие >, < Родитель >, < Владелец >)
- НайтиПоРеквизиту (< ИмяРеквизита >, < ЗначениеРеквизита >, < Родитель >, < Владелец >)
Во всех методах если поиск успешный, то будет возвращена ссылка на найденный элемент.
НайденныйКонтрагент = Справочники . Контрагенты . НайтиПоКоду ( «123» ); // Поиск контрагента с кодом «123»
НайденныйДоговор = Справочники . ДоговорыКонтрагентов . НайтиПоКоду ( «1» , , , НайденныйКонтрагент ); // Поиск подчиненного найденному контрагенту договора с номером «1»
НайденныйКонтрагент = Справочники . Контрагенты . НайтиПоНаименованию ( «Покупатели» ); // Поиск элемента с наименованием «Покупатели»
НайденныйКонтрагент1 = Справочники . Контрагенты . НайтиПоНаименованию ( «Ромашка ООО» , , НайденныйКонтрагент ); // Поиск элемента с наименованием «Ромашка ООО» в группе «Покупатели»
НайденныйКонтрагент = Справочники . Контрагенты . НайтиПоРеквизиту ( «ИНН» , «123456789» ); // Поиск контрагента с ИНН «123456789»
Изменение элементов справочника
Для изменения реквизитов справочника необходимо выполнить следующие действия:
- Получить объект элемента справочника (метод ПолучитьОбъект () , возвращает тип СправочникОбъект.<Имя справочника>);
- Присвоить новые значения реквизитам объекта;
- Записать объект элемента справочника.
Программное изменение справочника возможно только на стороне сервера.
Например, на форму обработки выведен реквизит Номенклатура типа СправочникСсылка.Номенклатура. Вот пример кода, изменяющего наименование выбранной пользователем номенклатуры:
НоменклатураОбъект = Номенклатура . ПолучитьОбъект ( );
НоменклатураОбъект . Наименование = «Новое наименование» ;
НоменклатураОбъект . Записать ();
Удаление элементов справочника
Элементы справочника могут быть помечены на удаление и удалены из базы непосредственно.
Непосредственное удаление – операция необратимая, в то время как пометку на удаление можно отменить. Пометка на удаление хранится в предопределенном реквизите ПометкаУдаления . В пользовательском режиме помеченные на удаление элементы и группы справочника помечаются красным крестиком.
Пометку на удаление можно установить/снять двумя разными способами:
// Способ 1. Использование метода УстановитьПометкуУдаления()
НайденныйКонтрагент = Справочники . Контрагенты . НайтиПоКоду ( «123» );
КонтрагентОбъект = НайденныйКонтрагент . ПолучитьОбъект ();
КонтрагентОбъект . УстановитьПометкуУдаления (Истина);
// Способ 2. Изменение свойства ПометкаУдаления
НайденныйКонтрагент = Справочники . Контрагенты . НайтиПоКоду ( “123” );
КонтрагентОбъект = НайденныйКонтрагент . ПолучитьОбъект ();
КонтрагентОбъект . ПометкаУдаления = Истина;
КонтрагентОбъект . Записать ();
Пример непосредственного удаления элемента справочника:
НайденныйКонтрагент = Справочники . Контрагенты . НайтиПоКоду ( «123» );
КонтрагентОбъект = НайденныйКонтрагент . ПолучитьОбъект ();
КонтрагентОбъект . Удалить ();
Обход элементов справочника
Для обхода элементов справочника в языке программирования 1С предусмотрено два метода:
- Выбрать (< Родитель >, < Владелец >, < Отбор >, < Порядок >)
- ВыбратьИерархически (< Родитель >, < Владелец >, < Отбор >, < Порядок >)
Методы отличаются порядком следования отобранных элементов: при иерархической выборке для каждого элемента сначала выбираются элементы, для которых он является родителем, а затем уже выбираются элементы следующего уровня.
Рассмотрим примеры обхода элементов справочника:
// Обход всех элементов справочника Контрагенты
Выборка = Справочники . Контрагенты . Выбрать (); // Получение выборки всех элементов справочника
Пока Выборка . Следующий () Цикл
//действия с очередным элементом
Сообщить ( Выборка . Наименование );
КонецЦикла;
// Обход контрагентов из группы «Покупатели»
ГруппаПокупатели = Справочники . Контрагенты . НайтиПоНаименованию ( «Покупатели» );
Выборка = Справочники . Контрагенты . Выбрать ( ГруппаПокупатели );
Пока Выборка . Следующий () Цикл
Сообщить ( Выборка . Наименование );
КонецЦикла;
// Обход договоров контрагента “Ромашка ООО”
НайденныйКонтрагент = Справочники . Контрагенты . НайтиПоНаименованию ( “Ромашка ООО” );
Выборка = Справочники . ДоговорыКонтрагентов . Выбрать (, НайденныйКонтрагент );
Пока Выборка . Следующий () Цикл
Сообщить ( Выборка . Наименование );
КонецЦикла;
// Обход контрагентов с пустым ИНН
// Реквизит ИНН должен быть проиндексирован!
Отбор = Новый Структура ( “ИНН” , “” ); // Структура может содержать только один элемент
Выборка = Справочники . Контрагенты . Выбрать (, , Отбор );
Пока Выборка . Следующий () Цикл
Сообщить ( Выборка . Наименование );
КонецЦикла;
Выбор элементов справочника запросом
Поиск данных в базе 1С предпочтительнее выполнять при помощи запросов. Запрос позволяет описать практически любые условия для отбора, в отличие от методов Выбрать () и ВыбратьИерархически () , на которые накладываются существенные ограничения. К тому же, в большинстве случаев работа с использованием запросов быстрее, чем работа с использованием программного кода.
Простой пример поиска и вывода товаров со стоимостью больше 1000:
Запрос = Новый Запрос ;
Запрос . Текст =
«ВЫБРАТЬ
| Товары.Наименование
|ИЗ
| Справочник.Товары КАК Товары
|ГДЕ
| Товары.Стоимость > 1000″ ;
Выборка = Запрос . Выполнить (). Выбрать ();
Пока Выборка . Следующий () Цикл
Сообщить ( Выборка . Наименование );
КонецЦикла;
Открытие форм справочника
Для открытия любых форм справочников рекомендуется использовать метод
ОткрытьФорму (< ИмяФормы >, < Параметры >, < Владелец >, < Уникальность >, < Окно >, < НавигационнаяСсылка >, < ОписаниеОповещенияОЗакрытии >, < РежимОткрытияОкна >)
Для открытия формы элемента или группы справочника также возможно использовать более простой метод
ПоказатьЗначение (< ОписаниеОповещенияОЗавершении >, < Значение >)
Кроме методов ОткрытьФорму () и ПоказатьЗначение () есть и другие (ОткрытьФормуМодально, ОткрытьЗначение, ПолучитьФорму), но их использование не рекомендуется, т.к. часть этих методов использует режим модального открытия, часть противоречит свежим рекомендациям фирмы 1С.
Приведем примеры программного открытия форм справочника:
// Открыть форму списка
ОткрытьФорму ( «Справочник.Контрагенты.ФормаСписка» );
// Открыть форму элемента
// Контрагент – реквизит формы, заполняемый пользователем интерактивно
ПоказатьЗначение (, Контрагент );
// Еще один способ открытия формы элемента
ПараметрыОткрытия = Новый Структура ( “Ключ” , Контрагент );
ОткрытьФорму ( “Справочник.Контрагенты.Форма.ФормаЭлемента” , ПараметрыОткрытия );
// Открыть форму группы
// ГруппаКонтрагентов– реквизит формы, заполняемый пользователем интерактивно
ПоказатьЗначение (, ГруппаКонтрагентов );
// Еще один способ открытия формы группы
ПараметрыОткрытия = Новый Структура ( “Ключ” , ГруппаКонтрагентов );
ОткрытьФорму ( “Справочник.Контрагенты.Форма.ФормаГруппы” , ПараметрыОткрытия );
Внимание!
Следует понимать, что интерактивная работа (в том числе открытие форм) в 1С возможна только на стороне клиента. В то же время поиск и изменение данных возможны только на стороне сервера.
Как полностью уничтожить управляемую форму.
Здравствуйте. Меня поставил в тупик следующий нюанс. Буду удивлен, если кто либо вообще разбирался в этой теме, но попробовать стоит.
Я открываю основную форму своей обработки, и в ней происходит программное получение (без фактического открытия) другой, служебной формы, и сохранение ссылки на нее в переменную модуля основной формы на клиенте.
Затем, скажем, основную форму обработки я закрыл. Сижу с пустым предприятияем. Через какое то время опять открываю основную форму, и, логично, опять получаю служебную в переменную.
На служебной форме есть ОбработкаОповещения(). И вот тут соль — замером производительности я случайно замечаю, что данная обработка отрабатывает уже дважды. Что может значить только одно — та, первая служебная форма, все еще существует, хотя она не открыта, и ссылка на нее нигде не хранится.
В данной ситуации во временное хранилище со служебной формы также ничего не помещалось.
В связи с чем у меня вопрос, почему этот «мусор» продолжает храниться в клиентском сеансе, что его там может удерживать, будет ли она когда нибудь удалена платформой, и есть ли способ вычистить ее программно, напрмер, перед закрытием основной формы обработки?
Вопрос не критичный, чистое любопытство. Благодаря этому нюансу я заметил ошибку в своем коде, после исправления которой вторая служебная форма уже не будет создаваться (будет через всю ту же обработку оповещения получена существующая).