Заметочки про 1С:Предприятие 8 (редакция 22.06.2012)

11.07.13

Разработка - Механизмы платформы 1С

За время программирования на 8.х, накопилось пока немного материала, но как мне кажется очень интересного. Появились простые решения, которые в более сложной реализации встречаются в типовых конфигурациях и в некоторых публикациях на Infostart'е. Собственно в статье речь пойдет об этих решениях.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
КодВОднуСтроку.epf
.epf 7,47Kb
628 2 500 руб. Купить
Пример 1
.epf 7,28Kb
1231 2 500 руб. Купить
Пример 2
.epf 8,52Kb
544 2 500 руб. Купить
Пример 3 без оптимизации
.epf 9,72Kb
477 2 500 руб. Купить
Пример 3 с оптимизацией
.epf 10,34Kb
467 2 500 руб. Купить
Гостинец от Ish_2
.epf 9,91Kb
422 2 500 руб. Купить
Пример 4
.epf 8,13Kb
449 2 500 руб. Купить
Пример 5
.epf 7,78Kb
375 2 500 руб. Купить
COM MONITOR
.epf 23,63Kb
369 2 500 руб. Купить
Пример 6 для COM Monitor
.epf 271,79Kb
511 2 500 руб. Купить
Пример 7
.epf 9,47Kb
294 2 500 руб. Купить
Пример 8
.erf 13,23Kb
270 2 500 руб. Купить
Пример 9
.erf 12,69Kb
247 2 500 руб. Купить
Пример 10
.epf 10,76Kb
52 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.
Только качественный контент

Оглавление

Если вы это всё уже знаете, то, пожалуйста, не кидайте в автора грязью. Танки грязи не боятся. Smile

Но всё-таки я надеюсь вас чем-нибудь удивить.

В подтверждение заметок описанных в статье прикладываю примеры и материалы. Всегда можно проверить.

Для вступления думаю достаточно. Начнем.       


Про циклы в одну строку

Первым номером нашей программы выступает код добавления (копирования) строк из одной таблицы значений в другую ТЗ или из одной табличной части в другую ТЧ. Ну, и т.д. Т.е. строки из обоих источников объединяются, совпадающие по имени колонки заполняются.

Для каждого СтрокаТЗ Из Таблица1 Цикл ЗаполнитьЗначенияСвойств(Таблица2.Добавить(), СтрокаТЗ) КонецЦикла;


Соответственно код добавления элементов из массива в массив будет такой.

Для каждого ЭлементМассива Из Массив1 Цикл Массив2.Добавить(ЭлементМассива) КонецЦикла;


Всего одна команда в цикле - что может быть проще?

Наверное, вы уже обратили внимание на запись циклов в одну строку. Так программный код выполняется несколько быстрее. Всё дело в том, что в строках есть дополнительные данные, которые используются, например, при отладке. Меньше строк - меньше дополнительных данных. Это прекрасно видно, если смотреть замер производительности в режиме отладки - цикл в строке Для из 10000 повторов записанный обычной структурой будет выполнен 10001 раз, а записанный в 1 строку будет выполнен 1 раз. Разумеется, что при этом результат выполнения программного кода будет абсолютно одинаковый, а вот время выполнения будет разное. Не верится? Смотрим "Пример 1".
Скачать Пример 1...

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

Также "тонким" моментом будет использование команды ОбработкаПрерыванияПользователя(). Если в цикле, записанном в 1 строку, используется данная команда, то вероятность срабатывания прерывания выполнения программы по Ctrl+Break становится не четким. Ну, может за исключением тех случаев, когда в цикле кроме этой других команд нет. Smile

Хочу сразу обратить ваше внимание на комментарии awa к этой статье. Всё сразу станет понятнее.

Обработку для сворачивания программного кода в 1 строку можно скачать здесь.

Вернуться к оглавлению...


Про быстрые массивы

Теперь посмотрим что-нибудь простенькое. Например, разбор строки с разделителями в массив элементов. В типовых конфигурациях есть функция РазложитьСтрокуВМассивПодстрок(). Предлагаю рассмотреть альтернативное решение. Вот код для строковых значений.

// РазбираемаяСтрока - строка исходного текста
// Разделитель - разделитель элементов строки

ЗначениеИзСтрокиВнутр("{""#"",51e7a0d2-530b-11d4-b98a-008048da3034,{0,{""S"",""" + СтрЗаменить(СтрЗаменить(РазбираемаяСтрока, """", """"""), Разделитель, """},{""S"",""") + """}}}");


Вот код для числовых значений.

ЗначениеИзСтрокиВнутр("{""#"",51e7a0d2-530b-11d4-b98a-008048da3034,{0,{""N""," + СтрЗаменить(РазбираемаяСтрока, Разделитель, "},{""N"",") + "}}}");


Посмотреть, как это работает можно здесь, здесь и здесь.
В (150) комментарии к статье было высказано предположение, что данный метод не эффективен, поэтому был добавлен "Пример 7". Действительно, на коротких строках предложенное в (150) комментарии решение с разбором строки эффективнее, но сложнее в исполнении. Ещё более эффективное решение и ещё более сложное в исполнении Smile читаем ниже...
Скачать Пример 7...

 

Так, так, так. А вот довольно шустренький программный код для сворачивания элементов массива. Результат записывается в НовыйМассив.

НовыйМассив = Новый Массив; Соответствие = Новый Соответствие;
Для каждого
ЭлементМассива Из Массив Цикл Соответствие.Вставить(ЭлементМассива) КонецЦикла;
Для каждого
КлючИЗначение Из Соответствие Цикл НовыйМассив.Добавить(КлючИЗначение.Ключ) КонецЦикла;


Для сравнения в "Пример 4" приведено 4 варианта реализации сворачивания массива: через массив, через таблицу значений, через соответствие и вариант, реализованный в типовых конфигурациях 1С. Поэкспериментируйте и выберите тот, что вам больше понравится.
Скачать Пример 4...

 

Если вдруг понадобится отсортировать элементы в массиве, то быстро это можно сделать так:

СписокЗначений = Новый СписокЗначений;
СписокЗначений.ЗагрузитьЗначения(Массив);
СписокЗначений.СортироватьПоЗначению();
Массив = СписокЗначений.ВыгрузитьЗначения();

В некоторых случаях больше подойдет сортировка не по значению, а по представлению.

Вернуться к оглавлению...


Про длинные строки

Получить строку из пробелов нужной длины можно собирая пробелы в цикле. Но можно использовать следующую конструкцию:

// Получаем строку пробелов длиной 10000 символов
СтрокаПробелов = СтрЗаменить(Формат(0, "ЧЦ=100; ЧН=; ЧВН=; ЧГ="), "0",
                
СтрЗаменить(Формат(0, "ЧЦ=100; ЧН=; ЧВН=; ЧГ="), "0", " ")); 


Интересное наблюдение при работе со строками большой длины можно сделать в "Пример 5". Использование трехуровневой буферизации может дать ускорение в десятки и даже тысячи раз. Код может выглядеть так:

Данные = "";
Результат = "";
Результат1 = "";
Результат2 = "";
// Получаем Данные и записываем в Результат
Пока ПолучитьДанные(Данные) Цикл
   
Результат2 = Результат2 + Данные;
    Если
СтрДлина(Результат2) > 100 Тогда
       
Результат1 = Результат1 + Результат2;
       
Результат2 = "";
        Если
СтрДлина(Результат1) > 10000 Тогда
           
Результат = Результат + Результат1;
           
Результат1 = "";
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Результат = Результат + Результат1 + Результат2;


Конечно, и здесь цикл можно записать в одну строку, но это не сделано только для сохранения читаемости программного кода в статье.
Скачать Пример 5...

В (302) комментарии к статье приведен интересный код для разбора длинных текстовых строк, позволяющий проводить предварительную обработку данных, например, перед помещением их в массив. Применительно к задаче помещения данных в массив на больших объемах данных он работает конечно медленнее, чем код описанный в разделе Про быстрые массивы, но возможность предварительной обработки данных дорогого стоит. Предлагаю рассмотреть альтернативное решение без использования объекта ТекстовыйДокумент. Оно конечно сложнее в исполнении, но эффективнее в работе и также позволяет добавить предварительную обработку данных, например, перед помещением их в массив.

ДлинаСтроки = СтрДлина(РазбираемаяСтрока);

Если
ДлинаСтроки > 1000 Тогда
   
// Порежем строку на блоки для более эффективного поиска
   
МассивСтрок = Новый Массив;
   
Индекс = 1;
    Пока
Индекс <= ДлинаСтроки Цикл
       
МассивСтрок.Добавить(Сред(РазбираемаяСтрока, Индекс, 1000));
       
Индекс = Индекс + 1000;
    КонецЦикла;

   
мИсходныйКод = МассивСтрок[0];
   
ГраницаКода = МассивСтрок.ВГраница();
Иначе
   
мИсходныйКод = РазбираемаяСтрока;
   
ГраницаКода = 0;
КонецЕсли;


мСтрок = Новый Массив;
ИндексКода = 0;
ДлинаРазделителя = СтрДлина(Разделитель);
НеПоследняяСтрока = Истина;

Пока
НеПоследняяСтрока Цикл
   
Позиция = Найти(мИсходныйКод, Разделитель);
    Пока
Позиция = 0 Цикл
        Если
ИндексКода = ГраницаКода Тогда
           
// Последний элемент
           
Позиция = СтрДлина(мИсходныйКод);
           
НеПоследняяСтрока = Ложь;
            Прервать;
        КонецЕсли;

       
ИндексКода = ИндексКода + 1;
       
мИсходныйКод = мИсходныйКод + МассивСтрок[ИндексКода];
       
Позиция = Найти(мИсходныйКод, Разделитель);
    КонецЦикла;

   
мСтрок.Добавить(Лев(мИсходныйКод, Позиция));
   
мИсходныйКод = Сред(мИсходныйКод, Позиция + ДлинаРазделителя);
КонецЦикла;

Возврат
мСтрок;


Посмотреть как это работает можно здесь и здесь.

 

Если вы подумали, что эта статья только об оптимизации производительности, то это не так. Статья об оптимизации производительности здесь, и не смотря на то, что статья посвящена 7.7, многие приемы оптимизации работают и в 8.х.

Вернуться к оглавлению...


Про типы данных. Динамическая настройка колонок табличного поля

Иногда бывает нужно проверить тип данных какого-либо ревизита. Для типов данных без квалификаторов проверку типа данных легко сделать с помощью ОписаниеТипов. А вот для типов данных Число, Строка и Дата можно использовать другую конструкцию с использованием массива типов. Вот пример для динамической настройки табличного поля. В примере использованы оба способа сравнения типов.

ТипЧисло = Тип("Число");
ОписаниеТипаБулево = Новый ОписаниеТипов("Булево");

мВыводитьПодвал = Ложь;
ТабличноеПоле.СоздатьКолонки();
КолонкиИсточника = ТабличноеПоле.Значение.Колонки;

// Отобразим булево как галочки, а отрицательные числа красным
Для каждого КолонкаТЧ Из ТабличноеПоле.Колонки Цикл
   
ИмяКолонкиТЧ = КолонкаТЧ.Имя;
   
ТипЗначенияКолонки = КолонкиИсточника[ИмяКолонкиТЧ].ТипЗначения;
    Если
ТипЗначенияКолонки = ОписаниеТипаБулево Тогда
       
КолонкаТЧ

Купить лицензии 1С

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Механизмы платформы 1С Программист Бесплатно (free)

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    41987    TitanLuchs    109    

152

Работа с интерфейсом WEB-интеграция Механизмы платформы 1С Бесплатно (free)

