При построении отчетов и обработок в платформе 1С:Предприятие 7.7 часто возникает задача исключить из выборки справочника элементы, которые помечены на удаление. В отличие от платформы 1С 8, где доступно обращение к реквизиту ПометкаУдаления в секции ГДЕ, синтаксис встроенного языка запросов 1С 7.7 устроен иначе. Разберем по шагам, как правильно составить текст запроса, какие есть альтернативные способы выборки и как избежать проблем с кодировкой при экспорте результата.
Проанализируем синтаксис языка запросов 1С 7.7. Для фильтрации объектов по признаку пометки на удаление в платформе предусмотрена специальная директива Обрабатывать. По умолчанию запрос может обрабатывать все элементы или следовать настройкам выборки. Чтобы явно ограничить выборку только актуальными позициями, указывается режим НеПомеченныеНаУдаление.
Важное ограничение: во встроенном языке запросов 1С 7.7 нельзя использовать обращение к методам объектов внутри секции Условие. Например, конструкция вида Условие(Товар.ПометкаУдаления() = 0); является ошибочной и вызовет сбой при выполнении запроса.
Посмотрим на корректный пример составления и выполнения запроса к справочнику номенклатуры:
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Товар = Справочник.Номенклатура.ТекущийЭлемент;
|Группировка Товар без групп;
|Обрабатывать НеПомеченныеНаУдаление;
|"//}}ЗАПРОС
;
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Предупреждение("Ошибка выполнения запроса!");
Возврат;
КонецЕсли;
Пока Запрос.Группировка("Товар") = 1 Цикл
Сообщить("Товар: " + Запрос.Товар.Наименование);
КонецЦикла;
Для директивы Обрабатывать доступны следующие режимы управления выборкой:
Если для решения задачи не требуется строить сложный отчет с группировками, а нужно лишь перебрать элементы в обработке, эффективнее воспользоваться прямым перебором справочника через объект встроенного языка. В этом случае проверка признака пометки на удаление выполняется через метод ПометкаУдаления().
Разберем пример программного обхода справочника:
Спр = СоздатьОбъект("Справочник.Номенклатура");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
// Метод возвращает 1, если элемент помечен на удаление, и 0, если не помечен
Если Спр.ПометкаУдаления() = 1 Тогда
Продолжить;
КонецЕсли;
// Пропускаем группы, если нужны только элементы
Если Спр.ЭтоГруппа() = 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 через меню Файл — Сохранить как.