Как найти пометку удаления в 1С 7.7 и программно получить ее состояние

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При переходе с платформы 1С:Предприятие 7.7 на современные версии 8.3 (например, при миграции из «Торговля и Склад 9.2» в «Управление торговлей 11.5») разработчики часто сталкиваются с концептуальными различиями в архитектуре систем. Одним из таких «камней преткновения» является пометка удаления. В восьмой версии платформы это стандартный реквизит объекта, который виден в метаданных и доступен как обычное свойство. Однако в семерке всё устроено иначе. Рассмотрим подробнее, где скрывается этот признак и как с ним работать системному аналитику или программисту.

Программный доступ к пометке удаления в 1С 7.7

Первое и самое важное правило, которое нам необходимо усвоить: в 1С 7.7 «ПометкаУдаления» — это не реквизит, а метод объекта. Вы не найдете это поле в дереве метаданных конфигуратора среди обычных реквизитов справочника или документа. Попытка обратиться к нему через точку как к свойству (например, Спр.ПометкаУдаления) в некоторых контекстах может не вызывать ошибку, но и не даст нужного результата.

Разберем по шагам, как правильно проверить статус объекта. Для этого используется встроенная функция, которая возвращает числовое значение. Проанализируем пример кода:


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

В данном примере метод ПометкаУдаления() возвращает 1, если объект помечен как удаленный, и 0, если нет. Важно помнить, что для работы этого метода объект должен быть предварительно выбран или найден.

Физическое хранение пометки удаления в базе данных

Для понимания того, почему пометка не видна в обычных инструментах просмотра таблиц, нам нужно заглянуть «под капот» платформы. Способ хранения напрямую зависит от формата базы данных (DBF или SQL). Выясним причину такого разделения.

1. Формат DBF (Файловый вариант)

В файловых базах 1С 7.7 использует классический механизм стандарта DBF. Каждая запись в файле таблицы (например, SC123.dbf для справочника) начинается со специального системного байта, который не отображается как колонка в 1С. Если запись помечена на удаление, в этот байт записывается символ «звездочка» (*). Если запись актуальна — там стоит пробел. Именно поэтому внешние утилиты для работы с DBF могут показывать удаленные записи, если не включен соответствующий фильтр.

2. Формат SQL (Клиент-серверный вариант)

В случае с Microsoft SQL Server ситуация меняется. Поскольку в SQL нет понятия «системного байта удаления» в строке таблицы, 1С создает в каждой таблице справочника (SC<ID>) или документа (DH<ID>) специальную колонку под названием ISMARK. Посмотрим на ее особенности:

Если вы используете прямые запросы (через внешние компоненты вроде 1C++), вам нужно обращаться именно к полю ISMARK. Проанализируем пример SQL-запроса:


SELECT 
    ID as [Ссылка $Справочник.Партнеры],
    ISMARK as ПометкаУдаления
FROM 
    $Справочник.Партнеры
WHERE 
    ISMARK = '*'

Особенности использования в «Конвертации данных 2.x»

При настройке правил выгрузки из 7.7 в 8.3 системные аналитики часто заходят в тупик, не обнаружив поля «ПометкаУдаления» в списке доступных полей источника. Посмотрим, как решить эту задачу правильно при настройке ПКС (Правил Конвертации Свойств).

Рассмотрим алгоритм настройки:

  1. В правилах конвертации свойств для приемника (где есть реквизит ПометкаУдаления) оставьте поле Источник пустым.
  2. Перейдите в обработчик события «Перед выгрузкой» для данного ПКС.
  3. Напишите следующий код:

// Передаем значение в ПКС через встроенный метод источника
Значение = Источник.ПометкаУдаления();

Стандартная обработка выгрузки V77Exp.ert корректно обработает это присваивание и передаст 0 или 1 в файл выгрузки, что в восьмерке превратится в Ложь или Истина соответственно.

Изменение статуса пометки: установка и снятие

Разберем также обратную задачу: как программно изменить состояние пометки удаления. В 1С 7.7 для этого предусмотрены отдельные методы, которые также отличаются от привычного присваивания в 1С 8.х.

Для установки пометки используется метод Удалить(). У него есть важный параметр:

Проанализируем пример установки пометки:


Спр = СоздатьОбъект("Справочник.Партнеры");
Если Спр.НайтиПоКоду("00001") = 1 Тогда
    // Устанавливаем пометку удаления (не физическое удаление!)
    Спр.Удалить(0); 
КонецЕсли;

Для снятия пометки существует отдельный метод СнятьПометкуУдаления(). Посмотрим на его применение:


Если Спр.ПометкаУдаления() = 1 Тогда
    Спр.СнятьПометкуУдаления();
КонецЕсли;

Возможные проблемы и «фантомные» ошибки

Иногда возникают ситуации, когда метод ПометкаУдаления() возвращает неверные данные или визуальное состояние элемента в списке не соответствует его реальному статусу. Выясним причину таких аномалий.

Чаще всего это связано с нарушением целостности индексных файлов (файлы с расширением .cdx). В отличие от 1С 8.х, где кэширование происходит на уровне сервера приложений и клиента, в 1С 7.7 всё взаимодействие с данными завязано на индексах. Если база была аварийно завершена, индексы могут «разъехаться» с основными данными (DBF). В этом случае поможет только монопольное переиндексирование базы данных через Конфигуратор.

Резюме: для успешной работы с пометкой удаления в 1С 7.7 всегда используйте метод ПометкаУдаления() вместо поиска реквизита, а при работе с SQL-базами напрямую обращайтесь к системному полю ISMARK. Понимание этих основ позволит вам избежать ошибок при миграции данных и написании сложных обработок.

← На главную