Заметочки про 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 и МассивТипов[0] = ТипЧисло Тогда
           
КолонкаТЧ.ВыделятьОтрицательные = Истина;
           
КолонкаТЧ.ОтображатьИтогиВПодвале = Истина;
           
КолонкаТЧ.ГоризонтальноеПоложениеВПодвале = ГоризонтальноеПоложение.Право;
           
мВыводитьПодвал = Истина;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

ТабличноеПоле.Подвал = мВыводитьПодвал;


К вопросу "Почему не воспользоваться методом СодержитТип?". Метод СодержитТип не дает однозначного ответа на вопрос "Какой тип реквизита?". Он только подтверждает, что реквизит может быть, например, числом. А если реквизит составного типа?

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

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


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

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

Предлагаю простенькую функцию, в которой данный "эффект" устранен.

Функция РасчетСуммыПоЯчейкам(ТабличноеПоле) Экспорт

   
Сумма = 0;
   
КоличествоСумм = 0;
   
СоответствиеЯчеек = Новый Соответствие;
   
ОписаниеТипов = Новый ОписаниеТипов("Число");

    Для Каждого
ВыделеннаяОбласть Из ТабличноеПоле.ВыделенныеОбласти Цикл
        Для
Индекс1 = ВыделеннаяОбласть.Лево По ВыделеннаяОбласть.Право Цикл
            Для
Индекс2 = ВыделеннаяОбласть.Верх По ВыделеннаяОбласть.Низ Цикл
               
Область = ТабличноеПоле.Область(Индекс2, Индекс1, Индекс2, Индекс1);
               
Значение = ОписаниеТипов.ПривестиЗначение(Область.Текст);
               
СоответствиеЯчеек.Вставить(Область.Имя, Значение);
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;

    Для каждого
Ячейка Из СоответствиеЯчеек Цикл
       
Значение = Ячейка.Значение;
        Если
Значение <> 0 Тогда
           
Сумма = Сумма + Значение;
           
КоличествоСумм = КоличествоСумм + 1;
        КонецЕсли;
    КонецЦикла;

   
КоличествоВыделено = СоответствиеЯчеек.Количество();
    Если
КоличествоВыделено > 1 Тогда
       
ТекстИтогов = " Выделено ячеек: " + КоличествоВыделено
            + "    Просуммировано ячеек: " + КоличествоСумм
            + "    Итого по выделенным ячейкам: " + Сумма;
    Иначе
       
ТекстИтогов = "";
    КонецЕсли;

    Возврат
ТекстИтогов;

КонецФункции
// РасчетСуммыПоЯчейкам()


Использование метода ПривестиЗначение вместо встречающегося в типовых конфигурациях преобразования через Попытка, дает в среднем ускорение на преобразовании типов в 4 раза. А использование отложенного вызова функции расчета суммы всего лишь на 0.2 секунды с легкостью решает проблему с задержками при выделении пользователем большого количества ячеек.

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

Ещё про работу с типами данных можно почитать ниже...

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


Про хитрые запросы. Не стандартное использование итогов

А что сейчас? А сейчас запросы. Не все конечно, а несколько каких-нибудь простеньких и интересненьких. Например, построение запросом двухуровневого дерева структуры задолженности для формы элемента справочника Контрагенты. Исходим из того, что чем меньше команд, тем быстрее работает. Ну, обычно быстрее. Ведь 1С это все-таки интерпретатор.

Итак, строим запросом дерево по структуре задолженности как на картинке ниже, смотрим закладку Задолженность. На закладке добавлено табличное поле с деревом значений Задолженность.

Получаем в детальных строках договоры контрагентов, а в итоговых строках организации. Приведенный ниже в качестве примера программный код будет работать в УТ и УПП. Для остальных конфигураций код запроса нужно немного подправить.

Запрос = Новый Запрос(
   
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
    | ДоговорыКонтрагентов.Организация КАК Организация,
    | ДоговорыКонтрагентов.Ссылка КАК СтруктураДоговоров,
    | -ЕСТЬNULL(ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток, 0) КАК Сумма
    |ИЗ
    | Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
    |  ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(
    |       , Контрагент = &Контрагент) КАК ВзаиморасчетыОстатки
    |  ПО ДоговорыКонтрагентов.Ссылка = ВзаиморасчетыОстатки.ДоговорКонтрагента
    |ГДЕ
    | ДоговорыКонтрагентов.Владелец = &Контрагент
    |
    |УПОРЯДОЧИТЬ ПО
    | Организация,
    | СтруктураДоговоров
    |ИТОГИ
    | Организация КАК СтруктураДоговоров,
    | СУММА(Сумма)
    |ПО
    | Организация"
);
Запрос.УстановитьПараметр("Контрагент", Ссылка);
Задолженность = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);


Получилось простенько и симпатично.

В итогах Организация используется без агрегатной функции - это возможно потому, что по Организации выполняется группировка. Ещё примеры построения двухуровневого дерева можно посмотреть здесь.

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


Про хитрые запросы. Тэта-соединения 1

Кажется тема с запросами получилась интересной. Тогда ещё один примерчик "Пример 2", который можно подержать в руках - изменение курсов валют с группировкой по месяцам.

 

Запрос = Новый Запрос(
   
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |   КурсыВалют.Период КАК Период1,
    |   МАКСИМУМ(ЕСТЬNULL(КурсыВалют1.Период, КурсыВалют.Период)) КАК Период2
    |ПОМЕСТИТЬ Соединения
    |ИЗ
    |   РегистрСведений.КурсыВалют КАК КурсыВалют
    |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют1
    |       ПО КурсыВалют.Валюта = КурсыВалют1.Валюта
    |           И КурсыВалют.Период > КурсыВалют1.Период
    |           И (КурсыВалют1.Валюта = &Валюта)
    |ГДЕ
    |   КурсыВалют.Валюта = &Валюта
    |
    |СГРУППИРОВАТЬ ПО
    |   КурсыВалют.Период
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |   КурсыВалют.Период КАК Период,
    |   НАЧАЛОПЕРИОДА(КурсыВалют.Период, МЕСЯЦ) КАК ПериодДляИтогов,
    |   КурсыВалют.Курс,
    |   КурсыВалют.Курс - КурсыВалют1.Курс КАК ИзменениеКурса
    |ИЗ
    |   РегистрСведений.КурсыВалют КАК КурсыВалют
    |       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Соединения КАК Соединения
    |           ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют1
    |           ПО Соединения.Период2 = КурсыВалют1.Период
    |               И (КурсыВалют1.Валюта = &Валюта)
    |       ПО КурсыВалют.Период = Соединения.Период1
    |           И (КурсыВалют.Валюта = &Валюта)
    |ИТОГИ
    |   ПериодДляИтогов КАК Период,
    |   СУММА(ИзменениеКурса)
    |ПО
    |   ПериодДляИтогов"
);
Запрос.УстановитьПараметр("Валюта", Валюта);
КурсыВалют = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); 


Аналогично можно построить и другие запросы, в которых отслеживается изменение значений показателей, например, изменение цен.
Скачать Пример 2...

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


Про хитрые запросы. Тэта-соединения 2

"Продолжаем разговор". В качестве ещё одного примера работы с запросами добавлен "Пример 3", в котором реализовано получение периодов действия установленных значений периодических регистров сведений. Перечитал предыдущее предложение - получилось немного тяжеловато, ну, да ладно. Предложенное решение в "Пример 3" может быть использовано, например, при решении задач по расчету заработной платы или при начислениях в ЖКХ.

Пример 3

Фишка этого запроса в том, чтобы убрать повторяющиеся данные из цепочки, а оставить только точки перехода с датами, когда данный переход был выполнен.
Т.е. для цепочки значений 0, 0, 1, 1, 1, 0, 0, 0, 1
должны остаться только значения 0, 1, 0, 1 и соответственно даты, когда значения в цепочке поменялись.

И несколько слов об оптимизации тэта-соединений. Во вложении 3 варианта реализации с использованием запросов, поэтому в статье текстов этих запросов нет - очень объемно получается. При больших объемах информации оптимизированный вариант запросов дает значительное ускорение, особенно в файловой версии. Это собственно и не удивительно, оптимизатор SQL сервера делает своё дело. Автором одного из вариантов является Ish_2 - это вариант "Гостинец".

Скачать Пример 3 без оптимизации...
Скачать Пример 3 с оптимизацией...
Скачать Гостинец от Ish_2...

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

Также интересный эффект получается при использовании индексов для временных таблиц. Попробуйте поиграть с объемами данных и галочками "Использовать индексы в запросе". Обещаю весьма неожиданный результат. Smile

Так уж получилось, что большинство комментариев к данной статье посвящено именно этому запросу. Видимо в нем есть тайное знание доступное теперь всем желающим.

Ещё про запросы можно посмотреть здесь, а про запросы с датами можно посмотреть здесь.

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


Про хитрые запросы. Тэта-соединения 3. Строки неограниченной длины

Делал загрузку прайсов из Excel. Если прайс и справочник Номенклатура маленькие, то конечно всё работает сравнительно быстро. Несколько секунд и сопоставление выполнено вне зависимости от того выполняется ли поиск в одном запросе или используется поиск по реквизитам справочника в цикле. Но в моём случае и справочник и прайс содержат десятки тысяч позиций. Всё бы ничего, но уж очень медленно получается при поиске соответствий Номенклатуры по полному наименованию.

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

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

Запрос = Новый Запрос(
   
"ВЫБРАТЬ
    |   ПОДСТРОКА(ТаблицаДляПоиска.НоменклатураXLS, 1, 40) КАК НоменклатураXLS_Индекс,
    |   ТаблицаДляПоиска.НоменклатураXLS КАК НоменклатураXLS
    |ПОМЕСТИТЬ ТаблицаДляПоиска
    |ИЗ
    |   &ТаблицаДляПоиска КАК ТаблицаДляПоиска
    |
    |ИНДЕКСИРОВАТЬ ПО
    |   НоменклатураXLS_Индекс
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |   СправочникНоменклатура.Ссылка КАК Номенклатура,
    |   СправочникНоменклатура.НаименованиеПолное КАК НоменклатураНаименование
    |ИЗ
    |   Справочник.Номенклатура КАК СправочникНоменклатура
    |       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаДляПоиска КАК ТаблицаДляПоиска
    |       ПО ПОДСТРОКА(СправочникНоменклатура.НаименованиеПолное, 1, 40) = ТаблицаДляПоиска.НоменклатураXLS_Индекс
    |           И ПОДСТРОКА(СправочникНоменклатура.НаименованиеПолное, 1, 1000) = ТаблицаДляПоиска.НоменклатураXLS
    |ГДЕ
    |   СправочникНоменклатура.ЭтоГруппа = ЛОЖЬ
    |   И СправочникНоменклатура.Услуга = ЛОЖЬ"
);

Запрос.УстановитьПараметр("ТаблицаДляПоиска", ТаблицаДляПоиска);
РезультатЗапроса = Запрос.Выполнить();

Решение лежало на поверхности. Правда?

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


Про пакетные запросы. Индексы во временных таблицах

Сегодня с утра была пятница. Пришло время открыть великую тайну-у-у-у.

В пакетных запросах в качестве источника данных часто выступает временная таблица. У временной таблицы есть возможность создавать индексы. В каких случаях создание индекса может ускорить выполнение запроса, а в каких наоборот?

Начнем с того, что посмотрим, когда не нужно создавать индексы. Ведь на создание индекса тратится время и ресурсы. Если индекс не будет использоваться, то его создание только замедлит выполнение запроса. Нет смысла создавать индексы, если временная таблица очень маленькая. Нет смысла создавать индексы, если временная таблица соединяется с другой таблицей по полям, которые во второй таблице уже проиндексированы.

Так когда же имеет смысл создавать индексы? Оказывается всё очень просто. Индексы имеет смысл создавать в случае, если выполняется условие сравнения на равенство. В качестве примера можно посмотреть запрос в предыдущем пункте Заметочек. Там как раз используется индекс именно в подобной ситуации.

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

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


Про СКД и запросы с итогами

В комментариях к публикациям Как выгрузить итоги запроса в одну колонку ? и Запросики для восьмерочки развернулась настоящая битва между Ish_2 и tango. Просто жуть какая-то. Но вопросы были подняты очень интересные. Я очень внимательно следил за ходом обсуждения и после очередного комментария с примером обработки от Ish_2, появилась обработка, которая демонстрирует построение многоуровнего дерева в одной колонке "Поле4" с использованием как запроса с итогами, так и СКД. За основу была взята обработка, приложенная к комментарию.

 

Ах, да. "В чем же фишка?" - спросите вы. Всё просто. Из СКД сложное многоуровневое дерево в дерево значений выгружается быстрее. На контрольном примере разница составила в 30 раз. При использовании запроса сам запрос выполняется сравнительно быстро, а вот скорость выгрузки результата запроса в дерево значений оставляет желать лучшего.

Так как программного кода как такового при использовании СДК нет, то не совсем очевиден способ реализации. Куда смотреть? Смотреть нужно в пользовательских полях. 

 

Собственно весь вывод данных в обработке при использовании СКД построен на пользовательских полях. Это сделано для того, чтобы сохранить нужную последовательность колонок в дереве значений. Если порядок следования реквизитов не важен или реквизиты не нужны в результирующем дереве значений, то и добавлять реквизиты в пользовательские поля не нужно.
Скачать Пример 8...

Но как вы, наверное, догадываетесь, "Пример 8" это не единственный вариант реализации многоуровневого дерева в одной колонке с использованием СКД. Поэтому был добавлен "Пример 9", в котором "Поле4" строится не через пользовательские поля, а через ресурсы. Чем он лучше варианта в "Пример 8"? Работает немного быстрее предыдущего примера и названия колонок в результирующем дереве значений получаются более "ожидаемые".

Особенностью реализации "Пример 9" является расположение ресурсов в группировках. Это сделано только для того, чтобы управлять порядком следования колонок в результирующем дереве значений. Иначе колонки с группировками будут расположены впереди, а уже за ними колонка "Поле4". Чтобы можно было управлять порядком расположения реквизитов необходимо вначале сформировать группировки по реквизитам, а затем реквизиты описать как ресурсы. При необходимости формирования определенного порядка следования колонок в результирующем дереве необходимо для некоторых группировок заменить состав выбранных полей с Авто на требуемый. Если порядок следования реквизитов не важен или реквизиты не нужны в результирующем дереве значений, то и добавлять реквизиты в ресурсы не нужно.
Скачать Пример 9...

Возможность выбора варианта реализации многоуровнего дерева в одной колонке дерева значений есть. В данной публикации приведено 4 способа. Выбирайте. Реализуйте.

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


Про дерево значений

Уже были рассмотрены примеры заполнения дерева значений с использованием запроса и СКД. Сейчас предлагаю рассмотреть несколько иной вариант работы с деревом значений.

Краткое описание исходных условий для этого варианта. Работаем с деревом значений имеющим 2 уровня. Для первоначального отображения формируется только первый уровень строк дерева и добавляется по одной пустой строке на втором уровне для отображения плюсиков возле строк. Первый уровень свернут. Далее, при разворачивании пользователем строки первого уровня, пустая строка второго уровня заменяется на необходимый набор данных. Необходимый набор данных получаем, например, запросом в виде таблицы значений.

Что мы получаем при использовании такого варианта работы с деревом? Быстрое первоначальное отображение дерева для пользователя. Что ещё? Немного больше кода при работе с деревом.

Вот тут мы и попляшем немного вокруг вопроса: "Как поместить необходимый набор данных в строки второго уровня?" Есть варианты.

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

Процедура ДеревоЗначенийПередРазворачиванием(Элемент, СтрокаДереваЗначений, Отказ)

    Если
СтрокаДереваЗначений.УровеньРазвернут Тогда
        Возврат;
    КонецЕсли;

   
СтрокиГруппировки = СтрокаДереваЗначений.Строки;
   
СтрокиГруппировки.Очистить();

   
ТаблицаЗначений = ПолучитьНаборНеобходимыхДанных(СтрокаДереваЗначений);

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

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

   
СтрокаДереваЗначений.УровеньРазвернут = Истина;

КонецПроцедуры
// ДеревоЗначенийПередРазворачиванием()

Циклы также можно оформить в одну строку, но для сохранения читаемости кода этого не сделано. На контрольном примере предложенный вариант заполнения был производительнее в 4 раза. Конечно же всё зависит от исходных данных и на других данных результаты могут быть другие, но о том, что 1С всё таки интерпретатор не стоит забывать. Правило "Чем меньше команд, тем быстрее работает программа" остается актуальным и по сей день.

Скачать пример...
Ещё про дерево значений можно посмотреть здесь...

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


Про таблицу значений

Увидел публикацию Преобразование ТаблицыЗначений во Временную таблицу автора sashapere, в которой ТаблицаЗначений с колонками неопределенного типа подготавливается для использования в запросах. Т.е. проверяются типы значений в колонках, а затем создается новая таблица значений с колонками нужного типа и данные переносятся в неё. Такую таблицу значений уже можно использовать в запросах, передавая её в качестве параметра или источника данных для ПостроителяЗапросов и ПостроителяОтчетов.

Мне показалось, что код не очень эффективен и это можно сделать быстрее. Вот что из этого получилось.

КолонкиТаблицыЗначений = ТаблицаЗначений.Колонки;
Для
Индекс = 0 По КолонкиТаблицыЗначений.Количество() - 1 Цикл
   
МассивЗначений = ТаблицаЗначений.ВыгрузитьКолонку(0);

   
// Получаем типы значений, которые используются в колонке
   
Соответствие = Новый Соответствие;
   
СтТипЗначения = ТипЗнч(Неопределено);
    Для каждого
Значение Из МассивЗначений Цикл
       
ТипЗначения = ТипЗнч(Значение);
        Если
СтТипЗначения <> ТипЗначения Тогда
           
СтТипЗначения = ТипЗначения;
           
Соответствие.Вставить(ТипЗначения);
        КонецЕсли;
    КонецЦикла;

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

   
// Удаляем старую колонку без установленного типа значения
   
ИмяКолонки = КолонкиТаблицыЗначений[0].Имя;
   
КолонкиТаблицыЗначений.Удалить(0);
    Если
МассивТипов.Количество() = 0 или МассивТипов.Количество() = 1 и МассивТипов[0] = ТипЗнч(Неопределено) Тогда
       
