Как автоматизировать получение списка последних релизов 1С:ЗУП и построить цепочку обновлений

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

Автоматизация процесса обновления конфигураций — критически важная задача для системных администраторов и программистов 1С, особенно когда речь идет о таких динамичных конфигурациях, как Зарплата и управление персоналом (ЗУП) 3.1. В этой статье мы подробно разберем, как программно получить актуальный список релизов, как правильно обрабатывать данные из официальных источников и как не запутаться в параллельных ветках поддержки (LTS).

Источники данных: XML против HTML

Для начала проанализируем, откуда можно получить информацию о выходе новых версий. Фирма «1С» предоставляет несколько механизмов, каждый из которых имеет свои особенности:

  1. Файл v8upd11.xml (в составе ZIP-архива): Это основной технический ресурс. Он содержит структурированные данные о версиях, путях к дистрибутивам и, что самое важное, список «разрешенных» версий, с которых возможен переход на текущий релиз.
  2. HTML-страница портала релизов: Более наглядный вариант, который проще парсить, если вам нужен только номер последней версии без построения цепочки обновлений.
  3. Современный API (JSON): Наиболее стабильный способ для современной разработки, позволяющий получать данные через HTTP-запросы без необходимости разбирать сложную структуру HTML.

Рассмотрим подробнее работу с XML-файлом, так как он дает наиболее полную картину для автоматизации.

Парсинг файла v8upd11.xml

Файл располагается по адресу, специфичному для каждой конфигурации. Для ЗУП 3.1 (ПРОФ) путь обычно выглядит так: downloads.1c.ru/ipp/ITSREPV/V8Update/Configs/HRM/31/83/v8upd11.zip. Обратите внимание, что файл поставляется в архиве, поэтому нам сначала потребуется его скачать и распаковать.

Разберем по шагам, как это реализовать в коде 1С:


// Путь для сохранения временного архива
ИмяАрхива = ПолучитьИмяВременногоФайла("zip");
КаталогРаспаковки = КаталогВременныхФайлов() + "update_xml_parse";

// 1. Скачивание файла (требуется предварительная авторизация, см. ниже)
// КопироватьФайл(АдресРесурса, ИмяАрхива); 

// 2. Распаковка архива
ЧтениеZIP = Новый ЧтениеZipФайла(ИмяАрхива);
ЧтениеZIP.ИзвлечьВсе(КаталогРаспаковки, РежимВосстановленияПутейФайловZIP.Восстанавливать);
ЧтениеZIP.Закрыть();

// 3. Чтение XML
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(КаталогРаспаковки + "/v8upd11.xml");

Пока ЧтениеXML.Прочитать() Цикл
    Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "v8u:version" Тогда
        НомерВерсии = ЧтениеXML.ПрочитатьВычисление();
        Сообщить("Найден релиз: " + НомерВерсии);
    КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();

В этом файле версии обычно перечислены по убыванию даты публикации, но не всегда по номеру релиза. Это подводит нас к важной особенности поддержки ЗУП.

Особенности параллельных веток (LTS) в ЗУП 3.1

Проанализируем ситуацию, которая часто вводит в заблуждение: одновременное существование нескольких актуальных версий. В ЗУП 3.1 компания «1С» поддерживает так называемые ветки длительного сопровождения (LTS). Например, долгое время параллельно выпускались обновления для веток 3.1.14 и 3.1.18, а позже — для 3.1.23 и 3.1.27.

Почему это важно: Если ваша база находится на ветке 3.1.23, вы не можете просто взять «самый последний» номер версии из списка (например, 3.1.27.150), так как это может быть переход на другую технологическую ветку с изменением функционала. Вам нужно искать последнее обновление именно для вашей ветки.

Выясним причину, по которой версии в XML могут идти не по порядку. 1С сортирует их по дате выхода. Если критическая ошибка обнаружена в старой LTS-ветке, обновление для нее выйдет позже, чем для новой ветки, и в XML-файле оно окажется выше (в начале файла). Поэтому логика «взять первую строку» может привести к попытке обновить новую версию на старую LTS-версию.

Построение цепочки обновлений (логика From)

Чтобы автоматика правильно понимала, на какой релиз можно обновиться, необходимо анализировать тег v8u:from внутри XML. Рассмотрим, как это работает: для каждого целевого релиза в блоке данных перечислены все версии, с которых поддерживается прямое обновление.

Проанализируем алгоритм выбора:

  1. Определяем текущий номер релиза нашей информационной базы (через Метаданные.Версия).
  2. Ищем в XML-файле все релизы, у которых в списке v8u:from присутствует наш текущий номер.
  3. Из найденных вариантов выбираем тот, который соответствует нашей ветке (например, начинается на те же первые три цифры) или является целевым для перехода на новую ветку.
  4. Если прямой переход на «самый свежий» релиз невозможен, алгоритм должен рекурсивно построить цепочку через промежуточные релизы.

Авторизация на портале и скачивание

Посмотрим на техническую реализацию доступа к файлам. Прямое скачивание через КопироватьФайл без параметров часто не срабатывает, так как сервер требует авторизации через сервис login.1c.ru.

Для корректной работы необходимо использовать объект HTTPСоединение. Сначала выполняется POST-запрос на сервер аутентификации с передачей логина и пароля ИТС, после чего сервер возвращает Cookie. Эти куки нужно сохранять и передавать во всех последующих запросах к downloads.1c.ru.

Пример структуры заголовка для HTTP-запроса:


ЗаголовокHTTP = Новый Соответствие;
ЗаголовокHTTP.Вставить("Cookie", ПолученныеРанееКуки);
Соединение = Новый HTTPСоединение("downloads.1c.ru",,,, Прокси, Истина);
Запрос = Новый HTTPЗапрос(ПутьКФайлу, ЗаголовокHTTP);
Результат = Соединение.Получить(Запрос, ИмяФайлаПриемника);

Использование HTML-парсинга как альтернативы

Если задача стоит максимально просто — получить только номер последнего релиза для уведомления, можно использовать чтение HTML-страницы проекта. Разберем, как найти нужную строку в тексте страницы https://releases.1c.ru/project/HRM30.

Мы можем прочитать содержимое страницы как обычный текст и искать вхождения ссылок. Посмотрим на пример упрощенного поиска:


// После получения текста страницы в переменную ТекстСтраницы
ПоискСтроки = "a href=""/version_files?nick=HRM30&ver=";
Позиция = Найти(ТекстСтраницы, ПоискСтроки);
Если Позиция > 0 Тогда
    // Вырезаем номер версии после найденного вхождения
    ЧастьТекста = Сред(ТекстСтраницы, Позиция + СтрДлина(ПоискСтроки));
    КонечнаяПозиция = Найти(ЧастьТекста, """");
    ПоследнийРелиз = Лев(ЧастьТекста, КонечнаяПозиция - 1);
    Сообщить("Актуальный номер релиза: " + ПоследнийРелиз);
КонецЕсли;

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

Практические советы

Таким образом, мы выяснили, что наиболее надежным методом является комбинированный подход: использование HTTPСоединение с авторизацией для получения v8upd11.xml и последующий анализ тегов v8u:from для определения корректного пути обновления. Это гарантирует, что ваша база данных будет обновлена без потери целостности и с соблюдением всех требований вендора.

← На главную