Веб-интерфейсы повышают качество внешнего вида приложений 1С, предсказуемы с точки зрения верстки, позволяют организовать удобные и высокопроизводительные рабочие места для пользователей. Расскажем об особенностях разработки веб-интерфейсов на React внутри 1С, двустороннем взаимодействии 1С и JavaScript, а также сборке веб-приложения в одностраничный файл.

19.06.2025    15766    zeegin    15    

61

Механизмы платформы 1С Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    23772    bayselonarrend    127    

68

Механизмы платформы 1С Программист 1С:Предприятие 8 Бесплатно (free)

В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.

30.01.2025    29937    user2122906    10    

67

Механизмы платформы 1С Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 Бесплатно (free)

Этот материал познакомит вас с механизмом XDTO (XML Data Transfer Objects) в 1С и научит эффективно использовать его возможности. Мы разберёмся, как работать с XML-схемами, создавать модели данных, манипулировать объектами XDTO, а также сериализовать и десериализовать их в XML. Вы узнаете, как использовать XDTO для интеграции с внешними системами, избегать типичных ошибок и оптимизировать код. К концу вы будете уверенно применять XDTO для решения сложных задач обмена данными и автоматизации процессов.

17.01.2025    50141    user2122906    12    

63

Механизмы платформы 1С WEB-интеграция Программист 1С:Предприятие 8 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    42840    dsdred    108    

155

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

23.06.2024    37503    bayselonarrend    22    

179
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Evg-Lylyk 5480 01.06.10 14:39 Сейчас в теме
Так программный код выполняется значительно быстрее. Всё дело в переходах между командами.

И на сколько быстрее? (примерчик)
dragonbridge; +1 Ответить
2. alexk-is 6549 01.06.10 14:58 Сейчас в теме
(1) Количество повторов 1000000
Замер код записан в 4 строки. Завершено за 3,329 сек.
Замер код записан в 1 строку. Завершено за 0,5 сек.

У меня получилось приблизительно в 6 раз. Но здесь нужно учитывать только время переходов. Если в цикле будут команды, которые выполняются медленно, то и результаты будут иными.
3. alexk-is 6549 01.06.10 15:06 Сейчас в теме
4. awa 2619 01.06.10 15:14 Сейчас в теме
(1)(2) Я думаю, что разница будет только в режиме отладки. В обычном режиме разницы быть не должно.
6. alexk-is 6549 01.06.10 15:39 Сейчас в теме
(4) Эх... раскусил... Да, действительно был включен режим отладки. Переделал тест. Теперь результат такой.

Замер код записан в 6 строк. Завершено за 1,532 сек.
Замер код записан в 1 строку. Завершено за 0,859 сек.

Почти в 2 раза. Тоже не плохо.
12. alexk-is 6549 01.06.10 16:06 Сейчас в теме
(4) Приложенный тест убедил?
16. awa 2619 01.06.10 17:27 Сейчас в теме
(12)(15) Да, убедил. Это действительно сказываются дополнительные коды (1) в компилированном коде, которые означают номер строки для отладки. В 1С, в отличие от нормальных сред программирования (типа Visual Studio или Embarcadero RAD) нет разделения на режимы компиляции Debug и Release. В 1С, по сути, всегда режим Debug. Ради интереса я перенес тест из формы в модуль обработки, поставил на нее пароль, и обфусцировал ее. Обфускация, кроме всего прочего, выкидывает отладочные коды (1). И результаты сразу стали одинаковыми! Правда, чуть больше, чем не для обфусцированных - вместо 1 сек для 1 строки и 1,4 сек для 6 строк стало по 2 сек. для обоих вариантов, что вполне объяснимо - обфускация добавляет лишние переходы и прочие запутывающие коды.
Но, по большому счету, и раньше было известно, что 1С для всяких сильно вычислительных и переборных задач совсем не подходит. В реальной же жизни, как правило, скорость работы 1С упирается в скорость работы с БД, и на этом фоне оптимизация просто кода 1С приносит практически незаметные результаты.
HystriX; admin; MariusUrsus; talych; Evil Beaver; tormozit; waol; JohnyDeath; zqzq; krv2k; karantella; AleksR; Sol; BabySG; alexk-is; Stety; СергейКа; Anything; Artem N; Шёпот теней; +20 Ответить
17. alexk-is 6549 01.06.10 17:56 Сейчас в теме
(16) Не совсем так. После получения данных из базы наступает момент, когда её необходимо показать пользователю. Вот тут-то и наступает самый интересный момент. Сколько будет стоить поднять производительнось пользовательского ПК, например, на 20% ? А тут халява :)
452. HystriX 20.12.18 08:42 Сейчас в теме
(16) Возможно, отсутствие разделения на Debug и Release обусловлено тем, что в 1С есть возможность для удобства помощи пользователям и разбора всяких нестандартных ситуаций прямо в открытом сеансе установить флаг "Отладка в текущем сеансе разрешена" и сразу же подключиться конфигуратором и начать отладку. И эта возможность иногда оправдывает себя намного больше, чем едва ощутимый прирост производительности алгоритмов :)
Мах; user1135262; +2 Ответить
320. пользователь 20.12.11 14:14
Сообщение было скрыто модератором.
...
5. Diversus 2340 01.06.10 15:19 Сейчас в теме
Для каждого СтрокаТЗ Из Таблица1 Цикл ЗаполнитьЗначенияСвойств(Таблица2.Добавить(), СтрокаТЗ) КонецЦикла;


А вот так работает, медленней?
Таблица2 = Таблица1.Скопировать();

Или я чего то не понял?
7. alexk-is 6549 01.06.10 15:41 Сейчас в теме
(5) Я имел ввиду вариант Таблица = Таблица1 + Таблица2 + Таблица3 + ... ТаблицаN
8. e.kogan 1909 01.06.10 15:42 Сейчас в теме
Вот за заход с итоговыми полями в запросе большое спасибо, раньше не встречала.
9. alexk-is 6549 01.06.10 15:53 Сейчас в теме
(8) Почему не встречала? В http://www.infostart.ru/public/69707/ встречается 4 раза, а эта публикация висит на главной уже больше месяца.