// Устанавливаем тип значения по умолчанию для колонок, в которых не установлены значения
        // По умолчанию Строка
       
КолонкиТаблицыЗначений.Добавить(ИмяКолонки, Новый ОписаниеТипов("Строка"));
    Иначе
       
// Создаем и заполняем колонку с установленным типом
       
ТаблицаЗначений.ЗагрузитьКолонку(МассивЗначений,
           
КолонкиТаблицыЗначений.Добавить(ИмяКолонки, Новый ОписаниеТипов(МассивТипов)));
    КонецЕсли;
КонецЦикла;

Допускаю, что и этот код тоже можно оптимизировать. Нет предела совершенству. Поэтому предлагаю сравнить с другими вариантами в "Примере 10". Авторы двух добавленных вариантов sashapere и i132.

Скачать Пример 10...

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


Про работу с COMОбъект("V81.Application") или как разогнать 1С в 1000 раз

Очень интересная публикация OLE - монитор автора ghostishe, в которой приложена обработка COM MONITOR. Мне как раз необходимо было сверить справочники в двух базах данных. В предложенной обработке всё понятно, но скорость получения данных из подключенной базы мне показалась крайне низкой. После небольшого эксперимента удалось получить такие же данные как в этой обработке, только в 30 раз быстрее, а после небольшой модификации удалось поднять скорость получения данных из подключенной базы ещё в 5 раз. Добавил "Пример 6". В предлагаемом примере разница во времени выполнения по сравнению с исходным образцом может составить от 15 до 1500 раз - это зависит от состояния базы данных и от объема получаемых данных. Чем больше данных нужно получить, тем больше может получиться разница.

Итак, что и как сравниваем. Во вложении 2 обработки: COM MONITOR и Пример 6 для COM Monitor.

COM MONITOR - во вложении, это почти оригинальная обработка, в которую добавлены команды для выполнения замера времени получения данных из подключенной базы. COM MONITOR работает в двух режимах: с закрытым окном подключенной базы данных и с открытым. Т.к. с открытым окном обработка работает очень медленно, то для сравнения берем только замер с закрытым окном.

Пример 6 для COM Monitor - эта обработка построена на основе COM MONITOR, ну, или почти так. Во всяком случае основной функционал (идею) постарался сохранить. Пример 6 для COM Monitor работает в двух режимах: с использованием дополнительной обработки и без неё. При установке соответствующего флажка используется дополнительная внешняя обработка, которая запускается в подключенной базе данных. Данные внешней обработке передаются через COMSafeArray, который в дальнейшем и обрабатывается. Обратно данные передаются аналогичным образом. Ни каких внешних компонент, всё по честному. AutoIt используется только чтобы вернуть фокус в 1С:Предприятие, а WScript для замера времени выполнения.

Скачать COM MONITOR от ghostishe...
Скачать Пример 6 для COM Monitor...

А теперь главный вопрос: за счет чего получается столь значительное ускорение? Ответ прост: за счет снижения количества разыменований. Да, да. На такой пустяковой операции как разыменование можно добиться столь значительного ускорения. Чем меньше точек в тексте модуля, тем выше скорость его выполнения. Разница особенно заметна при использовании COMОбъект(). Т. к. кроме разыменования здесь немаловажную роль играет передача данных между приложениями, то именно этот момент и решает применение дополнительной обработки. Данные между приложениями передаются всего 2 раза: туда и обратно.

Запускайте, тестируйте, удивляйтесь. Smile

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


Про работу с НастройкаПериода, ЗаполнитьЗначенияСвойств и вообще

Вводные данные, ну, или описание исходной задачи были следующие:

  • Есть форма Основная, в которой есть возможность настраивать период. Для настройки периода используется объект НастройкаПериода, который вызывается на редактирование по кнопке.
  • Также ещё есть форма Настройка, в которой также можно редактировать период, но не только через объект НастройкаПериода, а ещё и через поля ввода дат начала и окончания периода.
  • Необходимо чтобы настройки указанные в форме Настройка можно принять и перенести в форму Основная или отказаться от сделанных изменений.

Казалось бы, всё просто, нужно в форме Настройка создать ещё один объект НастройкаПериода и заполнить его свойства. Например, так:

Функция СкопироватьНустройкуПериода(НастройкаПериодаИсходный)
   
НастройкаПериодаРезультат = Новый НастройкаПериода;
   
ЗаполнитьЗначенияСвойств(НастройкаПериодаРезультат, НастройкаПериодаИсходный);
    Возврат
НастройкаПериодаРезультат;
КонецФункции

Вот тут и начинается самое интересное. При использовании команды ЗаполнитьЗначенияСвойств свойства объекта НастройкаПериодаРезультат заполняются неверно, т.е. свойства, конечно, заполняются, но не так как в исходном объекте. А в некоторых случаях вообще возникает ошибка.

Почему нельзя просто присвоить? НастройкаПериодаРезультат = НастройкаПериодаИсходный; Потому, что получится не новый объект, а ссылка на исходный объект.

Один из вариантов создания нового объекта НастройкаПериода может быть таким:

Функция СкопироватьНустройкуПериода(НастройкаПериодаИсходный)
    Возврат
ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(НастройкаПериодаИсходный));
КонецФункции

С этим разобрались и новый объект НастройкаПериода у нас есть - можно редактировать. Теперь в случае отказа можно просто ничего не делать. Закрыть форму Настройка и всё.

Теперь рассмотрим сохранение (перенос) измененных данных периода в основную форму. Если редактирование периода было выполнено через объект НастройкаПериода, то всё просто.

НастройкаПериодаИсходный = НастройкаПериодаРезультат;

А вот в случае редактирования дат периода не всё так однозначно. Потому что способ, который используется в типовых конфигурациях, в некоторых случаях опять же дает неожиданный результат. Т.е. иногда срабатывает, а иногда нет. Вот код с заплаткой.

НастройкаПериодаИсходный = НастройкаПериодаРезультат;

Если
ДатаНачала <> НастройкаПериодаИсходный.ПолучитьДатуНачала()
    или
ДатаОкончания <> НастройкаПериодаИсходный.ПолучитьДатуОкончания() Тогда
   
НастройкаПериодаИсходный.УстановитьПериод(ДатаНачала, ?(ДатаОкончания = '00010101', ДатаОкончания, КонецДня(ДатаОкончания)));

   
// Заплатка
   
Если ДатаНачала <> НастройкаПериодаИсходный.ПолучитьДатуНачала()
        или
ДатаОкончания <> НастройкаПериодаИсходный.ПолучитьДатуОкончания() Тогда
       
НастройкаПериодаИсходный = Новый НастройкаПериода;
       
НастройкаПериодаИсходный.ВариантНачала = ВариантГраницыИнтервала.КонкретнаяДата;
       
НастройкаПериодаИсходный.ВариантОкончания = ВариантГраницыИнтервала.КонкретнаяДата;
       
НастройкаПериодаИсходный.ДатаНачала = ДатаНачала;
       
НастройкаПериодаИсходный.ДатаОкончания = ДатаОкончания;
    КонецЕсли;
КонецЕсли;

Как видно из кода, заплатка в качестве периода устанавливает ПроизвольныйПериод. Ах, да. Не видно. Но всё равно в качестве периода устанавливается ПроизвольныйПериод.

Я прекрасно понимаю, что здесь рассмотрен некоторый частный случай, который в типовых конфигурациях не встречается. Но. Есть ли что-то особенное в постановке задачи? По моему нет. Так почему же такой подход не используется в типовых конфигурациях? Не связано ли это с тем, что разработчики типовых конфигураций фирмы 1С не смогли победить объект НастройкаПериода. Smile

В качестве примера приведу "Универсальный отчет", в котором также есть как Основная форма, так и форма Настройки. При этом если изменить период в форме Настройки, он тут же изменяется и в Основной форме. Т.е. закрыв форму Настройки можно отказаться от всех сделанных изменений кроме изменений периода. Вот такие пироги.

Скачать пример...

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


Про итоги в регистрах накопления

Пришло время испытать публикацию MMF на довольно большой базе данных. Обнаружился очень интересный факт. Таблица итогов по регистру остатков ЗаказыПокупателей была больше таблицы самого регистра в 50 раз и составляла 20% от всей базы УПП. Все попытки побороть это явление "цивилизованными" способами привели к уменьшению таблицы итогов лишь в 2.5 раза, при этом таблица самого регистра накопления выросла в 2 раза. Тогда было принято решение отключить расчет итогов по этому регистру. На производительности и функциональности это ни как не сказалось, а вот на размерах базы данных и на размерах архивных копий отразилось самым положительным образом.

Т.к. через интерфейс это сделать не получилось, то вот, собственно, код:

РегистрыНакопления.ЗаказыПокупателей.УстановитьПериодРассчитанныхИтогов('00010101');

С методической точки зрения, возможно, это не самое лучшее решение. Но меня поразила его эффективность и простота.

Скачать пример...

Для просмотра внутренней структуры файловой базы данных 1С:Предприятия 8 предлагаю обратить внимание на Tool_1CD.

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


Про танцы с бубном

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

Что есть? Конфигурация на базе типового решения 1С:Бухгалтерия предприятия 8 (2.0.31.36) - Учет в МФО (релиз 2.0.31.36), разработчик Фирма "Альянс-Информ". База работает на платформе 8.2.13.219.

Что хотим? Перейти на платформу 8.2.15.294.

Казалось бы, что ничего сложного нет. Установить платформу, запустить базу, сконвертировать базу при запуске и работать в своё удовольствие. Но не тут то было. После конвертации база почему-то начинает падать при запуске на любой версии платформы, начиная с 8.2.14.519. При этом на 8.2.13.219 всё работало как в режиме Конфигуратор, так и в режиме 1С:Предприятие.

Восстанавливаем архив, лезем в конфигуратор и видим, что конфигурация на поддержке без возможности изменения, т.е. типовая. Нужно что-то делать. Но что? Тестирование/исправление, реструктуризация, выгрузка/загрузка - все ранее применявшиеся движения шаманского танца не помогли. После конвертации база падает при запуске.

Что дальше? Разучим новые движения незамысловатого шаманского танца. Начинаем сначала. Заходим в конфигуратор платформы 8.2.13.219 пустой базы. Восстанавливаем архив базы данных из DT-файла. Сохраняем конфигурацию в CF-файл в меню Конфигурация - Сохранить конфигурацию в файл. Включаем возможность изменения в меню Конфигурация - Поддержка - Настройка поддержки. Обновляем конфигурацию базы данных (F7) или в меню Конфигурация - Обновить конфигурацию базы данных. Выходим из конфигуратора. Заходим в конфигуратор платформы 8.2.15.294. Выбираем ту же базу. Соглашаемся с предложением сконвертировать базу данных. Загружаем выгруженный ранее CF-файл в меню Конфигурация - Загрузить конфигурацию из файла. Обновляем конфигурацию базы данных (F7) или в меню Конфигурация - Обновить конфигурацию базы данных. Вот собственно и всё. Получаем работающую базу под платформой 8.2.15.294 с типовой конфигурацией на поддержке без возможности изменения. Т.е. всё то, что и хотелось получить первоначально.

Вывод. В арсенале настоящего шамана может быть много разных танцев, но архивную копию делать нужно.

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


Про использованные материалы

При подготовке статьи использованы также материалы других авторов. Если вам понравились их обработки, то можете поставить плюсик на их публикациях. Думаю, что они не будут против. Все ссылки есть в статье.

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


Про Разукрашку

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

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


Последний штрих

Идя навстречу пожеланиям читателей, фиксирую изменения в различных редакциях публикации.

07.09.2010. Добавил в заметочки "Про получение строки пробелов длиной 10000 символов"

12.10.2010. Добавил в заметочки "Про работу с COMОбъект("V81.Application") или как разогнать 1С в 1000 раз" 

12.01.2011. Добавил в заметочки "Про СКД и запросы с итогами" и два примера реализации многоуровнего дерева значений в одной колонке с помошью СКД

03.08.2011. Добавил в заметочки "Про дерево значений"

29.08.2011. Добавил в заметочки "Про типы данных. Расчет сумм по выделенным ячейкам табличного поля". Обновил Пример3_2.epf. Теперь Гостинец.epf "отдыхает"

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

12.10.2011. Добавил в заметочки к разделу "Про циклы в одну строку" обработку для формарования программного кода в одну строку.

13.10.2011. Добавил в заметочки "Про итоги в регистрах накопления"

17.11.2011. Добавил про разбор длинных строк в массив с возможностью предварительной обработки данных. Обновил Пример 7.

19.01.2012. Добавил в заметочки "Про работу с НастройкаПериода, ЗаполнитьЗначенияСвойств и вообще"

31.01.2012. Добавил в заметочки "Про танцы с бубном"

09.03.2012. Добавил в заметочки "Про хитрые запросы. Тэта-соединения 3. Строки неограниченной длины"

23.03.2012. Добавил в заметочки "Про пакетные запросы. Индексы во временных таблицах"

22.06.2012. Добавил в заметочки "Про таблицу значений"

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

 

01.06.2010 /Константинов Алексей Викторович/
Редакция от 22.06.2012

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

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

См. также

Механизмы платформы 1С Разработчик Бесплатно (free)

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

16.07.2025    45524    TitanLuchs    109    

156

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

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

19.06.2025    18558    zeegin    15    

64

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

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

03.02.2025    25956    bayselonarrend    127    

68

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

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

30.01.2025    33146    user2122906    10    

69

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

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

17.01.2025    55495    user2122906    13    

63

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

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

14.01.2025    46653    dsdred    110    

160

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

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

23.06.2024    40344    bayselonarrend    24    

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

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

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

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

Почти в 2 раза. Тоже не плохо.
12. alexk-is 6550 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 6550 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 2343 01.06.10 15:19 Сейчас в теме
Для каждого СтрокаТЗ Из Таблица1 Цикл ЗаполнитьЗначенияСвойств(Таблица2.Добавить(), СтрокаТЗ) КонецЦикла;


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

Или я чего то не понял?
7. alexk-is 6550 01.06.10 15:41 Сейчас в теме
(5) Я имел ввиду вариант Таблица = Таблица1 + Таблица2 + Таблица3 + ... ТаблицаN
8. e.kogan 1909 01.06.10 15:42 Сейчас в теме
Вот за заход с итоговыми полями в запросе большое спасибо, раньше не встречала.
9. alexk-is 6550 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 6550 01.06.10 16:02 Сейчас в теме
(8) Ну, хоть кого-то удивил.
13. anig99 2867 01.06.10 16:38 Сейчас в теме
хммммм...очень похоже всё-таки на баг компилятора...Скорость работы программы НЕ ДОЛЖНА зависеть от таких вещей...
Душелов; Шёпот теней; +2 – Ответить
22. WKBAPKA 216 02.06.10 08:37 Сейчас в теме
2(13): вот и я о том подумал, на самом деле, одна строка или 6 строк, машине (компилятору) по барабану, для нее на вход поступает линейный поток символов (включая управляющие символы). И какая тут разница, сколько строк или пробелов? Это разве что, время разбора лексем увеличивается за счет работы со строками, типа, чем больше пробелов и прочих не значащих символов, тем больше время разбора, но что бы в два раза!!!
14. ildarovich 8066 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 6550 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 2867 02.06.10 08:55 Сейчас в теме
(19) к тому же множество выкладок по оптимизации кода идет в сторону сокращения циклов или полного их устранения за счет запросов/переноса на сервер...
20. anig99 2867 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 6550 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 6550 02.06.10 19:01 Сейчас в теме
(29) Вот пока выложил только скриншот "Пример 3". Как думаешь, это будет интересно?
В двух словах - там по периодическому регистру сведений КурсыВалют вычисляются периоды действия курсов и ещё ряд показателей, при этом исключаются записи в которых курс установлен такой же как в предыдущей записи.
31. Ish_2 1117 02.06.10 19:19 Сейчас в теме
(31) Пока замечание.
Оформлял бы запросы с помощью временных таблиц. И надежнее в выполнении и нагляднее. Уж сколько говорено на эту тему ...
И 1с рекомендует обходиться без вложенных запросов.
34. alexk-is 6550 02.06.10 21:55 Сейчас в теме
(31) Переделал на пакетный запрос.
Однако вопрос в (30) был не про "Пример 2", а про "Пример 3".
32. Ish_2 1117 02.06.10 19:27 Сейчас в теме
Кстати , по пред.сообщению . А я получал такие двухуровневые деревья в "лоб", т.е. в цикле прокручивал выборку и заполнял каждую строку дерева. Твой способ ,насколько я понимаю, побыстрее и поизящнее.

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

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

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

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



Шёпот теней; +1 – Ответить
39. alexk-is 6550 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. Шёпот теней 1787 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 6550 04.06.10 13:36 Сейчас в теме
(41) :)
- Как-то не очень получается...
- Конечно можно и получше нарисовать. Ну, там в трехмерной проекции...
- А я бы нарисовал немного в профиль
- Да потому, что у вас всё в профиль
© Миссия Клеопатра


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

Первый запрос не изменился. Во втором поля выборки, два внутренних соединения, Итоги - как были так и остались.
50. alexk-is 6550 04.06.10 14:47 Сейчас в теме
(48) Там ещё 1 файл. Теперь их 5. Должен быть пакет из 12 запросов
52. Ish_2 1117 04.06.10 15:04 Сейчас в теме
(50) Скачал .Посмотрел. Мда.. "Он уважать себя заставил" !
Ты не подумай - я тоже энтузиаст и всё такое...
Но увидев текст пакета оробел : стоило ли ?
53. alexk-is 6550 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 6550 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 6550 07.06.10 10:27 Сейчас в теме
(63) Дошел до 4 и 5 запросов в пакете - случился взрыв мозга. Иду за кофе...
65. Ish_2 1117 07.06.10 10:40 Сейчас в теме
(64) "Взрыв мозга" , на самом деле, - это мне минус.
Нужно было оставить комментарии.
66. anig99 2867 07.06.10 12:58 Сейчас в теме
(65)(64) а комментарии - это моя статья про нарастающие итоги (: Как раз разбиение соединений сначала на более крупные периоды, а потом на более мелкие.
67. Ish_2 1117 07.06.10 13:03 Сейчас в теме
(66) Саша, ты не в теме. Совсем.
68. anig99 2867 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 1590 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 6550 08.06.10 12:23 Сейчас в теме
(123) А не проще из "Гостинец" вырезать 3 строки?
ИНДЕКСИРОВАТЬ ПО
Период1,
Период2
125. Abadonna 3979 08.06.10 12:28 Сейчас в теме
(124) А не проще прекратить быстродействиями меряться? :D
Практической пользы - практически ноль. Ну, одна за 17 секунд, другая за 15...
Ну и фигли? ;)
Нажал я кнопочку "Загрузить" и пишу этот коммент (а менеджер по асе девочку охмуряет).
Один фиг загрузит быстрее, чем вышеизложенное ;)
126. alexk-is 6550 08.06.10 12:28 Сейчас в теме
(123) :)
- У меня программа в 2 раза меньше твоей, работает в 10 раз быстрее, имеет изумительное юзабилити.
- Ну, и что? Зато моя работает правильно.


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

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

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

