1с 77 установить фильтр
1С 7.7 Множественный фильтр в полном журнале или пример работы компоненты vk_hook1C.dll
Думаю, что каждому программисту, который пишет или писал на "семерке", хотя бы раз заказчик задавал вопрос "А можно ли настроить отбор по нескольким полям в общем журнале?".
Дело в том, что стандартными средствами реализовать такое нельзя, отбор можно делать только по одному из реквизитов - "вид документа", "контрагент", "автор" и т.д. Можно написать обработку, которая внешним видом будет напоминать обычный журнал, но при этом пользователь будет иметь возможность указывать несколько фильтров для отбора документов. Однако в этом случае мы очень сильно будем терять в производительности работы такого "псевдо-журнала". Любая подобная обработка будет работать на порядок медленнее обычного журнала.
Остается смотреть в сторону нестандартных подходов в решении проблемы. Один из таких подходов и будет описан в данной статье, его суть заключается в применении внешней библиотеки vk_hook1C.dll.
Сразу стоит отметить, что данный метод подходит только для 1С SQL-версии. Т.к. основная задача библиотеки в том, чтобы перехватывать запросы, посылаемые 1С в базу SQL Server и подставлять в них требуемые значения.
Итак, исходные данные:
- SQL Server 2005 (2000 тоже подойдет, насчет версий старше 2005 ничего не могу сказать)
- 1С, сопряженная с SQL Server
- описание структуры таблиц 1С в SQL (подходит и для DBF-версии)
Копируем содержимое архива в каталог БД. Подключаем компоненту при запуске 1С
Далее создаем "Обычный журнал", устанавливаем в нем несколько видов отбора. В моем случае это: "Вид документа", "Автор", "Флаг Проведенные/Непроведенные", "Флаг Помеченные на удаление/Не помеченные на удаление".
Для отбора можно устанавливать любые "общие реквизиты" документов и некоторые стандартные поля для таблицы журнала (вроде "флага проведения").
Список полей, которые можно использовать в качестве фильтра можно посмотреть либо в таблице "_1SJOURN" в базе SQL, либо в файле 1cv7.dds, который хранит в себе полное описание всех структур таблиц базы SQL.
Пишем код, который отключает стандартный отбор журнала и включает наш "расширенный" отбор.
(т.к. вставка фрагмента кода подглючивает (уж простите, администрация) - напишу обычным текстом)
//Устанавливаем произвольный отбор, чтобы сбросить настройку отбора журнала
УстановитьОтбор("ПКО");
////Генерим событие (оно будет изловлено в ОбработкаВнешнегоСобытия)
vk_hook.ВызватьСобытие("vk_hook","Отбор","Журнал");
//*******************************************
//Преобразует объект в идентификатор, который понимает SQL
Функция ПолучитьИД(прм_Объект)
стр=СокрЛП(ЗначениеВСтрокуВнутр(прм_Объект));
стр=Сред(стр,2,СтрДлина(стр)-2); //Убираем <>
сз=СоздатьОбъект("СписокЗначений");
сз.ИзСтрокиСРазделителями(стр);
стр=сз.ПолучитьЗначение(7);
иб=Прав(стр,3);
стр=Лев(стр, СтрДлина(стр)-3); //Убираем последние 3 символа
стр=_IdToStr(стр);
стр=стр+иб;
Пока СтрДлина(стр) стр=" "+стр;
КонецЦикла;
Возврат стр;
КонецФункции // ПолучитьИД
//*******************************************
Процедура ОбработкаВнешнегоСобытия(прм_Источник,прм_Событие,прм_Данные)
Сообщить(прм_Источник+" "+прм_Событие+" "+прм_Данные);
Если (прм_Источник="vk_hook") и (прм_Событие="Отбор") и (прм_Данные="Журнал") Тогда
стр="";
Если ПустоеЗначение(ВыбАвтор)=0 Тогда
стр=стр+"SP74='"+ПолучитьИД(ВыбАвтор)+"' and ";
КонецЕсли;
Если СписокДокументов.ТекущаяСтрока()>1 Тогда
стр=стр+"IDDOCDEF="+СписокДокументов.ПолучитьЗначение(СписокДокументов.ТекущаяСтрока())+" and ";
КонецЕсли;
Если Проведенные=1 Тогда
стр=стр+"CLOSED='1' and ";
КонецЕсли;
Если НеПомеченныеНаУдаление=1 Тогда
стр=стр+"ISMARK='0' and ";
КонецЕсли;
vk_hook.ТекстSQL="Select * from _1SJOURN(NOLOCK INDEX=JOURNAL) where IDJOURNAL=? and DATE_TIME_IDDOC>=? and DATE_TIME_IDDOC vk_hook.НовыйSQL="Select * from _1SJOURN(NOLOCK INDEX=JOURNAL) where "+стр+" IDJOURNAL=? and DATE_TIME_IDDOC>=? and DATE_TIME_IDDOC vk_hook.УстановитьЗаменуSQL();
vk_hook.ТекстSQL="Select COUNT(*) from _1SJOURN(NOLOCK) where IDJOURNAL=? and DATE_TIME_IDDOC>=? and DATE_TIME_IDDOC vk_hook.НовыйSQL="Select COUNT(*) from _1SJOURN(NOLOCK) where "+стр+" IDJOURNAL=? and DATE_TIME_IDDOC>=? and DATE_TIME_IDDOC vk_hook.УстановитьЗаменуSQL();
УстановитьОтбор("");
СписокДокументов.ДобавитьЗначение("все");
СписокДокументов.ДобавитьЗначение(2457,"заявка покупателя");
СписокДокументов.ДобавитьЗначение(1611,"реализация");
СписокДокументов.ДобавитьЗначение(1656,"возврат от покупателя");
СписокДокументов.ДобавитьЗначение(2742,"заказ поставщику");
СписокДокументов.ДобавитьЗначение(1582,"поступление ТМЦ");
СписокДокументов.ДобавитьЗначение(1684,"возврат поставщику");
СписокДокументов.ДобавитьЗначение(2196,"ПКО");
СписокДокументов.ДобавитьЗначение(2225,"РКО");
СписокДокументов.ДобавитьЗначение(8980,"транзит денежных средств");
СписокДокументов.ТекущаяСтрока(1);
Пояснение по коду:
1. Процедура ф_Отбор() устанавливается на все элементы, изменение которых должно автоматически фильтровать журнал документов.
2. При помощи функции ПолучитьИД(прм_Объект) мы можем получить идентификатор объекта 1С, чтобы строить по нему фильтр в запросе.
3. В список значений уже добавлены типы документов с их идентификаторами (их можно найти в файле 1cv7.dds). К примеру, на рисунке показан идентификатор к документу "ЗаявкаПокупателя".
SQL-запрос мы "склеиваем" как обычную строку.
В коде встречаются 4 идентификатора полей таблицы SQL в которые мы передаем наши значения фильтров:
SP74 - это поле, в котором хранится "автор документа"
IDDOCDEF - в этом поле хранится идентификатор вида документа
CLOSED - флаг проведения
ISMARK - флаг пометки удаления
Как уже было сказано ранее, принцип работы компоненты в подмене SQL-запросов, поступающих из 1С в базу данных SQL.
Изначально запрос выглядит вот так:
vk_hook.ТекстSQL Select * from _1SJOURN(NOLOCK INDEX=JOURNAL) where "+стр+" IDJOURNAL=? and DATE_TIME_IDDOC>=? and DATE_TIME_IDDOC
Практически ничего не изменилось, за исключением добавления условия "where".
Команда vk_hook.УстановитьЗаменуSQL(), собственно и активизирует эту подмену.
На практике это выглядит примерно так:
1. Журнал без отборов
2. Журнал с отбором по типу документа
3. Журнал с отбором по типу документа и автору
4. Журнал с отбором только проведенных документов по типу документа и автору
Теперь время пришло сказать о недостатках описанного варианта организации множественного отбора, а точнее возможных его глюках. Дело в том, что данный метод отказывался корректно работать со сложным запросом (вложенной командой SELECT или множественным фильтром по одному из параметров, допустим выборе в качестве фильтра сразу 2-х типов документов). Фильтр вроде бы отрабатывал корректно, но при перемещении курсора внутри журнала, сам журнал вдруг "вешался" и все документы выборки пропадали. По всей видимости, это недоработки именно в самой компоненте. Не хотелось бы, чтобы для Вас это стало неприятной неожиданностью, в случае, если решите использовать этот способ на практике.
В заключении, хотелось бы сказать, что данный вариант решения задачи "множественного отбора в журнале документов" не единственный. В качестве альтернативы можно использовать библиотеки 1СРР.dll и Formex.dll, которые в связке дают схожий результат. Но этот путь для программиста будет более долгим и "тернистым", особенно если у Вас не было ранее опыта работы с этими библиотеками.
Для работы с файловой системой предназначен объект "ФС". В принципе его не требуется создавать с помощью функции СоздатьОбъект. Можно считать, что он уже создан. Но 1С позволяет создать сколько угодно таких объектов при помощи функции СоздатьОбъект;
Объект "ФС" имеет следующие методы:
ВыбратьФайл()
Открывает окно диалога выбора/сохранения файла. Возвращает: 0 - если в окне диалога нажата кнопка 'Отмена', 1 - если нажата кнопка 'ОК'.
Параметры:
-: 0 - диалог типа , 1 - диалог типа ;
- переменная, содержащая на входе строку с именем файла, а на выходе - имя выбранного файла;
- переменная, содержащая на входе строку с начальным каталогом, а на выходе - имя выбранного каталога;
- строка с заголовком окна;
- строка с фильтром отбора файлов (например: 'Все файлы (*.*) |*.*');
- строка с расширением файла по умолчанию;
- время ожидания отклика пользователя в секундах (необязателен).
ВыбратьФайлКартинки
Открывает окно диалога выбора/сохранения файла картинки.
Возвращает: 0 - если в окне диалога нажата кнопка 'Отмена', 1 - если нажата кнопка 'ОК'.
Синтаксис: ВыбратьФайлКартинки (, , , , , )
ВыбратьКаталог
Открывает окно диалога выбора каталога.
Возвращает: 0 - если в окне диалога нажата кнопка 'Отмена'; 1 - если в окне диалога нажата кнопка 'ОК', при этом в переменную возвращается имя выбранного каталога; -1 (минус единица) - закончилось время ожидания отклика пользователя.
Синтаксис: ВыбратьКаталог(,,)
СуществуетФайл
Проверяет существование файла..
Возвращает: 1 - файл существует; 0 - не существует.
Синтаксис: СуществуетФайл()
Параметры:
- строка с именем файла источника;
- строка с именем файла приемника;
-:
0 - существующий файл приемника перезаписать;
1 - существующий файл приемника не перезаписывать.
Удаляет файл.
Синтаксис: УдалитьФайл()
Параметры:
- строка с именем файла источника;
- строка с новым именем файла;
-:
0 - запрещает перемещение файла между дисками и существующий файл приемника не перезаписывается;
1 - разрешает перемещение файла между дисками (только для файлов) и существующий файл приемника перезаписывается.
Открывает выборку файлов по заданной маске и находит первый файл.
Возвращает строку с именем найденного файла.
Синтаксис: НайтиПервыйФайл()
Находит следующий файл по открытой выборке файлов.
Возвращает строку с именем найденного файла.
Синтаксис: НайтиСледующийФайл()
Возвращает атрибуты файла (в параметрах).
Атрибуты файла закодированы, об этом см. Синтакс-Помощник или описание встроенного языка
Создать новый каталог (папку).
Синтаксис:СоздатьКаталог()
Удаляет каталог файлов.
Синтаксис: УдалитьКаталог()
Устанавливает текущий каталог файлов.
Синтаксис: УстТекКаталог()
ТекКаталог
Возвращает строку с именем текущего каталога файлов.
WindowsКаталог
Возвращает строку с именем Windows директории.
СвободноеМестоНаДиске
Возвращает размер свободного дискового пространства в байтах.
Синтаксис: СвободноеМестоНаДиске()
Также часто применяются системные функции:
КаталогИБ Возвращает имя каталога базы данных.
КаталогПользователя Возвращает имя каталога пользователя.
КаталогПрограммы Возвращает имя каталога с исполняемыми файлами системы 1С:Предприятие.
КаталогВременныхФайлов Возвращает имя каталога временных файлов.
ИмяКомпьютера Возвращает сетевое имя компьютера, работающего в данный момент с программой.
Примеры
Пример 1
//переместить все текстовые файлы (*.txt) из каталога информационной базы в каталог TXT.
В большинстве российских типовых конфигураций для 1Сv7.7 (ТиС, ПУБ, Комплекс и др.) в отчетах используется множественный фильтр (МФ). Впервые он появился, более 10 лет назад, еще в ТиС 8.7, придя на смену МФ ТиС 8.6. С тех пор, аж до сего дня (24.03.2013) типовой механизм МФ содержит глюк связанный с восстановлением сохраненных настроек, хотя разработчики поют нам об обратном.
В большинстве российских типовых конфигураций для 1Сv7.7 (ТиС, ПУБ, Комплекс и др.) в отчетах используется множественный фильтр (МФ), такой как показан на 1 скрине. Впервые он появился, более 10 лет назад, еще в ТиС 8.7, придя на смену МФ ТиС 8.6 (скрин 2). С тех пор, аж до сего дня (24.03.2013) типовый механизм МФ содержит глюк связанный с восстановлением сохраненных настроек, хотя разработчики поют нам об обратном (скрин 3).
Переодически, на форумах посвященных 1С, поднимался вопрос: как полечить МФ?
Практически во всех этих ветках засветился один человек, выступавший под никами Tomba, Злопчинский, Чучундер. После его предложения, добавить в процедуру ВводНового() строчку:
глПриСменеСтрокиТаблицыМФ( 1, 0, Контекст);
вопрос сразу снимался.
Чтобы не постить постоянно, это "длинную" рекомендацию, CheBurator оформил ее в виде статьи, за которую ему плюсанули на данный момент 43 благодарных пользователя у которых все заработало.
К сожалению, у меня не заработало и я озаботившись проблемой, родил рекомендацию, как решить проблему востановления настроек МФ. В процесе тестирования работы МФ я обнаружил, что не всегда выбранные значения сохраняются в настройке. Подлечил и эту фичу.
Результаты лечения, были мной опубликованы 14.01.2007 на инфостарте в статье "ТиС: Не восстанавливается МФ в отчете - что делать? Часть 2".
Недавно обнаружил, что ещё один человек изобрел лисапед на эту тему, который опубликовал в виде разработки. Так как моей статьи уже на портале нет, то я накрапал эту "статью", как ответ на вопрос andrewks: "куда-уж проще-то?" в комментарий №2.
глПриСменеСтрокиТаблицыМФ(1,ТекСтрокаВТаблице,Контекст);
2.3. В кнопки «Удалить» и «УдалитьВсе» (см. скрин №4), в поле формула, после вызова процедуры глРаботаСТаблицейМФ();
добавить
глПриСменеСтрокиТаблицыМФ(1,ТекСтрокаВТаблице,Контекст);
(Внимание. Для несведущих в конфигурировании. Эти две функции должны быть обязательно разделены знаком ";" - точка с запятой)
зы: Прошу заметить, что мы изменяем только отчет (который может быть сохранен как внешний), и не затрагиваем другие объекты конфигурации, что упрощает процес обновления последней.
Журнал регистрации предоставляет возможность просмотра событий, отобранных по различным критериям. Для этого используется фильтр. Для установки фильтра следует выбрать пункт "Фильтр › Изменить" в меню "Действия" или нажать соответствующую кнопку панели инструментов. При этом открывается диалог настройки фильтра. Диалог содержит три закладки, на которых настраиваются различные параметры отбора событий.
Общие параметры
Закладка "Общие параметры" предназначена для установки наиболее общих критериев фильтра и способа фильтрации.
Способ отбора событий.
Этот параметр определяет, как будет выполняться отбор событий по условиям, определяемым другими параметрами фильтра.
Если выбран вариант "Фильтровать динамически", то события, удовлетворяющие условию фильтра, будут отбираться в процессе просмотра журнала.
Если выбран вариант "Отобрать сразу", то система при установке фильтра проанализирует все события журнала в выбранном интервале и отберет для просмотра удовлетворяющие условиям фильтра.
В первом случае журнал открывается сразу, но отбор может замедлить просмотр журнала. Во втором случае журнал открывается после анализа всех событий в выбранном интервале, но затем просмотр журнала выполняется без задержек. Динамическую фильтрацию имеет смысл использовать в тех случаях, когда условия фильтра таковы, что отбираться будет существенная часть событий. Если по условиям фильтра должна быть отобрана незначительная часть событий, то целесообразно выбрать вариант "Отобрать сразу". Заметим, что динамический просмотр не может выполняться, если часть событий в установленном интервале находится в архиве.
Интервал.
Группа управляющих элементов "Интервал" определяет период, за который будут просматриваться события в журнале.
- Текущий день журнал будет включать события текущей даты;
- Текущая неделя журнал будет включать события текущей недели;
- Текущий месяц журнал будет включать события текущего месяца;
- Последние … дн. журнал будет включать события за последние несколько дней, начиная от текущей даты.
- Весь текущий журнал будет показываться весь журнал регистрации за исключением тех периодов, которые были помещены в архив, тогда как во всех остальных вариантах при необходимости будут использоваться данные их архива журнала регистрации;
- С … по …: данный вариант позволяет непосредственно установить интервал просмотра журнала указанием даты начала и даты конца интервала.
Заметим, что интервал, в отличие от других параметров фильтра не замедляет динамического просмотра журнала. С другой стороны, если часть событий в установленном интервале находится в архиве, то динамический просмотр не может выполняться.
Режим запуска.
В этой группе параметров устанавливается отбор записей журнала по режимам запуска 1С:Предприятия. Например, если отметить только режим "Конфигуратор", то в журнал будут включены только события, отражающие действия пользователей в режиме запуска "Конфигуратор".
Категория событий.
Все события, записываемые в журнал регистрации, подразделяются на несколько категорий:
Сеанс | события подключения и отключения пользователей (запуска 1С:Предприятия и завершения работы); |
Административное | события связанные с действиями по изменению конфигурации и функциями администрирования информационной базы, например, создание резервной копии; |
Изменение | события изменяющие данные информационной данных базы, такие как запись документа, элемента справочника и т. д.; |
Информация | события отражающие действия пользователя не изменяющие данных информационной базы, например, открытие документа, или содержащие дополнительную информацию к другим событиям; |
Предупреждение | Специальные события записываемые в журнал регистрации различными механизмами 1С:Предприятия в тех случаях, когда в ходе обработки данных возникла ситуация, о которой выдается предупреждение; |
Ошибка | Специальные события записываемые в журнал регистрации при возникновении ошибок при работе 1С:Предприятия, например к этой категории относятся ошибки встроенного языка; |
Группа параметров "Категория событий" позволяет отобрать для просмотра события выбранных категорий.
Пользователь.
Этот параметр позволяет ограничить просмотр журнала регистрации событиями, относящимися к одному пользователю. Имя пользователя можно ввести вручную или выбрать из списка пользователей. Чтобы отключить отбор событий по имени пользователя, следует стереть имя пользователя или нажать кнопку "Все".
1С 7.7 Множественный фильтр в полном журнале или пример работы компоненты vk_hook1C.dll
Думаю, что каждому программисту, который пишет или писал на "семерке", хотя бы раз заказчик задавал вопрос "А можно ли настроить отбор по нескольким полям в общем журнале?".
Дело в том, что стандартными средствами реализовать такое нельзя, отбор можно делать только по одному из реквизитов - "вид документа", "контрагент", "автор" и т.д. Можно написать обработку, которая внешним видом будет напоминать обычный журнал, но при этом пользователь будет иметь возможность указывать несколько фильтров для отбора документов. Однако в этом случае мы очень сильно будем терять в производительности работы такого "псевдо-журнала". Любая подобная обработка будет работать на порядок медленнее обычного журнала.
Остается смотреть в сторону нестандартных подходов в решении проблемы. Один из таких подходов и будет описан в данной статье, его суть заключается в применении внешней библиотеки vk_hook1C.dll.
Сразу стоит отметить, что данный метод подходит только для 1С SQL-версии. Т.к. основная задача библиотеки в том, чтобы перехватывать запросы, посылаемые 1С в базу SQL Server и подставлять в них требуемые значения.
Итак, исходные данные:
- SQL Server 2005 (2000 тоже подойдет, насчет версий старше 2005 ничего не могу сказать)
- 1С, сопряженная с SQL Server
- описание структуры таблиц 1С в SQL (подходит и для DBF-версии)
Копируем содержимое архива в каталог БД. Подключаем компоненту при запуске 1С
Далее создаем "Обычный журнал", устанавливаем в нем несколько видов отбора. В моем случае это: "Вид документа", "Автор", "Флаг Проведенные/Непроведенные", "Флаг Помеченные на удаление/Не помеченные на удаление".
Для отбора можно устанавливать любые "общие реквизиты" документов и некоторые стандартные поля для таблицы журнала (вроде "флага проведения").
Список полей, которые можно использовать в качестве фильтра можно посмотреть либо в таблице "_1SJOURN" в базе SQL, либо в файле 1cv7.dds, который хранит в себе полное описание всех структур таблиц базы SQL.
Пишем код, который отключает стандартный отбор журнала и включает наш "расширенный" отбор.
(т.к. вставка фрагмента кода подглючивает (уж простите, администрация) - напишу обычным текстом)
//Устанавливаем произвольный отбор, чтобы сбросить настройку отбора журнала
УстановитьОтбор("ПКО");
////Генерим событие (оно будет изловлено в ОбработкаВнешнегоСобытия)
vk_hook.ВызватьСобытие("vk_hook","Отбор","Журнал");
//*******************************************
//Преобразует объект в идентификатор, который понимает SQL
Функция ПолучитьИД(прм_Объект)
стр=СокрЛП(ЗначениеВСтрокуВнутр(прм_Объект));
стр=Сред(стр,2,СтрДлина(стр)-2); //Убираем <>
сз=СоздатьОбъект("СписокЗначений");
сз.ИзСтрокиСРазделителями(стр);
стр=сз.ПолучитьЗначение(7);
иб=Прав(стр,3);
стр=Лев(стр, СтрДлина(стр)-3); //Убираем последние 3 символа
стр=_IdToStr(стр);
стр=стр+иб;
Пока СтрДлина(стр) стр=" "+стр;
КонецЦикла;
Возврат стр;
КонецФункции // ПолучитьИД
//*******************************************
Процедура ОбработкаВнешнегоСобытия(прм_Источник,прм_Событие,прм_Данные)
Сообщить(прм_Источник+" "+прм_Событие+" "+прм_Данные);
Если (прм_Источник="vk_hook") и (прм_Событие="Отбор") и (прм_Данные="Журнал") Тогда
стр="";
Если ПустоеЗначение(ВыбАвтор)=0 Тогда
стр=стр+"SP74='"+ПолучитьИД(ВыбАвтор)+"' and ";
КонецЕсли;
Если СписокДокументов.ТекущаяСтрока()>1 Тогда
стр=стр+"IDDOCDEF="+СписокДокументов.ПолучитьЗначение(СписокДокументов.ТекущаяСтрока())+" and ";
КонецЕсли;
Если Проведенные=1 Тогда
стр=стр+"CLOSED='1' and ";
КонецЕсли;
Если НеПомеченныеНаУдаление=1 Тогда
стр=стр+"ISMARK='0' and ";
КонецЕсли;
vk_hook.ТекстSQL="Select * from _1SJOURN(NOLOCK INDEX=JOURNAL) where IDJOURNAL=? and DATE_TIME_IDDOC>=? and DATE_TIME_IDDOC vk_hook.НовыйSQL="Select * from _1SJOURN(NOLOCK INDEX=JOURNAL) where "+стр+" IDJOURNAL=? and DATE_TIME_IDDOC>=? and DATE_TIME_IDDOC vk_hook.УстановитьЗаменуSQL();
vk_hook.ТекстSQL="Select COUNT(*) from _1SJOURN(NOLOCK) where IDJOURNAL=? and DATE_TIME_IDDOC>=? and DATE_TIME_IDDOC vk_hook.НовыйSQL="Select COUNT(*) from _1SJOURN(NOLOCK) where "+стр+" IDJOURNAL=? and DATE_TIME_IDDOC>=? and DATE_TIME_IDDOC vk_hook.УстановитьЗаменуSQL();
УстановитьОтбор("");
СписокДокументов.ДобавитьЗначение("все");
СписокДокументов.ДобавитьЗначение(2457,"заявка покупателя");
СписокДокументов.ДобавитьЗначение(1611,"реализация");
СписокДокументов.ДобавитьЗначение(1656,"возврат от покупателя");
СписокДокументов.ДобавитьЗначение(2742,"заказ поставщику");
СписокДокументов.ДобавитьЗначение(1582,"поступление ТМЦ");
СписокДокументов.ДобавитьЗначение(1684,"возврат поставщику");
СписокДокументов.ДобавитьЗначение(2196,"ПКО");
СписокДокументов.ДобавитьЗначение(2225,"РКО");
СписокДокументов.ДобавитьЗначение(8980,"транзит денежных средств");
СписокДокументов.ТекущаяСтрока(1);
Пояснение по коду:
1. Процедура ф_Отбор() устанавливается на все элементы, изменение которых должно автоматически фильтровать журнал документов.
2. При помощи функции ПолучитьИД(прм_Объект) мы можем получить идентификатор объекта 1С, чтобы строить по нему фильтр в запросе.
3. В список значений уже добавлены типы документов с их идентификаторами (их можно найти в файле 1cv7.dds). К примеру, на рисунке показан идентификатор к документу "ЗаявкаПокупателя".
SQL-запрос мы "склеиваем" как обычную строку.
В коде встречаются 4 идентификатора полей таблицы SQL в которые мы передаем наши значения фильтров:
SP74 - это поле, в котором хранится "автор документа"
IDDOCDEF - в этом поле хранится идентификатор вида документа
CLOSED - флаг проведения
ISMARK - флаг пометки удаления
Как уже было сказано ранее, принцип работы компоненты в подмене SQL-запросов, поступающих из 1С в базу данных SQL.
Изначально запрос выглядит вот так:
vk_hook.ТекстSQL Select * from _1SJOURN(NOLOCK INDEX=JOURNAL) where "+стр+" IDJOURNAL=? and DATE_TIME_IDDOC>=? and DATE_TIME_IDDOC
Практически ничего не изменилось, за исключением добавления условия "where".
Команда vk_hook.УстановитьЗаменуSQL(), собственно и активизирует эту подмену.
На практике это выглядит примерно так:
1. Журнал без отборов
2. Журнал с отбором по типу документа
3. Журнал с отбором по типу документа и автору
4. Журнал с отбором только проведенных документов по типу документа и автору
Теперь время пришло сказать о недостатках описанного варианта организации множественного отбора, а точнее возможных его глюках. Дело в том, что данный метод отказывался корректно работать со сложным запросом (вложенной командой SELECT или множественным фильтром по одному из параметров, допустим выборе в качестве фильтра сразу 2-х типов документов). Фильтр вроде бы отрабатывал корректно, но при перемещении курсора внутри журнала, сам журнал вдруг "вешался" и все документы выборки пропадали. По всей видимости, это недоработки именно в самой компоненте. Не хотелось бы, чтобы для Вас это стало неприятной неожиданностью, в случае, если решите использовать этот способ на практике.
В заключении, хотелось бы сказать, что данный вариант решения задачи "множественного отбора в журнале документов" не единственный. В качестве альтернативы можно использовать библиотеки 1СРР.dll и Formex.dll, которые в связке дают схожий результат. Но этот путь для программиста будет более долгим и "тернистым", особенно если у Вас не было ранее опыта работы с этими библиотеками.
Читайте также: