Chat
Ask me anything
Ithy Logo
Sign in to save

Удаление неключевых элементов справочника "Платформы" в 1С

Подробное руководство по созданию и использованию внешней обработки

delete-1c-directory-elements-h4bz2blu

В данном руководстве мы рассмотрим процесс создания внешней обработки в 1С:Предприятие 8.3 с использованием управляемых форм и СУБД MS SQL Server. Основной задачей обработки будет поиск и удаление элементов из справочника "Платформы", которые не помечены как "Ключевая", с учетом данных, хранящихся в константе "ПлатформыРезерв" типа "ХранилищеЗначений".

Ключевые аспекты и основные выводы

  • GUID (Globally Unique Identifier) играет центральную роль в идентификации объектов в 1С, обеспечивая их уникальность в любой информационной базе.
  • ХранилищеЗначений позволяет сохранять данные различных типов непосредственно в базе данных, включая массивы ссылок и таблицы значений.
  • Процесс удаления объектов в 1С обычно включает пометку на удаление и последующее физическое удаление помеченных объектов для обеспечения ссылочной целостности.

Понимание основных компонентов системы

Структура справочника "Платформы"

Справочник "Платформы" содержит информацию о различных платформах и имеет следующие реквизиты:

  • Наименование: Строковый реквизит длиной до 100 символов для хранения названия платформы.
  • ЧисловойКод: Числовой реквизит длиной 3 знака, принимающий значения от 100 до 999. Этот реквизит имеет контроль уникальности, гарантируя, что каждая платформа имеет уникальный числовой код.
  • Ключевая: Булевый реквизит, указывающий, является ли платформа ключевой.

Структура справочника в 1С

Пример отображения данных в 1С.

Константа "ПлатформыРезерв" и ХранилищеЗначений

Константа "ПлатформыРезерв" имеет тип данных "ХранилищеЗначений". Этот тип данных в 1С позволяет сохранять произвольные данные (включая двоичные данные, массивы, таблицы значений и другие объекты) непосредственно в базе данных. Данные в ХранилищеЗначений могут быть сжаты для экономии места.

В контексте данной задачи, ХранилищеЗначений в константе "ПлатформыРезерв" может содержать:

  • Строку GUID'ов элементов справочника "Платформы", разделенных символом ";".
  • Массив ссылок на элементы справочника "Платформы".
  • Таблицу значений с колонкой "Платформа", тип данных которой - ссылка на справочник "Платформы".

Работа с ХранилищемЗначений требует получения данных из него для дальнейшего анализа и использования.

Работа с ХранилищемЗначений в 1С

Пример загрузки данных в ХранилищеЗначений.

Роль GUID в 1С

GUID (Globally Unique Identifier) является статистически уникальным 128-битным идентификатором, который присваивается каждому объекту базы данных 1С в момент его создания. Главная особенность GUID — его уникальность не только в рамках одной информационной базы, но и глобально. Это делает его незаменимым инструментом при обмене данными между различными информационными базами, позволяя однозначно сопоставлять объекты.

В 1С можно получить GUID объекта по его ссылке. GUID представляется в виде строки формата "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX".

Визуальное представление GUID

Визуальное представление структуры данных, где GUID играет ключевую роль.


Создание внешней обработки "Удалить не ключевые"

Структура обработки и команды

Внешняя обработка будет представлять собой файл с расширением .epf. На форме обработки будет расположена одна команда "Удалить не ключевые". При нажатии на эту команду будет выполняться основной функционал обработки.

Алгоритм работы команды "Удалить не ключевые"