Мне, например, гораздо интереснее - почему с индексами в файловой версии работает значительно медленнее чем без индексов.
130. Ish_2 1117 08.06.10 14:54 Сейчас в теме
(129) Точнее всё-таки сформулировать так :
Почему при ЯВНО заданном индексе для врем.таблице в файловой базе наблюдаются жесткие тормоза ?
И почему при НЕЯВНО заданном индексе (ведь наверняка его создал оптимизатор запроса) тормозов не наблюдается.
131. artbear 1590 08.06.10 15:11 Сейчас в теме
(130) А на скуле проверяли с индексами и без ?
132. alexk-is 6550 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 6550 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 6550 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 6550 04.06.10 15:27 Сейчас в теме
(51) "Пример 3" в статью вставить не решился. Не хочу пока народ пугать. В статье пока "Пример 2".
54. Ish_2 1117 04.06.10 15:08 Сейчас в теме
Представляешь , а если бы в языке запросов для
временных таблиц был возможен UPDATE ?
Ведь тогда - все эти выкрутасы с соединениеми по неравенству были не нужны !
Одна команда UPDATE - и всё !
58. anig99 2867 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 4930 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
Сообщение было скрыто модератором.
...
78. пользователь 07.06.10 15:40
Сообщение было скрыто модератором.
...
79. пользователь 07.06.10 15:43
Сообщение было скрыто модератором.
...
80. пользователь 07.06.10 15:45
Сообщение было скрыто модератором.
...
81. пользователь 07.06.10 15:47
Сообщение было скрыто модератором.
...
83. пользователь 07.06.10 15:54
Сообщение было скрыто модератором.
...
84. пользователь 07.06.10 15:58
Сообщение было скрыто модератором.
...
86. пользователь 07.06.10 16:05
Сообщение было скрыто модератором.
...
87. пользователь 07.06.10 16:07
Сообщение было скрыто модератором.
...
88. пользователь 07.06.10 16:09
Сообщение было скрыто модератором.
...
91. пользователь 07.06.10 16:16
Сообщение было скрыто модератором.
...
93. пользователь 07.06.10 16:21
Сообщение было скрыто модератором.
...
97. пользователь 07.06.10 16:26
Сообщение было скрыто модератором.
...
94. пользователь 07.06.10 16:21
Сообщение было скрыто модератором.
...
96. пользователь 07.06.10 16:25
Сообщение было скрыто модератором.
...
89. пользователь 07.06.10 16:11
Сообщение было скрыто модератором.
...
86. пользователь 07.06.10 16:05
Сообщение было скрыто модератором.
...
77. пользователь 07.06.10 15:32
Сообщение было скрыто модератором.
...
74. пользователь 07.06.10 15:01
Сообщение было скрыто модератором.
...
75. пользователь 07.06.10 15:12
Сообщение было скрыто модератором.
...
90. пользователь 07.06.10 16:13
Сообщение было скрыто модератором.
...
92. пользователь 07.06.10 16:20
Сообщение было скрыто модератором.
...
95. пользователь 07.06.10 16:25
Сообщение было скрыто модератором.
...
98. пользователь 07.06.10 16:29
Сообщение было скрыто модератором.
...
99. пользователь 07.06.10 16:33
Сообщение было скрыто модератором.
...
100. пользователь 07.06.10 16:43
Сообщение было скрыто модератором.
...
102. Ish_2 1117 07.06.10 18:37 Сейчас в теме
И вот еще что .
Алексей , оно ,конечно, дело твоё - имеешь право скрывать чужие комментарии в своей теме. Но комментарии vip'a ты скрыл зря. У меня остался какой-то гаденький привкус.
103. Abadonna 3979 07.06.10 19:49 Сейчас в теме
(102) Закрыл Арчи. Так что к Алексею ты не по адресу ;)
Ежели честно: там был околотемный флад. Хотя и не такой уж фладистый ;)
Короче: стандартный спор упертых семерочников со мной широкообразованным ( :D ), начиная от 2.0 до 8.2 ;)
107. vip 08.06.10 05:56 Сейчас в теме
(102) Чтобы не оставалось привкуса, скопировал удаленные посты тебе в личку.
Как видишь, ничего особенного, кроме отхода от темы ветки, который поддержали кстати и ув. модераторы.
Приношу автору извинения.
А мысли мои по поводу 8.2 повторяются здесь http://infostart.ru/public/71438/?PAGEN_1=1#comm
110. Ish_2 1117 08.06.10 07:44 Сейчас в теме
108. Арчибальд 2712 08.06.10 07:39 Сейчас в теме
(102)(107) Реально, конечно, это был не совсем флуд, а один из аспектов темы 8. Но раз автор возразил (и обоснованно) - мои действия считаю правильными.
109. Ish_2 1117 08.06.10 07:42 Сейчас в теме
105. Ish_2 1117 07.06.10 22:17 Сейчас в теме
Алексею- пардон.
Арчибальду - Фи..
106. alexk-is 6550 08.06.10 00:01 Сейчас в теме
(105) Вот вариант, который показал наилучший результат в файловой версии для 8491 записей. Убрал все индексы. Этот вариант ещё меньше и работает правильно :)

Время выполнения Пример3_3.epf - ~ 1.7 сек
Прикрепленные файлы:
Пример3_3.epf
112. Ish_2 1117 08.06.10 07:50 Сейчас в теме
(106) Посмотрю чуть позже.
114. Ish_2 1117 08.06.10 08:08 Сейчас в теме
(106) Бегло всё-таки посмотрел.
Кроме последнего запроса - это Гостинец.epf.
Хм. Странно. За счет чего тогда ускорение в 8 раз (я проверил)?
Подскажи.
111. Арчибальд 2712 08.06.10 07:44 Сейчас в теме
(105) Радуйся, что в правилах ИС отсутствует прямой запрет на обсуждение действий модераторов :evil:
113. alexk-is 6550 08.06.10 07:51 Сейчас в теме
Народ, вы что, опять начинаете?
115. Ish_2 1117 08.06.10 08:26 Сейчас в теме
Не удержался- копнул.
Последний запрос ( чем отличается Пример3_3 от гостинца)- никакой прибавки к быстродействию не даёт.
Львиную долю времени (90%) занимает запрос соединения по неравенству.
Если из первого запроса "Гостинца" убрать строку "Индексировать по Период1,Период2"
то мы и получим быстродействие 1.5 сек.
В свою очередь , если мы добавим строку "Индексировать по Период1,Период2" в твой Пример 3_3 ,то получим те самые 11.7 сек (т.е. запрос из-за этой строки выполнился медленне в 8 раз ).
И честно говоря - это очень и очень странно.
Явное создание необходимого индекса многократно тормозит общий пакет запроса. Получается , что оптимизатор запроса лучше создает тот самый индекс.
117. artbear 1590 08.06.10 09:38 Сейчас в теме
(115) Ага, я сам в последнее время разочаровываюсь во временных таблицах 1С :(
Очень часто обычный запрос, без временных таблиц, реально быстрее, в несколько раз, чем запрос, построенный на ВТ
119. Ish_2 1117 08.06.10 10:50 Сейчас в теме
(117) Вопрос несколько в другом.
Явное использование во временной таблице Опции "Индексировать" (т.е. создание индекса) приводит в дальнейшем к очень серьезному замедлению при обращении к этой таблицы. Казалось бы , этого в принципе быть не должно.
122. alexk-is 6550 08.06.10 11:43 Сейчас в теме
(119) Возможно потеря времени не приобращении к ВТ, а при построении индекса?
424. daho 8 03.11.12 16:44 Сейчас в теме
(119) Ish_2, Это логично, но может еще от скул-сервака зависит. В Мелкософтовых всегда были проблемы с индексацией и высвобождением памяти от всякого старого мусора..
118. alexk-is 6550 08.06.10 10:48 Сейчас в теме
(115) В (106) я сразу написал, что убрал все индексы. Да, это "Гостинец", я уже писал об этом, но видимо где-то потерялось. Ещё раз: "Да, это Гостинец", только из первого запроса убрал лишнюю операцию с датами, объединил 6 и 7 пакет и исправил ошибку в первой записи.

Я выложил новые "Пример3" и "Пример3_2". На небольших объемам данных "Пример3" показывает изумительные результаты, а на больших объемах "Пример3_2" держит паритет с "Гостинец". :)

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

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

Но это пока только догадки. Нужно тестировать.
120. alexk-is 6550 08.06.10 10:55 Сейчас в теме
(115) Даже так. :)

Время выполнения Гостинец.epf - ~ 1.7 сек
Время выполнения Пример3_2.epf - ~ 1.5 сек
116. Ish_2 1117 08.06.10 08:31 Сейчас в теме
И где Артур Artbear ? Он как-то меня убедил, что явное создание необходимых индексов для временной таблицы есть благо. Пусть ответит перед "доверчивыми людями" !
133. anig99 2867 08.06.10 15:58 Сейчас в теме
Спор на самом деле немного не спор...
У Гилева есть статьи на эту тему. Быстродействие запроса зависит от слишком многих факторов, т.к. 1с ПЕРЕВОДИТ свои запросы в запросы SQL. А что там дальше будет... Нужно препарировать выполнение запросов на каждой отдельной конфигурации ПО.
1с в этом случае даёт лишь рекомендации...не использовать соединение вложенных запросов, т.к. это может транслироваться в неоптимальный запрос.
cool.vlad4; +1 – Ответить
134. axae 110 06.08.10 15:25 Сейчас в теме
Мне кажется надо исправить пример со сверткой массива:
НовыйМассив = Новый Массив; Соответствие = Новый Соответствие;
Для каждого ЭлементМассива Из Массив Цикл Соответствие.Вставить(ЭлементМассива) КонецЦикла;
Для каждого КлючИЗначение Из Соответствие Цикл НовыйМассив.Добавить(КлючИЗначение.Значение) КонецЦикла;

Кусок
Соответствие.Вставить(ЭлементМассива)
вставляет один лишь ключ, а значение-то останется Неопределено. Надо ведь
Соответствие.Вставить(ЭлементМассива, ЭлементМассива)
, либо
НовыйМассив.Добавить(КлючИЗначение.Ключ)
, так?
Поручик; alexk-is; +2 – Ответить
135. alexk-is 6550 07.09.10 10:41 Сейчас в теме
Добавил про получение строки пробелов длиной 10000 символов.
136. Ish_2 1117 08.10.10 19:22 Сейчас в теме
Ты написал в другой теме , что увеличил быстродействие в 90раз для подключаемой базы
Я правильно понял ? И где у тебя в теме об этом ?
137. Ish_2 1117 08.10.10 19:33 Сейчас в теме
+136 Ты в заметочках столько написал - в глазах рябит.
Я про "ускорение в 90 раз"(!) хотел бы почитать отдельно. Хм... и пристрастно.
138. alexk-is 6550 10.10.10 20:06 Сейчас в теме
(137) Ничего нового, это второй прием http://www.infostart.ru/public/18924/ пример использования здесь http://www.infostart.ru/public/19021/
Ну, и конечно же, это работает как в 7.7, так и в 8.х

...или обязательно нужны ещё доказательства?
140. alexk-is 6550 12.10.10 07:14 Сейчас в теме
(137) Добавил в конце статьи про "ускорение в 100 раз" или 200. Как получится :)
Ну, и как обычно жду комментариев
139. пользователь 12.10.10 06:39
Сообщение было скрыто модератором.
...
141. Ish_2 1117 12.10.10 07:29 Сейчас в теме
А что комментировать ?
Скачал две обработки.
1. COM Monitor
2. Пример 6 для COM Monitor

Посмотрел последний п.2.
А почему модуль закрыт в п.1 ?
Можно подтвердить факт про разное быстродействие п.1 и п.2 .
Но как я проверю открытый тобой секрет :
ускорение за счет снижения количества разименований ?
142. alexk-is 6550 12.10.10 07:48 Сейчас в теме
(141)
А почему модуль закрыт в п.1 ?
Ну, это не ко мне, а к автору обработки. Ссылка на автора есть. Я выложил обработку "как есть", только добавил замер времени выполнения
Но как я проверю открытый тобой секрет
Разве это секрет? Вот здесь http://www.infostart.ru/public/18924/ про это написано почти 2 года назад
Можно подтвердить факт про разное быстродействие п.1 и п.2
Сколько получилось?
143. Ish_2 1117 12.10.10 16:53 Сейчас в теме
1. У автора закрытый код , вот я и хотел увидеть его секрет и в чём он.
2. Результаты тестирования .
Основная база файловая , подключаемая SQL.
Справчочник КОнтрагенты. 5230 объектов.
Время загрузки :
1. COM Monitor ------------------------- 132сек
2. Пример 6 для COM Monitor -------- 21 сек.
Если в п.2 применить дополнительную обработку (извращение по-моему)
то
2. Пример 6 для COM Monitor -------- 9 сек.

144. alexk-is 6550 14.10.10 07:07 Сейчас в теме
(143) В комментариях к своей публикации ghostishe писал, что может открыть код, если очень надо. Мне было не нужно, поэтому я не просил.
145. alexk-is 6550 14.10.10 15:02 Сейчас в теме
(143) Немного подправил Пример 6 для COM Monitor. Теперь работает ещё быстрее.

Почему вариант с обработкой "извращение"? Это позволяет сократить издержки на передаче данных.

Вообще-то, если бы данные собирались на постоянной основе, то для SQL версии лучше было бы использовать привелегированный общий модуль, чтобы вся обработка данных прошла на сервере, а клиент получил уже готовый результат. Тогда обработка данных прошла бы ещё быстрее.

Я тестировал всё на файловых базах и разница в результатах была гораздо значительнее.
146. Ish_2 1117 15.10.10 16:03 Сейчас в теме
(145) У меня перестали приходить сообщения на e-mail с инфостарта. IE8. Не знаешь в чем тут дело ?
Новый пример по тесту в (143) дал -------- 17.5 сек.
147. alexk-is 6550 15.10.10 17:29 Сейчас в теме
(146) Мне тоже не приходят. Возможно после переезда ещё не все сервисы запущены.

Мне вот что интересно: на чем выполнены твои тесты и почему столь существенная разница в результатах по сравнению с моими?

У меня базы файловые УПП 1.2.29.1, объем каждой базы 13 Гб, платформа 1С 8.1.15.14
ОС Widows XP Pro SP2
ПК CPU IntelCore2 Duo E6750 2.66GHz RAM 4 Гб HDD RAID 0 SATA 2x160 Гб
Тестировал справочник Номенклатура 22000 элементов
148. Ish_2 1117 15.10.10 20:02 Сейчас в теме
(147) В понедельник попробую и опишу другой опыт (на большем объеме)
149. Ish_2 1117 18.10.10 09:27 Сейчас в теме
Основная база БП 1.6 файловая (копия), Подключаемая база - SQL(основная).
Справочник ДоговорыКонтрагентов . Количество объектов 16 665шт.

1. COM Monitor ------------------------- 406сек
(в процессе загрузки интерактивно закрываю открывщееся окно 1сПредприятия SQL-базы)
2. Primer_6_ COM_ Monitor.epf -------- 90 сек.
(без дополнительной обработки)
150. Fragster 1168 20.10.10 11:18 Сейчас в теме
Вариант про строку в массив через ЗначениеИзСтрокиВнутр - работает медленнее, чем
Код
   мСтрока = Новый Массив;
   Если Не ТипЗнч(Строка) = Тип("Строка") Тогда Возврат мСтрока; КонецЕсли;
   Стр = СокрЛП(Строка);
   Если Стр="" Тогда Возврат мСтрока; КонецЕсли;
   
   Длина = СтрДлина(Разделитель);
   Пока Истина Цикл Поз = Найти(Стр,Разделитель); Если Поз = 0 Тогда мСтрока.Добавить(СокрЛП(Стр)); Прервать; КонецЕсли; Нашли = СокрЛП(Лев(Стр, Поз-1)); Если Не ПустаяСтрока(Нашли) Тогда мСтрока.Добавить(Нашли); КонецЕсли; Стр = СокрЛП(Сред(Стр,Поз+Длина)); КонецЦикла;
Показать полностью


у меня - прочти в 4 раза
molodoi1sneg; +1 – Ответить
151. alexk-is 6550 21.10.10 15:44 Сейчас в теме
(150) Откуда такие данные? Как тестировали? Предлагаю посмотреть Пример 7

Вот мои результаты:
Длина тестовой строки: 608207
Количество строк тестовой строки: 12848
Код из комментария. Элементов в массиве: 10 106. Завершено за 9,812 сек.
Код из статьи. Элементов в массиве: 12 848. Завершено за 0,094 сек.
152. Fragster 1168 22.10.10 10:32 Сейчас в теме
(151) да, на длинный строках - пример из статьи лучше, на коротких - лучше цикл... Опытным путем подобрал - больше 1000 символов (там серийники по 24-32 символа через запятую) - используем ваш вариант, меньше - цикл. на моих данных - получилось оптимально
153. alexk-is 6550 22.10.10 13:30 Сейчас в теме
(152) А где доказательная база? Как проверяли результат?
310. alexk-is 6550 17.11.11 09:28 Сейчас в теме
(150) (302) Добавил про разбор длинных строк в массив с возможностью предварительной обработки данных.
Обновил Пример 7.
154. Ish_2 1117 29.12.10 19:34 Сейчас в теме
Слушай , хочу при выгрузке из запроса получить не двууровневое дерево , чтобы в одной колонке выдавалось
+Организации
-- Договоры

