Имя: Пароль:
1C
1С v8
Удаления большого количества элементов из справочника
0 Mops1C
 
01.11.25
10:55
Надо реализовать удаление (полное) большого кол-ва элементов из справочника, примерно 20к элементов. Суть в том, что надо делать это быстро, так как после этого ещё будет примерно столько же записываться (записывается за минуты полторы, пойдёт). Код
&НаСервере
Процедура ОчисткаСправочника()

    НачатьТранзакцию();

    Попытка
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |    ФедеральныеЛьготники.Ссылка КАК Ссылка
        |ИЗ
        |    Справочник.ФедеральныеЛьготники КАК ФедеральныеЛьготники";

        Выборка = Запрос.Выполнить().Выбрать();

        МассивДляУдаления = Новый Массив;
        Счетчик = 0;

        Пока Выборка.Следующий() Цикл
            МассивДляУдаления.Добавить(Выборка.Ссылка);
            Счетчик = Счетчик + 1;

            Если Счетчик >= 1000 Тогда
                УдалитьПакет(МассивДляУдаления);
                МассивДляУдаления.Очистить();
                Счетчик = 0;
            КонецЕсли;
        КонецЦикла;

        Если МассивДляУдаления.Количество() > 0 Тогда
            УдалитьПакет(МассивДляУдаления);
        КонецЕсли;

        ЗафиксироватьТранзакцию();
        Сообщить("Справочник полностью очищен!");

    Исключение
        ОтменитьТранзакцию();
        Сообщить("Ошибка очистки: " + ОписаниеОшибки(), СтатусСообщения.Важное);
        ВызватьИсключение;
    КонецПопытки;

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


1С:Предприятие 8.3 (8.3.27.1786)
Медицина. Больничная аптека, редакция 3.0 (3.0.2.27)
1 maxab72
 
01.11.25
10:57
Делай под полными правами, без всяких там "РАЗРЕШЕННЫЕ". будет быстрее
2 Irbis
 
01.11.25
10:59
Выделил всё и шифт+дел. Хотя конфа в которой часто приходится удалять условно-постоянную информацию не внушает уважения.
3 Волшебник
 
01.11.25
11:04
(0) Что-то не видно в Вашем коде собственно Объект.Удалить()
4 zenik
 
01.11.25
11:11
Я бы РС сделал и в нем статус хранил. И обработкой менял. Удалять справочник - такое себе занятие. А если ссылки?
5 Timon1405
 
01.11.25
11:11
разбить на порции и к каждой применить функцию ДлительныеОперации.ВыполнитьВФоне есть в БСП(3.*начиная с какой-то версии*)
6 Климов Сергей
 
01.11.25
11:12
(0) Перенесите транзакцию внутрь вашего УдалитьПакет()
7 Волшебник
 
01.11.25
11:15
(0) Удаляйте прямым запросом
DELETE FROM Catalog342 WHERE id IN (1,2,3)
8 Timon1405
 
01.11.25
11:19
(7) угу и ловите потом битые ссылки в связанных данных
9 Ёпрст
 
гуру
01.11.25
11:19
(7) ему вроде весь нужен, сюдя по коду, тогда уж truncate table
10 Ёпрст
 
гуру
01.11.25
11:19
(8) при коде в (0) оне и так будут
11 Волшебник
 
01.11.25
11:19
(8) гулять так гулять
12 Волшебник
 
01.11.25
11:20
(9) у него в коде РАЗРЕШЕННЫЕ
13 Ёпрст
 
гуру
01.11.25
11:32
(12) это видать, конструктор ему пишет, сам он не ведует, что ОНО значит :)
14 Маленький Вопросик
 
01.11.25
11:44
(13) +
15 Волшебник
 
01.11.25
11:46
(13) Я бы таких программистов бил линейкой по рукам. Железной. Ребром.
16 Fish
 
гуру
01.11.25
11:49
А потом кто-то не получит льготы от таких удаляторов.
17 Fish
 
гуру
01.11.25
11:50
Ну и тема, с чем связано " надо делать это быстро" не раскрыта.
18 Irbis
 
01.11.25
11:53
(17) У тру-1Сников срок исполнения заказа — только вчера. Иначе можно отложить на неопределенное время, может и делать ничего не надо будет.
19 timurhv
 
01.11.25
11:54
1С добавило пакетное добавление, удаление, изменение записей в РС, интересно, через сколько десятков лет будет реализовано подобное для документов, справочников?

РежимЗамещения.Добавление
РежимЗамещения.Обновление
РежимЗамещения.Удаление
20 Fish
 
гуру
01.11.25
11:56
(18) Настоящие Тру-1Сники в совершенстве владеют методом трёх гвоздей.
21 Irbis
 
01.11.25
11:57
(20) И трёх конвертов
22 Fish
 
гуру
01.11.25
11:58
(21) Не, метод трёх конвертов - это уровень выше. Это для начальников тех, кто владеет методом трёх гвоздей.
23 Garykom
 
гуру
01.11.25
12:04
(0) Глупость
Зачем удалять все когда надо обновить?
Нужен реквизит "ДатаОбновления" в самом справочники или в отдельном РС
При загрузке регистра льготников ищем в справочнике по СНИЛС, если нашли то обновляем данные и ставим дату обновления
Затем всех прочих (со старой датой обновления) "закрываем", ставя дату окончания действия или помечая на удаление (можно еще в отдельную группу)
24 Garykom
 
гуру
01.11.25
12:03
(23)+ Реально не понимаю тупизны, в рецептах же ссылки на льготников
25 Irbis
 
01.11.25
12:05
(22) Вот же мне не свезло, я и тем и тем владею. Но гвоздей в практике не меньше пяти, а конверт только один под №3.
26 Bigbro
 
01.11.25
14:10
ну во первых 20к это немного.
а если надо удалить реально много
проще бахнуть в конфигурации объект скопировав его предварительно. и вставить обратно.
если на него нет ссылок ниоткуда
но если есть то тогда полное удаление под большим вопросом.
27 lEvGl
 
гуру
01.11.25
14:14
(26) <
если на него нет ссылок ниоткуда

конечно же ссылок нет, что вы, что вы!
28 ProxyInspector
 
01.11.25
18:04
20К - это мелочи. Когда объектов миллионы или сотни миллионов тогда проблемы для 1С.
29 ProxyInspector
 
01.11.25
18:05
Грохнуть регистр сведений объемом 1 млрд записей и объемом 1 ТБ. Это проблемка
30 timurhv
 
01.11.25
18:16
(29) Уже нет
https://koder.by/rezhimzameshheniya_sliyanie_udalenie_obnovlenie.php

Вот бы подобное на документы и справочники реализовали.
Условно аналогично сразу 100к элементов справочника стали помечеными на удаление или заполнились реквизиты. По-сути это таже самая таблица в СУБД и обращения аналогичные, только контроль со стороны платформы нужно организовать.
Программист всегда исправляет последнюю ошибку.