Каталог решений - INFOSTART EVENT 2012: разбор решений конкурса разработчиков

INFOSTART EVENT 2012: разбор решений конкурса разработчиков

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), а в табличной части не задано (проверяется на соответствие пустых типов) (&СписокПустыхЗначений)
  • Оба значения равны по значению
 

has been added to your cart:
Оформление заказа