Как в 1С 7.7 выбрать из справочника только не помеченные на удаление элементы?

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

При построении отчетов и обработок в платформе 1С:Предприятие 7.7 часто возникает задача исключить из выборки справочника элементы, которые помечены на удаление. В отличие от платформы 1С 8, где доступно обращение к реквизиту ПометкаУдаления в секции ГДЕ, синтаксис встроенного языка запросов 1С 7.7 устроен иначе. Разберем по шагам, как правильно составить текст запроса, какие есть альтернативные способы выборки и как избежать проблем с кодировкой при экспорте результата.

Способ 1. Использование директивы «Обрабатывать» во встроенном языке запросов 1С 7.7

Проанализируем синтаксис языка запросов 1С 7.7. Для фильтрации объектов по признаку пометки на удаление в платформе предусмотрена специальная директива Обрабатывать. По умолчанию запрос может обрабатывать все элементы или следовать настройкам выборки. Чтобы явно ограничить выборку только актуальными позициями, указывается режим НеПомеченныеНаУдаление.

Важное ограничение: во встроенном языке запросов 1С 7.7 нельзя использовать обращение к методам объектов внутри секции Условие. Например, конструкция вида Условие(Товар.ПометкаУдаления() = 0); является ошибочной и вызовет сбой при выполнении запроса.

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


Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = 
"//{{ЗАПРОС(Сформировать)
|Товар = Справочник.Номенклатура.ТекущийЭлемент;
|Группировка Товар без групп;
|Обрабатывать НеПомеченныеНаУдаление;
|"//}}ЗАПРОС
;

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Предупреждение("Ошибка выполнения запроса!");
    Возврат;
КонецЕсли;

Пока Запрос.Группировка("Товар") = 1 Цикл
    Сообщить("Товар: " + Запрос.Товар.Наименование);
КонецЦикла;

Для директивы Обрабатывать доступны следующие режимы управления выборкой:

  1. Обрабатывать НеПомеченныеНаУдаление; — отбираются только не удаленные элементы справочника (или проведенные документы).
  2. Обрабатывать ПомеченныеНаУдаление; — отбираются исключительно элементы с признаком пометки на удаление.
  3. Обрабатывать Все; — в выборку попадают все элементы без учета статуса пометки.

Способ 2. Программный обход элементов справочника

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

Разберем пример программного обхода справочника:


Спр = СоздатьОбъект("Справочник.Номенклатура");
Спр.ВыбратьЭлементы();

Пока Спр.ПолучитьЭлемент() = 1 Цикл
    // Метод возвращает 1, если элемент помечен на удаление, и 0, если не помечен
    Если Спр.ПометкаУдаления() = 1 Тогда
        Продолжить;
    КонецЕсли;
    
    // Пропускаем группы, если нужны только элементы
    Если Спр.ЭтоГруппа() = 1 Тогда
        Продолжить;
    КонецЕсли;
    
    Сообщить("Актуальный товар: " + Спр.Наименование);
КонецЦикла;

Способ 3. Прямой SQL-запрос (при использовании 1С++)

В конфигурациях 1С 7.7, работающих на SQL-версии с внешними компонентами (например, 1С++), для выборки данных часто применяются прямые запросы к таблицам базы данных. В структуре таблиц 1С 7.7 признак пометки на удаление хранится в системной колонке ISMARK.

Рассмотрим, как строится условие в прямом SQL-запросе:


// В секции WHERE отсекаются помеченные на удаление записи и группы (ISFOLDER)
ТекстSQL = "
|SELECT 
|    sp.ID as [Товар $Справочник.Номенклатура],
|    sp.DESCR as [Наименование $Строка]
|FROM 
|    $Справочник.Номенклатура as sp
|WHERE 
|    sp.ISMARK = 0 
|    AND sp.ISFOLDER = 2
|";

Решение проблемы с искажением шрифта («каракулями») при экспорте

Выясним причину, почему при копировании списка данных из окна сообщений 1С 7.7 в Блокнот (Notepad) текст может вставляться нечитаемыми символами. Окно сообщений платформы 7.7 использует кодировку ANSI (Windows-1251). Если в момент выполнения операции копирования в буфер обмена в операционной системе активна английская раскладка клавиатуры, Windows может некорректно сопоставить кодовую страницу.

Для корректного переноса данных через буфер обмена достаточно переключить язык ввода в системе на Русский перед операцией копирования из окна 1С и перед вставкой в Блокнот.

Чтобы исключить ручное копирование и гарантировать правильную кодировку, сохранение списка данных лучше выполнять программно с помощью объекта Текст:


ФайлТекст = СоздатьОбъект("Текст");

Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = 
"//{{ЗАПРОС(ЭкспортВФайл)
|Товар = Справочник.Номенклатура.ТекущийЭлемент;
|Группировка Товар без групп;
|Обрабатывать НеПомеченныеНаУдаление;
|"//}}ЗАПРОС
;

Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
    Пока Запрос.Группировка("Товар") = 1 Цикл
        ФайлТекст.ДобавитьСтроку(Запрос.Товар.Наименование);
    КонецЦикла;
    
    // Сохраняем текстовый файл в кодировке ANSI
    ФайлТекст.Записать("C:\Export\Товары.txt");
    Сообщить("Список успешно выгружен в файл!");
КонецЕсли;

Также для вывода данных можно использовать штатный табличный документ (Таблица), который позволяет пользователю сохранить сформированный отчет в форматах TXT, XLS или MXL через меню Файл — Сохранить как.

← На главную