CбИС++ «БИТ»
   О ПРОГРАММЕ   
   О КОМПАНИИ   
   ЗАГРУЗИТЬ   
   ДОКУМЕНТАЦИЯ   
   · Руководство пользователя 
   · СБиС news
   · Статьи
   · Функции
   ПРАЙС-ЛИСТ   
   ВАКАНСИИ   
   АВТОМАТИЗАЦИЯ ТОРГОВЛИ   
СБиС 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;
}

Дмитрий Волков (volf@tensor.ru)

Поиск в 1.9

В версии 1.9 в окне поиска, которое открывается по комбинации <Ctrl+S>, появилось два новых флага – «Искать везде» и «По всем полям».

Если флаг «Искать везде» установлен, то поиск ведётся по всем записям таблицы, не зависимо от того, на какой строке находился курсор в момент поиска. Причём, если таблица иерархическая, то поиск ведётся от корня таблицы и по всем подразделам.

Если установлен флаг «По всем полям», то искомая строка ищется по всем полям записи, а не только по текущему столбцу. Понятно, что этот флаг имеет смысл только для режима «Текстовый шаблон». А полезен он может быть как минимум в двух случаях:

  • когда искомая строка может находиться сразу либо в одном, либо в другом поле (например, краткое и полное название организации);

  • когда нужно искать по полю, которое невозможно отобразить в столбце таблицы (например, нужно найти что-то в тексте правила операции).

Кроме того, во многих справочниках появилась возможность быстрого поиска записи по значению ключевого поля. Эта функция вызывается комбинацией <Ctrl+Alt+S>.

Дмитрий Новиков (demon@tensor.ru)

Отметить связанные записи

Надеюсь для вас не новость, что реально та строка, которую вы видите в таблице СБиС’а, состоит из записей нескольких таблиц, связанных между собой. Например, наименование накладной состоит из записей таблиц «Расход», «Складская картотека» и «Номенклатура». В 1.9 появилась возможность быстро отобрать записи, связанные с текущей, например, отметить в справочнике номенклатуры строку, связанную с текущим наименованием накладной. Делается это следующим образом.

  • Открываете окно (или несколько окон), в котором (в которых) нужно отметить связанные записи. В нашем примере это будет справочник номенклатуры.

  • Открываете таблицу, от которой будем искать записи (это может быть и реестр документов, и справочник, и таблица в диалоге). В нашем примере нужно открыть накладную и перейти в таблицу наименований.

  • Нажимаете комбинацию <Shift+Alt+L>. Программа покажет список текущих открытых окон, в которых могут быть записи, связанные с текущей. Выберите интересующее вас окно или отметье пробелом несколько окон и нажмите <Enter>.

  • Теперь, если перейти в одно из выбранных окон и нажать <Ctrl+F>, то вы увидите связанные записи. Либо можно нажать <Ctrl+G>, чтобы просто перейти к первой отмеченной записи.

И в заключение заметим, что, во-первых, команда <Shit+Alt+L> действует во всех таблицах, а, во-вторых, чтобы она работала должны быть открыты окна, в которых вы ожидаете увидеть связанные записи. Причём помечаться записи могут не только в справочниках и реестрах, но и в отчётах, которые выполнены в виде таблиц, например, в ведомости остатков по складу.

Дмитрий Новиков (demon@tensor.ru)

Как поместить документ в папку

Как уже писалось, в версии 1.9 появилась возможность создавать документ средствами встроенного языка. Покажем, как можно поместить создаваемый таким способом документ в нужную папку.

Сначала нужно эту папку найти. Сделать это легче всего по индексу «Номер» таблицы «Документ». В этот индекс включены следующие поля: «Тип документа», «Дата», «Номер», «Тема». В файле «sbis.prg» уже есть готовая функция поиска по этому индексу:

функция НайтиДокумент( Тип, Дата, 
                       Номер, Тема)
{
   О = Объект("Документ");
   'О.Тип документа' = Тип;
   О.Дата = Дата;
   О.Номер = Номер;
   О.Тема = Тема;
   если( !Найти(О,"Номер") )
      Очистить(О);
   вернуть О;
}

Вот ей-то и можно воспользоваться для поиска нужной папки. Тут самое сложное – определить какие значения передавать в качестве параметров. Проще всего запустить по <Ctrl+S> функцию «Отладить» для искомой папки и посмотреть значения соответствующих полей. Ну, а в общем, можно сказать следующее.

  • Самое сложное – это поле «Тип документа». Дело в том, что у папок это поле содержит число, равное числовое представление типа документа плюс 128. Числовое представление типа документа можно посмотреть в !sbis.dic, в таблице «Документ», в поле «Тип документа». Учтите, что у папок, помеченных флагом «для всех документов задачи», тип равен 128.

  • В поле «Дата» пишется дата закрытия папки.

  • В поле «Номер» для папок пишется ноль.

  • В поле «Тема» пишется название папки.

Таким образом, фрагмент создания документа в определённой папке может выглядеть примерно так:

оСчет = Выборка( "Исходящие счета" )
оПапка = НайтиДокумент( 1+128,
          31.12.29, 0, "НАЗВАНИЕ ПАПКИ" );
Связать( оСчет.Папки, оПапка );
# инициализация остальныхполей документа
Добавить( оСчет );

Сергей Макаров (smak@tensor.ru)

Распахивание диалоговых окон

Как вы, должно быть, заметили, некоторые диалоговые окна в версии 1.9 стали распахиваться на весь экран. Например, так «ведёт» себя окно редактирования расходной накладной.

В принципе таким можно сделать любой диалог. Достаточно перейти в режим редактирования,  нажать <Ctrl+Enter> и указать в поле «Загрузчик» значение «RecDialogMax». Но делать это имеет смысл только, если в диалоге есть табличка, которая и будет расширяться при распахивании диалога. Возможно, вместе с этим придётся ещё поправить у некоторых элементов диалога флаги «Фиксировать при перемещении» в окне «Стандартные свойства объекта» (вызывается из локального меню режима редактирования).

Дмитрий Новиков (demon@tensor.ru)


<<< Предыдущий выпуск | Архив выпусков | Следующий выпуск >>>