Пак Илларион

43
Рейтинг

pakill
Илларион Пак



  •   Регистрация: 13.02.2013 (11 лет назад)

  •   Был(а) на сайте: 26.12.2023

Подписчики 1

Рейтинг 43

Неблагодарное это дело – выдавать сообщения об ошибках

Статья Программист Платформа 1С v8.3 Windows Бесплатно (free) Нет файла Тестирование QA

Методика формирования и выдачи сообщений об ошибках. Описывается способ работы над ошибками в данных, прилагается программный код. Приводятся примеры.

28.09.2013    7219    pakill    16       

25

Найти реквизиты с типом строка 10

Инструменты и обработки Программист Платформа 1С v8.3 Россия Windows Абонемент ($m) Внешняя обработка (ert,epf) Инструментарий разработчика

При добавлении нового реквизита, ему автоматически присваивается тип Строка(10). Иногда программист просто забывает его исправить. Обработка ищет в конфигурации реквизиты с таким типом. Запустите ее у себя и, возможно, будете удивлены.

1 стартмани

12.08.2013    2692    6    pakill    4       

5

Открывалка

Инструменты и обработки Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Windows Абонемент ($m) Внешняя обработка (ert,epf) Инструментарий разработчика

Обработка открывает любые объекты, запоминает их, и, тем самым, упрощает их повторное открытие. Предназначена для разработчиков. Упрощает многократное открытие одних и тех же объектов в процессе разработки и отладки. Обновлена версия: По рекомендации aet и help1Ckr добавлена возможность группового открытия объектов.

1 стартмани

04.08.2013    3662    19    pakill    13       

13

Комментарии

DevСравнение двух таблиц значений.#10 12.08.16 20:27
Перебор строк и колонок - это цикл в цикле, что не очень производительно.
Для решения задач типа:
- сравнить таблицы с учетом или без учета порядка строк
- поиск дублирующихся строк
удобно пользоваться методом таблицы значений Свернуть().

Идея такова:
1. Копируем обе таблицы в одну общую таблицу
2. В общую таблицу добавляем колонку "Показатель". Заполняем его следующим образом: в строках, полученных из первой таблицы ставим Показатель = 1, в строках из второй таблицы ставим Показатель = 2
3. Сворачиваем общую таблицу: ТаблицаОбщая.Свернуть(ВсеСравниваемыеКолонки, "Показатель");
4. После свертки совпавшие строки будут иметь Показатель = 3, а в несовпавших строках будет Показатель = 1, либо Показатель = 2

Таким образом, отсутстсвие строк с показателем, равным 1 или 2, является признаком равенства таблиц.

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

Вот процедура, реализующая данный подход

Код
// Ищет отличия двух таблиц
//
// Параметры:
//      Таблица1                - ТаблицаЗначений или ТабличнаяЧасть - первая таблица
//      Таблица2                - ТаблицаЗначений или ТабличнаяЧасть - вторая таблица
//      МассивСтрокиТаблицы1    - Выходной параметр, массив строк Таблицы1 - строки Таблицы1, 
//                                несовпадающие с соответствующими строками Таблицы2
//      МассивСтрокиТаблицы2    - Выходной параметр, массив строк Таблицы2 - строки Таблицы2,
//                                несовпадающие с соответствующими строками Таблицы1
//      СтрокаПереченьКолонок   - Строка - имена колонок, по которым сравниваются строки таблиц.
//                                Если пустая строка, то подразумеваются все колонки Таблицы1
//      СтрокаИсключемыеКолонки - Строка - колонки, которые не должны участвовать в сравнении
// 
// Описание: 
//      Процедура сравнивает таблицы, и возвращает несовпадающие строки в двух массивах
//      
// Пример:
//
//      Документ1 = ...
//      Документ2 = ...
//      СтрокиОтличия1 = Неопределено;
//      СтрокиОтличия2 = Неопределено;
//      НайтиОтличияТаблиц(Документ1.Товары, Документ2.Товары, СтрокиОтличия1, СтрокиОтличия2);
//      Если СтрокиОтличия1.Количество() + СтрокиОтличия2.Количество() = 0 Тогда
//         Сообщить("Табличные части документов совпадают");
//      КонецЕсли;
//      
Процедура НайтиОтличияТаблиц(Таблица1, Таблица2, МассивСтрокиТаблицы1, МассивСтрокиТаблицы2, СтрокаПереченьКолонок = "", СтрокаИсключемыеКолонки = "")
   
   #Область Определение_реального_перечня_колонок
      // Определение реального перечня колонок с учетом необязательных параметров
      
      // В области определяется переменная РеальныйПереченьКолонок и ничего больше
      
      СтруктураИсключаемыеКолонки = Новый Структура(СтрокаИсключемыеКолонки);
      
      Если ЗначениеЗаполнено(СтрокаПереченьКолонок) Тогда
         
         Если ЗначениеЗаполнено(СтрокаИсключемыеКолонки) Тогда
            // Странно, что заполнены оба необязательных параметра. 
            // Тем не менее, выполним это требование
            РеальныйПереченьКолонок = "";
            СтруктураПереченьКолонок = Новый Структура(СтрокаПереченьКолонок);
            
            Для каждого ЭлементСтруктуры Из СтруктураПереченьКолонок Цикл
               ИмяКолонки = ЭлементСтруктуры.Ключ;
               Если Не СтруктураИсключаемыеКолонки.Свойство(ИмяКолонки) Тогда
                  РеальныйПереченьКолонок = РеальныйПереченьКолонок + ?(РеальныйПереченьКолонок = "", "", ", ") + ИмяКолонки;
               КонецЕсли;
            КонецЦикла;
         Иначе
            РеальныйПереченьКолонок = СтрокаПереченьКолонок;
         КонецЕсли;
         
      Иначе
         
         РеальныйПереченьКолонок = "";
         
         Если ТипЗнч(Таблица1) = Тип("ТаблицаЗначений") Тогда
            Колонки = Таблица1.Колонки;
         Иначе
            Колонки = Таблица1.ВыгрузитьКолонки().Колонки;
         КонецЕсли;
         
         Для каждого Колонка Из Колонки Цикл
            Если Не СтруктураИсключаемыеКолонки.Свойство(Колонка.Имя) Тогда
               РеальныйПереченьКолонок = РеальныйПереченьКолонок + ?(РеальныйПереченьКолонок = "", "", ", ") + Колонка.Имя;
            КонецЕсли;
         КонецЦикла;
         
      КонецЕсли;
   
   #КонецОбласти
   
   
   #Область Создание_общей_таблицы
   
      // Создается объединенная общая таблица, заполненная строками обеих таблиц
      // с двумя дополнительными системными колонками
      
      // В области определяется переменная ТаблицаОбщая и ничего больше      
      
      Если ТипЗнч(Таблица1) = Тип("ТаблицаЗначений") Тогда
         ТаблицаОбщая = Таблица1.Скопировать(, РеальныйПереченьКолонок);
      Иначе
         ТаблицаОбщая = Таблица1.Выгрузить(, РеальныйПереченьКолонок);
      КонецЕсли;
      
      ТаблицаОбщая.Колонки.Добавить("sys_ИндексСтроки");
      ТаблицаОбщая.Колонки.Добавить("sys_ПоказательТаблицы");
      
      ИндексСтроки = 0;
      Для каждого СтрокаОбщейТаблицы Из ТаблицаОбщая Цикл
         СтрокаОбщейТаблицы.sys_ИндексСтроки = ИндексСтроки;
         СтрокаОбщейТаблицы.sys_ПоказательТаблицы = 1;
         ИндексСтроки = ИндексСтроки + 1;
      КонецЦикла;
      
      ИндексСтроки = 0;
      Для каждого СтрокаТаблицы2 Из Таблица2 Цикл
         СтрокаОбщейТаблицы = ТаблицаОбщая.Добавить();
         ЗаполнитьЗначенияСвойств(СтрокаОбщейТаблицы, СтрокаТаблицы2);
         СтрокаОбщейТаблицы.sys_ИндексСтроки = ИндексСтроки;
         СтрокаОбщейТаблицы.sys_ПоказательТаблицы = 2;
         ИндексСтроки = ИндексСтроки + 1;
      КонецЦикла;
   
   #КонецОбласти
   
   
   // Сворачивание совпадающих строк
   
   ТаблицаОбщая.Свернуть("sys_ИндексСтроки, "  + РеальныйПереченьКолонок, "sys_ПоказательТаблицы");
   
   
   
   // Получение результатов
   
   МассивСтрокиТаблицы1 = Новый Массив;
   СтрокиСПоказателем1 = ТаблицаОбщая.НайтиСтроки(Новый Структура("sys_ПоказательТаблицы", 1));
   Для каждого СтрокаОбщейТаблицы Из СтрокиСПоказателем1 Цикл
      МассивСтрокиТаблицы1.Добавить(Таблица1[СтрокаОбщейТаблицы.sys_ИндексСтроки]);
   КонецЦикла;
   
   МассивСтрокиТаблицы2 = Новый Массив;
   СтрокиСПоказателем2 = ТаблицаОбщая.НайтиСтроки(Новый Структура("sys_ПоказательТаблицы", 2));
   Для каждого СтрокаОбщейТаблицы Из СтрокиСПоказателем2 Цикл
      МассивСтрокиТаблицы2.Добавить(Таблица2[СтрокаОбщейТаблицы.sys_ИндексСтроки]);
   КонецЦикла;
   
   
   // Замечание. Строки ОбщейТаблицы, у которых sys_ПоказательТаблицы = 3, это совпавшие
   // строки Таблицы1 и Таблицы2
   
КонецПроцедуры
DevУниверсальный обмен данными XML в режиме отладки#4 10.07.15 8:51
1. В конфигураторе: "Сервис - Параметры - Запуск 1С: Предприятие"
в поле: "Параметр запуска" вводим: "РежимОтладки"

В противном случае обмен будет выполняться в ФОНОВОМ режиме и отладить ничего не удастся


2. Вариант А (стандартный)

- В конвертации: Создать обработку для отладки (там есть инструкция)
- В "1С Предприятии":
- В настройках обмена устанавить режим отладки
и указать путь к созданной обработке
- В конфигураторе:
- Открыть созданную обработку
- Установить точки останова где нужно
- В "1С Предприятии": Запустить обмен


ВАЖНОЕ ЗАМЕЧАНИЕ. Иногда отладчик не видит точки останова.
В этом случае:
- Закрыть обработку - все равно отладчик ее не видит
- Открыть общий модуль: РаботаВБезопасномРежиме
- Найти процедуру: ВыполнитьМетодОбъекта
- Поставить точку останова на последнюю строку процедуры:

Выполнить "Объект." + ИмяМетода + "(" + ПараметрыСтрока + ")";

- Когда выполнение остановиться на этой точке, нажать <F11>
Обработка откроется, теперь отладчик будет ее видеть.



Вариант Б (проще, но менее детальный):

- В "1С Предприятии":
- Если в настройках обмена стоит флаг "режим отладки", то снять его
- В конфигураторе:
- Открыть модуль обработки: КонвертацияОбъектовИнформационныхБаз
- В зависимости от целей отладки поставить точку останова на
одной из следующих строк в тексте модуля:

Выполнить(ПКО.ПередВыгрузкой);
Выполнить(ПКО.ПриВыгрузке);
Выполнить(ПКО.ПослеВыгрузки);
Выполнить(ПКО.ПослеВыгрузкиВФайл);

Выполнить(ПКС.ПередВыгрузкой);
Выполнить(ПКС.ПриВыгрузке);
Выполнить(ПКС.ПослеВыгрузки);

Выполнить(ПКГС.ПередОбработкойВыгрузки);
Выполнить(ПКГС.ПослеОбработкиВыгрузки);
Выполнить(ПКГС.ПередВыгрузкой);
Выполнить(ПКГС.ПриВыгрузке);
Выполнить(ПКГС.ПослеВыгрузки);

Выполнить(ПравилоВыгрузкиДанных.ПередОбработкой);
Выполнить(ПравилоВыгрузкиДанных.ПослеОбработки);
Выполнить(ПравилоВыгрузкиДанныхПредыдущее.ПослеОбработки);

// В этих строках Правило - означает ПВД
Выполнить(Правило.ПередВыгрузкой);
Выполнить(Правило.ПередЗагрузкой);
Выполнить(Правило.ПередОбработкой);
Выполнить(Правило.ПередУдалением);
Выполнить(Правило.ПослеВыгрузки);
Выполнить(Правило.ПослеЗагрузки);
Выполнить(Правило.ПослеОбработки);
Выполнить(Правило.ПриЗагрузке);

Выполнить(Конвертация.ПередВыгрузкойДанных);
Выполнить(Конвертация.ПередЗагрузкойДанных);
Выполнить(Конвертация.ПередЗагрузкойОбъекта);
Выполнить(Конвертация.ПередКонвертациейОбъекта);
Выполнить(Конвертация.ПередПолучениемИзмененныхОбъектов);
Выполнить(Конвертация.ПослеВыгрузкиДанных);
Выполнить(Конвертация.ПослеВыгрузкиОбъекта);
Выполнить(Конвертация.ПослеЗагрузкиДанных);
Выполнить(Конвертация.ПослеЗагрузкиОбъекта);
Выполнить(Конвертация.ПослеПолученияИнформацииОбУзлахОбмена);
Выполнить(Конвертация.ПриПолученииИнформацииОбУдалении);

Выполнить(АлгоритмПоиска);
Выполнить(АлгоритмПослеЗагрузкиПараметра);
Выполнить(ТекстАлгоритма);
Выполнить(ТекстСобытия);
Выполнить(ТекстСобытияПослеЗагрузкиПравилОбмена);


Замечание 1. Некоторые строчки дублируются в тексте, поэтому лучше
поставить точки останова на всех дублирующихся строчках

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

Замечание 3. Если отсутствует обработка КонвертацияОбъектовИнформационныхБаз,
найти нужный модуль глобальным поиском по одной из приведенных
выше строк.
DevЕще один способ определения битой ссылки#1 08.07.15 8:57
Код
Если ЗначениеЗаполнено(Ссылка) Тогда
   Если ЗначениеЗаполнено(Ссылка.ВерсияДанных) Тогда
      Сообщить("Это живая ссылка");
   Иначе
      Сообщить("Это битая ссылка");
   КонецЕсли
Иначе
   Сообщить("Это пустая ссылка");
КонецЕсли;
DevКак узнать, является значение ссылочного типа «битой ссылкой» или нет?#21 03.07.15 16:07
Есть еще и такой способ:


Код
Если ЗначениеЗаполнено(Ссылка) Тогда
    Если ЗначениеЗаполнено(Ссылка.ВерсияДанных) Тогда
        Сообщить("Живая ссылка");
    Иначе
        Сообщить("Битая ссылка");
    КонецЕсли
Иначе
    Сообщить("Пустая ссылка");
КонецЕсли;
DevПросмотр временных таблиц в отладке#18 20.02.15 19:30
Прошу прощения за предыдущий пост. Как-то неправильно отформатировал текст.

Вот еще одна процедура



// Функция для просмотра временных таблиц запроса в отладчике
//
// Параметры
// Запрос - Запрос
// ИмяВремТаблицы - Имя временной таблицы.
// Если параметр задан, то функция вернет таблицу значений,
// иначе вернет структуру, содержащую все временные таблицы запроса
//
Функция ПоказВТ(Запрос, ИмяВремТаблицы = "") Экспорт

Если Запрос.МенеджерВременныхТаблиц = Неопределено Тогда
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Выполнить();
КонецЕсли;

ЗапросВТ = Новый Запрос("ВЫБРАТЬ * ИЗ " + ИмяВремТаблицы);
ЗапросВТ.МенеджерВременныхТаблиц = Запрос.МенеджерВременныхТаблиц;

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

Результат = Новый Структура;
Текст = СтрЗаменить(Запрос.Текст, Символы.ПС, " ");
ТекстНР = НРег(Текст);
Фрагмент = " поместить ";

Позиция = Найти(ТекстНР, Фрагмент);

Пока Позиция > 0 Цикл

ТекстНР = СокрЛ(Сред(ТекстНР, Позиция + СтрДлина(Фрагмент)));
Текст = СокрЛ(Сред(Текст, Позиция + СтрДлина(Фрагмент)));
Позиция = Найти(ТекстНР, " ");

Если Позиция = 0 Тогда
Прервать;
КонецЕсли;

ИмяВТ = Лев(Текст, Позиция-1);
ЗапросВТ.Текст = "ВЫБРАТЬ * ИЗ " + ИмяВТ;

Результат.Вставить(ИмяВТ, ЗапросВТ.Выполнить().Выгрузить());

ТекстНР = Сред(ТекстНР, Позиция + 1);
Текст = Сред(Текст, Позиция + 1);

Позиция = Найти(ТекстНР, Фрагмент);

КонецЦикла;


Возврат Результат;

КонецФункции
DevПросмотр временных таблиц в отладке#17 20.02.15 19:26
<p style="text-align: left; font-family: courier new,courier; color: blue">
<font color=green>// Функция для просмотра временных таблиц запроса в отладчике<br>
//<br>
// Параметры<br>
//      Запрос         - Запрос<br>
//      ИмяВремТаблицы - Имя временной таблицы.<br>
//                       Если параметр задан, то функция вернет таблицу значений,<br>
//                       иначе вернет структуру, содержащую все временные таблицы запроса<br>
//<br>
</font><font color=red>Функция </font>ПоказВТ<font color=red>(</font>Запрос<font color=red>, </font>ИмяВремТаблицы <font color=red>= </font><font color=black>""</font><font color=red>) Экспорт<br>
<br>
    Если </font>Запрос<font color=red>.</font>МенеджерВременныхТаблиц <font color=red>= Неопределено Тогда<br>
        </font>Запрос<font color=red>.</font>МенеджерВременныхТаблиц <font color=red>= Новый </font>МенеджерВременныхТаблиц<font color=red>;<br>
        </font>Запрос<font color=red>.</font>Выполнить<font color=red>();<br>
    КонецЕсли;<br>
<br>
    </font>ЗапросВТ <font color=red>= Новый </font>Запрос<font color=red>(</font><font color=black>"ВЫБРАТЬ * ИЗ " </font><font color=red>+ </font>ИмяВремТаблицы<font color=red>);<br>
    </font>ЗапросВТ<font color=red>.</font>МенеджерВременныхТаблиц <font color=red>= </font>Запрос<font color=red>.</font>МенеджерВременныхТаблиц<font color=red>;<br>
<br>
    Если </font>ЗначениеЗаполнено<font color=red>(</font>ИмяВремТаблицы<font color=red>) Тогда<br>
        Возврат </font>ЗапросВТ<font color=red>.</font>Выполнить<font color=red>().</font>Выгрузить<font color=red>();<br>
    КонецЕсли;<br>
<br>
    </font>Результат <font color=red>= Новый </font>Структура<font color=red>;<br>
    </font>Текст    <font color=red>= </font>СтрЗаменить<font color=red>(</font>Запрос<font color=red>.</font>Текст<font color=red>, </font>Символы<font color=red>.</font>ПС<font color=red>, </font><font color=black>" "</font><font color=red>);<br>
    </font>ТекстНР  <font color=red>= </font>НРег<font color=red>(</font>Текст<font color=red>);<br>
    </font>Фрагмент <font color=red>= </font><font color=black>" поместить "</font><font color=red>;<br>
<br>
    </font>Позиция <font color=red>= </font>Найти<font color=red>(</font>ТекстНР<font color=red>, </font>Фрагмент<font color=red>);<br>
<br>
    Пока </font>Позиция <font color=red>> </font><font color=black>0  </font><font color=red>Цикл<br>
<br>
        </font>ТекстНР <font color=red>= </font>СокрЛ<font color=red>(</font>Сред<font color=red>(</font>ТекстНР<font color=red>, </font>Позиция <font color=red>+ </font>СтрДлина<font color=red>(</font>Фрагмент<font color=red>)));<br>
        </font>Текст   <font color=red>= </font>СокрЛ<font color=red>(</font>Сред<font color=red>(</font>Текст<font color=red>,   </font>Позиция <font color=red>+ </font>СтрДлина<font color=red>(</font>Фрагмент<font color=red>)));<br>
        </font>Позиция <font color=red>= </font>Найти<font color=red>(</font>ТекстНР<font color=red>, </font><font color=black>" "</font><font color=red>);<br>
<br>
        Если </font>Позиция <font color=red>= </font><font color=black>0 </font><font color=red>Тогда<br>
            Прервать;<br>
        КонецЕсли;<br>
<br>
        </font>ИмяВТ           <font color=red>= </font>Лев<font color=red>(</font>Текст<font color=red>, </font>Позиция<font color=red>-</font><font color=black>1</font><font color=red>);<br>
        </font>ЗапросВТ<font color=red>.</font>Текст  <font color=red>= </font><font color=black>"ВЫБРАТЬ * ИЗ " </font><font color=red>+ </font>ИмяВТ<font color=red>;<br>
<br>
        </font>Результат<font color=red>.</font>Вставить<font color=red>(</font>ИмяВТ<font color=red>, </font>ЗапросВТ<font color=red>.</font>Выполнить<font color=red>().</font>Выгрузить<font color=red>());<br>
<br>
        </font>ТекстНР <font color=red>= </font>Сред<font color=red>(</font>ТекстНР<font color=red>, </font>Позиция <font color=red>+ </font><font color=black>1</font><font color=red>);<br>
        </font>Текст   <font color=red>= </font>Сред<font color=red>(</font>Текст<font color=red>,   </font>Позиция <font color=red>+ </font><font color=black>1</font><font color=red>);<br>
<br>
        </font>Позиция <font color=red>= </font>Найти<font color=red>(</font>ТекстНР<font color=red>, </font>Фрагмент<font color=red>);<br>
<br>
    КонецЦикла;<br>
<br>
<br>
    Возврат </font>Результат<font color=red>;<br>
<br>
КонецФункции<br>
</font></p>
DevПопулярные алгоритмы сортировки массивов#35 20.01.15 3:30
Когда-то, еще до нашей эры (ДОС, Паскаль) придумал метод сортировки: "разноской по значению" и для сравнения написал маленькую демо-програмку.

Прикрепленные файлы:

SORTDEMO.EXE
DevГрафический индикатор процесса в табличной части на Управляемых формах#20 08.02.14 4:23
Даже не беру во внимание чрезмерность предложенной визуализации.
Хочу обратить внимание на другую принципиальную особенность.

Зададимся вопросом: для чего нужен индикатор прогресса?
Наверно для какой-то длительной обработки данных.

Чем может быть обусловлена длительность обработки?
Вероятно, большим объемом данных и/или алгоритмической трудоемкостью расчетов.

Индикация ради индикации никому не нужна.
Боюсь, здесь именно такой случай.

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

У Вас цикл обработки делается на клиенте.
Что это значит?

Одно из двух:

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

2) На клиенте в цикле делается безумное количество обращений к серверу. Но это еще не
все. Нужно приспособить обработку на сервере, чтобы она выдавала результаты порциями.


Не будем далеко ходить. Вот простой пример:


Процедура ДлительнаяОбработка()
Запрос = Новый Запрос("Выбрать .... из ОченьОбъемныйРегистр");
Выборка =Запрос.Выполнить.Выбрать();
Пока Выборка.Следующий() Цикл
....
КонецЦикла;
КонецПроцедуры;



Как прикрутить эту процедуру к Вашему коду?
Напомню, читателям, запросы на клиенте не работают.

Вообще-то, индикатор прогресса реализовать возможно.
Но это дело хлопотное и неблагодарное.

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


И все это, только ради индикации.

DevПорядковый номер в запросе (Новым простым способом)#40 24.01.14 7:33
Согласен во многом с ildarovich.
Конечно есть путаница в терминах. Но вряд ли кто-то понимает разницу между терминами "порядковые числа" и "числа по-порядку". Единственно, не следует в таком случае упоминать про математику. Поскольку в математике
порядковое число - это нечто другое. Простим ему так же и обращение к теории вероятностей.
Все же, статья, полагаю, оказалась интересной и полезной для многих читателей

Теперь по теме.

1. Поскольку фрагмент

ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1

конструктор запроса записывает в 5 строк, то лично я вместо основания 4 использую основание 3. Получается компактнее. Для больших чисел, все равно использую основание 3. Просто формула становится длинее и все. Не вижу смысла переходить к основанию 10.


2. Насчет "Порождающего запроса".

Для меня как-то неочевидно, что соединение двух 16-строковых таблиц выполнится быстрее, чем соединение 4-х таблиц по 4 строки в каждой. Мне думается, что это будет одинаково по производительности.

Я даже не учитываю, что эти 16-строковые таблицы еще предварительно надо сформировать где-то в памяти. Впрочем, это несущественные мелочи.

Делалась ли проверка этого факта на тестах?

Интуитивно 4 вложенных цикла по 4 и два вложенных цикла по 16 примерно одинаковы по производительности, если это написано на серьезном языке, с оптимизацией счетчиков.

ПубликацииНеблагодарное это дело – выдавать сообщения об ошибках#14 09.10.13 2:44
(8). Чем же плох отладчик? Чтож. Дайте пользователю отладчик. Пусть ищет и исправляет ошибки в данных (подчеркиваю в данных, а не в коде). Ну а я, как-то не готов давать пользователю отладчик.

Коорд = СокрЛП(..) // это чтобы вместо: "текст , текст" всегда было так: "текст, текст"
Если Коорд <> "" Тогда

Здесь первая строка нужна сама по себе, а не для того, чтобы выполнить проверку во второй строке.
Но поскольку она все же есть, то не вижу ничего плохого чтобы сравнить <> ""


(12). Насчет Попытка-Исключение.
А Вы попробуйте воспроизвести в точности тот пример из комментария с помощью попытки-исключения.
И сразу же выяснится, что вы будете заниматься разбором строк в каждой процедуре, где используете эту конструкцию. Кроме того, у Вас возникнут трудности при передаче списка ошибок. И чтобы облегчить жизнь придется написать свою процедуру, занимающуюся разбором строк и накоплением ошибок.
Но скорее всего, Вы просто используете ту самую процедуру ОшибкуОтдать(), приведенную выше.
Так что, попытка-исключение - это всего лишь, один из способов ее применения.


>>
Цитата
Ну а исключение клиентского (самого высокого) уровня уже можно как угодно отработать. Сообщением, предупреждением, или записью в лог.

Заметьте, принципиальную разницу: сообщение может быть выдано не только на верхнем уровне, а на любом из уровней. В примерах как раз показан вывод из разных процедур. И это зависит от того, как вызвана процедура.
В Вашем случае - это наличие или отсутствие конструкции попытка-исключение в процедурах верхнего уровня.
Это значит, что "ВызватьИсключение" - это и есть Ваш способ вывода ошибки, т.е. Вы с этим уже заранее определились.
#

Прикрепленные файлы:

SORTDEMO.PAS
SORTSHOW.PAS