СБиС news №52 от 14.12.01
20.09.02 были внесены изменения в заметку «Как поместить документ в папку»:
неверно говорилось об указании поля «Тип документа» для папок документов.
Некоторые изменения к лучшему в экспорте/импорте
Начиная с версии 1.8, для экспорта записей можно было
задать фильтр. Напомним, что для этого нужно в io-файле после имени внешнего файла
поставить знак равенства – «=» и написать условное выражение. Результат
выполнения этого выражения и будет использоваться для фильтрации данных –
выполнилось успешно (вернулось не нулевое значение), запись будет
записана во внешний файл, не выполнилось (вернулось нулевое значение), запись
будет пропущена. Например, чтобы выкачать накладные, у которых в поле «Тема»
стоит «Р», нужно написать так:
+Расходные накладные:GIVE.TBL = Тема=="Р"
Это всё работает и в версии 1.8, теперь же, начиная с версии
1.9.026, этот фильтр начал работать и при импорте записей. То есть
теперь выражение, указанное после знака равенства, проверяется как при
экспорте, так и при импорте данных.
Чтобы различить в фильтрующем выражении, что в данный момент
происходит импорт или экспорт, программой определяется переменная «Экспорт».
Эта переменная равна 1 при экспорте и 0 при импорте.
Например, расширим наш пример. Сделаем так, чтобы импортировались только
накладные с темой «П», а экспортировались, как и раньше, с темой «Р»:
…:GIVE.TBL = Экспорт?Тема=="Р":Тема=="П"
В результате этого нововведения появилась возможность не
только отсеивать импортируемые записи, но и выполнять при импорте ряд дополнительных
действий, о которых мы сейчас и поговорим.
Дело в том, что при импорте фильтрующее выражение вызывается
после того, как новая запись сформирована, но ещё до того, как
она будет вставлена в базу данных. Таким образом, в этом выражении можно
манипулировать со всеми полями импортируемой записи, например, с полем
иерархии.
Импорт разделов
Допустим, во внешнем файле есть справочник номенклатуры, в
котором есть группы, причём номенклатурный номер группы начинается с 99.
Пишем в файле «sbis.io»:
+Номенклатура:ITEMS.TBL= ФильтрНоменкл()
А в каком-то prg-файле описываем функцию:
Функция ФильтрНоменкл()
{
Если( !Экспорт )
{
Если(ПодСтрока(НомНомер,1,2)=="99")
Узел(.,"Иерархия");
}
Вернуть 1;
}
Как видите, чтобы не уписывать всё выражение в одну строку,
сделана отдельная функция, имя которой указывается в io-файле. Обратите внимание, что функция
всегда возвращает 1, то есть здесь экспортируются/импортируются все
записи. Не забывайте при написании таких функций указывать конструкцию «Вернуть…».
Поместить запись в раздел при импорте
Кроме того, при импорте можно задать, в какую группу попадёт
импортируемая запись. Например, первые два символа номенклатурного номера определяют,
в какую группу будет помещена запись:
Функция ФильтрНоменкл()
{
Если( !Экспорт )
{
О = Объект( Номенклатура );
О.НомНомер = ПодСтрока(НомНомер,1,2);
Если( Найти( О,"НомНомер" ) > 0 )
Связать( .Иерархия, О );
}
Вернуть 1;
}
Поиск в 1.9
В версии 1.9 в окне поиска, которое открывается по
комбинации <Ctrl+S>, появилось два
новых флага – «Искать везде» и «По всем полям».
Если флаг «Искать везде» установлен, то поиск ведётся
по всем записям таблицы, не зависимо от того, на какой строке находился курсор
в момент поиска. Причём, если таблица иерархическая, то поиск ведётся от корня
таблицы и по всем подразделам.
Если установлен флаг «По всем полям», то искомая
строка ищется по всем полям записи, а не только по текущему столбцу. Понятно,
что этот флаг имеет смысл только для режима «Текстовый шаблон». А полезен он
может быть как минимум в двух случаях:
- когда
искомая строка может находиться сразу либо в одном, либо в другом поле
(например, краткое и полное название организации);
- когда
нужно искать по полю, которое невозможно отобразить в столбце таблицы
(например, нужно найти что-то в тексте правила операции).
Кроме того, во многих справочниках появилась возможность
быстрого поиска записи по значению ключевого поля. Эта функция вызывается
комбинацией <Ctrl+Alt+S>.
Отметить связанные записи
Надеюсь для вас не новость, что реально та строка, которую
вы видите в таблице СБиС’а, состоит из записей нескольких таблиц, связанных
между собой. Например, наименование накладной состоит из записей таблиц
«Расход», «Складская картотека» и «Номенклатура». В 1.9 появилась возможность быстро
отобрать записи, связанные с текущей, например, отметить в справочнике
номенклатуры строку, связанную с текущим наименованием накладной. Делается это
следующим образом.
- Открываете
окно (или несколько окон), в котором (в которых) нужно отметить связанные записи.
В нашем примере это будет справочник номенклатуры.
- Открываете
таблицу, от которой будем искать записи (это может быть и реестр документов, и
справочник, и таблица в диалоге). В нашем примере нужно открыть накладную и
перейти в таблицу наименований.
- Нажимаете
комбинацию <Shift+Alt+L>. Программа покажет список
текущих открытых окон, в которых могут быть записи, связанные с текущей.
Выберите интересующее вас окно или отметье пробелом несколько окон и нажмите <Enter>.
- Теперь,
если перейти в одно из выбранных окон и нажать <Ctrl+F>, то вы увидите связанные записи.
Либо можно нажать <Ctrl+G>, чтобы просто
перейти к первой отмеченной записи.
И в заключение заметим, что, во-первых, команда <Shit+Alt+L> действует во всех таблицах,
а, во-вторых, чтобы она работала должны быть открыты окна, в которых вы
ожидаете увидеть связанные записи. Причём помечаться записи могут не только в
справочниках и реестрах, но и в отчётах, которые выполнены в виде таблиц,
например, в ведомости остатков по складу.
Как поместить документ в папку
Как уже писалось, в версии 1.9 появилась возможность
создавать документ средствами встроенного языка. Покажем, как можно поместить
создаваемый таким способом документ в нужную папку.
Сначала нужно эту папку найти. Сделать это легче всего по
индексу «Номер» таблицы «Документ». В этот индекс включены следующие
поля: «Тип документа», «Дата», «Номер», «Тема». В файле «sbis.prg» уже есть готовая функция поиска по этому индексу:
функция НайтиДокумент( Тип, Дата,
Номер, Тема)
{
О = Объект("Документ");
'О.Тип документа' = Тип;
О.Дата = Дата;
О.Номер = Номер;
О.Тема = Тема;
если( !Найти(О,"Номер") )
Очистить(О);
вернуть О;
}
Вот ей-то и можно воспользоваться для поиска нужной папки.
Тут самое сложное – определить какие значения передавать в качестве параметров.
Проще всего запустить по <Ctrl+S>
функцию «Отладить» для искомой папки и посмотреть значения
соответствующих полей. Ну, а в общем, можно сказать следующее.
- Самое
сложное – это поле «Тип документа». Дело в том, что у папок это поле
содержит число, равное числовое представление типа документа плюс 128. Числовое
представление типа документа можно посмотреть в !sbis.dic, в таблице «Документ», в поле «Тип документа». Учтите, что у папок,
помеченных флагом «для всех документов задачи», тип равен 128.
- В
поле «Дата» пишется дата закрытия папки.
- В
поле «Номер» для папок пишется ноль.
- В
поле «Тема» пишется название папки.
Таким образом, фрагмент создания документа в определённой
папке может выглядеть примерно так:
оСчет = Выборка( "Исходящие счета" )
оПапка = НайтиДокумент( 1+128,
31.12.29, 0, "НАЗВАНИЕ ПАПКИ" );
Связать( оСчет.Папки, оПапка );
# инициализация остальныхполей документа
Добавить( оСчет );
Распахивание диалоговых окон
Как вы, должно быть, заметили, некоторые диалоговые окна в
версии 1.9 стали распахиваться на весь экран. Например, так «ведёт» себя окно
редактирования расходной накладной.
В принципе таким можно сделать любой диалог. Достаточно
перейти в режим редактирования, нажать <Ctrl+Enter> и указать в поле «Загрузчик»
значение «RecDialogMax».
Но делать это имеет смысл только, если в диалоге есть табличка, которая и будет
расширяться при распахивании диалога. Возможно, вместе с этим придётся ещё
поправить у некоторых элементов диалога флаги «Фиксировать при перемещении» в
окне «Стандартные свойства объекта» (вызывается из локального меню режима
редактирования).
<<< Предыдущий выпуск | Архив выпусков | Следующий выпуск >>>
|