INFOSTART EVENT 2012: разбор решений конкурса разработчиков
В статье проводится разбор присланных решений на конкурс разработчиков от компании «Первый БИТ». Приводятся планы выполнения запросов и сравниваются показатели быстродействия и оптимизации.
- Описание
- Подробнее
Описание
В данной статье я постараюсь дать развернутый анализ наиболее интересных решений с технологической точки зрения решений, присланных на конкурс разработчиков от компании "Первый БИТ" делаемпроекты.рф.
Данный конкурс проводился в рамках первой всероссийской конференции INFOSTART EVENT 2012 (ссылка на отчет //sale.itcity.ru/public/162790/). В конкурсе было две номинации – «знание механизма РАУЗ в УПП» и «разработка в системе 1С:Предприятие». Результаты конкурса опубликованы здесь и здесь. Конкурс проходил в два этапа. Первый этап — соревнование на скорость проходил в режиме реального времени, а второй этап — конкурс на самое оптимальное решение проходил уже в оффлайн режиме и решение присылались на мою на электронную почту. В статье проводится разбор решений присланных на второй этап.
Для начала, давайте посмотрим еще раз на задание из конкурса:
Требуется разработать внешнюю обработку, которая сможет найти все характеристики номенклатуры, которые полностью соответствуют указанному набору свойств и их значениям (Характеристика должна одновременно содержать все указанные свойства и их значения и кроме них не должна содержать других свойств с заполненными значениями).
Работать мы будем со справочником "Характеристики" в Управление Торговлей 11 для России (это важно). Ниже показан скриншот со структурой справочника
Полностью задание звучит следующим образом (полное описание задания можно скачать в файлах статьи):
Требуется разработать внешнюю обработку, которая будет содержать две табличные части и кнопку"Найти". Пример обработки указан на скриншоте ниже (саму обработку шаблон можно скачать в файлах статьи).
- В первой табличной части необходимо задать условия поиска.
- Во второй нужно выводить результат поиска.
В результате поиска нужно найти все характеристики номенклатуры, которые полностью соответствую указанному набору свойств и их значениям. Характеристика должна одновременно содержать все указанные свойства и их значения и кроме них не должна содержать других свойств с заполненными значениями. Предусматривается следующие ограничения:
- при вводе параметров поиска (в левой таблице) не должно быть свойств без указания значений.
- нельзя использовать сравнение на количество строк
SIC! Прежде чем читать дальше, еще раз внимательно прочитайте условие задачи и постарайтесь ее мысленно решить. На ней погорело очень много кандидатов, считающих себя хорошими программистами с высоким уровнем логического мышления.
Исходя из задания нам нужно работать с двумя таблицами — эталонной и табличной частью "ДополнительныеРеквизиты" справочника характеристики номенклатуры. Основная хитрость задачи состоит в том, что нужно выбрать все характеристики попадающие под наши условия и проверить, чтобы в них не было лишних заполненных свойств.
Для тестирования присланных решений была создана специальная база — были растиражированы следующие элементы:
1) Характеристика с 4 свойствами: размер — 35, цвет – зеленый, тип кожи – натуральная, полнота – 5 . Количество 20 000 элементов. (Тест №1)
2) Характеристика с 4 пустыми свойствами: размер, цвет, тип кожи и полнота и дополнительно к ним 100 свойств строкового типа со значением номера свойства (т.е. Свойство1 – значение «1», Свойство2 — значение «2»). Количество 5 000 элементов. (Тест №2)
Все запросы приведены «как есть». Время выполнения тестов для каждого из решений приведены для моего личного ноутбука и локального SQL сервера:
Технические характеристики ноутбука — Процессор Intel® Core™ i5-430M 2,26 ГГц, RAM — 4GB DDR3, HDD Sata 320 Gb
Версия SQL — Microsoft SQL Server 2008 R2 (RTM) — 10.50.1617.0 (X64) (Build 7601: Service Pack 1)
Версия 1С — 8.2.17.368 (клиент-серверная — x86-64)
P.S. Предвосхищая вопрос по коду 🙂 — метод ТекущаяУниверсальнаяДатаВМиллисекундах() появился в 8.2.17
Решение №1.
СписокПустыхЗначений = Новый СписокЗначений;
МассивТипов = Новый Массив(1);
Для каждого Тип Из Метаданные.ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.Тип.Типы() Цикл
Если Тип = Тип("Булево") Тогда
Продолжить; // Для типа булево нет пустых значений
КонецЕсли;
МассивТипов[0] = Тип;
ОписаниеТипа = Новый ОписаниеТипов(МассивТипов);
СписокПустыхЗначений.Добавить(ОписаниеТипа.ПривестиЗначение());
КонецЦикла;
СписокПустыхЗначений.Добавить(Неопределено);
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| Свойство КАК Свойство
| ,Значение КАК Значение
|
|ПОМЕСТИТЬ
| ЗаданныеСвойства
|
|ИЗ
| &Свойства КАК Свойства
|
|;
|
|ВЫБРАТЬ
| Характеристики.Ссылка КАК Характеристика
|
|ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК Характеристики
|
|ЛЕВОЕ СОЕДИНЕНИЕ
| ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК План
|
|ПО
| ИСТИНА
|
|ЛЕВОЕ СОЕДИНЕНИЕ
| Справочник.ХарактеристикиНоменклатуры.ДополнительныеРеквизиты КАК Реквизиты
|
|ПО
| План.Ссылка = Реквизиты.Свойство
| И Характеристики.Ссылка = Реквизиты.Ссылка
|
|ЛЕВОЕ СОЕДИНЕНИЕ
| ЗаданныеСвойства
|
|ПО
| План.Ссылка = ЗаданныеСвойства.Свойство
|
|СГРУППИРОВАТЬ ПО
| Характеристики.Ссылка
|
|ИМЕЮЩИЕ
| МИНИМУМ(
| ВЫБОР
| КОГДА ЕСТЬNULL(Реквизиты.Значение, ЗаданныеСвойства.Значение) ЕСТЬ NULL ТОГДА Истина
| КОГДА ЗаданныеСвойства.Значение ЕСТЬ NULL И Реквизиты.Значение В (&СписокПустыхЗначений) ТОГДА Истина
| КОГДА Реквизиты.Значение = ЗаданныеСвойства.Значение ТОГДА Истина
| ИНАЧЕ Ложь
| КОНЕЦ) = Истина
|";
Запрос.УстановитьПараметр("Свойства", Объект.Свойства.Выгрузить());
Запрос.УстановитьПараметр("СписокПустыхЗначений", СписокПустыхЗначений);
НачДата=ТекущаяУниверсальнаяДатаВМиллисекундах();
Результат = Запрос.Выполнить();
КонДата=ТекущаяУниверсальнаяДатаВМиллисекундах();
ВремяВыполнения = КонДата—НачДата;
Сообщить("Время выполнения — "+ВремяВыполнения+" миллисекунд");
Разбор решения №1.
Решение построено на следующем принципе:
(1) Получаем декартово произведение справочника характеристики номенклатуры и ПВХ "ДопРеквизитыИСведения". У нас к каждой строке из справочника характеристики соединяются все свойства из ПВХ "ДопРеквизитыИСведения". Т.е. в таблице получаем все возможные комбинации характеристики и ее возможных свойств. Ориентировочное число строк таблицы ~ 3 125 000 (примерно 25000 элементов справочника на примерно 125 свойств)
(2) К этой таблице (1) присоединяем табличную часть каждой характеристики. Ориентировочное число строк таблицы не меняется ~ 3 125 000
(3) К полученной таблице (2) присоединяем эталонную табличную часть со связью по свойствам из (1)
Дальше группируем по характеристике с определенными условиями:
- Оба свойства (в эталонной и в табличной части) отсутствуют (NULL), т.е. не заданы
- Когда в эталонной таблице значение отсутствует (NULL), а в табличной части не задано (проверяется на соответствие пустых типов) (&СписокПустыхЗначений)
- Оба значения равны по значению