а, скажем , 4- уровневое дерево , чтобы при выгрузке из запроса в одной колонке дерева иметь :
+Контрагент
--Договор
---Номенклатура
----Характеристика

Делал такое ?
155. alexk-is 6550 29.12.10 20:49 Сейчас в теме
(154) Пытался, но не получилось. Посмотреть результат было бы очень интересно.
156. Ish_2 1117 29.12.10 21:10 Сейчас в теме
(155) Да вот сижу, дергаю - дай, думаю, спрошу. Если получится - сообщу.
157. Ish_2 1117 30.12.10 08:32 Сейчас в теме
Итак , выводим в одной колонке дерева все итоги при выгрузке из запроса.
См. демо пример.
Прикрепленные файлы:
158. alexk-is 6550 30.12.10 09:25 Сейчас в теме
(157) Прикольно. Видимо я чего-то в прошлый раз не докрутил. Всё получилось даже с разными типами данных.
159. KapasMordorov 429 30.12.10 10:23 Сейчас в теме
(157)
Может, я ошибаюсь, но
в исходном примере данные разных типов были в одной колонке,
а в новом примере иерерахия есть только в первой колонке и в ней же одно повторяющееся значение.
И колонок стало 4 против прежних 2. Под условия в 154 не подходит.
160. Ish_2 1117 30.12.10 10:31 Сейчас в теме
(159) В текущей теме автора приведен пример как в одной колонке вывести разнотиповые итоги в одной колонке.
и рассматривается ТОЛЬКО двухуровневое дерево после выгрузки из запроса :
+Организации
--Договоры

В (157) приведен пример как в одном запросе получить 4-уровневое дерево.
Для простоты и наглядности все колонки в (157) одного типа.
(157) говорит также о том , что можно в одной колонке выводить итоги и для дерева ЛЮБОГО уровня.

Как вывести разнотиповые итоги в одной колонке в теме автора раскрыто хорошо и понятно.
161. KapasMordorov 429 30.12.10 11:11 Сейчас в теме
(160)
Похоже, это уже неважно.
У меня пример автора не повторяется. Либо в дереве три колонки, либо при настройке колонок нет иерархии.
162. Ish_2 1117 30.12.10 11:18 Сейчас в теме
(161) Так у автора , в ДеревоЗначений выгружаются 3 колонки. Но так как ЭлементФормы имеет 2 колонки , то пользователю видны только эти две колонки !
Если после выгрузки из запроса сделать Дерево.СоздатьКолонки() , то пользователь увидит 3 колонки.
163. KapasMordorov 429 30.12.10 11:21 Сейчас в теме
(162)
В том и дело, если я делаю две колонки и не использую "СоздатьКолонки", то в дереве нет иерархии.
164. Ish_2 1117 30.12.10 11:23 Сейчас в теме
(163) Не понял. У первой колонки табличного поля в свойствах должен стоять флаг "Иерархия"
166. KapasMordorov 429 30.12.10 11:32 Сейчас в теме
(164)(165)
Ага, свойство "Иерархия" как раз и не стояло.
Теперь всё понятно стало. (157) полностью решает задачу.
167. Ish_2 1117 30.12.10 11:37 Сейчас в теме
(166) А вообще , мне кажется перспективным выводить некоторые отчеты с группировками не в табличный документ , а в 3-4 уровневое дерево в табличном поле.
Удобнее для корректировок, быстрее, с пересчетом итогов по группировкам и т.д.
Доп. Функционал накручивается на дерево проще , чем на табличный документ.
169. ILM 241 30.12.10 22:50 Сейчас в теме
(167) А если добавить поле сумма для подсчета итогов, то как получится сделать: Дерево + итоги по группировкам?
171. alexk-is 6550 04.01.11 15:52 Сейчас в теме
(169) Пример расчета итогов можно посмотреть здесь http://infostart.ru/public/69707/
170. alexk-is 6550 31.12.10 07:24 Сейчас в теме
(166) Как хорошо, что сами разобрались. Хотя во вложении есть работающий "Пример 2", который собирает результат в одну колонку из двух.
(168) Да.
(169) Легко. Итоги расчитываются в итогах.
165. Ish_2 1117 30.12.10 11:26 Сейчас в теме
(163) А вот пусть автор и расскажет нам ,
как он получил свой пример с 2-уровневым деревом.
Таскаю , понимаешь, каштаны..
168. ILM 241 30.12.10 22:33 Сейчас в теме
(157) Вот как раз такую задачу решал, но не смог решить. Теперь ход мыслей понятен куда копать. Но более подробный пример такого запроса, очень помог бы мне.
А дерево из ААА->БББ->ВВВ->ГГГ выведется в поле 4?
172. ILM 241 04.01.11 19:16 Сейчас в теме
Алексей, я видел, это двухуровневое дерево. А вот если у меня количество вложенности дерева 10 и строится по паре полей, предок, родитель. То так просто не получается.
Код1 Код2
1
2 1
3 1
4 2
5 4
6 3

1->
+->2->4->5
+->3->6

Вот такое только вручную.
173. alexk-is 6550 04.01.11 19:28 Сейчас в теме
(172) Можно взглянуть на текст запроса разворачивающий этот список в дерево?
174. ILM 241 05.01.11 14:40 Сейчас в теме
(173) Как-то такой пакетик ))

ВЫБРАТЬ 1 КАК Код1, NULL КАК Код2
ПОМЕСТИТЬ ТМП_ИСХ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 2 КАК Код1, 1 КАК Код2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 3 КАК Код1, 1 КАК Код2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 4 КАК Код1, 2 КАК Код2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 5 КАК Код1, 2 КАК Код2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 6 КАК Код1, 3 КАК Код2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 7 КАК Код1, 6 КАК Код2
;
ВЫБРАТЬ Т0.Код1 КАК Код0, Т1.Код1 КАК Код1, Т2.Код1 КАК Код2, Т3.Код1 КАК Код3
ПОМЕСТИТЬ ТТТ
ИЗ ТМП_ИСХ КАК Т0
ЛЕВОЕ СОЕДИНЕНИЕ ТМП_ИСХ КАК Т1
ПО Т0.Код1 = Т1.Код2
ЛЕВОЕ СОЕДИНЕНИЕ ТМП_ИСХ КАК Т2
ПО Т1.Код1 = Т2.Код2
ЛЕВОЕ СОЕДИНЕНИЕ ТМП_ИСХ КАК Т3
ПО Т2.Код1 = Т3.Код2
ГДЕ Т0.Код2 ЕСТЬ NULL
;
ВЫБРАТЬ
ВЫБОР
Когда Код1 Есть NULL Тогда Код0
Когда Код2 Есть NULL Тогда Код1
Когда Код3 Есть NULL Тогда Код2
Иначе Код3
КОНЕЦ КАК Код33,
Код0, Код1, Код2, Код3
ИЗ ТТТ
ИТОГИ
ВЫБОР
Когда Код1 Есть NULL Тогда Код0
Когда Код2 Есть NULL Тогда Код1
Когда Код3 Есть NULL Тогда Код2
Иначе Код3
КОНЕЦ КАК Код33
ПО Код0, Код1, Код2, Код3 АВТОУПОРЯДОЧИВАНИЕ
;


Еще бы дубли строк убрать и вообще красота
175. CheBurator 3235 05.01.11 14:50 Сейчас в теме
(174) это какое-то умножение сдвигом на разряд.. ;-)
176. ILM 241 05.01.11 15:27 Сейчас в теме
(175) А что делать? Есть другие предложения? :D
177. alexk-is 6550 05.01.11 15:46 Сейчас в теме
(174) Это не дубли строк. Это пустые уровни итогов.
178. ILM 241 05.01.11 15:50 Сейчас в теме
(177) Хочу убрать пустые дубли итогов)
Мне только структура нужна, только дерево и чтобы заканчивалось на нужном уровне без пустых строк итогов.
Сильно хочу, однако )))
179. ILM 241 05.01.11 15:52 Сейчас в теме
А то выводится структура изделия, а в ней куча дублей.
180. alexk-is 6550 05.01.11 17:03 Сейчас в теме
(179) Как мне кажется, здесь нужно смотреть в другую сторону.
http://infostart.ru/public/78285/
http://infostart.ru/public/78371/
181. ILM 241 05.01.11 20:49 Сейчас в теме
(180) Видел оба. Из первого и взял запрос, а второе вообще не в тему. Думаю Игорь подтянется и подскажет.
182. Ish_2 1117 05.01.11 21:51 Сейчас в теме
(181) Подтянулся. Посмотрел и запустил запрос (174). Давай так . Правильно ли я тебя понял :
Дано : Граф описан с помощью таблицы "Граф" с колонками Сын,Родитель (Код1,Код2).
Априорно известен уровень графа =4 (такое редко встечается, но пусть)
Нужно : получить в виде дерева на форме изображение графа .
Замечание : быстродействие неважно - Таблица "Граф" очень небольшая(до 100 строк).
Если количество узлов в графе более 100 000 и уровень 5-10 , тогда такое построение запроса неприменимо.

Так ?

Результат твоего запроса (174) изображен на рисунке. Ты бы хотел избавиться от плвторений выделенных красным цветом ?
Так ?
Прикрепленные файлы:
183. Ish_2 1117 05.01.11 23:18 Сейчас в теме
(181)Завтра уеду.
Поэтому см. прикрепленную обработку с твоим и моим вариантом запроса.
Прикрепленные файлы:
СравнениеТвоёМоё.epf
184. ILM 241 06.01.11 09:04 Сейчас в теме
(183) Спасибо, Игорь. В твоём варианте тоже получаются пустые строки. Наверное от них не избавится никак.
Как я понял существуют всего три варианта получить дерево:
1) Формировать программно через код,
2) запросом через итоги,
3) Как иерархический справочник.

В СКД, тоже получаются пустые строки.
186. Ish_2 1117 06.01.11 21:30 Сейчас в теме
(184) От пустых строк в табличном поле избавится очень просто, используя обработчик ПриВыводеСтроки() , в котором свойство "Видимость" для ячеек с пустыми значениями устанавливается в "Ложь". Другими словами , такие ячейки просто не видны. См . рисунок.
В теме "Запрос против рекурсии.." применен именно такой приём и дерево ошибок выводится без пустых строк.
Минус же построения дерева из запроса с итогами - один : чрезвычайно низкое быстродействие.

(185) Вообще говоря, возможны варианты ,и варианты ,и варианты...
Но как только возникает условие : НУЖЕН абсолютный контроль зацикливания - то вариант только один.
Кхе..Кхе..
Я извиняюсь.В чужой теме я задудел в свою любимую дуделку.
Прикрепленные файлы:
185. ILM 241 06.01.11 09:28 Сейчас в теме
(183) Это всё равно лучше, чем было.
Про граф и уровень его, можно сказать, что максимальный уровень графа равен 4-м, это для примера. Ничто не мешает сделать вложенность и 10 ... 20. По поводу быстродействия нужно проверять.
Ведь запрос не обязательно делать для одной таблицы с данными графа и связывать её саму с собой.
Как вариант можно сформировать последовательные отрезки с наборами графа с увеличением уровня вложености (0-1, 1-2, 2-3, 3-4 ... 19-20 и так далее), а потом все отрезки объединить в один набор, и уже по нему пройтись запросом с итогами.
Хотя скорее всего вариант рекурсии с подзапросами будет выигрывать по скорости.
Не знаю существует ли другой вариант сформировать дерево структуры запросами. Очень, очень жаль что в 1С нет рекурсивных запросов.
187. Ish_2 1117 06.01.11 21:37 Сейчас в теме
(185) А вообще давай так.
Я 13 января создам тему : "Как выгрузить итоги запроса в одну колонку ?" - там и поговорим.
188. Ish_2 1117 07.01.11 15:42 Сейчас в теме
(185) Решил не тянуть до 13 января.
Вот оно : http://infostart.ru/public/79992/
189. Ish_2 1117 10.01.11 18:19 Сейчас в теме
Слушай , Алексей , ты в теме написал что объединение с пустыми запросами нужно для того, чтобы колонка сожержала разные типы.
Я даже это не проверял - взял в свою статью как есть.
Тут меня огорошили примером : все замечательно работает и без объединений с пустыми запросами.
Т.е. запрос на рисунке приводит к нормальным результатам см. следующий пост.
Прикрепленные файлы:
191. alexk-is 6550 11.01.11 10:08 Сейчас в теме
(189) (190) Да. Есть такое дело. Всё работает без добавления типов данных.
Долго не мог понять, зачем я так сделал. Так вот когда разобрался, то оказалось, что пустой запрос с типами данных необходим только в случае последующей обработки данных в дереве. Точнее в том случае, когда при вводе новых строк строки с необходимыми типами данных не попали в результат запроса.

В частности у меня это используется здесь http://infostart.ru/public/69707/
Т.е. в этой обработке первоначально запрос формирует только первый уровень дерева, остальные данные подгружаются при необходимости и когда при разворачивании уровней данные добавляются в дерево, типы добавляемых данных должны быть уже предопределены в дереве.

Статью поправлю.
190. Ish_2 1117 10.01.11 18:22 Сейчас в теме
На рисунке ниже результат этого запроса.(совершенно нормальный!).
Вопрос : из какого опыта ты взял это - чтобы получить разнотиповые итоги в одной колонке
нужно обязательно делать пустые объединения.
Прикрепленные файлы:
192. alexk-is 6550 12.01.11 21:41 Сейчас в теме
+191 Добавил в заметочки "Про СКД и запросы с итогами" - два примера реализации многоуровнего дерева значений в одной колонке с помошью СКД.
193. Ish_2 1117 16.01.11 13:58 Сейчас в теме
(192) Пример 9 выглядит диковато. На "1с" вставил тебе свои пять копеек :
http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=556773
194. alexk-is 6550 16.01.11 14:35 Сейчас в теме
(193) Повторюсь про Пример8 и Пример9.
Для меня главное, что так это работает и работает быстро. Так как выпуск новых версий платформы 8.1 не планируется, то можно предположить, что на 8.1 это будет работать всегда. При этом наблюдается 100% повторяемость как для файловой версии, так и для MS SQL. Так что к частному случаю это отнести нельзя.

Кстати, на 8.2 это тоже работает. Т.к. платформа постоянно дорабатывается, то тут в стабильности быть на 100% уверенным быть нельзя.
195. Ish_2 1117 16.01.11 17:36 Сейчас в теме
(194) Дело вкуса и подхода, конечно.
Но мне кажется, что публично предлагать лучше решения, невызывающие ни малейших сомнений ни в 8.1, ни в 8.2.
196. alexk-is 6550 17.01.11 08:55 Сейчас в теме
(195) Я могу торжественно заявить только то, что в текущих версиях 1С:Предприятия 8.1 и 8.2 это работает. Работает со 100% повторяемостью причем в различных вариантах. На создание подобного макета уходит минут 5. Соответственно это не частный случай. А вот будет ли эта схема работать в 8.3 или 9.0, я могу только предполагать.

>> Но мне кажется, что публично предлагать лучше решения, невызывающие ни малейших сомнений ни в 8.1, ни в 8.2.

Значит ли это, что если есть сомнения в том, что программа будет работать под следующей версией Windows, то этой программной нельзя пользоваться. В моей картине мира под сомнение попадает большинство существующих программ.
197. Ish_2 1117 17.01.11 09:13 Сейчас в теме
(196) Ну, если только "торжественно"... Тогда принимаю к сведению.
198. WKBAPKA 216 04.06.11 10:39 Сейчас в теме
а почему в примере для COM используется подключение через V81.Application, а не через V81.ComConnector
второй вариант значительно снижает нагрузку на процессор и работает быстрее...
в 8.0 вроде это не доступно :cry:
209. alexk-is 6550 06.06.11 11:43 Сейчас в теме
(198) Это была попытка показать разницу в применяемых методах, а сравнение лучше выполнять в одинаковых внешних условиях. Раз автор сравниваемой обработки выбрал V81.Application, то пусть так и будет.

V8х.ComConnector недоступен в базовых версиях конфигураций 8.х
cool.vlad4; +1 – Ответить
199. Yashazz 4930 05.06.11 11:16 Сейчас в теме
Автор, при всём моём уважении, первая же фраза анонса совершенно безграмотна. "Проезжая мимо сией станции и глядя на природу в окно, у меня слетела шляпа" (с) Чехов. Исправь, не позорься, плизз.
207. Yashazz 4930 05.06.11 19:08 Сейчас в теме
Тошнота от рекурсий и циклов? Я понимаю, конечно, что это СУБД и всё такое, но процедурное программирование ишшо никто не отменял. Товарищ Кнут вас бы не понял.
Тошнота от if-ов, case-ов? Дык они и в запросах есть, причём куда уродливее и нечитабельнее иной раз, особенно когда по таким полям группируют.
В общем, не вижу я прямой связи между тенденцией утолщать клиента и обязательностью всё делать запросами. Спорить времени нету и желания тоже.
cool.vlad4; +1 – Ответить
208. artbear 1590 06.06.11 08:40 Сейчас в теме
hogik пишет:
Сделаю еще одну попытку достучаться: http://citforum.ru/database/articles/seltzer/

Сайт недоступен :(
213. hogik 447 06.06.11 16:37 Сейчас в теме
(208)
Снимок экрана от 6 июня 2011 года в 16:34.
Прикрепленные файлы:
214. artbear 1590 06.06.11 16:52 Сейчас в теме
(213) Интересная статья, читаю.
215. Ish_2 1117 06.06.11 17:21 Сейчас в теме
(213) Прочитал. Вы что-то хотите предложить публике ?
На основании этой статьи Вы можете привести свои выводы, предлождения ?
утверждения, интересные 1с-никам ?
свой взгляд на развитие СУБД ?
С удовольствием почитаю.
Или , как обычно, в очередной раз посомневаться , подразумевая
" женщина хорошая , зря не напишет ".
216. hogik 447 06.06.11 18:07 Сейчас в теме
(215)
Игорь.
Это уже десятый круг... :evil: :evil: :evil:
Ну, тЫ открой мой "профайл" и прочти, хоть, названия публикаций.
Там есть ВСЕ ответы на вопросы из (215) сообщения воплощенные в РЕАЛЬНЫЕ разработки (публикации). Или тЕБЕ вслух почитать?
P.S. на (201).
"Тошнота от циклов..."(с)
Может это беременность? :)
217. Ish_2 1117 06.06.11 18:10 Сейчас в теме
(216) Спасибо за информацию.
210. cool.vlad4 2 06.06.11 11:59 Сейчас в теме
Я так понимаю про тошноту операторов ветвления это наверное про меня Я там выражал недовольство количеством и качеством, когда все превращается в макароны, а вовсе не про то, что их использовать нельзя. И про операторы SELECT и запросы, господину Ишу - Откуда вы знаете как транслирует 1С запросы? Поделитесь этой ценной информацией....
218. sa1m0nn 28 28.07.11 12:49 Сейчас в теме
Да, пример на коленке, с большой погрешностью. Достаточно в нем увеличить порядок, разница в 20-30%. Признал ошибку, спасибо.
219. alexk-is 6550 28.07.11 13:43 Сейчас в теме
(218)
Я не читал тут обсуждения
Может быть зря? Ваш тест построен некорректно. Замер производится с большой погрешностью, размер которой составляет 1 секунду. Т.е. есть вероятность, что при двух командах
    ВремяНачала = ТекущаяДата(); 
    ВремяОкончания = ТекущаяДата();
