22.11.2016 22:01:05 1966

При сборке обновлений модуля я пользуюсь вот этим решением Конструктор модулей для Маркетплейса, после сборки обновлений модуля архив падает сюда

/bitrix/tmp/api.blog/1.0.4

В этом архиве всегда есть файл updater.php, который скачивается клиентом при установке обновлений модуля и делает все необходимые изменения, так называемый роутер.
Но в нем есть не все, что требуется в работе, иногда приходится таблицы новые добавлять, столбцы к уже существующим таблицам, индексы, джаваскрипты, стили, картинки и т.д.
Если у вашего модуля есть особая структура, которую необходимо обновлять у клиента, то добавить ее в апдейтер можно следующим образом:

Находим в модуле вот этот файл

/bitrix/modules/bitrix.mpbuilder/samples/_updater.php

И добавляем в него вот этот код, который при каждой сборке обновлений автоматически будет добавляться в архив, а после вы уже можете изменить его как захочется.
С папками /install/js и т.д. думаю все понятно, все эти папки апдейтер будет обновлять, вот обратите внимание на закомментированные по умолчанию запросы к БД, они служат как примеры, если мне нужно обновить таблицу или добавить столбец к таблице, я пользуюсь этими примерами и пишу отдельно необходимый запрос под конкретный модуль, а по умолчанию при каждой сборке обновлений они должны быть закомментированы.

if(IsModuleInstalled('{MODULE_ID}'))
{
    if(is_dir(dirname(__FILE__) . '/install/admin'))
        $updater->CopyFiles("install/admin", "admin/");

    if(is_dir(dirname(__FILE__) . '/install/components'))
        $updater->CopyFiles("install/components", "components/{NAMESPACE}");

    if(is_dir(dirname(__FILE__) . '/install/js'))
        $updater->CopyFiles("install/js", "js/{MODULE_ID}/");

    if(is_dir(dirname(__FILE__) . '/install/css'))
        $updater->CopyFiles("install/css", "css/{MODULE_ID}/");

    if(is_dir(dirname(__FILE__) . '/install/images'))
        $updater->CopyFiles("install/images", "images/{MODULE_ID}/");
}

/*
if($updater->CanUpdateDatabase())
{
    //Sample #1
    if($updater->TableExists("api_orderstatus_history"))
    {
        global $DB;

        if(!$DB->Query("SELECT `FILES` FROM `api_orderstatus_history` WHERE 1=0", true))
        {
            $updater->Query(array(
                 "MySQL" => "ALTER TABLE `api_orderstatus_history` ADD `FILES` CHAR(1) NOT NULL DEFAULT 'N' AFTER `MAIL`",
            ));
        }
    }

    //Sample #2
    if(!$updater->TableExists("api_orderstatus_file"))
    {
        $updater->Query(array(
             "MySQL" => "CREATE TABLE `api_orderstatus_file` (
                              `ID` INT(11) NOT NULL AUTO_INCREMENT,
                              `ORDER_ID` INT(11) NULL DEFAULT NULL,
                              `FILE_ID` VARCHAR(255) NULL DEFAULT NULL,
                              PRIMARY KEY (`ID`)
                            );",
        ));
    }

    //Sample #3
    if($updater->TableExists("api_reviews"))
    {
        $updater->Query(array(
             "MySQL" => "ALTER TABLE `api_reviews` ADD `IBLOCK_ID` INT(11) NOT NULL AFTER `THUMBS_DOWN`",
        ));
    }

    //Sample #4
    if($updater->TableExists("b_iblock_element_property"))
    {
        if(!$DB->IndexExists("b_iblock_element_property", array("VALUE_NUM", "IBLOCK_PROPERTY_ID")))
        {
            $updater->Query(array(
                 "MySQL"  => "CREATE INDEX ix_iblock_element_prop_num ON b_iblock_element_property(VALUE_NUM, IBLOCK_PROPERTY_ID)",
                 "MSSQL"  => "CREATE INDEX IX_B_IBLOCK_ELEMENT_PROPERTY_4 ON B_IBLOCK_ELEMENT_PROPERTY(VALUE_NUM, IBLOCK_PROPERTY_ID)",
                 "Oracle" => "CREATE INDEX IX_IBLOCK_ELEMENT_PROP_NUM ON B_IBLOCK_ELEMENT_PROPERTY(VALUE_NUM, IBLOCK_PROPERTY_ID)",
            ));
        }
    }

    //Sample #5
    if($updater->TableExists("b_iblock_property"))
    {
        if(!$DB->IndexExists("b_iblock_property", array("UPPER(\"CODE\")")))
        {
            $updater->Query(array(
                 "Oracle" => "CREATE INDEX ix_iblock_property_2 ON B_IBLOCK_PROPERTY(UPPER(CODE))",
            ));
        }
    }
}
*/