Посмотри её. Там ещё много вкусного :)
10. e.kogan 1909 01.06.10 15:54 Сейчас в теме
(9) Потому что туда в код не залезала, времени не было.
11. alexk-is 6549 01.06.10 16:02 Сейчас в теме
(8) Ну, хоть кого-то удивил.
13. anig99 2865 01.06.10 16:38 Сейчас в теме
хммммм...очень похоже всё-таки на баг компилятора...Скорость работы программы НЕ ДОЛЖНА зависеть от таких вещей...
Душелов; Шёпот теней; +2 Ответить
22. WKBAPKA 216 02.06.10 08:37 Сейчас в теме
2(13): вот и я о том подумал, на самом деле, одна строка или 6 строк, машине (компилятору) по барабану, для нее на вход поступает линейный поток символов (включая управляющие символы). И какая тут разница, сколько строк или пробелов? Это разве что, время разбора лексем увеличивается за счет работы со строками, типа, чем больше пробелов и прочих не значащих символов, тем больше время разбора, но что бы в два раза!!!
14. ildarovich 8065 01.06.10 16:43 Сейчас в теме
С результатами согласен
Функция ТочноеВремя() 
	
	Script = Новый COMОбъект("MSScriptControl.ScriptControl");
	Script.Language = "javascript"; 
	Возврат Script.eval("new Date().getTime()"); 
	
КонецФункции

Процедура КнопкаСформироватьНажатие(Кнопка)
	
	Старт = ТочноеВремя();
	
	А = 0;
	Для Сч = 1 По 1000000 Цикл
		А = А + 1;
	КонецЦикла;
	
	Сообщить("В несколько строк:" + (ТочноеВремя() - Старт) + " мск");
	
	Старт = ТочноеВремя();
	
	А = 0;Для Сч = 1 По 1000000 Цикл А = А + 1;КонецЦикла;
	
	Сообщить("В одну строку:" + (ТочноеВремя() - Старт) + " мск");
	
КонецПроцедуры
Показать

Результат(вне отладки):
В несколько строк:1 531 мск
В одну строку:1 078 мск

Но я бы объяснил это не лишними повторениями или переходами между командами, а наличием возможных точек останова и возможностью указания строки ошибки.
Stety; Anything; Шёпот теней; +3 Ответить
15. alexk-is 6549 01.06.10 16:56 Сейчас в теме
(14) Не вижу принципиальной разницы. Давай назовем так - Переход между командами с созданием возможных точек останова и возможностью указания строки ошибки. Результаты тестов от этого не изменятся.
18. Abadonna 3979 01.06.10 19:46 Сейчас в теме
Что-то мне кажется, что говорить в контексте 1С "скомпилированный" не совсем корректно. 1С таки интерпретатор, имхо.
19. awa 2619 01.06.10 20:44 Сейчас в теме
(18) На самом деле 1С и компилятор и интерпретатор одновременно. Исходный код компилируется в промежуточный "п-код" либо в момент первого обращения к модулю, если исходный текст модуля открыт, либо заранее, если исходный текст модуля запаролен или исходный текст модуля отсутствует. Далее полученный "п-код" выполняется виртуальной машиной 1С в режиме интерпретатора.
Правда, не знаю, как выполняется клиентский код в тонком и веб-клиентах 8.2.