Функционал команды "Удалить не ключевые" должен выполнить следующие шаги:

  1. Получить данные из константы "ПлатформыРезерв". Необходимо прочитать значение константы. Так как константа имеет тип "ХранилищеЗначений", полученное значение будет объектом типа "ХранилищеЗначения". Из этого объекта необходимо извлечь хранимые данные с помощью метода Получить(). Тип полученных данных может быть Строка, Массив или ТаблицаЗначений.
  2. Собрать список ссылок на элементы, которые НЕ подлежат удалению. Этот список будет формироваться на основе данных, полученных из ХранилищаЗначений. В зависимости от типа данных в ХранилищеЗначений, логика сбора ссылок будет отличаться:
    • Строка с GUIDами: Разделить строку на отдельные GUID'ы, используя ";" как разделитель. Для каждого GUID необходимо получить ссылку на соответствующий элемент справочника "Платформы". Это можно сделать с помощью функции НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(СтрокаGUID)) или с использованием строкового представления ссылки.
    • Массив ссылок: Перебрать элементы массива. Каждый элемент массива уже является ссылкой на элемент справочника "Платформы".
    • Таблица значений: Перебрать строки таблицы значений. В каждой строке в колонке "Платформа" содержится ссылка на элемент справочника "Платформы".
    Все полученные ссылки следует собрать в единый список (например, в Массив или СписокЗначений).
  3. Получить все элементы справочника "Платформы". Необходимо получить полный список всех элементов справочника "Платформы".
  4. Идентифицировать элементы для удаления. Перебрать все элементы справочника "Платформы". Для каждого элемента проверить два условия:
    • Является ли элемент "Ключевым" (реквизит "Ключевая" равен Ложь).
    • Присутствует ли ссылка на этот элемент в списке ссылок, которые НЕ подлежат удалению (сформированном на шаге 2).
    Если оба условия истинны (элемент не ключевой И не содержится в списке исключений), то этот элемент подлежит удалению.
  5. Пометить на удаление элементы, подлежащие удалению. Для каждого элемента, идентифицированного для удаления на шаге 4, необходимо установить пометку на удаление. Это можно сделать с помощью метода объекта ПометитьУдаление(Истина).
  6. Выполнить физическое удаление помеченных объектов. После пометки на удаление необходимо выполнить процедуру физического удаления помеченных объектов. В клиент-серверном варианте это обычно делается через регламентное задание или вручную через меню "Администрирование" - "Обслуживание" - "Удаление помеченных объектов". Однако, в контексте внешней обработки, можно вызвать эту процедуру программно, если у пользователя есть соответствующие права. Важно помнить, что физическое удаление произойдет только в том случае, если на помеченный объект нет ссылок из других объектов базы данных.
  7. Сообщить пользователю о результате. После выполнения всех операций необходимо проинформировать пользователя о количестве помеченных на удаление элементов или о возникших ошибках.

Примеры программного кода

Получение данных из ХранилищаЗначений


Перем ДанныеИзХранилища;
Константы.ПлатформыРезерв.Прочитать();
Если Константы.ПлатформыРезерв.Получить() <> Неопределено Тогда
    ДанныеИзХранилища = Константы.ПлатформыРезерв.Получить();
Иначе
    // Обработка случая, когда хранилище пустое
    Сообщить("Хранилище значений константы 'ПлатформыРезерв' пустое.");
    Возврат;
КонецЕсли;
    

Формирование списка ссылок для исключения удаления (пример для строки GUID)


СписокСсылкиИсключения = Новый СписокЗначений();
Если ТипЗнч(ДанныеИзХранилища) = Тип("Строка") Тогда
    СписокGUIDСтрокой = СтрРазделить(ДанныеИзХранилища, ";", Ложь);
    Для Каждого СтрокаGUID Из СписокGUIDСтрокой Цикл
        Попытка
            ГУИД = Новый УникальныйИдентификатор(СокрЛП(СтрокаGUID));
            СсылкаНаПлатформу = Справочники.Платформы.НайтиПоУникальномуИдентификатору(ГУИД);
            Если СсылкаНаПлатформу <> Неопределено Тогда
                СписокСсылкиИсключения.Добавить(СсылкаНаПлатформу);
            Иначе
                Сообщить("Не найдена платформа с GUID: " + СтрокаGUID);
            КонецЕсли;
        Исключение
            Сообщить("Некорректный формат GUID в строке: " + СтрокаGUID);
        КонецПопытки;
    КонецЦикла;
ИначеЕсли ТипЗнч(ДанныеИзХранилища) = Тип("Массив") Тогда
    Для Каждого СсылкаПлатформы Из ДанныеИзХранилища Цикл
        Если ТипЗнч(СсылкаПлатформы) = Тип("СправочникСсылка.Платформы") Тогда
            СписокСсылкиИсключения.Добавить(СсылкаПлатформы);
        Иначе
             Сообщить("В массиве найден элемент некорректного типа.");
        КонецЕсли;
    КонецЦикла;
ИначеЕсли ТипЗнч(ДанныеИзХранилища) = Тип("ТаблицаЗначений") Тогда
     Если ДанныеИзХранилища.Колонки.Найти("Платформа") <> Неопределено Тогда
        Для Каждой СтрокаТЗ Из ДанныеИзХранилища Цикл
            Если ТипЗнч(СтрокаТЗ.Платформа) = Тип("СправочникСсылка.Платформы") Тогда
                 СписокСсылкиИсключения.Добавить(СтрокаТЗ.Платформа);
            Иначе
                 Сообщить("В таблице значений найдена строка с некорректным типом в колонке 'Платформа'.");
            КонецЕсли;
        КонецЦикла;
     Иначе
         Сообщить("В таблице значений отсутствует колонка 'Платформа'.");
     КонецЕсли;
Иначе
    Сообщить("Неожиданный тип данных в хранилище значений: " + ТипЗнч(ДанныеИзХранилища));
    Возврат;
КонецЕсли;

    

Поиск и пометка на удаление