идущих последовательно разница будет 1 секунда. Значит ли это, что команда ТекущаяДата() выполняется 1 секунду?

Скачайте Пример 1.
У меня получается 0.882 и 0.601 секунды, а у вас?
220. alexk-is 6550 28.07.11 14:12 Сейчас в теме
(218) Поэтому все тезисы заявленные в статье сопровождены примерами, которые демонстрируют при каких условиях эти тезисы выполняются.
221. alexk-is 6550 03.08.11 09:45 Сейчас в теме
Добавил блок "Про дерево значений"
222. sozinovss 07.08.11 22:25 Сейчас в теме
У меня у одного кодировка кода полетела?
224. alexk-is 6550 07.08.11 23:14 Сейчас в теме
(222) (223) Да.
Хотя странно, конечно.

У меня всё читается и даже картинки на своих местах. IE8
223. sozinovss 07.08.11 22:26 Сейчас в теме
В смысле в тексте код прямоугольниками.
225. alexk-is 6550 29.08.11 11:58 Сейчас в теме
Добавил в заметочки "Про расчет сумм по выделенным ячейкам табличного поля"

Обновил Пример3_2.epf. Теперь Гостинец.epf "отдыхает" :)
226. Ish_2 1117 29.08.11 13:03 Сейчас в теме
(225) Не горячись.
Мне не нравится как ты суммируешь ячейки.
В цикле записываешь в соответствие , затем в цикле суммируешь.
Да еще и через "Попытку".

    Сумма = 0;
    КоличествоСумм = 0;
    СоответствиеЯчеек = Новый Соответствие;

    Для Каждого ВыделеннаяОбласть Из ТабличноеПоле.ВыделенныеОбласти Цикл
        Для Индекс1 = ВыделеннаяОбласть.Лево По ВыделеннаяОбласть.Право Цикл
            Для Индекс2 = ВыделеннаяОбласть.Верх По ВыделеннаяОбласть.Низ Цикл
                Область = ТабличноеПоле.Область(Индекс2, Индекс1, Индекс2, Индекс1);
                Попытка
                    Значение = Число(Область.Текст);
                Исключение
                    Значение = 0;
                КонецПопытки;
                СоответствиеЯчеек.Вставить(Область.Имя, Значение);
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;

    Для каждого Ячейка Из СоответствиеЯчеек Цикл
        Значение = Ячейка.Значение;
        Если Значение <> 0 Тогда
            Сумма = Сумма + Значение;
            КоличествоСумм = КоличествоСумм + 1;
        КонецЕсли;
    КонецЦикла;
Показать


Ужас !
Неужто нельзя было что-то придумать для отказа от "Попытки" ?
227. alexk-is 6550 29.08.11 13:23 Сейчас в теме
(226) Все так делают. Вот код из типовой БГУ
Попытка
	Ячейка = ПолеТабличногоДокумента.Область("R" + Формат(ИндексСтрока, "ЧГ=0") + "C" + Формат(ИндексКолонка, "ЧГ=0"));
	Если Ячейка.Видимость = истина Тогда
		Сумма = Сумма + Число(СтрЗаменить(Ячейка.Текст, " ", ""));
	КонецЕсли;
Исключение
КонецПопытки;


В 8.х преобразование простых типов выполняется гораздо хуже чем в 7.7
228. Ish_2 1117 29.08.11 13:33 Сейчас в теме
(227) Ну и что ?
Значит, в типовых - ужас.
Значит, все делают ужасно.
Не может быть, чтобы преобразование "строка-число" осуществлялось только через "попытку".
Неужто нет встроенных механизмов , преобразующих строки в числа ?
Покажи нам мастер-класс , Алекс !
229. alexk-is 6550 29.08.11 13:45 Сейчас в теме
(228) Злой, а я добрый.
Простым кодингом быстрее чем "Попытка", наверное, не получится.
Можно конечно написать ВК, но нужно ли это?
230. Ish_2 1117 29.08.11 13:52 Сейчас в теме
(229) Какое ВК ?
Только штатными средствами и без разбора строки !
Не томи. Гони мастер-класс !
231. cool.vlad4 2 29.08.11 14:18 Сейчас в теме
Вообще подобные заявления "Не может быть, чтобы преобразование "строка-число" осуществлялось только через "попытку".
Неужто нет встроенных механизмов , преобразующих строки в числа ?" заставляют усомнится...кое в чем...вообще-то это не только в 1С, это повсеместно так. Можно обернуть лишь в функцию . Функция ПопыткаПреобразовать(Строка)...и о каком встроенном механизме может идти речь если я подсуну строковую кашу "fdgsdg" или "1.345" или "1.232,2343" и т.д.
232. Ish_2 1117 29.08.11 14:35 Сейчас в теме
(231) Поменьше воды. Истина всегда конкретна.
И очень скоро мы узнаем : чего стоят общие соображения типа : "это повсеместно так" ,
и кто должен в ком усомниться.
233. Ish_2 1117 29.08.11 14:37 Сейчас в теме
(232) Угроза .
Алекс, не сделаешь дозавтра - опубликую тему сам .
Там напишу , что ты -"такой,сякой и разэтакий".
234. cool.vlad4 2 29.08.11 14:43 Сейчас в теме
(232) Возможно я не уловил сути задачи. Задача произвольную строку преобразовать в число, без попыток, только встроенными средствами. Сообщения 228, 230 и т.д. Так?
235. Ish_2 1117 29.08.11 14:45 Сейчас в теме
236. cool.vlad4 2 29.08.11 14:47 Сейчас в теме
(235) Тогда какой ответ должен быть для, например , - "sdsdsd" и "sdf4df632d4"...Это чтобы понять, что требуется
237. Ish_2 1117 29.08.11 14:49 Сейчас в теме
(236) Если ТекстЯчейки ="sdsdsd" или "sdf4df632d4"... Тогда мы должны преобразовать его к 0(нулю).
238. cool.vlad4 2 29.08.11 14:52 Сейчас в теме
(237) Хорошо, да это возможно сделать встроенными средствами, достаточно получить одно вхождение не числового символа и все. А как тогда быть с различными записями числа "1,343" или "1.3434" , в общем что является числом - делители групп, дробей и т.д.?
239. Ish_2 1117 29.08.11 14:54 Сейчас в теме
(238) Потерпи до завтра.
240. alexk-is 6550 29.08.11 15:25 Сейчас в теме
(239) Так?

Функция СтрокаВЧисло(Знач СтрокаЧисла)

   
// Уберем хвостовые пробелы и стандартный разделитель
   
СтрокаЧисла = СтрЗаменить(СокрЛП(СтрокаЧисла), Символы.НПП, "");

   
// Проверим допустимые символы
   
КоличествоРазделителей = 0;
    Для
Индекс = 1 По СтрДлина(СтрокаЧисла) Цикл
       
СимволЧисла = Сред(СтрокаЧисла, Индекс, 1);
        Если
Найти("0123456789", СимволЧисла) = 0 Тогда
            Если
Найти(",.", СимволЧисла) = 0 Тогда
                Возврат
0;
            ИначеЕсли
КоличествоРазделителей > 1 Тогда
                Возврат
0;
            КонецЕсли;
           
КоличествоРазделителей = КоличествоРазделителей + 1;
        КонецЕсли;
    КонецЦикла;

   
// Преобразование
   
Возврат Число(СтрокаЧисла);

КонецФункции
// СтрокаВЧисло()
241. cool.vlad4 2 29.08.11 15:27 Сейчас в теме
(240) ага тоже сначала подумал на что-то подобное ЕстьНеЦифры из типовой. Но работать это будет медленнее попытки, ИМХО. Так, что вариант, только из любви к искусству.
244. Ish_2 1117 29.08.11 15:46 Сейчас в теме
(240) Не пойдёт ! Слишком уж в лоб. Медленно.
И потом : нужно без разбора по символам.
245. Ish_2 1117 29.08.11 15:49 Сейчас в теме
(240) + Слушай , стал бы я тебя дергать из-за такого решения ?
242. cool.vlad4 2 29.08.11 15:28 Сейчас в теме
(239) Если вариант как в 240, то неинтересно, так, что терпеть не буду.
243. cool.vlad4 2 29.08.11 15:35 Сейчас в теме
как вариант можно регуляркой попробовать
246. Ish_2 1117 29.08.11 16:15 Сейчас в теме
На всякий случай :
Требуется автоматически суммировать все выделенные ячейки в табличном документе
и вывести результат на форму.
Использовать типовой алгоритм суммирования (как в типовых конфигурациях) с использованием "попытки" - запрещено.
Использовать посимвольный разбор текста ячейки - запрещено.
Использование ВК - запрещено.

Разрешено использование только штатных (встроенных) функций.

Какой должна быть процедура суммирования ?
247. cool.vlad4 2 29.08.11 16:18 Сейчас в теме
(246) Уж не запрос ли ты имеешь ввиду и шаблоны? - (исходя из пристрастий Ish_2)...
248. alexk-is 6550 29.08.11 16:30 Сейчас в теме
(246) Так?
XMLЗначение(Тип("Число"), СтрокаЧисла);
249. cool.vlad4 2 29.08.11 16:34 Сейчас в теме
(248) Думаю, что нет - при значениях типа - "sdgfd" будет ошибка, которую можно отловить через попытку, но тогда весь смысл теряется.
250. Ish_2 1117 29.08.11 16:41 Сейчас в теме
(248) КОнечно,нет . Здесь нужно использовать "Попытка".
При XMLЗначение(Тип("Число"), "ыыы.3") - Ошибка.
251. Ish_2 1117 29.08.11 16:43 Сейчас в теме
(248) Хорош гадать. Завтра жду.
252. cool.vlad4 2 29.08.11 16:47 Сейчас в теме
Вычислить("""fvd""+""-fvd""") = строка
Вычислить("""4""+""-4""") = 0 значит число
upd не, неправильно, не работает, идея была добавлять минус.
253. cool.vlad4 2 29.08.11 16:58 Сейчас в теме
:D дождусь до завтра
254. alexk-is 6550 29.08.11 17:26 Сейчас в теме
Так работает...
СтрокаЧисла = СтрЗаменить(СокрЛП(СтрокаЧисла), Символы.НПП, "");
XMLЗначение(Тип("Число"), ?(Лев(СтрокаЧисла,1) = "-", "-0" + Сред(СтрокаЧисла, 2), "0" + СтрокаЧисла));
255. Ish_2 1117 29.08.11 17:42 Сейчас в теме
(254) Я тебе тестировщик что ли ..? Ты давай своё окончательное решение.
Ты написал :
XMLЗначение(Тип("Число"), ?(Лев(СтрокаЧисла,1) = "-", "-0" + Сред(СтрокаЧисла, 2), "0" + СтрокаЧисла)); 
Присвоим СтрокаЧисла = "1йй.1", Тогда после преобразования должны получить 0.
Заходим в режиме 1сПредприятие в "Табло" набираем
XMLЗначение(Тип("Число"), ?(Лев("1йй.1",1) = "-", "-0" + Сред("1йй.1", 2), "0" + "1йй.1"))

и получим значение 1, вместо 0.
Это ошибка.
cool.vlad4; +1 – Ответить
256. cool.vlad4 2 29.08.11 17:44 Сейчас в теме
И если количество разделителей больше 1, должно быть по идее 0. А в этом случае просто обрежет. Но в принципе можно допилить. Только вот смысл этого непонятен Лев(СтрокаЧисла,1) = "-"
257. cool.vlad4 2 29.08.11 17:47 Сейчас в теме
Я думаю по длине надо проверять входное и выходное значение, чтобы отсекать лишнее.
258. cool.vlad4 2 29.08.11 17:53 Сейчас в теме
Туплю, Лев(СтрокаЧисла,1) = "-" - отрицательные числа же.
259. alexk-is 6550 29.08.11 21:34 Сейчас в теме
Ладно. Пусть тогда будет так.

Функция СтрокаВЧисло(СтрокаЧисла)

ОписаниеТипов = Новый ОписаниеТипов("Число");
Возврат
ОписаниеТипов.ПривестиЗначение(СтрокаЧисла);

КонецФункции
// СтрокаВЧисло()
saddy; i132; Evg-Lylyk; cool.vlad4; +4 – Ответить
260. cool.vlad4 2 29.08.11 22:00 Сейчас в теме
(259) черт, действительно...самый грамотный способ...кстати ПривестиЗначение записи вида "2e-4" понимает...
261. Ish_2 1117 30.08.11 07:40 Сейчас в теме
(259) Ок.
И насколько быстрее чем "Попытка" ?
262. alexk-is 6550 30.08.11 08:13 Сейчас в теме
(261) Скорость очень сильно зависит от структуры строковых данных.
Если все ячейки можно преобразовать к числу, то быстрее в ~1,7 раза.
Если все ячейки нельзя преобразовать к числу, то быстрее в ~6,5 раз.
Если 50 на 50, то быстрее в ~4 раза.

Это только приведение к типу число.
263. Ish_2 1117 30.08.11 08:54 Сейчас в теме
(262) А статью про запросы ты зажал .
264. alexk-is 6550 30.08.11 09:45 Сейчас в теме
(263) Кое-кто статью залажал. Не будем показывать пальцем "кто", хотя это был...
265. Ish_2 1117 30.08.11 09:47 Сейчас в теме
(264) Не пыжься. Я всё равно не сознаюсь.
Опубликовал бы как есть.
292. alexk-is 6550 17.10.11 11:56 Сейчас в теме
(265) Праздника не будет...
293. Ish_2 1117 17.10.11 12:17 Сейчас в теме
(292) Обдурил ? Со статьёй про запросы ?
294. alexk-is 6550 17.10.11 13:01 Сейчас в теме
(293) Нет. Это про 300 звёздочек на этой публикации. Это я так, на всякий случай, предупредить, а то прослеживаются некоторые тенденции...

Статья будет, но чуть позже. Осталось ещё 5 страничек написать...
295. Ish_2 1117 17.10.11 13:04 Сейчас в теме
266. artbear 1590 01.09.11 18:25 Сейчас в теме
(0) ИМХО в начале публикации не хватает оглавления.
чтобы не пришлось бегать по всей статье.
267. alexk-is 6550 02.09.11 06:46 Сейчас в теме
(266) Вот бы ещё знать как это сделать...
268. alexk-is 6550 02.09.11 07:39 Сейчас в теме
(266) Добавил оглавление с сылками по якорям
http://htmlbook.ru/samhtml/yakorya

...хорошо, когда есть хороший webmaster...
269. Широкий 693 08.09.11 11:03 Сейчас в теме
Вставлю свои 5 копеек касаемо COM_Monitor.
В общем случае получение ссылки по ГУИДЫ выполняется так:
ОбъектДляПоиска.ПолучитьСсылку(Новый УникальныйИдентификатор(Строка(Выборка.Ссылка.УникальныйИдентификатор())))

Но можно использовать XMLСтрока/XMLЗначение

Прикрепил обработку с замерами
Прикрепленные файлы:
ВнешняяОбработка1.epf
270. alexk-is 6550 09.09.11 18:48 Сейчас в теме
(269) Этот комментарий сподвиг меня на более глубокое исследование вопроса и поиска вариантов решения.
Обновил "Пример 6 для COM Monitor". Теперь получается ещё большее ускорение при использовании дополнительной обработки для передачи данных.

Вид сравниваемых данных: Документ "Реализация товаров и услуг".
Количество документов: 81846

Результаты выполнения:
COM MONITOR: 6601.097 сек.
Пример 6 для COM Monitor: 117.772 сек. Ускорение в 56 раз
Пример 6 для COM Monitor с обработкой: 4.377 сек. Ускорение в 1508.1 раза
271. Широкий 693 09.09.11 21:14 Сейчас в теме
Ускорение прям на глазах меняется :)
Только что 1400 было
272. alexk-is 6550 09.09.11 21:23 Сейчас в теме
(271) Данные по COM MONITOR написал вначале по оценке за 1 минуту. Не смог дождаться результата, ушел домой.
Пишу из дома. Теперь когда тест всё таки закончился пересчитал на фактические данные.
273. alexk-is 6550 09.09.11 21:34 Сейчас в теме
(271) Собственно не важно 1400 или 1500. На разной технике и разных базах результаты будут отличаться.
Допустим разница времени выполнения будет 200 раз. Т.е. не 3 с лишним часа, а всего 1 минуту. Не знаю как для других, а для меня это очень даже приличное ускорение.
274. Широкий 693 09.09.11 21:35 Сейчас в теме
Сколько прирост дала моя методика?
275. alexk-is 6550 09.09.11 21:45 Сейчас в теме
(274) Применительно к рассматриваемой задаче ускорение получилось в 1.62 раза (38%)
276. Широкий 693 09.09.11 21:49 Сейчас в теме
Могу еще 5 копеек в копилку
Пример обмена через сериализованную таблицу значений.
Пример не самостоятельный - надергал в текстовик куски из кода.. но принцип должен быть понятен.
Прикрепленные файлы:
ПримерКода.txt
277. alexk-is 6550 09.09.11 22:13 Сейчас в теме
(276) Прикольно.
Хотя в рамках рассматриваемой задачи мой вариант реализации обмена данными получился эффективнее.
278. artbear 1590 10.09.11 12:45 Сейчас в теме
(276) Да, сериализованной таблицей очень удобно пользоваться, я этот метод еще в 77 юзал :)
279. MrXaN 45 23.09.11 08:00 Сейчас в теме
Очень полезная статья иногда глянешь и новое решение в голову лезет)) Спасибо автору.+1
280. пользователь 01.10.11 01:43
Сообщение было скрыто модератором.
...
281. KSM 05.10.11 11:33 Сейчас в теме
282. alexk-is 6550 05.10.11 14:35 Сейчас в теме
Добавил в заметочки "Про типы данных"
283. shomo 05.10.11 15:58 Сейчас в теме
спасибо за советы. Надо применять оптимизированные коды. Хотя 1с требует все данные отбирать запросом.
284. пользователь 06.10.11 06:05
Сообщение было скрыто модератором.
...
285. pmtvv 09.10.11 15:05 Сейчас в теме
полезная информация, спасибо за статью
286. alexk-is 6550 12.10.11 09:42 Сейчас в теме
Добавил в заметочки к разделу "Про циклы в одну строку" обработку для формарования программного кода в одну строку.
287. alexk-is 6550 13.10.11 18:22 Сейчас в теме
Добавил в заметочки "Про итоги в регистрах накопления"
288. artbear 1590 13.10.11 18:43 Сейчас в теме
alexk-is пишет:Добавил в заметочки "Про итоги в регистрах накопления"

