При переходе с платформы 1С:Предприятие 7.7 на современные версии 8.3 (например, при миграции из «Торговля и Склад 9.2» в «Управление торговлей 11.5») разработчики часто сталкиваются с концептуальными различиями в архитектуре систем. Одним из таких «камней преткновения» является пометка удаления. В восьмой версии платформы это стандартный реквизит объекта, который виден в метаданных и доступен как обычное свойство. Однако в семерке всё устроено иначе. Рассмотрим подробнее, где скрывается этот признак и как с ним работать системному аналитику или программисту.
Первое и самое важное правило, которое нам необходимо усвоить: в 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. Посмотрим на ее особенности:
char(1).'*' (звездочка) — объект помечен на удаление.' ' (пробел) — объект не помечен.Если вы используете прямые запросы (через внешние компоненты вроде 1C++), вам нужно обращаться именно к полю ISMARK. Проанализируем пример SQL-запроса:
SELECT
ID as [Ссылка $Справочник.Партнеры],
ISMARK as ПометкаУдаления
FROM
$Справочник.Партнеры
WHERE
ISMARK = '*'
При настройке правил выгрузки из 7.7 в 8.3 системные аналитики часто заходят в тупик, не обнаружив поля «ПометкаУдаления» в списке доступных полей источника. Посмотрим, как решить эту задачу правильно при настройке ПКС (Правил Конвертации Свойств).
Рассмотрим алгоритм настройки:
ПометкаУдаления) оставьте поле Источник пустым.
// Передаем значение в ПКС через встроенный метод источника
Значение = Источник.ПометкаУдаления();
Стандартная обработка выгрузки V77Exp.ert корректно обработает это присваивание и передаст 0 или 1 в файл выгрузки, что в восьмерке превратится в Ложь или Истина соответственно.
Разберем также обратную задачу: как программно изменить состояние пометки удаления. В 1С 7.7 для этого предусмотрены отдельные методы, которые также отличаются от привычного присваивания в 1С 8.х.
Для установки пометки используется метод Удалить(). У него есть важный параметр:
0 — установить пометку удаления (объект остается в базе).1 — непосредственное удаление (объект физически стирается из таблиц).Проанализируем пример установки пометки:
Спр = СоздатьОбъект("Справочник.Партнеры");
Если Спр.НайтиПоКоду("00001") = 1 Тогда
// Устанавливаем пометку удаления (не физическое удаление!)
Спр.Удалить(0);
КонецЕсли;
Для снятия пометки существует отдельный метод СнятьПометкуУдаления(). Посмотрим на его применение:
Если Спр.ПометкаУдаления() = 1 Тогда
Спр.СнятьПометкуУдаления();
КонецЕсли;
Иногда возникают ситуации, когда метод ПометкаУдаления() возвращает неверные данные или визуальное состояние элемента в списке не соответствует его реальному статусу. Выясним причину таких аномалий.
Чаще всего это связано с нарушением целостности индексных файлов (файлы с расширением .cdx). В отличие от 1С 8.х, где кэширование происходит на уровне сервера приложений и клиента, в 1С 7.7 всё взаимодействие с данными завязано на индексах. Если база была аварийно завершена, индексы могут «разъехаться» с основными данными (DBF). В этом случае поможет только монопольное переиндексирование базы данных через Конфигуратор.
Резюме: для успешной работы с пометкой удаления в 1С 7.7 всегда используйте метод ПометкаУдаления() вместо поиска реквизита, а при работе с SQL-базами напрямую обращайтесь к системному полю ISMARK. Понимание этих основ позволит вам избежать ошибок при миграции данных и написании сложных обработок.