Объект ДокументыМенеджер позволяет получить доступ ко всем менеджерам документов. Это можно сделать перебрав все менеджеры в цикле или обратившись к конкретному менеджеру по имени. Также данный объект позволяет проверить является ли ссылка ссылкой на какой-нибудь документ:
Создание документа программно
Чтобы программно создать документ нужно использовать метод менеджера документа СоздатьДокумент:
Программное заполнение документа
Для программного заполнения документа нужно обращаться к каждому реквизиту объекта по имени, через точку от объекта:
Программное заполнение табличной части документа
К табличной части документа можно обратиться по имени, через точку от объекта. Затем через метод Добавить добавить новую строку табличной части. К реквизитам строки можно обращаться по имени, через точку от строки. В целом работа с табличной частью документа похожа на работу с таблицей значений:
//создаем новый документ
ПриходныйДок = Документы. ПриходТовара. СоздатьДокумент();
//добавим несколько строк в табличную часть СписокТоваров
НоваяСтрТЧ = ПриходныйДок. СписокТоваров. Добавить();
НоваяСтрТЧ. Товар = СсылкаНаТоварОдин;
НоваяСтрТЧ. Количество = 18;
НоваяСтрТЧ = ПриходныйДок. СписокТоваров. Добавить();
НоваяСтрТЧ. Товар = СсылкаНаТоварДва;
НоваяСтрТЧ. Количество = 36;
//можно загрузить строки из таблицы значений
//имена колонок должны совпадать с именами реквизитов табличной части
ПриходныйДок. СписокТоваров. Загрузить(НекаяТаблица);
//записываем в базу данных
ПриходныйДок. Записать();
Программное изменение документа
Изменить документ можно только через программный объект. Для этого методом ПолучитьОбъект нужно получить из ссылки объект и потом изменить его реквизиты:
//получаем объект из ссылки
ПриходныйДок = СсылкаНаДок. ПолучитьОбъект();
//меняем поставщика
ПриходныйДок. Поставщик = СсылкаНаПоставщика;
//записываем
ПриходныйДок. Записать();
Программное копирование документа
Для создания копии объекта предназначен метод Скопировать. Данный метод есть как у ссылки на документ, так и у объекта:
//копия документа через ссылку
НоваяКопия = СсылкаНаДок. Скопировать();
НоваяКопия. Дата = ТекущаяДатаСеанса();
НоваяКопия. Записать();
//копия документа через объект
ДокОбъект = СсылкаНаДок. ПолучитьОбъект();
НоваяКопия = ДокОбъект. Скопировать();
НоваяКопия. Дата = ТекущаяДатаСеанса();
НоваяКопия. Записать();
Программное удаление документа
Пометить на удаление документ можно с помощью метода УстановитьПометкуУдаления. Параметром нужно передать значение пометки на удаление. При установке пометки на удаление документ автоматически распроводится, если он был проведен и записывается. Также можно полностью удалить документ из базы методом Удалить:
//устанавливать пометку на удаление можно только через объект
ПриходныйДок = СсылкаНаДок. ПолучитьОбъект();
//пометить на удаление
ПриходныйДок. УстановитьПометкуУдаления(Истина);
//снять пометку на удаление
ПриходныйДок. УстановитьПометкуУдаления(Ложь);
//удаление документа из базы
ПриходныйДок. Удалить();
Программное проведение документа
У документа нет отдельного метода для проведения документа. Проведение — это запись документа с проведением. Для проведения документа используется метод Записать, в который параметром нужно передать режим записи документа. Всего есть три режима записи: запись, проведение, отмена проведения. Если параметр не указан, то используется запись:
ПриходныйДок = Документы. ПриходТовара. СоздатьДокумент();
ПриходныйДок. Дата = ТекущаяДатаСеанса();
//запись документа
ПриходныйДок. Записать(РежимЗаписиДокумента. Запись);
//тоже запись
ПриходныйДок. Записать();
//проведение документа
ПриходныйДок. Записать(РежимЗаписиДокумента. Проведение);
//отмена проведения документа
ПриходныйДок. Записать(РежимЗаписиДокумента. ОтменаПроведения);
Программная работа с движениями документа
Через свойство Движения можно обращаться к движениям проведенного документа и даже редактировать их. Рассмотрим на примере:
ДатаПоиска = ТекущаяДатаСеанса();
ПриходныйДок = Документы. ПриходТовара. НайтиПоНомеру(«АА0000003», ДатаПоиска);
ДокПриходОбъект = ПриходныйДок. ПолучитьОбъект();
//получаем все движения документа
ДвиженияДока = ДокПриходОбъект. Движения;
//перебор всех регистров, по которым выполняются движения документом
Для Каждого Рег Из ДвиженияДока Цикл
Сообщить(Рег);
КонецЦикла;
//количество регистров из коллекции движений
КолвоРег = ДвиженияДока. Количество();
//поиск по имени регистра
РегОстатки = ДвиженияДока. Найти(«ОстаткиТоваров»);
Если Не РегОстатки = Неопределено Тогда
//есть такой регистр
//читаем записи регистра из базы данных
РегОстатки. Прочитать();
//перебирам в цикле и увеличиваем количество вдвое
Для Каждого ЗаписьРег Из РегОстатки Цикл
ЗаписьРег. Количество = ЗаписьРег. Количество * 2;
КонецЦикла;
//записываем
РегОстатки. Записать();
КонецЕсли;
Программный поиск документа
Чтобы программно найти документ можно использовать методы НайтиПоНомеру и НайтиПоРеквизиту менеджера документа.
В метод НайтиПоНомеру первым параметром передается номер документа, вторым дата, для определения периода, в котором нужно искать документ. Если для документа указана периодичность = В пределах года, то можно передать любую дату за этот год:
ДатаПоиска = Дата(2021,1,1);
//в настройках нумерации указана Периодичность = В пределах года
ПриходныйДок = Документы. ПриходТовара. НайтиПоНомеру(«000000017», ДатаПоиска);
//поиск будет выполняться среди документов за 2021 год с номером 000000017
//в настройках нумерации указана Периодичность = В пределах месяца
ПриходныйДок= Документы. ПриходТовара. НайтиПоНомеру(«000000017», ДатаПоиска);
//поиск будет выполняться среди документов за январь 2021 год с номером 000000017
//в настройках нумерации указана Периодичность = Непериодический
//дату можно не указывать
ПриходныйДок = Документы. ПриходТовара. НайтиПоНомеру(«000000017»);
//поиск будет выполняться среди всех документов
//если документ не найден, то в ПриходныйДок будет пустая ссылка
Если ПриходныйДок = Документы. ПриходТовара. ПустаяСсылка() Тогда
//не нашли
ИначеЕсли ПриходныйДок = Неопределено Тогда
//для документа указана нулевая длина номера
Иначе
//ПриходныйДок — ссылка на документ
КонецЕсли;
Метод НайтиПоРеквизиту принимает два параметра: имя реквизита и значение реквизита. Если реквизит имеет тип Строка, то поиск выполняется по точному соответствию. Нельзя искать по реквизиту с типом ХранилищеЗначения или неограниченная строка.
//поиск по реквизиту
//первый параметр — имя реквизита
//второй параметр — значение реквизита
ПриходныйДок = Документы. ПриходТовара. НайтиПоРеквизиту(«Поставщик», СсылкаНаПоставщика);
//если документ не найден, то в ПриходныйДок будет пустая ссылка
Если ПриходныйДок = Документы. ПриходТовара. ПустаяСсылка() Тогда
//не нашли
Иначе
//ПриходныйДок — ссылка на найденный документ
//если было несколько документов с таким значением реквизита, то
//будет найден первый попавшийся
КонецЕсли;
Чтобы получить выборку документов можно воспользоваться методом Выбрать менеджера документа. Затем полученную выборку можно перебрать с помощью цикла Пока. На каждом витке цикла будут данные об одном документе. Через параметры метода можно ограничить выборку по периоду или по реквизитам.
//выборка всех документов
ВыборкаПриходов = Документы. ПриходТовара. Выбрать();
Пока ВыборкаПриходов. Следующий() Цикл
//через выборку есть доступ ко всем реквизитам объекта
Сообщить(ВыборкаПриходов. Номер);
Сообщить(ВыборкаПриходов. Поставщик);
//также через выборку можно получить объект
ДокОбъект = ВыборкаПриходов. ПолучитьОбъект();
КонецЦикла;
//выборка документов за 2 месяца
ВыборкаПриходов = Документы. ПриходТовара. Выбрать(Дата(2021,1,1), Дата(2021,2,28));
//выборка всех документов, у которых дата больше 1 марта 2021
ВыборкаПриходов = Документы. ПриходТовара. Выбрать(Дата(2021,3,1));
//выборка всех документов, у которых дата меньше 15 марта 2021
ВыборкаПриходов = Документы. ПриходТовара. Выбрать(, Дата(2021,3,15));
//выборка документов с конкретной датой
ОтборДок = Новый Структура(«Дата», Дата(2021,3,22));
ВыборкаПриходов = Документы. ПриходТовара. Выбрать(,, ОтборДок);
//выборка документов с конкретным значением реквизита
ОтборДок = Новый Структура(«Поставщик», СсылкаНаПоставщика);
ВыборкаПриходов = Документы. ПриходТовара. Выбрать(,, ОтборДок);
//выборка отсортированная по убыванию даты
ВыборкаПриходов = Документы. ПриходТовара. Выбрать(,,, «Дата Убыв»);
Выборка позволяет получать данные из базы порциями. Если в базе будет 1000000 документов, то выборка будет получить их небольшими порциями, а не загружать сразу все документы в оперативную память.
Программная работа с ссылкой на документ
Через ссылку на документ можно обратиться к реквизитам объекта. При этом будет неявно выполнен запрос к базе данных для получения значения реквизита. Так как работа с базой данных возможна только на сервере, то на клиенте нельзя от ссылки получать значения реквизитов:
Поставщик = СсылкаНаДокПриход. Поставщик;
ДатаДок = СсылкаНаДокПриход. Дата;
//однако на клиенте такой код не сработает с ошибкой:
// поле объекта не обнаружено
Для получения пустой ссылки можно использовать метод ПустаяСсылка. Для проверки на пустую ссылку можно воспользоваться методом Пустая:
//получение пустой ссылки на документ
ПустойДокПриход = Документы. ПриходТовара. ПустаяСсылка();
//проверка на пустую ссылку
Если ПустойДокПриход. Пустая() Тогда
//пустая ссылка
КонецЕсли;
//или так
Если ПустойДокПриход = Документы. ПриходТовара. ПустаяСсылка() Тогда
//тоже пустая ссылка
КонецЕсли;
Сопоставление документов по идентификатору
У каждого документа есть уникальный идентификатор, который присваивается при первой записи документа и не может быть изменен. Часто при обмене между двумя базами данных требуется сопоставлять документы. Для этого можно использовать идентификаторы.
Пример выгрузки идентификатора документа. Уникальный идентификатор получается из ссылки методом УникальныйИдентификатор:
ВыборкаПриходов = Документы. ПриходТовара. Выбрать();
Пока ВыборкаПриходов. Следующий() Цикл
//получаем уникальный идентификатор
УИДПрихода = ВыборкаПриходов. Ссылка. УникальныйИдентификатор();
//преобразуем в строку
УИДПриходаСтрокой = Строка(УИДПрихода);
//дальше записываем строку в файл обмена
КонецЦикла;
Пример сопоставления документов по идентификатору. Здесь используется метод ПолучитьСсылку для получения ссылки на документ по уникальному идентификатору и метод УстановитьСсылкуНового чтобы уникальный идентификатор нового документа был равен уникальному идентификатору, полученному из другой базы.
Определяем вид изменяемого регистра сведений
Регистры сведений в зависимости от режима записи подразделяются на независимые и с подчинением регистратору. Для того чтобы выяснить, к какому виду относится регистр, откройте его свойства:
После того, как Вы выяснили вид регистра сведений — Вы можете выбрать вариант действий с регистром.
Удаляем записи в независимом регистре сведений
Для очистки записей с отбором Вам нужно проанализировать состав измерений регистра сведений. Задавая отбор по измерениям, Вы можете частично удалять данные в регистре сведений. К примеру, рассмотрим регистр сведений КурсыВалют. В этом регистре 2 измерения: Валюта и БазоваяВалюта:
Теперь давайте рассмотрим 2 способа очистки записей по определенной Валюте. Первый способ — использование объекта НаборЗаписей:
ОчиститьЗаписиВНезависимомРегистреСведенийСОтборомВалюта БазоваяВалюта
Набор РегистрыСведенийКурсыВалютСоздатьНаборЗаписей
НаборОтборВалютаУстановитьВалюта
НаборОтборБазоваяВалютаУстановитьВалюта
НаборЗаписать
В этом примере мы создаем набор записей, устанавливаем для него отбор по измерениям, но записи в набор не добавляем. В результате при записи набора будет выполнена очистка записей по валютам, установленным в качестве отбора.
Второй способ — использование объекта МенеджерЗаписи:
ОчиститьЗаписиВНезависимомРегистреСведенийСОтборомВалюта БазоваяВалюта
Запись РегистрыСведенийКурсыВалютСоздатьМенеджерЗаписи
ЗаписьВалюта Валюта
ЗаписьБазоваяВалюта БазоваяВалюта
ЗаписьУдалить
Оба вариант удалят записи по валюте. При использовании второго варианта платформа будет конвертировать менеджер записи в набор записей.
Не забывайте про порядок измерений в регистре. К примеру, если задавать отбор только по измерению Валюта — будут удаляться все записи по этой валюте независимо от значений второго измерения (БазоваяВалюта). Таким образом Вы можете либо более детально удалять записи, устанавливая отбор по нескольким измерениям, либо делать более общее удаление с использованием отбора только по одному измерению.
Удаляем записи в регистре с подчинением регистратору
Все записи в таком регистре подчинены регистратору. Поэтому для удаления записей Вам нужно задавать отбор по регистратору. В качестве примера будем использовать регистр ЦеныНоменклатуры. Все записи этого регистра подчинены документам-регистраторам. Состав измерений регистра:
Теперь рассмотрим, как можно удалить все записи по определенному регистратору:
ОчиститьЗаписиВЗависимомРегистреСведенийРегистратор
Набор РегистрыСведенийЦеныНоменклатурыСоздатьНаборЗаписей
НаборОтборРегистраторУстановитьРегистратор
НаборЗаписать
Приведенный выше пример очистит все записи по регистратору. Теперь давайте рассмотрим пример удаления записей с отбором — к примеру нам необходимо удалить записи по определенной номенклатуре:
Первым действием мы устанавливаем отбор по регистратору и считываем записи. Далее в обратном порядке обходим записи и удаляем только нужные записи. Таким образом можно выполнять «точечную» очистку регистра.
Полная очистка записей регистра сведений
Ниже приведен пример, который полностью очистит записи в регистре сведений:
ОчиститьЗаписиРегистраСведений
Набор РегистрыСведенийКурсыВалютСоздатьНаборЗаписей
НаборЗаписать
Наши разработки
Как программно удалить все записи из справочника Номенклатура☑0
svchernova ✎
Ничего не поняла. Как программно удалить записи из справочника в 8.1?
вот код:
СпрНоменклатура = Справочники. Номенклатура;
Выборка = Справочники. Номенклатура. Выбрать();
Пока Выборка. Следующий() = 1 Цикл
СпрНоменклатура. Удалить(); //УстановитьПометкуУдаления (Истина); //пометка на удаление
КонецЦикла;
Вроде же это совсем просто должно быть? Кто знает, откликнитесь, пожалуйста. я только начинаю в 1С, раньше на С++ работала.
1
RomaH ✎
объект получить надо
2
Defender aka LINN ✎3
svchernova ✎
ну не издевайтесь, все ведь когда-то начинали. я программист, но с 1С только-только начала. на предложение СпрНоменклатура. Удалить(); ругается.
4
butterbean ✎
конфа типовая??
5
svchernova ✎
СпрНоменклатура = Справочники. Номенклатура; —— это разве не означает «получить объект?»
6
svchernova ✎7
RomaH ✎
доктор, меня все игнорируют
8
butterbean ✎
в сервисе есть групповая обработка справочников и документов, там можно пометить все на удаление
9
butterbean ✎
+ потом через удаление помеченных удалить совсем
10
svchernova ✎
я буду закачивать новый справочник из DBF файла и поэтому хочу предварительно очистить старый
11
bvn13 ✎
а документы есть в базе? «я буду закачивать новый справочник из DBF файла» — сами будете делать или все-таки воспользуетесь
советом?
12
svchernova ✎
для Butterbean — я знаю, но хочетсяудалить самой
13
wise ✎
ПОПРОБУЙ прочитать и обдумать
14
Patrio_
O_Muerte ✎
ТекущийЭлемент = Выборка. ПолучитьОбъект(); ТекущийЭлемент. Удалить()
15
bvn13 ✎16
svchernova ✎
я буду делать сама. документов в базе нет пока. я достаточно опытный программист, но не в 1С, говорю же!
17
RomaH ✎
вот так будет правильнее:
Выборка = Справочники. Номенклатура. Выбрать(); Пока Выборка. Следующий() = 1 Цикл СпрОбъект = СпрНоменклатура. ПолучитьОбъект(); СпрОбъект. ОбменДанными. Загрузка = Истина;
СпрОбъект. Удалить(); //УстановитьПометкуУдаления (Истина); //пометка на удаление
18
svchernova ✎
тут секта какая-то. сектантский язык, но привыкаю потихоньку. Спасибо, ребята. Сейчас попробую
19
RomaH ✎
СпрОбъект. ОбменДанными. Загрузка = Истина; если конфа типовая (правильно написаная) — то в обработке при/перед записью по этому признаку стоит выход из процедуры
20
antgrom ✎
А для начала убедитесь , что работаете не в рабочей базе и что ВСЕ ЗАПИСИ действительно надо удалять.
21
Patrio_
O_Muerte ✎22
svchernova ✎
я работаю в локальной базе, на своем компе. я ничего не испорчу.
23
svchernova ✎
СпрОбъект = СпрНоменклатура. ПолучитьОбъект(); — тут не то что-то
24
svchernova ✎25
Patrio_
O_Muerte ✎
Выборка = Справочники. Номенклатура. Выбрать(); Пока Выборка. Следующий() = 1 Цикл СпрНоменклатура = Выборка. ПолучитьОбъект(); СпрНоменклатура. Удалить();
26
Patrio_
O_Muerte ✎
Пока Выборка. Следующий() Цикл
27
svchernova ✎
Да, Patrio, так получилось. Спасибо Вам большое. Не понимаю пока нутром, для чего нужно получать объект. Ладно, со временем разберусь в этой кухне.
Спасибо
28
bvn13 ✎
изменять можно только объект. Ссылку изменить нельзя.
29
svchernova ✎30
svchernova ✎
я как-то догадываюсь, что для работы над объектом надо его получить, но тонкостей здесь много, согласитесь. а пока что шишки набиваю на лбу.
31
antgrom ✎
«Ссылка» — это ссылка на значение в таблице БД
Изменив ссылку Вы не получите результата.
«Объект» — само значение в таблице БД. Его можно и нужно менять.
32
Patrio_
O_Muerte ✎
Читайте про типы данных 1с, они здесь своеобразные 🙂
33
Patrio_
O_Muerte ✎
+ Не за что
34
svchernova ✎
я думала, что объект — объект конфигурации, то есть справочник, документ, реквизиты, формы, поля ввода, колонки, и т.д. но это еще и строки. Надо привыкнуть.
35
svchernova ✎
есть за что. здесь действительно помогают.
36
svchernova ✎
и сдается мне, что одни дядьки 🙂
37
Dmitrii ✎
Объект это не строки, не реквизиты, не формы, не поля ввода, не колонки.
38
svchernova ✎
а что такое объект, всё-таки?
39
Patrio_
O_Muerte ✎
Ссылку мы можем прочитать — и это не строка, а на самом деле ссылка на некую запись в базе данных со всеми своими реквизитами, методами и всем прочим, что присуще ссылке. (1-ый тип данных). Объект мы можем и прочитать и изменить — и это тоже не строка, это уже непосредственно запись в таблице, с которой можно сделать все что угодно, и которая имеет все свои реквизиты, методы и все прочее, что присуще объекту.(2-ый тип данных). Строка — это некое строковое значение, набранное от руки с клавиатуры. (3-ий тип данных).
40
Patrio_
O_Muerte ✎
А вообще типов данных тама миллион, я столько не напечатаю 🙂 так что лучше почитать справочную литературу, благо подобной море.
41
svchernova ✎
вот, под словом «строка» я и подразумевала запись в таблице. Да, 1С очень спицифична, много надо читать, и разбираться надо много. но это хорошо, без хлебушка не останусь. Спасибо, Patrio.
42
Patrio_
O_Muerte ✎
+ То есть, объектом на уровне методов программирования может быть справочник, документ, перечисление, константы и т.д. — то есть все для чего выделяется место под запись в таблице базы данных (все что хранится). Прочее что вы перечислили «формы, поля ввода, колонки» это скорее элементы формы, обрабатываются динамически при начале работы с ними интерактивно.
43
Patrio_
O_Muerte ✎
Это как свезет 🙂
Эт да, за фотку готовы на все, так что рекомендую 🙂
44
svchernova ✎
Мне свезёт обязательно 🙂 Прикреплю я фотку.
45
Patrio_
O_Muerte ✎
Я то не требую, но вот помощников прибавится в разы.
Иногда возникает ситуация, когда из программы надо удалить все документы, очистить базу, оставив одни справочники. Сделать это можно несколькими способами. Рассмотрим их все, чтобы определить, какой будет удобен именно вам. В любом случае, удаление документов из базы начинается с проставления пометок на удаление. Это несложное действие, но если у вас все же возникнут вопросы, обращайтесь за консультацией по программе 1С к нашим специалистам – мы с радостью вам поможем.
Удаление документов в журнале документов
Если нам надо удалить все счета, как пометить на удаление сразу группу документов? Зайдем в журнал документов «Счета покупателям».
Зайдем в журнал «Счета покупателям»
Выделить все документы в журнале, можно нажав комбинацию клавиш «Ctrl+A». Затем или нажав правой кнопкой мышки, или в кнопке «Еще» выбрать команду «Пометить на удаление/Снять пометку». Также можно это сделать, нажав кнопку «Del» на клавиатуре.
Документы помечены на удаление. При этом если в журнале мы установим отбор (по дате, контрагенту), то выделятся только те документы, которые отобразятся в отборе.
Установка пометки на удаление с помощью группового изменения реквизитов
Еще один способ пометить на удаление все документы –с помощью встроенной в библиотеку стандартных подсистем обработки «Групповое изменение реквизитов.»
Эту обработку возможно открыть по прямой ссылке: e1cib/command/Обработка. ГрупповоеИзменениеРеквизитов. Команда. ГрупповоеИзменениеРеквизитов
Переход по ссылке
Переход в групповое изменение реквизитов по меню панели разделов
В первую очередь важно определить перечень типов объектов, которые мы хотим поменять.
Выбор объектов для изменения реквизитов
Мы можем задать несколько типов объектов, чтобы менять только общие для этих объектов реквизиты. Если нужно, мы можем установить отбор для документов (например, ограничить группу документов датой). Отобранные объекты отображаются в подвале открытого окна.
Отбор по дате объекта в обработке
Для активации пометки на удаление необходимо включить специальную опцию в дополнительных параметрах, поскольку пометка на удаление является служебным реквизитом и по умолчанию недоступна в интерфейсе.
Дополнительные параметры обработки
В интерфейсе обработки появился реквизит пометки на удаление, поэтому появилась возможность установить его значение для выбранных объектов.
Установка пометки на удаление
При необходимости можно проверить результат, перейдя в журнал счетов покупателям. Обратите внимание, что перед пометкой на удаление документы нужно будет распровести, а также на наличие связанных объектов.
Документы «Счета покупателям» помечены на удаление
После установки пометки на удаление на все документы, которые нужно удалить, идем в пункт меню «Администрирование» и запускаем процедуру «Удаление помеченных объектов», установив режим «Автоматическое удаление всех помеченных объектов», и нажимаем «Удалить». После проведения контроля ссылочной целостности, документы будут удалены.
После контроля ссылочной целостности, документы удаляются
Удаление всех документов из программы без контроля ссылочной целостности
Этот способ хорошо использовать, когда надо очистить полностью информационную базу от всех документов. Сделать это можно с помощью обработки «Универсальный обмен данными в формате XML». Найти ее можно в разделе «Все функции»-«Обработки».
Эта обработка предназначена для обмена данными, но в ней имеется закладка «Удаление данных». Хотя разработчики предупреждают, что использовать ее не рекомендуется, т.к. может нарушиться ссылочная целостность информации, ею мы воспользуемся, т.к. нам она нужна именно для полной очистки информационной базы. Устанавливаем галочку, что удалять мы будем все документы.
При значительном объеме данных эта процедура может занять очень длительное время. Поэтому рекомендуется выполнять удаление по частям.
Работая в программах 1С, рекомендуется периодически удалять помеченные объекты. Накапливаясь в программе, они приводят к увеличению информационной базы, снижается быстродействие программы, появляются недочеты в работе пользователя. Ошибки могут возникнуть, если пользователь случайно выберет помеченный на удаление объект, что часто бывает при копировании документов, создании дублей записей и потом установки пометки на удаление на одну из них и т.п. При установлении даты запрета редактирования на определенную дату будет проблемно удалить такие объекты. Поэтому необходимо вовремя освобождать программу от ненужной информации самостоятельно или осуществлять данные действия силами специалистов в рамках сопровождения 1С 8.3.
Справочники в 1С — это объекты конфигурации, предназначенные для хранения данных, имеющих одинаковую структуру и носящие списочный характер. Например, в справочниках может храниться: перечень номенклатуры, контрагентов, сотрудников, банковских счетов и т.д. В статье рассматриваются базовые принципы работы с этим объектом метаданных.
Создание элемента справочника
Создание новой группы: НоваяГруппа СправочникиКонтрагентыСоздатьГруппу // Создание группы НоваяГруппаНаименование // Заполнение наименования НоваяГруппаЗаписать // Запись группы Создание нового элемента: НовыйЭлемент СправочникиКонтрагентыСоздатьЭлемент // Создание элемента НовыйЭлементРодитель СправочникиКонтрагентыНайтиПоНаименованию // Заполнение родителя НовыйЭлементНаименование // Заполнение наименования НовыйЭлементИНН // Заполнение реквизита // Добавление новой строки табличной части НоваяСтрока НовыйЭлементКонтактнаяИнформацияДобавить НоваяСтрокаТип НоваяСтрокаПредставление
НовыйЭлементЗаписать // Запись элемента
Поиск элементов справочника
Для поиска элементов справочников в языке программирования 1С предусмотрено несколько методов:
Во всех методах если поиск успешный, то будет возвращена ссылка на найденный элемент. НайденныйКонтрагент СправочникиКонтрагентыНайтиПоКоду // Поиск контрагента с кодом «123» НайденныйДоговор СправочникиДоговорыКонтрагентовНайтиПоКоду НайденныйКонтрагент // Поиск подчиненного найденному контрагенту договора с номером «1» НайденныйКонтрагент СправочникиКонтрагентыНайтиПоНаименованию // Поиск элемента с наименованием «Покупатели» НайденныйКонтрагент1 СправочникиКонтрагентыНайтиПоНаименованию НайденныйКонтрагент // Поиск элемента с наименованием «Ромашка ООО» в группе «Покупатели» НайденныйКонтрагент СправочникиКонтрагентыНайтиПоРеквизиту // Поиск контрагента с ИНН «123456789»
Изменение элементов справочника
Для изменения реквизитов справочника необходимо выполнить следующие действия:
Программное изменение справочника возможно только на стороне сервера.
Например, на форму обработки выведен реквизит Номенклатура типа СправочникСсылка. Номенклатура. Вот пример кода, изменяющего наименование выбранной пользователем номенклатуры: НоменклатураОбъект НоменклатураПолучитьОбъект НоменклатураОбъектНаименование НоменклатураОбъектЗаписать
Удаление элементов справочника
Элементы справочника могут быть помечены на удаление и удалены из базы непосредственно.
Непосредственное удаление – операция необратимая, в то время как пометку на удаление можно отменить. Пометка на удаление хранится в предопределенном реквизите . В пользовательском режиме помеченные на удаление элементы и группы справочника помечаются красным крестиком.
Пометку на удаление можно установить/снять двумя разными способами: // Способ 1. Использование метода УстановитьПометкуУдаления() НайденныйКонтрагент СправочникиКонтрагентыНайтиПоКоду КонтрагентОбъект НайденныйКонтрагентПолучитьОбъектКонтрагентОбъектУстановитьПометкуУдаления
// Способ 2. Изменение свойства ПометкаУдаления НайденныйКонтрагент СправочникиКонтрагентыНайтиПоКоду КонтрагентОбъект НайденныйКонтрагентПолучитьОбъект КонтрагентОбъектПометкаУдаления КонтрагентОбъектЗаписать Пример непосредственного удаления элемента справочника: НайденныйКонтрагент СправочникиКонтрагентыНайтиПоКоду КонтрагентОбъект НайденныйКонтрагентПолучитьОбъект КонтрагентОбъектУдалить
Обход элементов справочника
Для обхода элементов справочника в языке программирования 1С предусмотрено два метода:
Методы отличаются порядком следования отобранных элементов: при иерархической выборке для каждого элемента сначала выбираются элементы, для которых он является родителем, а затем уже выбираются элементы следующего уровня.
Рассмотрим примеры обхода элементов справочника: // Обход всех элементов справочника Контрагенты Выборка СправочникиКонтрагентыВыбрать // Получение выборки всех элементов справочника ВыборкаСледующий //действия с очередным элементом СообщитьВыборкаНаименование // Обход контрагентов из группы «Покупатели» ГруппаПокупатели СправочникиКонтрагентыНайтиПоНаименованию Выборка СправочникиКонтрагентыВыбратьГруппаПокупатели ВыборкаСледующий СообщитьВыборкаНаименование
// Обход договоров контрагента “Ромашка ООО” НайденныйКонтрагент СправочникиКонтрагентыНайтиПоНаименованию Выборка СправочникиДоговорыКонтрагентовВыбрать НайденныйКонтрагент ВыборкаСледующий СообщитьВыборкаНаименование
// Обход контрагентов с пустым ИНН // Реквизит ИНН должен быть проиндексирован! Отбор Структура // Структура может содержать только один элемент Выборка СправочникиКонтрагентыВыбрать Отбор ВыборкаСледующий СообщитьВыборкаНаименование
Выбор элементов справочника запросом
Поиск данных в базе 1С предпочтительнее выполнять при помощи запросов. Запрос позволяет описать практически любые условия для отбора, в отличие от методов и , на которые накладываются существенные ограничения. К тому же, в большинстве случаев работа с использованием запросов быстрее, чем работа с использованием программного кода.
Открытие форм справочника
Для открытия любых форм справочников рекомендуется использовать метод ОткрытьФормуИмяФормыПараметрыВладелецУникальностьОкноНавигационнаяСсылкаОписаниеОповещенияОЗакрытииРежимОткрытияОкна Для открытия формы элемента или группы справочника также возможно использовать более простой метод Кроме методов и есть и другие (ОткрытьФормуМодально, ОткрытьЗначение, ПолучитьФорму), но их использование не рекомендуется, т.к. часть этих методов использует режим модального открытия, часть противоречит свежим рекомендациям фирмы 1С.
Приведем примеры программного открытия форм справочника: // Открыть форму списка
// Открыть форму элемента // Контрагент – реквизит формы, заполняемый пользователем интерактивно ПоказатьЗначение Контрагент
// Еще один способ открытия формы элемента ПараметрыОткрытия Структура Контрагент ОткрытьФорму ПараметрыОткрытия
// Открыть форму группы // ГруппаКонтрагентов– реквизит формы, заполняемый пользователем интерактивно ПоказатьЗначение ГруппаКонтрагентов
// Еще один способ открытия формы группы ПараметрыОткрытия Структура ГруппаКонтрагентов ОткрытьФорму ПараметрыОткрытия
Следует понимать, что интерактивная работа (в том числе открытие форм) в 1С возможна только на стороне клиента. В то же время поиск и изменение данных возможны только на стороне сервера.
Из этой статьи вы узнаете, как в удалить в 1С объект при помощи программного кода, а также как поставить пометку на удаление.
В предыдущей статье, я рассказывал, как интерактивно удалить в 1С объект, и что для этого нужно настроить в правах конфигурации:
Удаление в 1С
Программное удаление справочника в 1С
Для того чтобы программно удалить экземпляр справочника в 1С, необходимо воспользоваться методом Удалить объекта справочника. Для демонстрации разберу пример: разместим на форме обработки реквизит с ссылкой на справочник Контрагенты.
И при выполнении команды формы обработки, будем удалять этот экземпляр справочника.
УдалитьКонтрагента
КонтрагентОбъект КонтрагентПолучитьОбъект
КонтрагентОбъектУдалить
Контрагент СправочникиКонтрагентыПустаяСсылка
УдалитьКоманда
УдалитьКонтрагента
В этом коде удаление экземпляра справочника я производил в серверном контексте. Сначала при помощи метода ПолучитьОбъект() из ссылки был получен экземпляр объекта справочника, а потом этот экземпляр удален при помощи метода Удалить(). В реквизит Контрагент управляемой формы я записал пустую ссылку, чтобы отображение ссылки удаленного объекта не вводило в заблуждение.
Замечу, что программное удаление произошло при таких правах на объект.
Право «Интерактивное удаление» снято, то есть мы не можем непосредственно удалять экземпляр этого объекта, но мы можем удалить его программно (благодаря установленному праву Удалить).
Замечу, что при программном удалении объекта контроль ссылочной целостности не происходит! Поэтом не следует злоупотреблять этой возможностью!
Программное удаление документа в 1С
Документ программным способом удаляется также, как и справочник: нужно воспользоваться методом Удалить() экземпляра объекта документа. Например, на форме этой обработки я размещу реквизит с ссылкой на документ.
А при выполнении команды документ будет удаляться.
УдалитьДокумент
ДокументОплата ОплатаПолучитьОбъект
ДокументОплатаУдалить
Оплата ДокументыОплатаПустаяСсылка
УдалитьКоманда
УдалитьДокумент
Как и в случае справочника, программное удаление документа стало возможным благодаря установленному праву «Удалить».
Пометка на удаление программно в 1С
Для того, чтобы программно пометить на удаление объект необходимо воспользоваться методом объекта УстановитьПометкуУдаления.
Переделаем предыдущий пример: на форме разместим две команды.
Одна команда будет устанавливать пометку на удаление у документа в реквизите, вторая снимать.
УстановитьНаСервере
ДокументОплата ОплатаПолучитьОбъект
ДокументОплатаУстановитьПометкуУдаления
УстановитьКоманда
УстановитьНаСервере
СнятьНаСервере
ДокументОплата ОплатаПолучитьОбъект
ДокументОплатаУстановитьПометкуУдаления
СнятьКоманда
СнятьНаСервере
В этом коде, в процедуре УстановитьНаСервере() мы устанавливаем пометку на удаление, передав в метод УстановитьПометкуУдаления параметр Истина, а в процедуре СнятьНаСервере() снимаем пометку, передав Ложь.
Для объектов справочников метод УстановитьПометкуУдаления имеет следующий синтаксис:
Параметр ВключаяПодчиненные имеет тип Булево, и если установлено Истина, то будут помечены на удаление подчиненные элементы (если справочник иерархический), а также все объекты подчиненного справочника (если есть).
Продемонстрируем работу второго параметра: на форму поместим реквизит с типом булево, реквизит с типом ссылка на справочник Контрагенты , и сделаем две команды: установить и снять.
В обработчиках команд будем устанавливать и снимать пометку на удаление.
УстановитьНаСервере
КонтрагентОбъект КонтрагентПолучитьОбъект
КонтрагентОбъектУстановитьПометкуУдаленияПодчиненные
УстановитьКоманда
УстановитьНаСервере
СнятьНаСервере
КонтрагентОбъект КонтрагентПолучитьОбъект
КонтрагентОбъектУстановитьПометкуУдаленияПодчиненные
СнятьКоманда
СнятьНаСервере
У справочника Контрагенты включим иерархию.
И также сделаем подчиненный справочник.
Если мы установим пометку для группы с флажком подчиненные.
То будет помечена группа и все входящие в неё объекты.
А без установленного флага Подчиненные будет помечена только группа.
Тоже самое с объектами из подчиненного справочника. При установленном флаге Подчиненные.
Будет помечен на удаление и сам элемент справочника, и объекты подчиненного ему справочника.
А иначе, будет помечен только сам элемент.
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить вКнига «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С. Только для читателей моего блога,промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
можно оплатить вручную:
Яндекс. Деньги — 410012882996301Web Money — R955262494655
Вступайте в мои группы:
Регистры сведений в 1С — это прикладные объекты конфигурации для хранения данных в структурированном виде (в разрезе измерений). Например, в регистре сведений можно хранить курсы валют в разрезе валют, цены номенклатуры в разрезе номенклатур, ФИО физических лиц в разрезе физических лиц и т.д.
При проектировании разработчик указывает необходимость хранения данных в разрезе времени и минимальную периодичность, с которой записи будут храниться в регистре:
Регистры сведений, для которых указана периодичность, называются периодическими.
Изменение данных в регистре может осуществляться как вручную, так и при помощи документов. Режим записи в регистр определяет разработчик на этапе проектирования:
Физически регистр сведений представляет собой таблицу, в которой хранятся следующие данные:
Для всех регистров сведений обеспечивается контроль уникальности записей, т.е. в регистре не может быть двух одинаковых записей. Одинаковыми считаются записи, у которых совпадают значения измерений, период (если регистр периодический) и регистратор (если регистр подчинен регистратору).
Добавление записей
Программно добавить записи в регистр сведений можно при помощи:
Объект МенеджерЗаписи можно использовать только для работы с независимыми регистрами. Причем можно обрабатывать только одну запись. Объект предназначен в основном для интерактивной работы, но программно с ним также можно работать. На системном уровне МенеджерЗаписи использует объект НаборЗаписей.
Общая схема добавления записей в регистр сведений при помощи объекта НаборЗаписей выглядит так:
// Добавление записи в независимый непериодический регистр сведений
НаборЗаписей РегистрыСведенийВерсииПодсистем // Этап 1
НаборЗаписейОтборИмяПодсистемыИмяПодсистемы // Этап 2
// Этап 3
НоваяЗапись НаборЗаписей
НоваяЗаписьИмяПодсистемы ИмяПодсистемы
НоваяЗаписьВерсия НомерВерсии
НаборЗаписей // Этап 4
// Добавление записи в независимый периодический регистр сведений
НаборЗаписей РегистрыСведенийКурсыВалют // Этап 1
// Этап 2
НаборЗаписейОтборВалютаДоллар
НаборЗаписейОтборПериод
НоваяЗапись НаборЗаписей
НоваяЗаписьПериод
НоваяЗаписьВалюта Доллар
НоваяЗаписьКурс
НоваяЗаписьКратность
НаборЗаписей // Этап 4
Общая схема добавления записей в регистр сведений при помощи объекта МенеджерЗаписи выглядит так:
// Добавление записи в независимый непериодический регистр сведений
Запись РегистрыСведенийВерсииПодсистем // Этап 1
// Этап 2
ЗаписьИмяПодсистемы ИмяПодсистемы
ЗаписьВерсия НомерВерсии
Запись // Этап 3
// Добавление записи в независимый периодический регистр сведений
Запись РегистрыСведенийКурсыВалют // Этап 1
// Этап 2
ЗаписьПериод
ЗаписьВалюта Доллар
ЗаписьКурс
ЗаписьКратность
Запись // Этап 3
Изменение записей
Изменять существующие записи регистров сведений возможно при помощи объектов НаборЗаписей и МенеджерЗаписи. Ограничения объекта МенеджерЗаписи были описаны выше.
Общая схема редактирования записей регистров сведений:
// Редактирование записей с использованием объекта НаборЗаписей
НаборЗаписей РегистрыСведенийКурсыВалют // Этап 1
// Этап 2
НаборЗаписейОтборПериодДатаКурса
НаборЗаписейОтборВалютаДоллар
НаборЗаписей // Этап 3
Запись НаборЗаписей
ЗаписьКурс // Этап 4
НаборЗаписей // Этап 5
// Редактирование записей с использованием объекта МенеджерЗаписи
Запись РегистрыСведенийКурсыВалют // Этап 1
// Этап 2
ЗаписьПериод ДатаКурса
ЗаписьВалюта Доллар
Запись // Этап 3
Запись // Проверка, что запись существует
ЗаписьКурс // Этап 4
Запись // Этап 5
Чтение записей
Чтение информации из базы данных рекомендуется выполнять при помощи запросов. Данный способ обеспечивает гибкое применение отборов и группировок, а также возможность выбора записей из нескольких таблиц.
Запрос Запрос
ЗапросТекст
Выборка Запрос
Выборка
// обход результата выполнения запроса
Для периодических регистров сведений есть возможность получить наиболее поздние записи, период которых меньше указанной даты — срез последних, и наиболее ранние записи, период которых больше указанной даты — срез первых. Для получения среза первых и среза последних запросом необходимо использовать одноименные виртуальные таблицы, в параметрах которых сразу можно задать дату среза и отборы. Отборы, если они необходимы, рекомендуется накладывать именно в параметрах виртуальных таблиц, т.к. это позволяет ускорить выполнение запроса.
// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта»
// и период МЕНЬШЕ или равен значению из переменной «ВыбраннаяДата»
Запрос Запрос
ЗапросТекст
Запрос ВыбраннаяВалюта
Запрос ВыбраннаяДата
Выборка Запрос
Выборка
// обход результата выполнения запроса
// Получение записи, у которой валюта равна значению из переменной «ВыбраннаяВалюта»
// и период БОЛЬШЕ или равен значению из переменной «ВыбраннаяДата»
Запрос Запрос
ЗапросТекст
Запрос ВыбраннаяВалюта
Запрос ВыбраннаяДата
Выборка Запрос
Выборка
// обход результата выполнения запроса
Кроме чтения запросом возможно использование методов объектной модели.