ИМХО сразу бы уж прикладывал прямую ссылку с якорем :)
289. alexk-is 6550 14.10.11 06:43 Сейчас в теме
(288) Аппетиты растут во время еды? :)
290. Evg-Lylyk 5529 14.10.11 23:28 Сейчас в теме
Для раздела "Про типы данных. Расчет сумм по выделенным ячейкам табличного поля"
думаю стоит упоминуть Оптимизированный подсчет суммы выделенных ячеек табличного документа
Хорошее решение с ПривестиЗначение ;)
291. alexk-is 6550 15.10.11 12:20 Сейчас в теме
(290) Да, предложенный "Оптимизированный подсчет суммы выделенных ячеек табличного документа" очень эффективен при использовании Попытка для преобразования типов данных, а также при выделении большого количества ячеек, в случае, когда расчет выполняется на каждую выделенную ячейку.

Я предложил несколько иной подход к решению:

1. Решение проблемы с наложением областей
2. Оптимизация выполнения кода по скорости
3. Использование отложенного расчета по выделенным ячейкам. Т.е. расчет выполняется после окончания выделения области

Возможно, что объединение двух этих методов дало бы ещё больший эффект, но...
296. Gasdrubal 19.10.11 06:16 Сейчас в теме
Ох уж эти циклы в одну строку, как их все любят теперь в коде, но ведь это снижает читабельность. Данное ухищерние не делает экспоненциальные алгоритмы перебора - полиномиальными. К чему?
297. alexk-is 6550 19.10.11 06:45 Сейчас в теме
(296) Конечно же не делает. Это просто не возможно сделать интерпретатором.

Правда ведь, что вывод напрашивается сам собой - нужно пользоваться обработкой КодВОднуСтроку.epf.
Она оставляет исходный код с комментариями и форматированием, а также формирует код в одну строку. При этом сохраняется читабельность кода и работает интерпретатор пошустрее.
298. anig99 2867 23.10.11 23:31 Сейчас в теме
Потестировал тут циклы в разных вариантах. Видимо очень сильно зависит от кол-ва кода внутри цикла. У меня в файловой версии 13 платформы разница даже до 10% не дотягивала. Кроме случая с выводом Состояние. Вывод в каждой итерации цикла тормозит цикл раза в 3-4. Если такой цикл написать в 1 строчку, то вообще чудеса - вывод состояния в какой-то момент может перестать выполняться (возможно это специфика взаимодействия с windows 7) и соответственно нет вывода состояния - не тормозов.
Ограничение вывода 1 раз на 1000 итераций увеличило выполнение цикла на 1-2 сек (176 и 178 соответственно). Т.е. значимых тормозов уже не наблюдалось.
Те же 1-2 секунды дало ОбработкаПрерыванияПользователя и вынос тела цикла в отдельную процедуру.
В конфе прикрепленной есть обработка создания документов. В обработке подменю для тестирования. Создает в цикле документы, но не записывает их.
Прикрепленные файлы:
ТестированиеСпособовПоискаПоЧастиНомера.cf
299. alexk-is 6550 24.10.11 06:49 Сейчас в теме
(298) Процент ускорения зависит не только и не столько от количества команд в цикле, сколько от их "качества". Чем быстрее выполняются команды, тем больше процент ускорения. В этом отношении, самыми медленными командами будут команды обработки данных. Эффекта практически не будет в том случае, если в цикле выполняется только простое проведение. А вот на командах обработки коротких строк, на условиях сравнения и других операциях, которые выполняются только в памяти без обращения к базе данных - эффект получается довольно значительный.
300. ismdmr 27.10.11 18:24 Сейчас в теме
Интересные подходы, спасибо
301. omandarina 02.11.11 04:25 Сейчас в теме
Очень большое спасибо, очень помогло с пробелами ... до этого, ей богу, догадывался, что нечто подобное можно провернуть, но не догадывался, как ...
302. Gmix 419 15.11.11 13:08 Сейчас в теме
Интересная статья
На счет больших строк.
Для работы с большими строками используйте объект ТекстовыйДокумент.
Приложил измененный пример 7.
Пример 7.
Длина тестовой строки: 1233914
Количество строк тестовой строки: 10000
Код из комментария.  Элементов в массиве: 10 000.  Завершено за 37,532 сек.
Код из статьи.  Элементов в массиве: 10 000.  Завершено за 0,094 сек.
Через ПС и Текст.  Элементов в массиве: 10 000.  Завершено за 0,125 сек.

быстродействие почти такое же, что из через внутреннюю строку, но зато легально иногда даже быстрее зависит от строки.
И что не мало важно позволяет обрабатывать данные помещая в массив.
Прикрепленные файлы:
Пример7.epf
306. alexk-is 6550 16.11.11 09:08 Сейчас в теме
(302) Хороший пример. Да, если данные необходимо предварительно обрабатывать. Возможно даже, что иногда быстрее, но уж очень зависит от состава данных в строке.
Пример 7.
Длина тестовой строки: 2099999
Количество строк тестовой строки: 1000000
Код из комментария.  Элементов в массиве: 1 000 000.  Завершено за 1 472,631 сек.
Код из статьи.  Элементов в массиве: 1 000 000.  Завершено за 0,778 сек.
Через ПС и Текст.  Элементов в массиве: 1 000 000.  Завершено за 5,34 сек.
Через ПС и Текст (одна строка).  Элементов в массиве: 1 000 000.  Завершено за 6,058 сек.


(305) Даже на одной команде в цикле получилось 12%-ное ускорение. Это конечно не много. Но можно посмотреть на это с другой стороны. Например, так. Сколько будет стоить проапгрейдить все компьютеры в сети, чтобы поднять производительность на 5%? Но это так, лирическое отступление. Для меня же это скрытый резерв, который позволяет не прибегая к глобальным изменениям в коде, а лишь нажатием нескольких кнопок, несколько поднять производительность на некоторых операциях. Я о нём знаю и помню, а Вы?..
303. Gmix 419 15.11.11 13:34 Сейчас в теме
Еще один момент
про циклы в одной строке
В отладке действительно скорость выполнения цикла отличается в разы.
1 000 000 итераций
Замер код записан в 6 строк. Завершено за 23,39 сек.
Замер код записан в 1 строку. Завершено за 1,203 сек.

А в базе данных в которой нет отладки разница уже не так очевидна.
Замер код записан в 6 строк. Завершено за 1,953 сек.
Замер код записан в 1 строку. Завершено за 1,39 сек.
304. alexk-is 6550 15.11.11 14:18 Сейчас в теме
(303) См. (6)
Тестирую на моём ПК
У меня для 1000000 циклов результаты такие

1С:Предприятие 8.1.15.14
Замер код записан в 6 строк. Завершено за 0,884 сек.
Замер код записан в 1 строку. Завершено за 0,587 сек.
33,6%

1С:Предприятие 8.2.14.533
Замер код записан в 6 строк. Завершено за 0,85 сек.
Замер код записан в 1 строку. Завершено за 0,499 сек.
41,3%

В вашем замере разница в 28.8%. Вполне укладывается в среднестатистическую погрешность. От ПК тоже многое зависит.

По приведенному примеру. Следует учитывать, что чем больше быстро выполняющихся операций в цикле, тем больше будет эффект. Ну, и наоборот, если в цикле выполняются очень медленные операции, то эффекта возможно вообще не будет.
305. Gmix 419 15.11.11 14:25 Сейчас в теме
Тут важен включена отладка или нет.
если на 1 000 0000 итераций разница в 0,5 сек на цикле
так как код внутри цикла будет выполняться одинаково
смысла так издевается над кодом я не вижу.
Важно быстродействие внутри цикла.
307. Gmix 419 16.11.11 10:13 Сейчас в теме
Если смотреть на реальном коде. Ускорения вы не получите.
так как реально циклы с 1 000 000 итерациями для простой арифметике не делают.
Как правило в циклах тормозят именно то что внутри него.
эти примеры доказывают то, что конструкция
Для По Цикл
Конец;

медленнее на 0.3 сек для 1 000 000 итераций чем
Для По Цикл Конец;


но это будет ничтожно мало в сравнении полной производительностью определенного кода.
с чего вы взяли что поднимите общую производительность на 5%.
Есть реальные примеры замера производительности с нормальными циклами и в одну строку?
Причем тестировать нужно корректно:
Запуск 1С тест1
Запуск 1С тест2

1С и ОС кешеруют данные и проверять нужно с этим учетом + сама отладка тормозит поэтому код в режиме отладки выполняется дольше.

я не спорю что код в одну строку быстрее но у него огромный минус (не читаемость), а ++ его спорны

т.е в реалии если не оптимизировать то что внутри цикла ни кто из пользователей не заметит ускорения

Если вы хотите оптимизировать нужно пользоваться замером производительности тогда вы получите гораздо лучшей результат.

Вот реальный пример кода вывод области табличного документа.
Ускорения практически ноль.
Замер код записан в 6 строк. Завершено за 10,359 сек.
Замер код записан в 1 строку. Завершено за 10,297 сек.
Прикрепленные файлы:
Пример1.epf
308. alexk-is 6550 16.11.11 16:48 Сейчас в теме
(307) Вот другой пример. Берем обработку http://infostart.ru/public/19856/
Для тестирования работы обработки возьмем глобальный модуль ЗиК 7.70.315

Вот результат с оптимизацией. Завершено за 16,34 сек.
Вот результат без оптимизации. Завершено за 19,628 сек.
Вот они 16% ускорения на реальной обработке и реальных данных.
Можно сравнить с обработкой с диска ИТС. Завершено за 2670,795 сек.

Я не призываю агульно всё писать в 1 строку.
Ещё раз повторюсь. Для меня это только один из способов оптимизации.
Допускаю, что возможно я чего-то про оптимизацию не знаю. И если у вас есть какой-то другой способ поднять производительность на те же 16%, буду только рад об этом узнать.
309. Gmix 419 16.11.11 17:21 Сейчас в теме
Ну для этих целей можно еще доп 3 сек подождать.
Реальный пример это немного другой все таки разукрашивать код нужно не пользователям БД.
а вот выводит отчеты им ближе будет.
Ускорение есть только в части самого цикла при большем количестве итераций.
Но время работы самого цикла незримо мало по сравнению с тем временем которое тратиться на обработку того, что внутри цикла
Согласен программист должен сам решать.
Либо писать так чтобы было читаемо ли в одну строку.
Но в реальных БД ускорения даже в 5% вы точно не получите.
так что сравнивать этот нюанс с
Сколько будет стоить проапгрейдить все компьютеры в сети, чтобы поднять производительность на 5%

считаю некорректным. Большего результата можно добиться оптимизировав код в режиме замера производительности.
Удачи!
311. alexk-is 6550 17.11.11 09:45 Сейчас в теме
(309)
Большего результата можно добиться оптимизировав код в режиме замера производительности.
Вообще-то я расчитывал, что будет предложен какой-нибудь конкретный метод оптимизации применительно к конкретной обработке. :)
Ну, нет, так нет.
312. Gmix 419 17.11.11 09:55 Сейчас в теме
Оптимизировать разукраску текста? Зачем? 3 секунды я потерплю.
И типовая тоже сгодиться.
Для каких целей вами нужно разукрашивать ВЕСЬ глобальный модуль.
Как правило сфера применения данной обработки это вставка кода в статью на сайте.
Если Вы вставите огромный кусок кода в статью, то её скорее всего читать ни кто не будет.
Реальная задача для вашей обработки это разукраска ну максиму 300 строк.
Сравните производительность с 300 строками. Нужна оптимизация?
313. alexk-is 6550 17.11.11 11:24 Сейчас в теме
314. westinka 22.11.11 14:12 Сейчас в теме
спасибо автору, начинающему более чем интересно и уместно почитать такое, включая всем комментарии. особенно если помнить о том, что лучше учиться не на своих ошибках :)
315. pvlunegov 160 02.12.11 10:31 Сейчас в теме
Спасибо автору за действительно качественно оформленную статью.
Почитаю на досуге
316. ilnur.56 08.12.11 15:29 Сейчас в теме
Спасибо. Пригодилось.
317. i132 130 09.12.11 15:23 Сейчас в теме
Хочу добавить еще пример: если много накладных в одну строку, то фильтр по одному товару быть быстрее, чем по подзапросу:

.Остатки(&Момент,Номенклатура = &Номенклатура)

вместо

.остатки(&Момент,Номенклатура в (Выбрать Номенклатура из Накладная))

в случае файлового варианта 8.1.15 выигрыш был 50%
321. OLEG4120 165 20.12.11 15:56 Сейчас в теме
(317) У меня кстати вопрос. сколько раз выполниться
Выбрать Номенклатура из Накладная

в
.остатки(&Момент,Номенклатура в (Выбрать Номенклатура из Накладная))

Один ли раз?
318. Olejkee 09.12.11 15:28 Сейчас в теме
нужно для начала на практике все попробовать ) спс
319. Moll 19.12.11 21:20 Сейчас в теме
Благодарим за статью, особенно интересным было почитать про запросы и схемы компоновки данных, некоторые моменты оказались совершенно новыми для меня, а также полезными.. тем более что в последнее время часто приходится писать запросы и составлять схемы компоновки данных..
И конечно же плюс за оформление, ведь это потраченное время на благо начинающих программюг x]
322. Feelthis 38 22.12.11 10:09 Сейчас в теме
Большое спасибо за проделанную работу, очень помогло в изучении тонкостей 1с )
323. пользователь 25.12.11 13:51
Сообщение было скрыто модератором.
...
324. пользователь 29.12.11 09:34
Сообщение было скрыто модератором.
...
325. petrovaUL 11.01.12 07:24 Сейчас в теме
Спасибо, попробую при удобных случаях. Можно методичку создать.
326. ArikiteSun 16.01.12 13:23 Сейчас в теме
Интересная информация, спасибо!
328. Широкий 693 19.01.12 10:01 Сейчас в теме
"Про итоги в регистрах накопления"
Тогда было принято решение отключить расчет итогов по этому регистру. На производительности и функциональности это ни как не сказалось..


Совсем не тому учите. На производительность это скажется если отчеты формировать с периодом больше месяца.
А насчет размеров:
РегистрНакопленияМенеджер.<Имя регистра накопления> (AccumulationRegisterManager.<Имя регистра накопления>)
ПересчитатьИтоги (RecalcTotals)
Синтаксис:
ПересчитатьИтоги()
Описание:
Выполняет полный пересчет итогов регистра накопления.
Пример:
Регистры.Остатки.ПересчитатьИтоги();


Если это не помогло - в скуле очистить таблицу итогов и снова ПересчитатьИтоги.

Можно и с другой стороны - отключить у всех измерений участие в итогах

Речь ессно идет про оборотный регистр
329. alexk-is 6550 19.01.12 12:14 Сейчас в теме
(328)
Речь ессно идет про оборотный регистр
В статье речь идет про регистр остатков ЗаказыПокупателей.

На производительности и функциональности это ни как не сказалось
Это означает, что ни на производительности, ни на функциональности отключение расчитанных итогов именно по этому регистру ни как не сказалось.

Вот сегодняшняя статистика по производительности:
Универсальный отчет http://infostart.ru/public/84642/
Регистр ЗаказыПокупателей. Расчет итогов отключен.
Группировки отчетов Заказ, Номенклатура. Отборов нет.

Формирование отчета по остаткам и оборотам за прошлый год заняло 33 секунды, а это 16 колонок и 80000 строк.
Формирование отчета по остаткам и оборотам за весь период заняло 204 секунды, а это 16 колонок и 240000 строк.
Формирование отчета по текущим остаткам заняло 14 секунд, а это 4 колонки и 50000 строк.

Хотя обычно нужны итоги по конкретному заказу. Так вот формирование отчета с итогами по всем измерениям регистра и отбором по заказу заняло меньше секунды. Если нужно, то сделаю замер с точностью до милисекунд.

А насчет размеров
Как я уже написал в статье, все "цивилизованные" способы не привели к значительному уменьшению таблиц итогов. Как работать с итогами я знаю: http://infostart.ru/public/18394/

А то, что "С методической точки зрения, возможно, это не самое лучшее решение", то это я так же указал в статье.

PS: Статья хорошая (сам писал). Пожалуйста, читайте внимательнее.
332. Широкий 693 19.01.12 16:11 Сейчас в теме
(329)
Обычно распухание происходит когда регистр "в ноль" не закрывается. Поэтому записей в таблице итогов больше чем в таблице движений (грубо говоря кратно количеству месяцев). Может стоило в эту сторону покопать? Сделать например корректирующий документ который погасит неиспольуемые движения.


Т.к. через интерфейс это сделать не получилось, то вот, собственно, код:

РегистрыНакопления.ЗаказыПокупателей.УстановитьПериодРассчитанныхИтогов('00010101');


Операции->Управление итогами->Установить По = Год своего рождения.

