Модификатор пакета запросов: УНИЧТОЖИТЬ



Уникальный инструментарий, который (вероятно) никогда вам не понадобится.

ПРЕАМБУЛА

Как-то раз, в одной компании мирового уровня (но без мирового имени), в отделе разработки учетных решений 1С, возникла крайне острая необходимость и потребность в модификации всех существующих запросов конфигурации УПП 1.2 (переписанная вдоль и поперёк так, что аж имеет своё уникальное и гордое имя — «Корпоративная Система Управления»). Суть модификации заключалась в следующем — в пакетах запросов, в явном виде, необходимо уничтожать все временные таблицы. Таблицы должны уничтожаться по мере их использования в пакете. Если временная таблица не используется ни в одном из следующих (по порядку) запросов пакета, то такая временная таблица должна быть удалена после текущего запроса (отдельным запросом «УНИЧТОЖИТ»).

По легенде, это должно обеспечить более эффективную и своевременную очистку неиспользуемых таблиц на сервере СУБД и повлиять на общую эффективность работы системы при большом количестве одновременно «функционирующих» пользователей.

Пример (реальный запрос из БП 2.0.63.4): 

Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Проводки.СчетДт КАК СчетДт,
| Проводки.СчетКт КАК СчетКт
|ПОМЕСТИТЬ ТаблицаСчетовДтКт
|ИЗ
| &Проводки КАК Проводки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТаблицаСчетовДтКт.СчетДт КАК Счет
|ПОМЕСТИТЬ ТаблицаСчетов
|ИЗ
| ТаблицаСчетовДтКт КАК ТаблицаСчетовДтКт
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТаблицаСчетовДтКт.СчетКт
|ИЗ
| ТаблицаСчетовДтКт КАК ТаблицаСчетовДтКт
|
|ИНДЕКСИРОВАТЬ ПО
| Счет
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| Хозрасчетный.Ссылка
|ИЗ
| ПланСчетов.Хозрасчетный КАК Хозрасчетный
|  ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаСчетов КАК ТаблицаСчетов
|  ПО Хозрасчетный.Ссылка = ТаблицаСчетов.Счет
|ГДЕ
| Хозрасчетный.Валютный"
;

должен быть преобразован в:

Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Проводки.СчетДт КАК СчетДт,
| Проводки.СчетКт КАК СчетКт
|ПОМЕСТИТЬ ТаблицаСчетовДтКт
|ИЗ
| &Проводки КАК Проводки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТаблицаСчетовДтКт.СчетДт КАК Счет
|ПОМЕСТИТЬ ТаблицаСчетов
|ИЗ
| ТаблицаСчетовДтКт КАК ТаблицаСчетовДтКт
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТаблицаСчетовДтКт.СчетКт
|ИЗ
| ТаблицаСчетовДтКт КАК ТаблицаСчетовДтКт
|
|ИНДЕКСИРОВАТЬ ПО
| Счет
|;
//{ добавлено
|УНИЧТОЖИТЬ ТаблицаСчетовДтКт;
//} добавлено
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| Хозрасчетный.Ссылка
|ИЗ
| ПланСчетов.Хозрасчетный КАК Хозрасчетный
|  ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаСчетов КАК ТаблицаСчетов
|  ПО Хозрасчетный.Ссылка = ТаблицаСчетов.Счет
|ГДЕ
| Хозрасчетный.Валютный
//{ добавлено
|;
|УНИЧТОЖИТЬ ТаблицаСчетов;
//} добавлено
|"
;

Из примера видно, что пакет состоит из трех последовательных запросов. В запросе №1 формируется временная таблица «ТаблицаСчетовДтКт», которая в последствии используется в запросе №2. В запросе №3 временная таблица «ТаблицаСчетовДтКт» уже не используется, поэтому она может быть удалена после запроса №2. В запросе №2, так-же, создаётся временная таблица «ТаблицаСчетов», которая используется в запросе №3. Т.к. запрос №3 — это последний запрос, то после его выполнения удаляются все выжившие оставшиеся временные таблицы.

Выглядит довольно просто, на первый взгляд. И казалось бы, проделывать подобное довольно легко. Но… это лишь поверхностное впечатление. Когда дело доходит до реальных действий, оказывается (внезапно(!)), что в системе очень много пакетов запросов, которые не ограничиваются 2-3-4 временными таблицами. Встречаются даже монструозные пакеты по 40+ временных таблиц. Дополнительно, анализ отягощается повсеместным наличием вложенных запросов. Всё это может свести с ума, если проделывать подобный анализ в ручную, в старом добром Notepad++ по нескольку десятков раз за сеанс (много запросов). Поэтому, было принято правильное решение создать некий инструментарий, который делал бы подобный анализ самостоятельно, но под чутким руководством разработчика.

JAVA JIVE

Для информатиков-экономистов, математиков-экономистов и менеджеров-маркетологов, попавших в сферу IT через постель доскональное освоение мощнейших возможностей конфигуратора 1С, иногда бывает затруднительно решать проблемы, которые выходят за рамки их уютной среды обитания. Поэтому, перед началом реализации поставленной задачи нужно было ознакомиться с документацией по языку Java, что в итоге оказалось очень увлекательным занятием.

