<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Работа для  программистов &#187; bitrix</title>
	<atom:link href="http://job-interview.ru/articles/post/tag/bitrix/feed" rel="self" type="application/rss+xml" />
	<link>http://job-interview.ru/articles</link>
	<description>вакансии, вопросы, статьи</description>
	<lastBuildDate>Thu, 29 Mar 2012 20:53:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CMS Битрикс. За и против.</title>
		<link>http://job-interview.ru/articles/post/234</link>
		<comments>http://job-interview.ru/articles/post/234#comments</comments>
		<pubDate>Thu, 04 Feb 2010 21:45:56 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[bitrix]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[битрикс]]></category>

		<guid isPermaLink="false">/articles/?p=234</guid>
		<description><![CDATA[Проработав 2 года с CMS Битрикс, у меня сформировалось свое отношение к этому движку. Есть как плюсы, так и минусы, но все же негатива накопилось гораздо больше.
В этой статье я поделюсь своим мнением с читателями и постараюсь описать и хорошие, и плохие стороны этой CMS.
Во-первых, хочется сказать пару слов о тормозах этой системы. В этом [...]]]></description>
			<content:encoded><![CDATA[<p>Проработав 2 года с <strong>CMS Битрикс</strong>, у меня сформировалось свое отношение к этому <em>движку.</em> Есть как плюсы, так и минусы, но все же негатива накопилось гораздо больше.</p>
<p>В этой статье я поделюсь своим мнением с читателями и постараюсь описать и хорошие, и плохие стороны этой <strong>CMS</strong>.</p>
<p>Во-первых, хочется сказать пару слов о <em>тормозах</em> этой системы. В этом ее любят обвинять очень многие.</p>
<p>Для простых сайтов движок вполне подходит и тормозов в этом случае наблюдаться не будет, если, конечно, <em>проектировщик</em> не допустил откровенных ляпов при создании структуры <strong>инфоблоков</strong> (о том что это за зверь сейчас узнаем).</p>
<p><span id="more-234"></span></p>
<p>Тормоза начинаются, когда от сайта требуется что-то большее, нежели обычный текстовый контент. В этом случае проектировщик сталкивается с неуклюжестью движка.<br />
В битриксе все основывается на понятии инфоблока. Давайте рассмотрим что же на самом деле из себя представляет <strong>инфоблок.</strong></p>
<p><img title="Диаграмма инфоблоков Битрикс" src="/uploads/tiger/bitrix.png" alt="Диаграмма инфоблоков Битрикс" /></p>
<p><strong>Инфоблок</strong> — это такая <em>сущность</em>, которая объединяет элементы с определенным набором свойств. Часть свойств, такие как название элемента, раздел, даты активности и т.п., присутствует у элементов всех инфоблоков. К этим свойствам проектировщик может добавить еще и свои свойства, но они уже будут рассматриваться в контексте каждого конкретного инфоблока.</p>
<p>Существует также понятие <strong>типа инфоблока</strong>, который объединяет в себе инфоблоки.<br />
Поясню на примере. Допустим, мы создаем сайт, на котором будут размещены <em>вакансии.</em>. В этом случае нам будут необходимы 3 инфоблока: «Вакансии», «Отрасли», «Компании».</p>
<p>После создания инфоблока «Вакансии» мы можем создать в нем элементы со стандартным набором свойств:</p>
<ul>
<li>Название</li>
<li>Активность (да/нет)</li>
<li>Период активности (активен в указанный период времени)</li>
<li>Краткое описание</li>
<li>Подробное описание</li>
<li>Изображение-превью</li>
<li>Увеличенное изображение</li>
<li>Раздел</li>
</ul>
<p>Этих свойств будет достаточно для обычного текстового контента (статьи, новости и т.д.), но нам для вакансий этого не хватит. Мы создадим еще свойства:</p>
<ul>
<li>Компания (свойство, ссылающееся на инфоблок «Компании»)</li>
<li>Отрасль (свойство, ссылающееся на инфоблок «Отрасли»)</li>
<li>Опыт работы (свойство типа список с значениями «до 2-х лет», «от 2-х до 4-х лет», «более 4 лет» и т.д.)</li>
</ul>
<p>В инфоблоке «Отрасли» и «Компании» ограничимся стандартным набором свойств, которые предоставляет нам битрикс.</p>
<p>Вот, что у нас получилось:</p>
<p><img title="Структура инфоблоков Битрикс для размещения вакансий" src="/uploads/tiger/vacancy_bitrix.png" alt="Структура инфоблоков Битрикс для размещения вакансий" /></p>
<p>Вроде бы с точки зрения <em>теории баз данных</em> у нас все верно. Все сущности разделены, избыточности нет и т.д. Но давайте взглянем на <strong>структуру базы</strong>.</p>
<p>Рассмотрим как работает <strong>выборка из инфоблоков</strong> на простом примере. В <strong>битриксе</strong> существует часть таблиц в базе данных, которые хранят данные, связанные с инфоблоками — сами инфоблоки (b_iblock), их элементы(b_iblock_element), свойства(b_iblock_property), значения свойств (b_iblock_element_property).</p>
<p>Это не все таблицы, связанные с инфоблоками, но для простоты понимания нас будут интересовать именно они.</p>
<p><img title="ER-диаграмма некоторых таблиц Битрикса, хранящих данные об инфоблоках" src="/uploads/tiger/bd_bitrix.png" alt="ER-диаграмма некоторых таблиц Битрикса, хранящих данные об инфоблоках" /></p>
<p>Как видим, элементы всех инфоблоков хранятся в одной таблице, все свойства этих элементов так же хранятся в одной таблице.</p>
<p>Как же так! Зачем <em>СУБД</em> копаться в вакансиях, отраслях, если нам нужно будет выбрать всего лишь список всех компаний, вакансии которых храняться в базе ?!</p>
<p>А что будет, если нашему сайту необходим более сложный функционал? Вот тогда то и начнутся тормоза.</p>
<p>Теперь воспользуемся <strong>АПИ битрикса</strong> и выберем список вакансий конкретной компании, но те вакансии, которые не относятся к определенной отрасли.</p>
<p>В примере происходит выборка из инфоблока «Вакансии», ID которого 23, а также происходит фильтрация по компании, ID которой 373, и по отрасли, ID которой 317. В последнем параметре метода GetList передается список выбираемых полей — ID, компания, опыт работы, начало периода активности вакансии.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$arFilter</span> <span style="color: #339933;">=</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span>
<span style="color: #0000ff;">&quot;IBLOCK_ID&quot;</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">23</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// выбираем элементы из инфоблока, ID которого 23</span>
<span style="color: #0000ff;">&quot;ACTIVE&quot;</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">&quot;Y&quot;</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// выбираем только активные элементы</span>
<span style="color: #0000ff;">&quot;PROPERTY_COMPANY&quot;</span><span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">373</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// вакансии будут принадлежать компании с ID=373</span>
<span style="color: #0000ff;">&quot;!PROPERTY_BRANCH&quot;</span> <span style="color: #339933;">=&gt;</span><span style="color: #cc66cc;">317</span> <span style="color: #666666; font-style: italic;">// вакансии, принадлежащие отрасли с ID=317, нас не интересуют</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$res</span> <span style="color: #339933;">=</span> CIBlockElement<span style="color: #339933;">::</span><span style="color: #004000;">GetList</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DATE_ACTIVE_FROM&quot;</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">&quot;ASC&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$arFilter</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ID&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;PROPERTY_COMPANY&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;PROPERTY_EXPERIENCE&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;DATE_ACTIVE_FROM&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Выглядит красиво, прямо как-будто один безобидный <strong>SQL запрос</strong>, но заглянем внутрь:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> BP<span style="color: #66cc66;">.*</span>
<span style="color: #993333; font-weight: bold;">FROM</span>
b_iblock_property BP<span style="color: #66cc66;">,</span> b_iblock B
<span style="color: #993333; font-weight: bold;">WHERE</span>
BP<span style="color: #66cc66;">.</span>IBLOCK_ID<span style="color: #66cc66;">=</span>B<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">AND</span> B<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">23</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AND</span> UPPER<span style="color: #66cc66;">&#40;</span>BP<span style="color: #66cc66;">.</span>CODE<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">=</span>UPPER<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'COMPANY'</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #993333; font-weight: bold;">SELECT</span> BP<span style="color: #66cc66;">.*</span>
<span style="color: #993333; font-weight: bold;">FROM</span>
b_iblock_property BP<span style="color: #66cc66;">,</span> b_iblock B
<span style="color: #993333; font-weight: bold;">WHERE</span>
BP<span style="color: #66cc66;">.</span>IBLOCK_ID<span style="color: #66cc66;">=</span>B<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">AND</span> B<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">23</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AND</span> UPPER<span style="color: #66cc66;">&#40;</span>BP<span style="color: #66cc66;">.</span>CODE<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">=</span>UPPER<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'EXPERIENCE'</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #993333; font-weight: bold;">SELECT</span> BP<span style="color: #66cc66;">.*</span>
<span style="color: #993333; font-weight: bold;">FROM</span>
b_iblock_property BP<span style="color: #66cc66;">,</span> b_iblock B
<span style="color: #993333; font-weight: bold;">WHERE</span>
BP<span style="color: #66cc66;">.</span>IBLOCK_ID<span style="color: #66cc66;">=</span>B<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">AND</span> B<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">23</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AND</span> UPPER<span style="color: #66cc66;">&#40;</span>BP<span style="color: #66cc66;">.</span>CODE<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">=</span>UPPER<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'BRANCH'</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #993333; font-weight: bold;">SELECT</span> BE<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">AS</span> ID<span style="color: #66cc66;">,</span> FPV0<span style="color: #66cc66;">.</span>VALUE <span style="color: #993333; font-weight: bold;">AS</span> PROPERTY_COMPANY_VALUE<span style="color: #66cc66;">,</span> FPV0<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">AS</span> PROPERTY_COMPANY_VALUE_ID<span style="color: #66cc66;">,</span> FPEN0<span style="color: #66cc66;">.</span>VALUE <span style="color: #993333; font-weight: bold;">AS</span> PROPERTY_EXPERIENCE_VALUE<span style="color: #66cc66;">,</span> FPEN0<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">AS</span> PROPERTY_EXPERIENCE_ENUM_ID<span style="color: #66cc66;">,</span> FPV1<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">AS</span> PROPERTY_EXPERIENCE_VALUE_ID<span style="color: #66cc66;">,</span><span style="color: #993333; font-weight: bold;">IF</span><span style="color: #66cc66;">&#40;</span>EXTRACT<span style="color: #66cc66;">&#40;</span>HOUR_SECOND
<span style="color: #993333; font-weight: bold;">FROM</span>
BE<span style="color: #66cc66;">.</span>ACTIVE_FROM<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&gt;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> DATE_FORMAT<span style="color: #66cc66;">&#40;</span>BE<span style="color: #66cc66;">.</span>ACTIVE_FROM<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'%d.%m.%Y %H:%i:%s'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> DATE_FORMAT<span style="color: #66cc66;">&#40;</span>BE<span style="color: #66cc66;">.</span>ACTIVE_FROM<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'%d.%m.%Y'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> DATE_ACTIVE_FROM<span style="color: #66cc66;">,</span><span style="color: #993333; font-weight: bold;">IF</span><span style="color: #66cc66;">&#40;</span>EXTRACT<span style="color: #66cc66;">&#40;</span>HOUR_SECOND
<span style="color: #993333; font-weight: bold;">FROM</span>
BE<span style="color: #66cc66;">.</span>ACTIVE_FROM<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&gt;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> DATE_FORMAT<span style="color: #66cc66;">&#40;</span>BE<span style="color: #66cc66;">.</span>ACTIVE_FROM<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'%d.%m.%Y %H:%i:%s'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> DATE_FORMAT<span style="color: #66cc66;">&#40;</span>BE<span style="color: #66cc66;">.</span>ACTIVE_FROM<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'%d.%m.%Y'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> ACTIVE_FROM
<span style="color: #993333; font-weight: bold;">FROM</span>
b_iblock B
<span style="color: #993333; font-weight: bold;">INNER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> b_lang L <span style="color: #993333; font-weight: bold;">ON</span> B<span style="color: #66cc66;">.</span>LID<span style="color: #66cc66;">=</span>L<span style="color: #66cc66;">.</span>LID
<span style="color: #993333; font-weight: bold;">INNER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> b_iblock_element BE <span style="color: #993333; font-weight: bold;">ON</span> BE<span style="color: #66cc66;">.</span>IBLOCK_ID <span style="color: #66cc66;">=</span> B<span style="color: #66cc66;">.</span>ID
<span style="color: #993333; font-weight: bold;">INNER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> b_iblock_property FP0 <span style="color: #993333; font-weight: bold;">ON</span> FP0<span style="color: #66cc66;">.</span>IBLOCK_ID <span style="color: #66cc66;">=</span> B<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">AND</span> FP0<span style="color: #66cc66;">.</span>CODE<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'COMPANY'</span>
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> b_iblock_property FP1 <span style="color: #993333; font-weight: bold;">ON</span> FP1<span style="color: #66cc66;">.</span>IBLOCK_ID <span style="color: #66cc66;">=</span> B<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">AND</span> FP1<span style="color: #66cc66;">.</span>CODE<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'EXPERIENCE'</span>
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> b_iblock_property FP2 <span style="color: #993333; font-weight: bold;">ON</span> FP2<span style="color: #66cc66;">.</span>IBLOCK_ID <span style="color: #66cc66;">=</span> B<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">AND</span> FP2<span style="color: #66cc66;">.</span>CODE<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'BRANCH'</span>
<span style="color: #993333; font-weight: bold;">INNER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> b_iblock_element_property FPV0 <span style="color: #993333; font-weight: bold;">ON</span> FPV0<span style="color: #66cc66;">.</span>IBLOCK_PROPERTY_ID <span style="color: #66cc66;">=</span> FP0<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">AND</span> FPV0<span style="color: #66cc66;">.</span>IBLOCK_ELEMENT_ID <span style="color: #66cc66;">=</span> BE<span style="color: #66cc66;">.</span>ID
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> b_iblock_element_property FPV1 <span style="color: #993333; font-weight: bold;">ON</span> FPV1<span style="color: #66cc66;">.</span>IBLOCK_PROPERTY_ID <span style="color: #66cc66;">=</span> FP1<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">AND</span> FPV1<span style="color: #66cc66;">.</span>IBLOCK_ELEMENT_ID <span style="color: #66cc66;">=</span> BE<span style="color: #66cc66;">.</span>ID
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> b_iblock_element_property FPV2 <span style="color: #993333; font-weight: bold;">ON</span> FPV2<span style="color: #66cc66;">.</span>IBLOCK_PROPERTY_ID <span style="color: #66cc66;">=</span> FP2<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">AND</span> FPV2<span style="color: #66cc66;">.</span>IBLOCK_ELEMENT_ID <span style="color: #66cc66;">=</span> BE<span style="color: #66cc66;">.</span>ID
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> b_iblock_property_enum FPEN0 <span style="color: #993333; font-weight: bold;">ON</span> FPEN0<span style="color: #66cc66;">.</span>PROPERTY_ID <span style="color: #66cc66;">=</span> FP0<span style="color: #66cc66;">.</span>ID <span style="color: #993333; font-weight: bold;">AND</span> FPV1<span style="color: #66cc66;">.</span>VALUE_ENUM <span style="color: #66cc66;">=</span> FPEN0<span style="color: #66cc66;">.</span>ID
<span style="color: #993333; font-weight: bold;">WHERE</span>
<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>BE<span style="color: #66cc66;">.</span>IBLOCK_ID <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'23'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>BE<span style="color: #66cc66;">.</span>ACTIVE<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'Y'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>FPV0<span style="color: #66cc66;">.</span>VALUE_NUM <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'373'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span> FPV2<span style="color: #66cc66;">.</span>VALUE_NUM <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #66cc66;">&#40;</span>FPV2<span style="color: #66cc66;">.</span>VALUE_NUM <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'317'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>BE<span style="color: #66cc66;">.</span>WF_STATUS_ID<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">AND</span> BE<span style="color: #66cc66;">.</span>WF_PARENT_ELEMENT_ID <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span>
BE<span style="color: #66cc66;">.</span>ACTIVE_FROM <span style="color: #993333; font-weight: bold;">ASC</span></pre></div></div>

<p>Ужас! А что же тогда творится с <em>СУБД</em> на реальных сайтах.</p>
<p>Мы при написании метода <strong>GetList</strong> использовали 3 свойства (ключи значений массивов, начинающиеся с «PROPERTY_») и в <strong>SQL-запросах</strong>, которые сгенерил битрикс, видим 3 запроса для каждого из 3-х свойств. А что будет, если создать десятки свойств? А будет ровно столько запросов сколько участвует в методе GetList.</p>
<p>Ну и в конце мы видим громадный запрос, напичканный join&#8217;ами. Если приглядеться к этому запросу, то можно догадаться, что количество join&#8217;ов зависит от количества свойств, участвующих в методе GetList.</p>
<p>Понятно, что все это плата за универсальность. Все те, кто используют <strong>битрикс</strong> любят повторять, что это далеко не идеальная система, но это лучшая CMS из всех существующих. А чем она лучше? Да только, пожалуй, тем, что у нее присутствует больше всевозможных модулей по сравнению с другими <strong>CMS</strong>. Еще есть удобная админка, в которой быстро разберутся модераторы. Так же битрикс постоянно обновляется и пополняется новыми модулями, в этом тоже его плюс.</p>
<p>Как я уже сказал, мое мнение, что битрикс сгодится только для простых сайтов. Если требуется какой-то более менее сложный функционал, то приходится ломать голову как обойти эти издержки универсальности.</p>
<p>Возникает вопрос. Зачем простому сайту, на котором в основном <em>статьи</em> и новости, дополнительные модули в виде магазина, форума, блогов, тормозной статистики (которую к тому же предлагают многие бесплатные сервисы). А ведь такой сайт <em>программист</em> может без проблем создать, например, на бесплатном <em>фреймворке symfony</em>, в котором админка генерится одной командой. Так зачем платить больше?</p>
<p>Ну а сайт со сложным функционалом, как я уже сказал, по моему мнению начинать делать на битриксе лучше не стоит. Эта затея перерастет в поиски путей обхода битриксовых фич.<br />
И все-таки смысл создавать сайты на битриксе, как мне видится, есть. Но прежде, чем описать свою точку зрения на этот счет, нужно сказать несколько слов о многочисленной армии кодеров-битриксоидов.</p>
<p>Это такие люди, в основном студенты, которые еще не слышали ни о теории баз данных, ни о паттернах проектирования, не работали с существующими фреймворками. Для них битрикс — это все, что стоит за сайтом. Они даже о новых <em>технологиях</em> узнают только тогда, когда она будет включена в очередную версию <em>CMS</em>.</p>
<p>Как-то раз ко мне подошел один из сотрудников за помощью. Он парсил <em>файл CSV</em>, но этот процесс у него отрабатывал не верно. Стали смотреть скрипт и тут программист высказывает свое предположение: «Может быть <strong>битрикс</strong> где-то закрался?». Может быть всемогущий битрикс каким-то  магическим образом и мог бы закрасться в его скрипт, но дело в том, что он его запускал без подключения движка. На самом деле потом нашли обычную ошибку в логике самого скрипта.</p>
<p>Еще был случай. Отмечали чей-то день рождения и двое программистов начали обсуждать все достоинства битрикса. Один из них кинул фразу: «Ну битрикс — это очень мощная система, он внутри себя и <em>язык Си</em> использует, и <em>ассемблер</em>». Второй округлил глаза и не поверил. А тот ему: «Ну ты залезь в код битрикса, посмотри». Тут вообще без комментариев.</p>
<p>Так вот, мое мнение, что создавать сайты на битриксе имеет смысл, но только для <em>менеджеров</em>. Они не знают всех тонкостей работы движка, его подводных камней.<br />
Им выгодно иметь в своем штате <strong>битриксоидов</strong>, которым не нужно платить нормальные деньги, ведь это еще новичек, который дальше битрикса ничего не видел. Да и работать он будет с системой, в которой уже большинство вещей сделано за него.</p>
<p>Таким образом, на свет появляются <em>web-студии</em>, которые штампуют на битриксе сайт за сайтом. Их основной задачей в итоге становиться увеличение штата сотрудников, способных делать сайты на битриксе. <em>Дешевая рабочая сила</em>. Чем больше штат, тем больше сайтов они смогут клепать.</p>
<p>И напоследок хотелось бы дать совет <strong>начинающим программистам</strong>. Не устраивайтесь на работу в <em>web-студии</em>, которые в своих описаниях вакансий упоминают слово «<strong>Битрикс</strong>». Если вы начнете свой карьерный путь с этого движка, то потом соскочить с него будет не просто. Пройдет года 2 и ваши друзья уже неплохо продвинуться в программировании, кто-то перерастет в <em>проектировщика</em>, а вы будете жить одними <strong>инфоблоками</strong> и не понимать что происходит внутри.<br />
Я сейчас не говорю о всех, но именно таких программистов я встречал часто. Конечно, все люди разные, кто-то может на работе использовать битрикс, но дома в целях <em>самообразования</em> тренироваться в других <em>областях программирования</em>. Но все же лучше набираться знаний на работе, где человек проводит большую часть своего времени.</p>
<p>На этом все. Спасибо за внимание. В комментариях жду ваших мыслей по поводу использования битрикса.</p>
]]></content:encoded>
			<wfw:commentRss>http://job-interview.ru/articles/post/234/feed</wfw:commentRss>
		<slash:comments>869</slash:comments>
		</item>
	</channel>
</rss>