З.Ы. В статье все-таки нужно объяснить - чего же мы сделали, и к чему это может привести.
334. alexk-is 6550 19.01.12 16:27 Сейчас в теме
(332)
Обычно распухание происходит когда регистр "в ноль" не закрывается. Поэтому записей в таблице итогов больше чем в таблице движений (грубо говоря кратно количеству месяцев). Может стоило в эту сторону покопать? Сделать например корректирующий документ который погасит неиспольуемые движения.
Так я же написал в статье, что таблица регистра увеличилась при этом в 2 раза, а пересчет итогов после этого привел лишь к уменьшению таблиц итогов лишь в 2.5 раза.

Операции->Управление итогами->Установить По = Год своего рождения
Так это ведь не отключит расчет итогов, а установит его на указанную дату. Чуствуете разницу? Отключить? Установить на дату?
330. nll.jojo 19.01.12 12:20 Сейчас в теме
много чАго интересного
331. Boroda 90 19.01.12 12:48 Сейчас в теме
Спасибо, очень интересные и познавательные заметки. Узнал для себя много нового. Надеюсь, что публикации будут иметь продолжение. А потом, если их собрать, глядишь, и учебник можно издать для начинающих... Однозначно "+"!
333. Широкий 693 19.01.12 16:15 Сейчас в теме
В догонку
Тогда было принято решение отключить расчет итогов по этому регистру

Итоги все же есть - на текущий момент.

Вот если бы так сделал:
РегистрыНакопления.ЗаказыПокупателей.УстановитьПериодРассчитанныхИтогов('00010101');
РегистрыНакопления.ЗаказыПокупателей.УстановитьИспользованиеТекущихИтогов(Ложь);

То я бы с удовольствием посмотрел бы на твои замеры
335. alexk-is 6550 19.01.12 16:35 Сейчас в теме
(333) Вообще-то цель была не убить базу, а уменьшить самую большую таблицу с сохранением функциональности и производительности.

Будет время, обязательно попробую.
336. Широкий 693 19.01.12 17:48 Сейчас в теме
Так это ведь не отключит расчет итогов, а установит его на указанную дату. Чуствуете разницу? Отключить? Установить на дату?

Разницы не чувствую - потому как это одно и то же.

А отключает итоги вот это:
УстановитьИспользованиеИтогов(<Признак>)
Но тогда уже придется без виртуальных таблиц обходится
337. alexk-is 6550 20.01.12 13:11 Сейчас в теме
(336) Тут всё очень просто. Это решение не для Вас. Вам оно ни как не подойдет, т.к. решает проблемы, которых у Вас нет, возможно ни когда и не будет.

Но если что, обращайтесь... :)
338. Широкий 693 20.01.12 13:13 Сейчас в теме
Что так? И возразить нечем?
339. alexk-is 6550 20.01.12 13:29 Сейчас в теме
(338) А зачем? Есть люди предельно убежденные в своей правоте. Убеждать их в чем либо дело не благодарное.

Я описал проблему, попытки решения и вариант решения, который в результате этих попыток был принят. При этом отметил, что возможно это не самый лучший вариант решения.

Как сказал один товарищ "Нет плохих или хороших решений, есть только принятые и не принятые".
340. fonomo0 23.01.12 09:45 Сейчас в теме
Как начинающему , мне интересно!)
341. lux17 23.01.12 11:21 Сейчас в теме
спасибо, очень любопытно
342. Модератор раздела 23.01.12 17:33 Сейчас в теме
(0) Что добавил/изменил при последних правках?
343. alexk-is 6550 23.01.12 17:38 Сейчас в теме
(342) См. (327)

Даже ссылку с якорем вставил. Полный сервис. :)
344. master_yoda 27 27.01.12 13:49 Сейчас в теме
Весьма занимательная статья......очень пригодилась при оптимизации некоторого быдлокода
345. zhleonid8 28.01.12 23:06 Сейчас в теме
да бывает 1о строк кода только на дату.......прогеры так могут
346. zhleonid8 28.01.12 23:07 Сейчас в теме
они на могое горазды
347. mkostya 30 29.01.12 23:00 Сейчас в теме
Очень понравились заметки продолжайте в том же духе))
348. Inerren 31.01.12 08:45 Сейчас в теме
Спасибо за занимательную статью. Как новичку в 1С, действительно, полезно было почитать.
349. alexk-is 6550 31.01.12 09:49 Сейчас в теме
350. zsder 5 31.01.12 20:39 Сейчас в теме
Спасибо большое автору за данную публикацию, узнал много нового!
351. JamilRG 02.02.12 08:34 Сейчас в теме
занимательно, да очень
352. пользователь 03.02.12 18:41
Сообщение было скрыто модератором.
...
353. Sean1s 9 05.02.12 19:02 Сейчас в теме
Мизерный прирост быстродействия за счет удобства читаемости кода. Да ну...
354. Anton_prezident 12.02.12 14:14 Сейчас в теме
спасибо,интересная статья
355. Veduin 15.02.12 07:47 Сейчас в теме
спасибо, очень познавательно!
356. cerg110 3 15.02.12 09:32 Сейчас в теме
спасибо, интересно было почитать на досуге.
357. BalVlad 15.02.12 14:43 Сейчас в теме
Для меня - новичка в 1С много нового и интересного, спасибо за статью!
358. fit686 21.02.12 19:20 Сейчас в теме
Честно говоря разницы не чувствуется,но все-равно спасибо,ради общего развития.
360. FeDBuka 9 12.03.12 14:49 Сейчас в теме
Спасибо, интересно
361. bolush 12.03.12 14:56 Сейчас в теме
Оооо интерестно. Когда то что то похожее писал. Ну канешно похожее
362. Новиков 292 13.03.12 09:49 Сейчас в теме
Пожелание автору: якорями отмечайте, что нового вы добавили в статью после апдейта, и в самом низу ставьте на них ссылки, чтобы сразу можно было прочитать, то что не читал. Спасибо! .-)
363. alexk-is 6550 13.03.12 10:06 Сейчас в теме
364. Новиков 292 13.03.12 13:30 Сейчас в теме
(363) ты согласен что это комменты, но не статья? :) Я предлагаю, просто внизу строчкой или как-то - раз у тебя уже якоря есть, писать типо "обновление 13.03.2012: пруфы на якоря".

Ты не подумай, я не со своим уставом в твой монастырь, не учу тебя - ни ни. Ну просто (мне так кажется) - это было бы удобно!
372. alexk-is 6550 27.03.12 14:11 Сейчас в теме
365. i132 130 22.03.12 12:22 Сейчас в теме
предлагаю вариант подсчета сумм выбранных строк таблицы на форме:

ТзСвертки = ИсходнаяТаблица.Скопировать(Новый Структура("Обработать",Истина),"Сумма");
ИтогВыбранныхСумм = ТзСвертки.Итог("Сумма");
366. alexk-is 6550 22.03.12 13:09 Сейчас в теме
(365) Это вместо "Про типы данных. Расчет сумм по выделенным ячейкам табличного поля" ?
367. i132 130 22.03.12 14:31 Сейчас в теме
(366) нет, это не про печатную таблицу, это про таблицу значений на форме, у которой галочками выделяются нужные строки -вариант подбора: нужные строки не сразу добавляются в талицу отбора а выделяются галочкой в основной таблице, (например: отмена заказов)
369. пользователь 26.03.12 18:35
Сообщение было скрыто модератором.
...
370. пользователь 26.03.12 18:35
Сообщение было скрыто модератором.
...
371. пользователь 26.03.12 18:36
Сообщение было скрыто модератором.
...
373. jONES1979 28.03.12 08:02 Сейчас в теме
Спасибо! Много полезного! Добавил в "закладки"!
374. coder1cv8 3487 10.04.12 14:31 Сейчас в теме
Не пойму как установка рассчитанных итогов в пустую дату может не ухудшить производительность получения остатков прошлых периодов? Я уже 1С немного подзабыл, поэтому подскажите, где я ошибаюсь в своих рассуждениях?

Итоги у нас хранятся помесячно, вплоть до периода рассчитанных итогов + текущие итоги (которые с датой 3999.чего-то там). Как получаются остатки, когда мы обращаемся к виртуальной таблице остатков: если дата на которую нужны остатки больше периода рассчитанных итогов, то берутся текущие итоги и из них вычитаются все движения до даты на которую нам нужны остатки. Если же мы хотим получить остатки где-нибудь в прошлом году к примеру, то берется ближайший месяц рассчитанных итогов и к нему добавляются (или вычитаются) движения до нужной даты.

Что должно произойти если мы сбросим период рассчитанных итогов: остатки всегда будут формироваться путем вычитания всех движений (до нужной нам даты) из текущих итогов. Получается что чем дальше в прошлое нам нужны остатки - тем дольше будет выполнятся запрос. Или я не прав и в 1С это работает не так?
375. alexk-is 6550 10.04.12 14:53 Сейчас в теме
(374) Например, потому, что таблица итогов в 50 раз больше, чем таблица самого регистра. Размер иногда имеет значение, а большой размер может иметь большое значение.
376. An-Aleksey 64 18.04.12 10:32 Сейчас в теме
Нет смысла создавать индексы, если временная таблица соединяется с другой таблицей по полям, которые во второй таблице уже проиндексированы.

Почему? Разве в этом случае не будет производиться скан по полям первой временной таблицы?
377. alexk-is 6550 18.04.12 11:14 Сейчас в теме
(376) Переадресовываю этот вопрос чёрному ящику "оптимизатору запросов".
Конечно, если поля в обоих таблицах будут проиндексированы, то оптимизатор скорее всего выберет один из индексов. А может решит, что перебор записей будет быстрее, а может поднимет результат запроса из кеша, а может решит, что использование индекса, по которому нет статистики не так эффективно, как использование индекса с высоким показателем выборки уникальных записей.

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

Кроме этого есть ещё и такой момент http://infostart.ru/public/71130/#Pro_paketnye_zaprosy_Indeksy_vo_vremennyh_tablicah
При этом данная заметочка не касается индексов созданных в базе данных.
378. An-Aleksey 64 18.04.12 11:48 Сейчас в теме
(377)Согласен, непостижимы пути оптимизатора.
Но с тем же успехом можно вообще не использовать индексирования (нигде) - т.к. время тратится, а использование не гарантировано.

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

При этом данная заметочка не касается индексов созданных в базе данных.

Вот это как раз и заставило задуматься :)
Насколько я понял рекомендации 1С, следует индексировать обе таблицы. Но там пояснения строятся больше на физических таблицах.
379. alexk-is 6550 18.04.12 12:39 Сейчас в теме
(378) Что-то не увидел по ссылке рекомендаций по индексированию "обоих временных таблиц". Можно привести цитату, где это написано?

"Если вспомнить про масштабируемость системы, то вопросов выделять или не выделять ресурсы не должно вставать."
Тогда зачем спрашивать? Проидексировать всё на свете - вдруг пригодится?

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

И забегая вперед, хотелось бы узнать результаты этого эксперимента.
380. An-Aleksey 64 18.04.12 13:47 Сейчас в теме
(379)Формулировка следующая:
Убедитесь в том, что для всех условий, использованных в запросе, имеются подходящие индексы.

Что в данном случае подразумевают под "подходящими" нужно обдумать...

Начал писать, но тут подумал - может мы говорим про разные соединения?
Я в данном случае подразумеваю внутреннее соединение.

Если же говорить о левых соединениях, то там действительно индексы для основной таблицы не нужны, поскольку никакой фильтрации по первой таблице не требуется и все равно будет полный обход.
381. alexk-is 6550 18.04.12 17:58 Сейчас в теме
(380) Тем не мение я продолжаю считать, что лучшим советчиком в тонкой настройке запросов будет именно эксперимент на конкретной базе данных с конкретным оптимизатором и, по возможности, разбор плана запроса.

Например, берем базу данных в которой есть 2 регистра: "Продажи" и "ПродажиСебестоимость". В продажах 235000 записей, в себестоимости - 155000. Соединяем их по "Регистратор" и "Номенклатура", используем внутреннее соединение и смотрим показания секундомера.

Вот исходный запрос:
ВЫБРАТЬ
	Продажи.Регистратор КАК Регистратор,
	Продажи.Номенклатура КАК Номенклатура,
	Продажи.Стоимость КАК Стоимость
ПОМЕСТИТЬ Продажи
ИЗ
	РегистрНакопления.Продажи КАК Продажи
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПродажиСебестоимость.Регистратор КАК Регистратор,
	ПродажиСебестоимость.Номенклатура КАК Номенклатура,
	ПродажиСебестоимость.Стоимость КАК Стоимость
ПОМЕСТИТЬ Себестоимость
ИЗ
	РегистрНакопления.ПродажиСебестоимость КАК ПродажиСебестоимость
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Продажи.Регистратор,
	Продажи.Номенклатура,
	СУММА(Продажи.Стоимость) КАК Доходы,
	СУММА(Себестоимость.Стоимость) КАК Расходы
ИЗ
	Продажи КАК Продажи
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Себестоимость КАК Себестоимость
		ПО Продажи.Регистратор = Себестоимость.Регистратор
			И Продажи.Номенклатура = Себестоимость.Номенклатура


СГРУППИРОВАТЬ ПО
	Продажи.Регистратор,
	Продажи.Номенклатура
Показать
14.779 - без индексов. Первый вызов
5.359 - без индексов. Второй вызов

Теперь добавляем индексы.

7.146 - индекс в Продажи по Регистратор и Номенклатура. Первый вызов
7.106 - индекс в Продажи по Регистратор и Номенклатура. Второй вызов

6.091 - индекс в Себестоимость по Регистратор и Номенклатура. Первый вызов
6.01 - индекс в Себестоимость по Регистратор и Номенклатура. Второй вызов

7.718 - индекс в обоих таблицах по Регистратор и Номенклатура. Первый вызов
7.636 - индекс в обоих таблицах по Регистратор и Номенклатура. Второй вызов

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

5.763 - индекс в Себестоимость по Номенклатура. Первый вызов


Получилось, что в данном случае для оптимизатора запросов лучше не делать индексов для виртуальных таблиц, потому что время на их создание больше, чем эффект от их использования.

В замерах участвовала база УПП 1.3.24.2 на Microsoft SQL Server 2005 Standard Edition
382. An-Aleksey 64 18.04.12 18:15 Сейчас в теме
(381)Алексей, а можете снять план запроса выбранный СУБД для запроса с индексами в обоих таблицах?
383. musatov1c.ru 6 25.04.12 10:08 Сейчас в теме
Спасибо за публикацию. Правда интересно. :)
384. NPMar 26.04.12 10:58 Сейчас в теме
Спасибо! Надеюсь пригодится, особенно для такого "чайника" в восьмерке, как я. Сейчас возникла необходимость переходить на с семерки на восьмерку. Дейсвительно, очень интересно!
385. i132 130 26.04.12 11:32 Сейчас в теме
Способ без цикла получить массив всех строк Дерева заначений:

Дерево.КОлонки.Добавить("ВременнаяКолонка");
МассивВсехСтрок = Дерево.Строки.НайтиСтроки(Новый Структура("ВременнаяКолонка",Неопределено),Истина);

Если с помощью этого метода преобразовывать Дерево в Таблицу значений получается выигрыш 10% чем если с рекурсией бегать по веткам дерева (30000строк, 2 уровня)
386. eugen91 07.06.12 13:32 Сейчас в теме
Очень полезная статья - спасибо!
387. slawaka 09.06.12 10:34 Сейчас в теме
За статью спасибо, добавил в закладки. На 8 работаю недавно, поэтому для себя узнал много полезного.
Правда, вот "Про хитрые запросы. Тэта-соединения 2", пример3 мне кажется, больно заморочено.
Попробовал написать по своему, получилось проще и на SQL работает в 2-4 раза быстрей чем "Гостинец от Ish_2..."
Вот:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	КурсыВалют.Период КАК Период,
	КурсыВалют.Курс КАК Курс,
	КурсыВалют1.Период КАК Период2,
	КурсыВалют1.Курс КАК Курс2
ПОМЕСТИТЬ
	ВрмКурсы	
ИЗ
	РегистрСведений.КурсыВалют КАК КурсыВалют
ЛЕВОЕ СОЕДИНЕНИЕ 
	РегистрСведений.КурсыВалют КАК КурсыВалют1
ПО КурсыВалют1.Валюта = КурсыВалют.Валюта
	И КурсыВалют1.Период В (ВЫБРАТЬ 
								МИНИМУМ (КурсыВалют2.Период)
							ИЗ
								РегистрСведений.КурсыВалют КАК КурсыВалют2
							ГДЕ
								КурсыВалют2.Валюта = &Валюта
								И КурсыВалют2.Курс <> КурсыВалют.Курс 
								И КурсыВалют2.Период > КурсыВалют.Период)
ГДЕ
	КурсыВалют.Валюта = &Валюта
;
ВЫБРАТЬ
	МИНИМУМ(КурсыВалют.Период) КАК ПериодС,
	КурсыВалют.Период2 КАК ПериодПО,
	МИНИМУМ(КурсыВалют.Курс2) КАК Курс,
	МИНИМУМ(КурсыВалют.Курс2) - МИНИМУМ(КурсыВалют.Курс) КАК ИзменениеКурса,
	РАЗНОСТЬДАТ(МИНИМУМ(КурсыВалют.Период), КурсыВалют.Период2, ДЕНЬ) КАК КоличествоДней
ИЗ
	ВрмКурсы КАК КурсыВалют
СГРУППИРОВАТЬ ПО 
	КурсыВалют.Период2
УПОРЯДОЧИТЬ ПО
	ПериодС

Показать
388. alexk-is 6550 09.06.12 11:38 Сейчас в теме
(387) Да, прикольно.