ВыборкаПлатформ = Справочники.Платформы.Выбрать();
СчетчикПомеченных = 0;
Пока ВыборкаПлатформ.Следующий() Цикл
    Если Не ВыборкаПлатформ.Ключевая И СписокСсылкиИсключения.Найти(ВыборкаПлатформ.Ссылка) = Неопределено Тогда
        Попытка
            ОбъектПлатформа = ВыборкаПлатформ.ПолучитьОбъект();
            ОбъектПлатформа.ПометитьУдаление(Истина);
            ОбъектПлатформа.Записать();
            СчетчикПомеченных = СчетчикПомеченных + 1;
        Исключение Как Исключение
            Сообщить("Ошибка пометки на удаление платформы " + ВыборкаПлатформ.Наименование + ": " + Исключение.Описание);
        КонецПопытки;
    КонецЕсли;
КонецЦикла;

Сообщить("Помечено на удаление " + СчетчикПомеченных + " неключевых элементов справочника 'Платформы', не входящих в список исключений.");
    

Вызов процедуры удаления помеченных объектов (пример)


// Для выполнения физического удаления может потребоваться интерактивное подтверждение или права администратора.
// Типовая обработка удаления помеченных объектов может быть доступна через глобальный контекст.
// Пример вызова (требует проверки доступности в вашей конфигурации и прав пользователя):
// Обработки.УдалениеПомеченныхОбъектов.Создать().ОткрытьФорму();

// Или, если доступно программное удаление без интерактивности (имея соответствующие права):
// УдалитьПомеченныеОбъекты(Истина); // Удалить все помеченные объекты
    

MS SQL Server и его взаимодействие с 1С

При клиент-серверной архитектуре 1С часто используется MS SQL Server в качестве СУБД. Данные конфигурации 1С хранятся в таблицах базы данных SQL Server. Взаимодействие между платформой 1С и SQL Server происходит через специальный драйвер. Понимание основ работы с MS SQL Server и его оптимизации (например, индексирование) может быть полезным для повышения производительности 1С.

Архитектура MS SQL Server

Общая архитектура MS SQL Server.

Несмотря на то, что наша внешняя обработка работает на уровне платформы 1С, знание о том, как 1С взаимодействует с базой данных, помогает понять причины тех или иных ограничений и особенностей (например, почему удаление объектов происходит в два этапа: пометка и физическое удаление).


Часто задаваемые вопросы (FAQ)

Что такое уникальный идентификатор объекта в 1С?

Уникальный идентификатор объекта в 1С, или GUID (Globally Unique Identifier), это 128-битное число, которое присваивается каждому объекту базы данных при его создании. Он гарантирует уникальность объекта как в пределах одной базы, так и при обмене данными с другими информационными базами.

Как получить GUID объекта в 1С?

GUID объекта в 1С можно получить программно с помощью метода УникальныйИдентификатор() у ссылки на объект. Например: СсылкаНаОбъект.УникальныйИдентификатор(). Результат будет объектом типа "УникальныйИдентификатор", который можно преобразовать в строку.

Что такое ХранилищеЗначений?

ХранилищеЗначений - это специальный тип данных в 1С, который позволяет сохранять произвольные данные (строки, числа, массивы, таблицы значений, двоичные данные и т.д.) непосредственно в поле базы данных. Это удобно для хранения данных, которые не имеют фиксированной структуры или большого объема.

Как удалить объекты в 1С?

Удаление объектов в 1С обычно происходит в два этапа: сначала объект помечается на удаление с помощью метода ПометитьУдаление(Истина). После этого выполняется процедура физического удаления помеченных объектов, которая проверяет, нет ли ссылок на эти объекты из других частей базы. Если ссылки отсутствуют, объект физически удаляется из базы данных. Эту процедуру можно запустить вручную или настроить как регламентное задание.

Почему объекты сначала помечаются на удаление, а потом физически удаляются?

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

Можно ли удалить элементы справочника, на которые есть ссылки?

Физически удалить элементы справочника, на которые есть ссылки из других объектов (документов, регистров и т.д.), без предварительного удаления или изменения этих ссылок невозможно при использовании стандартной процедуры удаления помеченных объектов. 1С блокирует такое удаление для сохранения целостности данных.

Как работать с дублирующимися элементами справочников?

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

Видео: Поиск и удаление дублей в 1С.


Заключение

Создание внешней обработки для удаления неключевых элементов справочника с учетом данных из ХранилищаЗначений является типовой задачей при разработке в 1С. Понимание принципов работы с GUID, ХранилищемЗначений и механизма удаления объектов критически важно для корректной реализации такого функционала. При работе с клиент-серверной архитектурой и СУБД MS SQL Server необходимо также учитывать особенности взаимодействия платформы с базой данных.


Используемые источники


Last updated May 14, 2025

AI-assisted research. Sources, methodology and corrections · Explore published answers

Ask Ithy AI
Download Article
Delete Article