Платформа 1С-ПРедприятие 7.7 хоть и несколько устарела, но все еще актуальна. Предлагаю несколько практических советов по ускорению некоторых операций на встроеном языке, без использования внешних компонентов, штатными средствами.
Выгрузка-загрузка данных.
XML-парсер известный тормоз, а на больших объемах может вообще зависнуть. Выгрузка-загрузка через объект «Текст» работает шустро, но на больших объемах скорость катастрофически падает. Использование объекта Addon.V7TextFile решает проблему больших объемов, но не решает проблему скорости. Кустарные компоненты не рассматриваем.
Выход есть — записать данные в объект «СписокЗначений» (в виде строк) и выгрузить его в файл при помощи функции ЗначениеВФайл(). А загружать функцией ЗначениеИзФайла(). Быстро и просто! На больших объемах притормаживает, но не сильно. Один недостаток — этот способ несовместим с версией 8.Х.
Таким же образом можно выгрузить в файл любой другой объект, например, «ТаблицаЗначений». Но учтите, что выгружаются (вернее, сериализуются) внутренние представления объектов. Если строки и числа выгружаются «как есть», то всякие справочники и документы выгружаются в виде идентификаторов, и могут быть прочитаны только в той же базе данных.
Поиск по нескольким полям ТаблицыЗначений
В 7.7 почему-то не предусмотрен поиск значений по нескольким полям (колонкам) таблицы. А решать эту задачу перебором — неэффективно. При этом, поиск значений в одной колонке работает очень быстро.
Выходом будет использование индексации. Для этого создаем новую колонку «Ключ» типа «Строка» (или без типа), и для каждой строки вычисляем ключ — строку, которая включает в себя элементы разных колонок. Например:
Ключ=СокрЛП(Имя)+"|"+СокрЛП(Фамилия);
или
Ключ=СокрЛП(Номенклатура.Код)+"|"+СокрЛП(Поставщик.Код);
ТЗ.Ключ=Ключ;
СокрЛП() желательно использовать везде, где сравниваются строки — оно обрезает лишние пробелы.
Таким образом, чтобы найти строку по двум колонкам, вычисляем ключ комбинации значений и ищем этот ключ.
н=0;
Если ТЗ.НайтиЗначение(Ключ, н, «Ключ»)=1 Тогда
ТЗ.ПолучитьСтрокуПоНомеру(н);
// Вот мы и на нужной строке
КонецЕсли;
Фильтрация таблиц и списков значений
Иногда требуется отфильтровать таблицу или список значений, удалив из них строки, не подходящие по условию. И фокус не в том, что удалять нужно от конца к началу списка (любой программист это знает), а в том, что удаление элемента работает гораздо медленнее, чем добавление. Поэтому гораздо быстрее создать новый список или таблицу с такой же структурой и в нее копировать оставляемые элементы. Об оперативной памяти не беспокойтесь, для задач, решаемых в 1С, ее обычно гораздо более, чем достаточно. =)
Для начала, хватит. Это наиболе простые и эффективные приемы, какие я знаю. Есть и другие приемы ускорения различных задач, не столь простые и эффективные, но полезные. Если будет интерес — опишу.
Выгрузка-загрузка данных.
XML-парсер известный тормоз, а на больших объемах может вообще зависнуть. Выгрузка-загрузка через объект «Текст» работает шустро, но на больших объемах скорость катастрофически падает. Использование объекта Addon.V7TextFile решает проблему больших объемов, но не решает проблему скорости. Кустарные компоненты не рассматриваем.
Выход есть — записать данные в объект «СписокЗначений» (в виде строк) и выгрузить его в файл при помощи функции ЗначениеВФайл(). А загружать функцией ЗначениеИзФайла(). Быстро и просто! На больших объемах притормаживает, но не сильно. Один недостаток — этот способ несовместим с версией 8.Х.
Таким же образом можно выгрузить в файл любой другой объект, например, «ТаблицаЗначений». Но учтите, что выгружаются (вернее, сериализуются) внутренние представления объектов. Если строки и числа выгружаются «как есть», то всякие справочники и документы выгружаются в виде идентификаторов, и могут быть прочитаны только в той же базе данных.
Поиск по нескольким полям ТаблицыЗначений
В 7.7 почему-то не предусмотрен поиск значений по нескольким полям (колонкам) таблицы. А решать эту задачу перебором — неэффективно. При этом, поиск значений в одной колонке работает очень быстро.
Выходом будет использование индексации. Для этого создаем новую колонку «Ключ» типа «Строка» (или без типа), и для каждой строки вычисляем ключ — строку, которая включает в себя элементы разных колонок. Например:
Ключ=СокрЛП(Имя)+"|"+СокрЛП(Фамилия);
или
Ключ=СокрЛП(Номенклатура.Код)+"|"+СокрЛП(Поставщик.Код);
ТЗ.Ключ=Ключ;
СокрЛП() желательно использовать везде, где сравниваются строки — оно обрезает лишние пробелы.
Таким образом, чтобы найти строку по двум колонкам, вычисляем ключ комбинации значений и ищем этот ключ.
н=0;
Если ТЗ.НайтиЗначение(Ключ, н, «Ключ»)=1 Тогда
ТЗ.ПолучитьСтрокуПоНомеру(н);
// Вот мы и на нужной строке
КонецЕсли;
Фильтрация таблиц и списков значений
Иногда требуется отфильтровать таблицу или список значений, удалив из них строки, не подходящие по условию. И фокус не в том, что удалять нужно от конца к началу списка (любой программист это знает), а в том, что удаление элемента работает гораздо медленнее, чем добавление. Поэтому гораздо быстрее создать новый список или таблицу с такой же структурой и в нее копировать оставляемые элементы. Об оперативной памяти не беспокойтесь, для задач, решаемых в 1С, ее обычно гораздо более, чем достаточно. =)
Для начала, хватит. Это наиболе простые и эффективные приемы, какие я знаю. Есть и другие приемы ускорения различных задач, не столь простые и эффективные, но полезные. Если будет интерес — опишу.