Зато "Гостинец от Ish_2..." работает правильно :)
393. Ish_2 1117 14.06.12 18:41 Сейчас в теме
(388) Заглянул вот.. "гостинец от Ish_2" - лучше всех ? я правильно понял ?
394. alexk-is 6550 16.06.12 12:07 Сейчас в теме
(393) В первоначальном виде? Нет.
Но если его немного подшаманить, то возможно будет лучше всех и работать будет правильно.
395. Ish_2 1117 16.06.12 23:47 Сейчас в теме
(394) Просто похихикать защел. Забыл уже всё.
392. ildarovich 8066 14.06.12 14:22 Сейчас в теме
(387) Вот здесь Комментарий к статье в похожей задаче уже применялся этот прием. После этого автор этого метода проводил исследования с целью доказать его преимущества. В файловом варианте "не смог дождаться результатов". В SQL-варианте результаты были нестабильными (зависели от числа запусков запроса) без явного преимущества метода.
389. slawaka 09.06.12 14:44 Сейчас в теме
А что здесь не правильно? Я к сожалению не видел правильного гостинца смотрел код из ветки.
390. alexk-is 6550 14.06.12 13:51 Сейчас в теме
(389) Результат конечно же. Результат.
391. slawaka 14.06.12 14:01 Сейчас в теме
Ну я именно про результат и спрашиваю, что неправильно в результате?
Кроме первой строки и последней все то же самое что и в гостинце 1 версии.
Но первая и последняя у меня правильнее, остальные версии гостинца к сожалению не видел, не могу скачать.
396. Yashazz 4930 20.06.12 13:07 Сейчас в теме
Раз уж тема всплыла, задам тупой вопрос: где и в каком примере конкретно, смотреть "ускорение в 1000 раз" для ком-обмена? Я навскидку не нашёл.
397. alexk-is 6550 20.06.12 13:28 Сейчас в теме
398. commo 22.06.12 13:21 Сейчас в теме
надо почитать спасибо.
399. alexk-is 6550 22.06.12 15:39 Сейчас в теме
400. alexk-is 6550 25.06.12 10:48 Сейчас в теме
Добавил в заметочки для раздела "Про таблицу значений" Пример 10. Теперь можно поиграть вариантами заполнения, объемами данных и сравнить результаты на цифрах. :)
401. zigomodo 29.06.12 19:55 Сейчас в теме
Спасибо,обязательно возьму на заметку!
402. Ish_2 1117 03.07.12 13:07 Сейчас в теме
Слушай, заметочник.

Хочу в "СпискеДокумента" иметь "Итоги по колонке" .
Устанавливаем любой отбор - автоматически пересчитываются итоги.

Что-то нигде не нашел описания простого решения, пришлось открывать "велосипед" самому.

Расскажешь нам : как и что ?
Прикрепленные файлы:
403. alexk-is 6550 03.07.12 13:37 Сейчас в теме
(402) Прочитал несколько раз. Так и не понял, в чем вопрос? Что требуется?
1. Итоги вообще не считаются, а должны. Как сделать, чтобы считались?
2. Итоги то считаются, то не считаются, не зависимо от установленного отбора. Как сделать, чтобы всегда считались?
3. При установке отбора итоги пересчитываются, а не должны. Как сделать, чтобы не пересчитывались?
4. При установке отбора итоги не пересчитываются, а должны. Как сделать, чтобы пересчитывались?
5. Итоги зло, тот кто их считает враг государства. Как его найти? :)
406. Ish_2 1117 03.07.12 14:52 Сейчас в теме
(403) КТо тебе такое сказал , что итоги в списке это зло ?
Разрешаю тебе презрительно посмотреть на этого смельчака.
404. alexk-is 6550 03.07.12 14:09 Сейчас в теме
405. Ish_2 1117 03.07.12 14:45 Сейчас в теме
(404) Ага, спасибо. Вроде бы верно все по смыслу, но громоздко.
Лучше бы использовать для запроса "ПостроительОтчета".
ПостроительОтчета.ТекстЗапроса =
"Выбрать
Сумма(СуммаДокумента)
ИЗ Документ.ПриходныйКассовыйОрдер как Док
{Где Док.___,
Док.___1,
Док.___2
Док.___3,......}"

Потом в цикле каждому элементу отбора "Построителя" присвоить элементОтбора "Списка" и наконец
ПостроительОтчета.Выполнить();
407. Ish_2 1117 03.07.12 15:10 Сейчас в теме
(404) Кстати , я считаю что в публикации смысловая ошибка. Автор предлагает использовать событие ПриПолученииДвнных() . Я считаю , что правильно использовать ОбновлениеОтображения() . А ты ?
408. alexk-is 6550 03.07.12 15:28 Сейчас в теме
(407) Читаем справку:
ОбновлениеОтображения() Вызывается при обновлении формы или при изменении данных формы.
Т.е. событие ОбновлениеОтображения() наступает при изменении любых данных формы, даже не связанных с ТабличнымПолем. В данном случае правильнее использовать событие ТабличногоПоля ПриПолученииДвнных() с тем, чтобы избежать "левых" пересчетов итогов.


Ну, вот как-то так я считаю :)
409. Ish_2 1117 03.07.12 16:18 Сейчас в теме
(408) За справку, спасибо.
Истина всегда конкретна :
Форма со списком документов в подавляющем числе случаев или не имеет полей ввода или имеет такие поля ввода , после изменений которых должен обновляться СписокДокументов. Наличие же элементов формы , которые никак не связаны со СпискомДокументов в такой форме - сущая экзотика.
Тогда в подаляющем числе случаев выгоднее использовать ОбновлениеОтображения().

Чем мне не нравится событие "ПриПолученииДанных" ?
А тем что оно вызывается трижды при обновлении видимой страницы.
У Радченко это есть. Привожу по памяти :
Вначале получаем данные всех записей выше текущей, затем ниже текущей записи , затем саму запись.

Заметочник, ты не все справки читал...
410. alexk-is 6550 03.07.12 16:54 Сейчас в теме
(409) Может и так, не хочу спорить по такому пустяку. На быстродействии ведь практически ни как не скажется.
411. Ish_2 1117 03.07.12 17:48 Сейчас в теме
(410) Угу. Для вас, заметочников, - всё пустяки.
Нагрел меня на 50 $m - пустяк.
Обдурил со статьей про запросы - тоже пустяк..
412. alexk-is 6550 03.07.12 19:46 Сейчас в теме
(411) Да, ладно. Сейчас про запросы только ленивый не пишет.
Я ленивый. :)

Думал, что фраза "На быстродействии ведь практически ни как не скажется" зацепит. Не зацепила. Странно.
413. kiros 52 16.07.12 16:15 Сейчас в теме
Класс! столько полезно, столько полезного и все в одном месте.
414. SERJ_1CC 50 17.07.12 09:30 Сейчас в теме
И все же информация интересная, что-то подчеркнуть для себя можно и есть над чем подумать тоже...
415. maxim305 18 19.07.12 06:12 Сейчас в теме
Спасибо! Интересный материал!
416. WalterMort 247 22.08.12 19:20 Сейчас в теме
Не читал все коменты, но сериализацию в строку и функцию СтрЗаменить использовал в своей версии обработки ПоискИЗаменаЗначений - для изменения значения субконто в движениях по бух. регистру. Выгружаем набор в ТЗ - ТЗ в строку - СтрЗаменить - обратно в ТЗ - ТЗ в набор. Получилось гораздо быстрее чем шерстить по всем движениям и искать нужное субконто.
417. sumixam 30.08.12 15:01 Сейчас в теме
спасибо очень полезные заметки
418. volsh77 17 05.09.12 04:20 Сейчас в теме
кратко : Спасибо, тебе автор!
419. ГСГ 24.09.12 08:43 Сейчас в теме
Да уж тут народ еще основной функционал до конца не изучил, а тут такие глубины копают :)
420. VVi3ard 52 04.10.12 12:42 Сейчас в теме
Есть пара интересных моментов, но было бы удобнее всем если бы это цитатник был в виде CF или DT или файловая база на DropBox(Яндекс.Диск), сейчас каждую обработку приходится качать отдельно, alexk-is что думаешь?
421. alexk-is 6550 04.10.12 13:17 Сейчас в теме
(420) Думаю, что в статье многие моменты и так подробно расписаны (есть, конечно, пара исключений). Так что качать, собственно, и не нужно. Но если нужен примерчик, то скачать его не проблема.
Кроме этого некоторые выложенные файлики не мои, о чем указано в статье. Соответственно они выложены "как есть".
422. eigen20 23.10.12 15:57 Сейчас в теме
Большое спасибо автору. Узнал много нового!!!! Просто офигенная статья!!
423. пользователь 23.10.12 16:28
Сообщение было скрыто модератором.
...
425. daho 8 03.11.12 16:44 Сейчас в теме
А ваще статья интересная!
426. waol 322 14.11.12 08:59 Сейчас в теме
Про таблицу значений
добавлю тоже в копилку
алгоритм понравился, немного его модифицировал:

- если в ТЗ только одна колонка, то при ее удалении удаляются и все строки;
- собственно, какие то колонки уже м.б. типизированы;
- в большинстве случаев известно, что тип в колонках не составной
Прикрепленные файлы:
tz.txt
427. fatenkov 16.11.12 14:44 Сейчас в теме
Большое спасибо за статью, подчерпнул много интересного
428. chemezov 50 22.11.12 09:49 Сейчас в теме
интересно спасибо
429. Miha.L 06.12.12 18:12 Сейчас в теме
Очень-очнь пользительно.
Автору - респект.
430. kaliningrad06 20.12.12 02:02 Сейчас в теме
Почитал статью осталось двоякое чувство...
В 7.7 было проще................
431. TrinitronOTV 16 20.12.12 12:56 Сейчас в теме
kaliningrad06,
поддерживаю вас
432. miniogn 48 08.01.13 09:31 Сейчас в теме
>> Про типы данных. Расчет сумм по выделенным ячейкам табличного поля

Для полной универсальности не хватает проверки на тип выделенной области.
А то если в выделение попадает картинка, то имеем ошибку.

Функция РасчетСуммыПоЯчейкам(ТабличноеПоле) Экспорт

    Сумма = 0;
    КоличествоСумм = 0;
    СоответствиеЯчеек = Новый Соответствие;
    ОписаниеТипов = Новый ОписаниеТипов("Число");

    Для Каждого ВыделеннаяОбласть Из ТабличноеПоле.ВыделенныеОбласти Цикл
		Если ТипЗнч(ВыделеннаяОбласть) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда // <- тут
			Для Индекс1 = ВыделеннаяОбласть.Лево По ВыделеннаяОбласть.Право Цикл
Показать
433. internetname 08.02.13 13:28 Сейчас в теме
Интересно. Но, если кто не знал, V8.COMConnector работает быстрее, чем V8.Application
434. alexk-is 6550 08.02.13 20:29 Сейчас в теме
(433) internetname, ответ на это замечание в посте (209)
435. Zas1402 11.06.13 11:37 Сейчас в теме
Круто, нужные статьи..
436. DimanYa 02.09.13 09:10 Сейчас в теме
Это, что теперь, чтобы скачать все эти обработки нужно потратить 14$m?

Не могли бы вы закинуть эти обработки в один архив? А то грабёж получается небольшой такой =)
437. Odinas 30.10.13 14:43 Сейчас в теме
(436) DimanYa, давайте сразу тогда все обработки инфостарта в один архив) ну и чтобы вообще $m не тратить на торренты все закинуть) а то грабеж :)
438. irishka77 12.11.13 14:45 Сейчас в теме
Всегда рада Вашим статьям!
439. Tushcan 38 05.12.13 06:58 Сейчас в теме
Автору спасибо! Очень интересно и познавательно.
440. Serj1C 484 05.12.13 08:58 Сейчас в теме
Можно добавить пару моментов из http://v8.1c.ru/o7/201312opt/index.htm
(про знач в web, НачалоПериода(&Дата, Год) в запросах, утечки памяти и т.д.)
441. Twirus 15.01.14 17:14 Сейчас в теме
Отличная Статья. Автору большущее спасибо. Очень пригодилась.
442. Al-X 05.02.14 11:29 Сейчас в теме
Спасибо ! Убрал в заметки.
443. drlondon 19.07.14 14:05 Сейчас в теме
Добрый день Очень интересно изложено. Хотелось бы добавить пару моментов о шаблоне отчета на СКД с расширением функционала (подразумеваются обычные и управляемые формы). В материалы шаблона обработки 1С дополнительно добавлено:

1. Печать заголовков колонок на каждой странице отчета.
2. Выбор из стандартных предустановленных вариантов компоновки отчета.
3. Кнопка, которая открывает сформированный отчет (табличный документ) в Microsoft Office Excel или Open Office Calc, т.е. в программе, которая ассоциирована для файлов с расширением .xls.
4. Группа кнопок для управления Периодом. "Выбор периода...", "Предыдущий месяц", "Текущий месяц" и "Следующий месяц".
444. tisas77 10.11.14 20:48 Сейчас в теме
Спасибо за статью!
445. Somebody1 68 31.07.17 14:05 Сейчас в теме
Потрясающая работа. Спасибо!
446. kote 539 24.11.17 16:10 Сейчас в теме
Замеры времени исполнения кода с включенным режимом отладки - лютое зло.. без него всё лишее, похоже, убирается при компиляции модулей и разница становится неощутима.

Сворачивание цикла в одну строку даёт прирост в 1-2%.. Читаемость кода всё же важнее, если время уж не совсем критично.

А вот переход с 8.2 на 8.3 сразу же даёт -25% (минус). Грустно, товарищи :(
448. tormozit 7393 08.04.18 21:39 Сейчас в теме
(446) Разница ощутимая есть и она слабо зависит от подключенности отладчика. В консоли кода ИР, которая кстати контролирует подключенность отладчика, я сделал пример (будет работать только в консоли кода ИР)
пМассив = Новый Массив;
пМассив.Добавить("гшоукще");
пМассив.Добавить("ыва");
пМассив.Добавить("лдщзмит");
пРазделитель = ".";

Количество = 10000;
ирОбщий.НачатьЗамерЛкс(Количество, "Многострочный");
Для Счетчик = 1 По Количество Цикл
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку();
	Пустая = Истина;
	Для Каждого Элемент Из пМассив Цикл
		Если Не Пустая Тогда
			ЗаписьXML.ЗаписатьБезОбработки(пРазделитель);
		Иначе
			Пустая = Ложь;
		КонецЕсли; 
		ЗаписьXML.ЗаписатьБезОбработки(Строка(Элемент));
	КонецЦикла;
	Результат = ЗаписьXML.Закрыть();
КонецЦикла;
ирОбщий.КончитьЗамерЛкс();

ирОбщий.НачатьЗамерЛкс(Количество, "Однострочный");
Для Счетчик = 1 По Количество Цикл
	ЗаписьXML = Новый ЗаписьXML;  	ЗаписьXML.УстановитьСтроку();  	Пустая = Истина;  	Для Каждого Элемент Из пМассив Цикл  		Если Не Пустая Тогда  			ЗаписьXML.ЗаписатьБезОбработки(пРазделитель);  		Иначе  			Пустая = Ложь;  		КонецЕсли;  		ЗаписьXML.ЗаписатьБезОбработки(Строка(Элемент));  	КонецЦикла;  	Результат = ЗаписьXML.Закрыть(); 
КонецЦикла;
ирОбщий.КончитьЗамерЛкс();
Показать

И получил результаты как с подключенным отладчиком, так и без. В первом случае ускорение естественно немного больше - 40%. Во втором случае ускорение составило 30%.
Окончание замера "Многострочный" - Длительность = 0.241с, Среднее = 0.0000241с. Отладчик подключен и неравномерно замедляет выполнение кода!
Окончание замера "Однострочный" - Длительность = 0.14с, Среднее = 0.000014с. Отладчик подключен и неравномерно замедляет выполнение кода!
Окончание замера "Многострочный" - Длительность = 0.194с, Среднее = 0.0000194с
Окончание замера "Однострочный" - Длительность = 0.133с, Среднее = 0.0000133с
Прикрепленные файлы:
тест.t1c
447. tormozit 7393 08.04.18 21:24 Сейчас в теме
Про запись кода в одну строку. В ИР 4.47 в консоли кода добавлены команды "В однострочный" и "Из однострочного" для преобразования кода в/из однострочного вида. Команда "В однострочный" справочно оставляет оригинальный код, удаляет комментарии, преобразует инструкции для контекстной подсказки, проверяет многострочные строковые литералы, инструкции препроцессора и вызов ОбработкаПрерыванияПользователя(). Команда "Из однострочного" восстанавливает код из однострочного вида, сформированного первой командой (например если вы потеряли оригинал).
Пример
	// Пассивный оригинал расположенного ниже однострочного кода. Выполняйте изменения синхронно в обоих вариантах.
	#Если Сервер И Не Сервер Тогда
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку();
	Пустая = Истина;
	Для Каждого Элемент Из пМассив Цикл
		Если Не Пустая Тогда
			ЗаписьXML.ЗаписатьБезОбработки(пРазделитель);
		Иначе
			Пустая = Ложь;
		КонецЕсли; 
		ЗаписьXML.ЗаписатьБезОбработки(Строка(Элемент));
	КонецЦикла;
	Результат = ЗаписьXML.Закрыть();
	Возврат Результат;
	#КонецЕсли
	// Однострочный код использован для ускорения. Выше расположен оригинал. Выполняйте изменения синхронно в обоих вариантах. Преобразовано консолью кода из подсистемы "Инструменты разработчика" (http://devtool1c.ucoz.ru)
	ЗаписьXML = Новый ЗаписьXML;  	ЗаписьXML.УстановитьСтроку();  	Пустая = Истина;  	Для Каждого Элемент Из пМассив Цикл  		Если Не Пустая Тогда  			ЗаписьXML.ЗаписатьБезОбработки(пРазделитель);  		Иначе  			Пустая = Ложь;  		КонецЕсли;  		ЗаписьXML.ЗаписатьБезОбработки(Строка(Элемент));  	КонецЦикла;  	Результат = ЗаписьXML.Закрыть();  	Возврат Результат;  
Показать

Таким образом обеспечиваются читаемость и два способа возвращения оригинального кода.
449. kote 539 11.04.18 17:46 Сейчас в теме
(447) ОК, спасибо.

Странно, я получил другие результаты в Вашей консоли кода когда проверял простые оперции с массивами в циклах.. попробую еще раз замерить.
Возможно с платформой что-то меняется (с релизами)..
450. tormozit 7393 11.04.18 21:27 Сейчас в теме
(449) Аналогичные результаты я получал и ранее. Думаю платформа в этом плане уже давно не менялась. В утверждения обычно легче верить, если они сопровождены примером для самостоятельной проверки. Было бы интересно получить пример (желательно в виде t1c), который бы давал сильно другие результаты.
451. BelskyAV 06.12.18 13:50 Сейчас в теме
Шикарно!
Спасибо большое.
453. пользователь 21.03.23 15:09
Сообщение было скрыто модератором.
...
Для отправки сообщения требуется регистрация/авторизация