(17) Ну давай посчитаем. В твоем тесте цикл выполняется миллион раз, в варианте шести строк внутри цикла 4 строки, т.е. за время выполнения теста происходит обработка отладочного кода (1) четыре миллиона раз. Именно этих четырех миллионов вызвовов команды (1) нет в варианте с одной строкой. Уходит на это примерно пол-секунды (на моем рабочем компе разница между тестами 0.4 секунды). В обычной жизни для вывода пользователю результатов запроса из БД надо выполнить не более нескольких тысяч строк (с учетом всех циклов), что на три порядка меньше, чем в тесте. Т.е. способом "пишем всю программу в одну строку" ты будешь ловить миллисекунды.
Я отнюдь не отрицаю, что эффект есть, я просто говорю, что, как правило, он совсем не стоит внимания. Возможно, в исключительных случаях, и бывает, что таким способом можно получить хоть немного заметную экономию времени. Но скорее всего, это тяжелые алгоритмические или переборные задачи, которые, в таком уж случае, гораздо эффективнее писать на других, компилируемых, языках. С++, например. Выигрыш по времени выполнения чисто алгоритмической программы на С++ по сравнению с 1С может достигать нескольких тысяч раз.
HystriX; WarAn; a0212; pvlunegov; Mingrel; Evil Beaver; awk; Artem N; +8 Ответить
24. anig99 2865 02.06.10 08:55 Сейчас в теме
(19) к тому же множество выкладок по оптимизации кода идет в сторону сокращения циклов или полного их устранения за счет запросов/переноса на сервер...
20. anig99 2865 01.06.10 21:10 Сейчас в теме
а если запоролить обработку?
21. WKBAPKA 216 02.06.10 08:34 Сейчас в теме
а про циклы мне не совсем понятно... вернее понятно :o , но почему так?
23. WKBAPKA 216 02.06.10 08:40 Сейчас в теме
прочитал последние посты, вопросы отпали... :)
25. awa 2619 02.06.10 10:01 Сейчас в теме
Кстати, в приведенном коде разбора строки с элементами в массив, есть ошибка, а точнее ограничение. Если в элементах разбираемой строки встречается двойная кавычка, то приведенный код упадет. Поэтому перед преобразованием надо добавить
РазбираемаяСтрока = СтрЗаменить(РазбираемаяСтрока, """", """""");
alexk-is; +1 Ответить
27. alexk-is 6549 02.06.10 10:36 Сейчас в теме
(25) Ни каких ограничений нет. См. пост (25) - там смимаются все ограничения. :)

А если серьезно, то у меня такой способ разбора строк встречается часто. Взял из модуля, где разбираются строки вида ЭлементыФормы.КоманднаяПанель.Кнопки.Подменю.Кнопки.Действие.Подсказка

Главное ведь сам прицип. Если принцип понятен, то модифицировать команду под разбор, например, строки чисел уже не составит труда.

(Подсказка: S заменить на N и убрать некоторые кавычки)
26. WellMaster 106 02.06.10 10:32 Сейчас в теме
Иногда встречал простые задачи, которые нельзя ни перенести на сервер, ни реализовать на запросах - все делалось на клиенте.
Вот мои замеры (10 млн итераций):

Замер код записан в 6 строк. Завершено за 25,652 сек.
Замер код записан в 1 строку. Завершено за 14,771 сек.

11 секунд выигрыша в моем случае - большой плюс.
Предложенный способ оптимизации действительно отношу к особенностям компилятора/интерпритатора, а не к оптимизации кода в полном смысле этого слова.
Но все равно плюс автору за статью.
28. Ish_2 1117 02.06.10 13:08 Сейчас в теме
1. Почему для построения двухуровневого дерева нельзя обойтись только первой частью запроса ?

2. Зачем в одной колонке нужно иметь разные типы ?

3. Не понял текста запроса после "Объединить Все" .
- Второй запрос будет пустым . зачем это нужно ?
4.
"ИТОГИ
| Организация КАК СтруктураДоговоров,
| СУММА(Сумма)
|ПО
| Организация");"

- После опции ИТОГИ употреблена не агрегатная функция , а "Организация" .
Что это ?
29. Ish_2 1117 02.06.10 13:15 Сейчас в теме
30. alexk-is 6549 02.06.10 19:01 Сейчас в теме
(29) Вот пока выложил только скриншот "Пример 3". Как думаешь, это будет интересно?
В двух словах - там по периодическому регистру сведений КурсыВалют вычисляются периоды действия курсов и ещё ряд показателей, при этом исключаются записи в которых курс установлен такой же как в предыдущей записи.
31. Ish_2 1117 02.06.10 19:19 Сейчас в теме
(31) Пока замечание.
Оформлял бы запросы с помощью временных таблиц. И надежнее в выполнении и нагляднее. Уж сколько говорено на эту тему ...
И 1с рекомендует обходиться без вложенных запросов.
34. alexk-is 6549 02.06.10 21:55 Сейчас в теме
(31) Переделал на пакетный запрос.
Однако вопрос в (30) был не про "Пример 2", а про "Пример 3".
32. Ish_2 1117 02.06.10 19:27 Сейчас в теме
Кстати , по пред.сообщению . А я получал такие двухуровневые деревья в "лоб", т.е. в цикле прокручивал выборку и заполнял каждую строку дерева. Твой способ ,насколько я понимаю, побыстрее и поизящнее.

33. alexk-is 6549 02.06.10 20:07 Сейчас в теме
(32) Ну, да. Иначе зачем огород городить?
35. Поручик 4612 02.06.10 23:01 Сейчас в теме
Покажи пример. Интересно. Я так понял, на нём можно построить что-то таблицы изменения задолженности.

Фичу с контрагентами будет время воткну в конфу.
36. alexk-is 6549 02.06.10 23:40 Сейчас в теме
(35) Изменение задолженности? Разве типовые отчеты этого не показывают? Хотя остатки в разрезе документов можно таким образом развернуть.

Нет. Я имел ввиду несколько иное представление именно периодических регистров сведений: КурсыВалют, ЦеныНоменклатуры и т.д. Где это может использоваться? Например, здесь http://infostart.ru/public/70802/
37. alexk-is 6549 03.06.10 12:40 Сейчас в теме
Добавил про сворачивание массивов.
38. Ish_2 1117 04.06.10 10:42 Сейчас в теме
Для ,в целом симпатичного, примера 3 нужно указать , что в случае большой таблицы регистра КурсыВалют (более 1000 записей), мы получим серьезное замедление.
Дело , конечно, в том , что при соединении по неравенству в первом запросе размер "промежуточной" таблицы запроса резко возрастает.

Например , получение первой временной таблицы Периоды при помощи кодинга может дать многократный выигрыш по быстродействию .



Шёпот теней; +1 Ответить
39. alexk-is 6549 04.06.10 11:18 Сейчас в теме
(38) По оптимизации выборки в нарастающих итогах могу дать ссылочку http://infostart.ru/public/61295/ :)

Здесь фишка в другом - убрать повторяющиеся данные из цепочки, а оставить только точки перехода с датами, когда данный переход был выполнен.
Т.е. для цепочки 0, 0, 1, 1, 1, 0, 0, 0, 1
должны остаться только 0, 1, 0, 1
Шёпот теней; +1 Ответить
40. Шёпот теней 1786 04.06.10 11:53 Сейчас в теме
(38) ... неужели ... не ужели ... НЕужели ... неУЖЕЛИ ... вотВЕДЬвот ...
42. Ish_2 1117 04.06.10 12:09 Сейчас в теме
(40) Да ,Шепот. Применение в запросе соединения по неравенству - "в лоб" ,
может дать плачевные результаты.
41. Ish_2 1117 04.06.10 12:06 Сейчас в теме
Второй в пакете запрос я еще не осилил - до твоей "фишки" не дошел.

Отметив возможное замедление , продолжим "ковырять" первый запрос пакета.
В нем фильтрация по &Валюта применена дважды , причем один раз в условии соединения. На мой взгляд , эффективнее и понятнее будет следующий запрос для получения временной таблицы "Соединения"

Выбрать РАЗРЕШЕННЫЕ КурсыВалют.Период
Поместить Периоды
из Регистр.КурсыВалют
Где КурсыВалют.Валюта=&Валюта;

ВЫБРАТЬ
Периоды.Период как Период1,
Максимум (ЕСТЬNULL(Периоды1.Период, Периоды.Период)) КАК Период2
Поместить Соединения
Из
Периоды КАК Периоды
Левое Соединение Периоды КАК Периоды1
Периоды.Период > Периоды1.Период
Сгруппировать по
Периоды.Период
44. alexk-is 6549 04.06.10 13:36 Сейчас в теме
(41) :)
- Как-то не очень получается...
- Конечно можно и получше нарисовать. Ну, там в трехмерной проекции...
- А я бы нарисовал немного в профиль
- Да потому, что у вас всё в профиль
© Миссия Клеопатра


Добавил вариант с оптимизацией. Работает немного побыстрее, но понять, что делается в двенадцати пакетном запросе мне кажется сложнее. :)
47. alexk-is 6549 04.06.10 14:30 Сейчас в теме
(41) Хочу скромно поинтересоваться по поводу "Пример 3 с оптимизацией"...
Ну, как?
43. Ish_2 1117 04.06.10 13:33 Сейчас в теме
Посмотрел второй запрос.
Пример 3 хорош лишь как любопытная демонстрация запросной техники , но ни в коем случае не образец решения задачи. Лучше бы явно это указать в теме.
Действительно , выгрузив таблицу регистра в таблицу значений мы за ОДИН проход получим выходное дерево многократно быстрее.
45. alexk-is 6549 04.06.10 13:43 Сейчас в теме
(43) Там не дерево. Там список.
46. anig99 2865 04.06.10 14:30 Сейчас в теме
а на том дереве... или плоды познания, или русалка, или вообще кот, который ссыт в тапки...
49. Ish_2 1117 04.06.10 14:38 Сейчас в теме
За (46) гони Сашу , он нас с сурьёзного настроя сбивает.
59. anig99 2865 04.06.10 15:45 Сейчас в теме
(49) пятница...жарко...вечером ещё ехать на шабашку... дай коту нассать в тапки...
48. Ish_2 1117 04.06.10 14:34 Сейчас в теме
Хм.. А как у тебя тема обновляется ?
Скромно поинтересуюсь : а можно посмотреть пример 3 - оба варианта до оптимизации и после.

Первый запрос не изменился. Во втором поля выборки, два внутренних соединения, Итоги - как были так и остались.
50. alexk-is 6549 04.06.10 14:47 Сейчас в теме
(48) Там ещё 1 файл. Теперь их 5. Должен быть пакет из 12 запросов
52. Ish_2 1117 04.06.10 15:04 Сейчас в теме
(50) Скачал .Посмотрел. Мда.. "Он уважать себя заставил" !
Ты не подумай - я тоже энтузиаст и всё такое...
Но увидев текст пакета оробел : стоило ли ?
53. alexk-is 6549 04.06.10 15:08 Сейчас в теме
(52) Что нам стоит дом построть - нарисуем будем жить! :)
Ну, так как?
60. Ish_2 1117 07.06.10 08:08 Сейчас в теме
(53) В субботу попробовал твой "Пример № 3"
Теперь и ты отведай моего гостинца .

1. Текст запроса сокращен в 1,5 раза.
2. Быстродействие запроса увеличилось в 1,5 раза

В прикрепл.файле "Гостинец" твоя обработка "пример № 3" с измененным текстом запроса.
Прикрепленные файлы:
Гостинец.epf
61. alexk-is 6549 07.06.10 10:12 Сейчас в теме
(60) Всё зависит от информационной базы. На SQL разницы не получилось, а вот на файловой "гостинец" на 18% быстрее. Только "гостинец" по первой дате выдает неправильный результат в "Изменение курса". Всё равно спасибо. Буду изучать.
62. Ish_2 1117 07.06.10 10:20 Сейчас в теме
(61) Проверялась в субботу действительно на файловом варианте.

На небольших объёмах проверять бессмысленно.
Создай 1 000 - 10 000 различных курсов по одной валюте и сравни результаты.
выигрыш в быстродействии должен быть никак не меньше 1.5 раза.
На мой вкус, "Гостинец" в первой строке выдает как раз правильный результат :
"Изменение курса" в первой строке не имеет смысла , т.к. пред.курс неизвестен.

63. vip 07.06.10 10:23 Сейчас в теме
(61) > Только "гостинец" по первой дате выдает неправильный результат в "Изменение курса".

Да наплюй ты на результат. Главное, шо 18%.
64. alexk-is 6549 07.06.10 10:27 Сейчас в теме
(63) Дошел до 4 и 5 запросов в пакете - случился взрыв мозга. Иду за кофе...
65. Ish_2 1117 07.06.10 10:40 Сейчас в теме
(64) "Взрыв мозга" , на самом деле, - это мне минус.
Нужно было оставить комментарии.
66. anig99 2865 07.06.10 12:58 Сейчас в теме
(65)(64) а комментарии - это моя статья про нарастающие итоги (: Как раз разбиение соединений сначала на более крупные периоды, а потом на более мелкие.
67. Ish_2 1117 07.06.10 13:03 Сейчас в теме
(66) Саша, ты не в теме. Совсем.
68. anig99 2865 07.06.10 14:01 Сейчас в теме
(67) думаешь, если тут коты в тапки ссут, то я не в теме? Я посмотрел гостинец из (60)... Разве там не продемонстрировано применение сложного алгоритма для оптимизации времени выполнения запроса?
70. Ish_2 1117 07.06.10 14:09 Сейчас в теме
(68) Да , это так . Этот подход применил Алексей - я лишь повторил его.
Дело совсем не в этом .
Всё крутится вокруг "фишки"( Алексей употребил это слово) в (39).
121. Ish_2 1117 08.06.10 11:10 Сейчас в теме
Давай уж добьем до конца этот вопрос.
(68) ,(107) Саша и Артур , просьба :
Пожалуйста , протестируйте и сравните на предмет быстродействия:
1. Прикрепленную обработку в (60) Гостинец.epf
2. В текущей теме в разделе "файлы" четвертый файл "пример с оптимизацией" Пример 3_2.epf.

Нужно в БП , а потом в УТ создать ежедневные разные курсы по одной валюте за 12 лет и запустить обработки 1 и 2. Сравнить время выполнения .
Не откажите хорошему человеку. Вы нас рассудите с Алексеем.

P.s. Было бы хорошо - и для файлового варианта и для клиент-серверного.
127. artbear 1589 08.06.10 12:48 Сейчас в теме
(121) Пока некогда тестировать :(
пока только иногда почитываю
123. Ish_2 1117 08.06.10 11:48 Сейчас в теме
+(68),(107) Виноват. Алексей уже успел поменять на новую версию свой "пример3_2" .
Сравнивать нужно с первоначальным примером.
Прикрепленные файлы:
Пример3_2_Первоначальный.epf
124. alexk-is 6549 08.06.10 12:23 Сейчас в теме
(123) А не проще из "Гостинец" вырезать 3 строки?
ИНДЕКСИРОВАТЬ ПО
Период1,
Период2
125. Abadonna 3979 08.06.10 12:28 Сейчас в теме
(124) А не проще прекратить быстродействиями меряться? :D
Практической пользы - практически ноль. Ну, одна за 17 секунд, другая за 15...
Ну и фигли? ;)
Нажал я кнопочку "Загрузить" и пишу этот коммент (а менеджер по асе девочку охмуряет).
Один фиг загрузит быстрее, чем вышеизложенное ;)
126. alexk-is 6549 08.06.10 12:28 Сейчас в теме
(123) :)
- У меня программа в 2 раза меньше твоей, работает в 10 раз быстрее, имеет изумительное юзабилити.
- Ну, и что? Зато моя работает правильно.


А если серьезно, то мне понравилось решение в "Гостинец", иначе не появился бы "Пример3_3".
128. Ish_2 1117 08.06.10 12:54 Сейчас в теме
(126) Черт возьми ! Возник спор - нужно установить факты.
После того как факты установлены - делиться размышлизмами и делать выводы .
129. alexk-is 6549 08.06.10 13:19 Сейчас в теме
(128) Как мне кажется, особо спорить не о чем.

В SQL версии
"Гостинец" работет немного быстрее как в вариантах с индексами, так и без индексов

В файловой версии
При использовании индексов "Гостинец" также быстрее
"Пример3_3" быстрее без индексов, но это скорее исключение - может дело в базе или в расположении звезд

Мне, например, гораздо интереснее - почему с индексами в файловой версии работает значительно медленнее чем без индексов.
130. Ish_2 1117 08.06.10 14:54 Сейчас в теме
(129) Точнее всё-таки сформулировать так :
Почему при ЯВНО заданном индексе для врем.таблице в файловой базе наблюдаются жесткие тормоза ?
И почему при НЕЯВНО заданном индексе (ведь наверняка его создал оптимизатор запроса) тормозов не наблюдается.
131. artbear 1589 08.06.10 15:11 Сейчас в теме
(130) А на скуле проверяли с индексами и без ?
132. alexk-is 6549 08.06.10 15:36 Сейчас в теме
(131) Лучшее время из 10 тестов. MS SQL 2005. УПП 1.2.

С индексами
Время выполнения Гостинец.epf - 0,484 сек
Время выполнения Пример3_2.epf - 0,469 сек

Без индексов
Время выполнения Гостинец.epf - 0,343 сек
Время выполнения Пример3_2.epf - 0,516 сек
82. alexk-is 6549 07.06.10 15:54 Сейчас в теме
(60) Загрузил курсы валют за 12 лет. Получил следующие результаты для файловой версии.

Вариант 3. Обычное соединение. Завершено за ~35,5 сек.
Вариант 3. Оптимизированное соединение. Завершено за ~12,5 сек.
Гостинец. Оптимизированное соединение. Завершено за ~12,5 сек.
Починенный Гостинец. Оптимизированное соединение. Завершено за ~12,5 сек.

Разница в производительности очень не значительная :(
101. Ish_2 1117 07.06.10 18:20 Сейчас в теме
(82) Давай подробнее.
Рассматривается файловый вариант. Исследуются две обработки
"Гостинец.epf"
и "Пример 3_2" , скачанный в текущей теме сегодня в 18-20 мск.

Количество ежедневных курсов (подряд) с 1998 года по сегодняшний день составило в тестовой базе БП 1.6 - 4400 шт.
Замер времени исполнения запроса производился средствами ТВОЕЙ обработки.
Каждая обработка запускалась 3 разF.

Время выполнения Гостинец.epf - ~ 11.7 сек
Время выполнения Пример3_2.epf - ~ 17.7 сек
Выигрыш 1.5 раза.

Кто нас рассудит ? Помогите , люди добрые !
104. alexk-is 6549 07.06.10 22:16 Сейчас в теме
(101) Так. Был немного занят - делал сыну мечи.
Итак дома загрузил курсы в БП 1.6 - 8491 запись в регистре сведений Курсы валют по EUR и USD с 01.01.1999

Время выполнения Гостинец.epf - ~ 12.3 сек
Время выполнения Пример3_2.epf - ~ 12.6 сек
Время выполнения Пример3.epf - ~ 35.5 сек

51. Ish_2 1117 04.06.10 14:54 Сейчас в теме
Так я то текст темы смотрю ! А ты в файлах .
56. alexk-is 6549 04.06.10 15:27 Сейчас в теме
(51) "Пример 3" в статью вставить не решился. Не хочу пока народ пугать. В статье пока "Пример 2".
54. Ish_2 1117 04.06.10 15:08 Сейчас в теме
Представляешь , а если бы в языке запросов для
временных таблиц был возможен UPDATE ?
Ведь тогда - все эти выкрутасы с соединениеми по неравенству были не нужны !
Одна команда UPDATE - и всё !
58. anig99 2865 04.06.10 15:44 Сейчас в теме
(54) по поводу апдейта для решения проблем с нарастающими итогами говорено давно... Иначе оптимизированный запрос с соединением по неравенству занимает много страниц... Некоторые "гуру" даже разбираться не хотят (:
На самом такими темпами нужно ждать 1с 8.5 или 9.0, где будет реализована возможность редактирвания ВРЕМЕННЫХ таблиц и что-то типа UPDATE.
(57) там можно в меньше, чем 15 строчек уложиться...вопрос только в производительности... А производительсноть повышается 3 способами:
1. Наращивание железа
2. Оптимизация рутинных операций путем переписывания на assemblere (или другом языке)
3. Написанием сложного и длинного алгоритма, возможно с применением математических моделей.
55. Ish_2 1117 04.06.10 15:10 Сейчас в теме
Кхе-кхе ... Придется смотреть попристальнее . Вот блин...
57. Ish_2 1117 04.06.10 15:36 Сейчас в теме
А ты опубликуй этот длиннющий пакет.
А ниже приведи текст кода в 15-20 строчек решающий эту же задачу , причем в любом варианте быстрее чем запрос.
И вывод : дескать решайте сами !
200. Yashazz 4933 05.06.11 12:24 Сейчас в теме
(57) Эстер тоже любит наворотить запрос, листингов на 70, а потом выясняется, что кодом оно решается в 20 строк и быстрее, и прозрачнее. На мой взгляд, запрос ради запроса это уже искусство, а не прагматика, реально же надо искать золотую середину.
201. Ish_2 1117 05.06.11 13:38 Сейчас в теме
(200) Бог с ним , с этим штампом о золотой середине. Кто её видел ?
Прагматика должна опираться на исходные положения :
1. Данные хранятся только на сервере.
2. Любое обращение к данным есть запрос.
3. Эффективнее преобразовывать данные там , где они хранятся. Без перегонки на клиента.
4. Переводя решение на SQL -запрос , мы делаем его технологичнее (отвязываемся от слабости клиента).

Эти исходные положения диктуют совершенно определенный взгляд на решение любой задачи.
Тошнота от циклов , if-ов , case-ов, рекурсий - нормальная реакция здорового мозга.
Понятно , что без кодинга совсем не обойтись. НО.
Корявая попытка написать запрос полезнее двух корректно написанных процедур.
Долой кодинг ! Даешь прозрачный запрос !
202. hogik 447 05.06.11 16:31 Сейчас в теме
(201)
"Переводя решение на SQL -запрос , мы делаем его технологичнее (отвязываемся от слабости клиента)."(с)
Отвязываясь от "слабости клиента"(с) происходит отвязывание и от мозгов клиента. Если мозгов (алгоритмических возможностей) "запросного" сервера хватает для решения поставленной задачи, то - да. А если не хватает? Упрощаем (извращаем) постановку задачи? Подстраиваем схему БД под средства (запросы) обработки данных? Громоздим "средний уровень"? И всё это ради утверждения "Любое обращение к данным есть запрос"(с). Откажитесь от использования только запросов, и получите "золотую середину"(с). Все так просто... :-)
203. Ish_2 1117 05.06.11 16:52 Сейчас в теме
(202) Всё как обычно, Владимир ?

а) Ничего не утверждаем,
б) ничего не предлагаем

Но :

в) спорим
в) сомневаемся ,
г) отрицаем ,
е) отказываемся ...

С одной стороны , имеете право . Так безопаснее , чем лезть на рожон
с утверждениями и предложениями : не "задолбят".
С другой стороны , блекло и тускло. Всё как обычно...
kulabuha; +1 Ответить
204. hogik 447 05.06.11 17:03 Сейчас в теме
(203)
Всё как обычно, Игорь ? :-)
Я утверждаю, предлагаю, делаю...
И если Ваш гонор не позволяет понять, даже, мои разработки, то пишите запросы дальше.
205. Ish_2 1117 05.06.11 17:05 Сейчас в теме
206. hogik 447 05.06.11 17:17 Сейчас в теме
(205)
Игорь.
Для разговора требуется от собеседников, чтобы они читали не только свои сообщения.
Или, читая, не заменяли все слова собеседника на слово - "восьмерка". У Вас это не получается...
Ок.(с) :-)
P.S.
Сделаю еще одну попытку достучаться: http://citforum.ru/database/articles/seltzer/
rdk_a; artbear; cool.vlad4; +3 Ответить
211. cool.vlad4 2 06.06.11 12:07 Сейчас в теме
212. Ish_2 1117 06.06.11 12:14 Сейчас в теме
(211) Спасибо за информацию.
69. Ish_2 1117 07.06.10 14:03 Сейчас в теме
А пока помечтаем и о другой необходимой возможности в языке запросов 1с :
указывать в полях выборки запрос . Разумеется , такая возможность давно реализована в диалектах SQL.
И тогда вместо соединения по неравенству можно следующее, многократно более эффективное :

Выбрать 
КВ.Период  как ТекущийПериод,
(Выбрать Первые 1 
КВвнутр.Период из РегистрСведений.КурсыВалют как КВвнутр
ГДЕ  КВвнутр.Период<КВ.Период  
Упорядочить ПО КВвнутр.Период Убыв) как ПредыдущийПериод 
ИЗ РегистрСведений.КурсыВалют как КВ
71. vip 07.06.10 14:19 Сейчас в теме
(69)
Разумеется , такая возможность давно реализована в диалектах SQL.

Разумеется.
И в 1С++ тоже.
Все чаще ловлю себя на мысли, что с 1С++ (в связке с FormEx, разумеется) не осталось ничего, о чем стоит помечтать.
Пора, наверное, на восьмерку. Освежить, так сказать, мечтательный раздел мозга.
72. пользователь 07.06.10 14:31
Сообщение было скрыто модератором.
...
73. пользователь 07.06.10 14:59
Сообщение было скрыто модератором.
...
76. пользователь 07.06.10 15:22
Сообщение было скрыто модератором.
...
Для отправки сообщения требуется регистрация/авторизация