#bitrix

Пофиксить её можно так:

В файле:

local/modules/sprint.migration/lib/versionconfig.php:207

добавить условие:

if (strpos($values['migration_dir'], ':') === false) { // @todo fix для windows
    $values['migration_dir'] = Module::getDocRoot() . $values['migration_dir'];
}

Код всего блока:

if (empty($values['migration_dir'])) {
    $values['migration_dir'] = Module::getPhpInterfaceDir() . '/migrations';
} elseif (empty($values['migration_dir_absolute'])) {
    if (strpos($values['migration_dir'], ':') === false) { // @todo fix для windows
        $values['migration_dir'] = Module::getDocRoot() . $values['migration_dir'];
    }
}
try {
    // путь к картинке, которая либо есть на деве, либо её нужно загрузить с прода на дев
    $src = $image['src'];

    // адрес прода, откуда будем скачивать картинки
    $externalDomain = 'https://example.com';

    $root = \Bitrix\Main\Application::getDocumentRoot();

    $filePath = $root . $src;

    // если картинки нет на деве
    if (!file_exists($filePath)) {
        $fileExternalLink = $externalDomain . $src;

        // то скачиваем её один раз
        $fileExternalContent = file_get_contents($fileExternalLink);

        if (!empty($fileExternalContent)) {
            // и сохраняем себе
            \Bitrix\Main\IO\File::putFileContents($filePath, $fileExternalContent);
        }
    }
} catch (\Exception $e) {
    ShowError($e->getMessage());
}

Чтобы передать данные, например, из шаблона компонента в шаблон сайта можно воспользоваться функционалом отложенных функций.

ShowViewContent это обычная отложенная функция такая же как и SetTitle или SetPageProperty.

Поэтому вывод контента с помощью ShowViewContent может быть выше по коду, чем передача самого контента с помощью AddViewContent или с помощью SetViewTarget + EndViewTarget.

Передаём контент в буферизируемую область:

$APPLICATION->AddViewContent('myContentBlockName', '<p>Hello</p>');

И указываем где нужно выводить содержимое этой буферизируемой области, но только в некешируемой части, например в шаблоне сайта:

Как сохранить cookie на d7:

\Bitrix\Main\Context::getCurrent()->getResponse()->addCookie(
    new \Bitrix\Main\Web\Cookie('cookieName', 'cookieValue')
);

Но на странице обязательно должен быть подключен

require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/footer.php'); 

или

require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_after.php");

т. к. куки d7 добавляются именно в эпилоге.

При этом старый код

$APPLICATION->set_cookie('cookieName', 'cookieValue');

сработает даже без подключения эпилога.