После нескольких бессонных ночей за книгами Эккеля, на выходе получилась следующая реализация:

  • Комментарий — строка текста, которой будут окаймлены все созданные запросы на удаление временных таблиц в итоговом пакете запросов;
  • Удалить старые комментарии — признак удаления всех комментариев из исходного пакета запросов перед его обработкой (для пущей надёжности обработки запросов, которые испещрены различными «хитрыми» комментариями). Чем-то похоже на то, как это делает стандартный конструктор запросов 1С, когда вы открываете им запросы с вашими комментариями;
  • Исходный запрос — пакет запросов 1С, в который необходимо добавить запросы на уничтожение временных таблиц;
  • Итоговый запрос — модифицированный пакет запросов, который содержит в «правильных» местах все необходимые дополнительные запросы на уничтожение временных таблиц;
  • Очистить — кнопка очистки полей «Исходный запрос» и «Итоговый запрос»;
  • Сформировать — запуск процесса обработки исходного пакета запросов.

КАК ЭТО ИСПОЛЬЗОВАТЬ

Для того, чтобы модифицировать исходный пакет запросов, необходимо:

  1.  Скопировать пакет запросов «от кавычки до кавычки» (если пакет копируется из какого-либо модуля исходного кода)  
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    | Проводки.СчетДт КАК СчетДт,
    | Проводки.СчетКт КАК СчетКт
    |ПОМЕСТИТЬ ТаблицаСчетовДтКт
    
    ...
    
    |ГДЕ
    | Хозрасчетный.Валютный"
    

    или скопировать ВЕСЬ пакет запросов (если пакет копируется из макета схемы компоновки данных)

    ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ПервоначальныеСведенияНМАБухгалтерскийУчетСрезПоследних.НематериальныйАктив КАК НематериальныйАктив,
    ПервоначальныеСведенияНМАБухгалтерскийУчетСрезПоследних.СпособНачисленияАмортизации КАК СпособНачисленияАмортизацииБУ,
    ПервоначальныеСведенияНМАБухгалтерскийУчетСрезПоследних.СрокПолезногоИспользования КАК СрокПолезногоИспользованияБУ
    ПОМЕСТИТЬ ПервоначальныеСведенияНМАБУ
    
    ...
    
    {ГДЕ
    НематериальныеАктивы.Ссылка КАК СвязанноеПолеСсылка_НМА,
    ПервоначальныеСведенияНМАБУ.СпособНачисленияАмортизацииБУ КАК СвязанноеПолеСпособНачисленияАмортизацииБУ_НМА,
    ПервоначальныеСведенияНМАБУ.СрокПолезногоИспользованияБУ КАК СвязанноеПолеСрокПолезногоИспользованияБУ_НМА,
    ПервоначальныеСведенияНМАНУ.СрокПолезногоИспользованияНУ КАК СвязанноеПолеСрокПолезногоИспользованияНУ_НМА}

  2. Поместить скопированный текст в поле «Исходный запрос»;
  3. Установить необходимый комментарий (в некоторых «мировых» конторах формат комментариев регламентирован);
  4. Нажать кнопку «Сформировать»;
  5. Скопировать полученный запрос из поля «Итоговый запрос» и поместить полученное содержимое «в конфигуратор» (там уже все необхоимое выделено, нужно только нежно нажать сочетание клавиш «Ctrl+V»).

В итоге, связи между временными таблицами и запросами пакета, а также добавление запросов на уничтожение временных таблиц в «правильные» места, берёт на себя данный инструментарий. Нам же остаётся умело орудовать двумя известными сочетаниями клавиш  «Ctrl+С» и «Ctrl+V» на тех запросах, которые мы пожелаем модифицировать.

ДЛЯ ЗАО «1С»

Если вдруг на эту публикацию, набредёт кто-нибудь из великой и ужасной цитадели 1С, тот кто может влиять на функциональность и возможности инструментария для разработчика 1С, то для него у меня есть специальное сообщение:

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

Примерный вид формы конструктора запросов мог бы выглядеть в этом случае как-то так:

На изображении видно, что для последнего запроса из пакета (1) появился признак «Уничтожить все временные таблицы» (2). Признак становится активным, когда установлен переключатель «Уничтожение временной таблицы». Если признак «Уничтожить все временные таблицы» установлен, то при нажатии кнопки «ОК» мы получаем, на выходе, итоговый пакет запросов со всеми дополнительными инструкциями на уничтожение временных таблиц в «правильных» местах, по аналогии с тем, как это реализовано в даннолй публикации.

Прилагаемый архив делится на 2 части:

  1. QueryModifier.jar — сама программа на Java;
  2. src — папка с исходниками.

5 Comments

  1. script

    Дык, а где самое интересное?

    Что с общей производительностью после модификации запросов?

    Reply
  2. DrAku1a

    Загляните ко мне — есть «Отладчик запросов», «Визуальная структура запроса» — работает без ВК и JS, на чистом 1С.

    Функции «Добавить удаление неиспользуемых временных таблиц» — нет, но можно реализовать (довольно легко).

    Плюс — за саму идею!

    Reply
  3. 1ce.Architect

    (2) Спасибо!

    Посмотрел ваш «отладчик запросов» — отличная работа! Для такой обработки эта функция придётся очень даже в «тему».

    Reply
  4. TODD22

    (3)Вы про результаты не расскажите? Что там с производительностью в итоге?

    Reply
  5. 1ce.Architect

    (1) Технических замеров не производилось, потому что проект пока находится в состоянии «приостановлен», и в продакшн ничего не устанавливалось. Обязательно дополню публикацию, если появятся какие-то дополнительные данные по этому направлению.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *