По долгу службы наша контора обслуживает несколько организаций, которые для управленческого и бухгалтерского учета используют 1с.
1с, как известно, постоянно выпускает обновления для своих конфигураций.
Соответственно на обновление хотя бы 5 баз уходит приличное количество времени.
Рассказ о том, как добиться полной (кроме скачивания обновлений) автоматизации процесса средствами MSSQL далее.
Автоматизировать процесс начнем с «конца»
- В 1с обновление возможно только с определенной версии на определенную. Это связано с тем, что файлы обновления поставляются не в виде полного «слепка» конфигурации. А в виде изменений от эталонной версии.
- Так же в самом коде 1с есть предопределенные обработки, которые запускаются при переходе с одной версии на другую.
Значит нам надо получить текущую версию 1с.
Есть конечно вариант использования 1с-COMConnector, который не менее 2 секунд устанавливает соединение, «Кушает» лишнюю лицензию, память и пьет мой кофе.
Как посмотреть номер релиза программы 1С?
Я пошел по другому пути. В версиях 1с >8.0 нет каталога базы данных, следовательно всё хранит в себе база данных MSSQL.
В таблицах БД есть таблица _config, а в ней строка с FileName=root. Смотрим содержимое (Binary Data):
Содержимое хранится в сжатом виде. Ниже будет пример его распаковки
Методом научного тыка находим этой же таблице есть запись с FileName=e0666db2-45d6-49b4-a200-061c6ba7d569 (тот же идетификатор):
,6,
,»ЗарплатаИУправлениеПерсоналом»,
,»»>
>,»»,1,
,
,
,
,
,72ef09b4-4393-4d23-a530-7e5b50cf1d24,31e2aa98-4a9c-4d99-a3e7-540a13396b8c,1e7940af-fba5-46c3-8ffb-e8389ac2b79f,87090b31-2cd0-4b45-8b24-efdb2383b1a2,1,»Фирма «»1С»»»,»2.5.40.3″,»http://downloads.v8.1c.ru/tmplts/»,1,
(приведена только самая интересная часть файла)
Вы наверное догадались что это за конфигурация 1с.
Теперь надо это объяснить MS SQL.
В c# я написал класс:
При создании класса надо передать MemoryStream binary data из таблицы _config.
Как видно в коде им можно парсить и конфигурации 7.7, предварительно распаковав.
Теперь до версии конфигурации можно добраться зная её «адрес»: Далее просто создаем пустую базу с версией «ВЕРСИЯ» и находи что её «адрес» (v8metadata)(((v8metadata)(((v8metadata)(this.array_data[3])).array_data[1])).array_data[1])).array_data[15].ToString();
using System; using System.Collections.Generic; using System.Text; using System.Data.SqlClient; using System.IO.Compression; using System.IO; namespace metadata < class v8config < public SqlConnection con; public string rootfile; public string platform; public string vendor; public string conf; public string version; public v8metadata v8; private string db; private string server = «»; public v8config(string constring) < con = new SqlConnection(constring); db = con.Database; MemoryStream ms = file_data(«root»); v8metadata v82 = new v8metadata(ms, «root»); rootfile = v82.get(1).ToString(); if (v82.array_data.Length >2) platform = «8.2»; else platform = «8.1»; update_prop(); > //Конструктор для linked серверов public v8config(SqlConnection conn, string srv, string database) < con = conn; server = srv; db = database; if (check_is_v8()) < MemoryStream ms = file_data(«root»); v8metadata v82 = new v8metadata(ms, «root»); rootfile = v82.get(1).ToString(); if (v82.array_data.Length == 3) platform = «8.2»; else if (v82.array_data.Length >3) < platform = «8.0»; rootfile = «root»; >else platform = «8.1»; update_prop(); > > public v8config(SqlConnection conn) < con = conn; db = con.Database; MemoryStream ms = file_data(«root»); v8metadata v82 = new v8metadata(ms, «root»); rootfile = v82.get(1).ToString(); update_prop(); >//Функция, конечно кривовата, но работает private void update_prop() < if (platform != «8.0») < if (v8 == null) < v8 = new v8metadata(file_data(rootfile), rootfile); >if (((v8metadata)(((v8metadata)(((v8metadata)(v8.array_data[3])).array_data[1])).array_data[1])).array_data.Length > 20) platform = «8.2»; vendor = v8.get(«vendor»); conf = v8.get(«conf»); version = v8.get(«version»); > else < vendor = «очень старая конфигурация»; conf = «очень старая конфигурация»; version = «очень старая конфигурация»; >> public void SaveToFile(string file, string filename) < FileStream fs = File.OpenWrite(filename); MemoryStream ms = file_data(file); byte[] data = ms.ToArray(); fs.Write(data, 0, data.Length); >private bool check_is_v8() < try < bool doopencon = false; SqlCommand cmdu1; bool haslinked = true; if (con.State != System.Data.ConnectionState.Open) < con.Open(); doopencon = true; >cmdu1 = new SqlCommand(«», con); cmdu1.CommandText = «select name from [» + server + «].[master].dbo.sysdatabases where name='» + db + «‘»; if (cmdu1.ExecuteScalar() == null) < haslinked = false; >if (!haslinked) < if (doopencon) con.Close(); return false; >cmdu1.CommandText = «select name from [» + server + «].» + db + «.dbo.sysobjects where name =’config'»; if (cmdu1.ExecuteScalar() == null) < haslinked = false; >if (doopencon) con.Close(); return haslinked; > catch < return false; >> private MemoryStream file_data(string name) < MemoryStream ms = new MemoryStream(); if (con.State != System.Data.ConnectionState.Open) con.Open(); string sql; if (server != «») sql = «select BinaryData from [» + server + «].[» + db + «].dbo.Config where [filename]='» + name + «‘»; else sql = «select BinaryData from [» + db + «].dbo.Config where [filename]='» + name + «‘»; SqlCommand cmdu1 = new SqlCommand(sql, con); cmdu1.CommandTimeout = 200; SqlDataReader rs = cmdu1.ExecuteReader(); if (rs.Read()) < DeflateStream dfs = new DeflateStream(rs.GetSqlBytes(0).Stream, CompressionMode.Decompress); byte[] BufferOut = new byte[100]; int BytesRead; while ((BytesRead = dfs.Read(BufferOut, 0, 100)) >0) ms.Write(BufferOut, 0, BytesRead); dfs.Close(); > con.Close(); return ms; > public string get(string descr) < if (rootfile == null) return «База данных не является бд 1с v8»; if (v8 == null) < v8 = new v8metadata(file_data(rootfile), rootfile); >if (descr == «test») < string fname = ((v8metadata)(((v8metadata)(((v8metadata)(v8.array_data[4])).array_data[2])).array_data[2])).array_data[3].ToString() + «.5»; MemoryStream ms = this.file_data(fname); v8metadata nv8 = new v8metadata(ms, fname); return «test»; >else return v8.get(descr); > > >
v8config v8 = new v8config(«server=сервер;database=база;uid=sa;pwd=пароль;Connection Timeout=300;»); v8.get(«version»);
Но где же здесь MSSQL?
Новое в программе 1С:ЗУП ред.3 (начиная с релиза 3.1.25.36)
Вот CLR функция, которая получит эти данные в самом MSSQL:
У нас есть отдельная БД, которая хранит в себе сервера и базы. Соответственно функция адаптирована под это.
А как определить какое обновление необходимо для данной конфигурации 1с?
При установке обновлении 1с можно использовать каталог обновлений на сервере. В каждом обновлении есть файл .mft вида:
Vendor=Фирма «1С»
Name=БухгалтерияПредприятия
Version=2.0.25.5
AppVersion=8.2
.
И файл UpdInfo.txt
Version=2.0.25.5
FromVersions=;2.0.24.10;
UpdateDate=11.07.2011
Это же всё, что нам надо.
Зная FromVersions и дату выхода обновления мы можем автоматически генерировать строку для запуска обновления 1с. (ссылка на параметры в начале топика)
Но тут появляется еще одна проблема — наличие пользователей в базе. 1с не обновляется. Пишем «выгонялку» пользователей (vbscript)
‘basename-Имя базы в кластере серверов 1с ‘updateway — Путь к файлу обновления ‘platform — Платформа 1с (8.1/8.2) ‘srv1c — Сервер 1с ‘srvUser — пользователя для входа на сервер 1с ‘srvPasswd- пароль пользователя для входа на сервер 1с ‘confchanged — булево — конфигурация изменена. Выполнить только принятие изменений конфигурации Function GetUpdateForConfig(basename,updateway,platform,srv1c,srvUser,srvPasswd,baseUsr,basepwd,confchanged) allowdisconnect=false ‘Если мы работаем с 12 до 6 утра — мы можем выгнать пользователей if Hour(now())>0 and Hour(now)0 then ConnectString = WorkingProcess.HostName :» tcp://» > «comconsole» then if allowdisconnect then WorkingProcessConnection.Disconnect Connection ShowStatus «Discconnect соединения » Есть работающие пользователи.»,false,false GetUpdateForConfig=0 Exit function End if End if Next End if Next ShowStatus «Запуск обновления » /S»»» «» «»»» if baseUsr<>»» then constr=constr /N» » /P» » /UpdateCfg»»» «»»» end if constr=constr /UpdateDBCfg» if Way1cv81=»» then ShowStatus «Не заполнен путь к 81″,true,true GetUpdateForConfig=»» Exit function End if RunString=»»»» «1cv8.exe»» CONFIG » «» Resfile=WorkCatalog() result.txt» RunString=RunString /Out»»» «»»» ShowStatus «Строка запуска: » https://habr.com/ru/articles/130924/» target=»_blank»]habr.com[/mask_link]
Работаем в 1С:Предприятие 8.*, 7.7
Чтобы узнать номер релиза платформы и конфигурации 1С Предприятие 8 необходимо войти в программу в режиме «Предприятие» или «Конфигуратор» и выбрать пункт меню «Справка» — «О программе».
Релиз системных файлов (платформы) программы указан в верхней строке этого окна. На рисунке ниже в скобках мы видим цифры: (8.2.15.301), это номер релиза платформы 1С:Предприятие 8.2.
Релиз установленной конфигурации мы также видим в этом окне. Его номер указан в скобках в строке следующей после заголовка «Конфигурация». На нашем примере для версии 8.2 мы видим информацию: “Управление торговлей”, редакция 10.3 (10.3.17.4)
Источник: goto1c.blogspot.com
Актуальные релизы программ 1С Предприятие
На этой страничке я публикую информацию для своих клиентов о дате выхода актуальных релизов для каждой конфигурации 1С. Данная информация необходима для своевременной установки обновления. Для того, чтобы конфигурации всегда были в актуальном состоянии!
Закажите обновление 1C в один клик! ⇒
Текущий релиз технологической платформы 1С.
Платформа 8.2 (не используется) Дата выхода: 13.02.2015 Номер релиза: 8.2.19.130 |
Платформа 8.3 Дата выхода: 14.06.2023 Номер релиза: 8.3.23.1739 |
Текущие релизы типовых конфигураций.
1С:ERP Управление предприятием, редакция 2.2*** Дата выхода: 15.03.2018 Номер релиза: 2.2.4.197 |
1С:ERP Управление предприятием, редакция 2 Дата выхода: 22.06.2023 Номер релиза: 2.5.12.80 |
Бухгалтерия Предприятия, редакция 2.0
Дата выхода: 30.03.2022
Номер релиза: 2.0.67.25
Дата выхода: 05.08.2022
Номер релиза: 1.6.27.295
*** конфигурация больше не поддерживается.
Где скачать обновления для 1С.
Видео на моем канале.
Фирма «1С» ведет постоянную разработку своих программных решений. Для каждой программы, как минимум, раз в месяц выходят ключевые обновления (подробнее об обновлениях).
Для того, чтобы узнать какой у Вас релиз платформы и конфигурации (если, не знаете, что такое платформа и конфигурация посмотрите вот это видео), откройте программу в режиме «Конфигуратор» или «1С Предприятие» и в верхнем меню нажмите вот этот знак.
Откроется вот такое окно.
Вверху читаем номер вашего релиза платформы, чуть ниже номер конфигурации.
Изменения числа в последнем регистре номера релиза, не столь важны. Хотя, тут тоже надо следить, чтобы не было большого разрыва, особенно в релизах платформы. На следующий регистр нужно обращать особое внимание. Если он меняется и у Вас есть расхождения, нужно обязательно обновиться.
Я публикую на этой странице информацию для наших клиентов. Если Вы не нашли название своей программы 1С, позвоните мне, и я включу ее в эту таблицу.
Как получить доступ к обновлениям программ 1С
Вопрос из моей практики: «Дополнительно купили Управление торговлей, надо ли нам теперь покупать два ИТС?».
Ответ: Нет не надо. Для двух программ версии ПРОФ или КОРП достаточно одного договора на сопровождение. Купленную программу нужно зарегистрировать в своем личном кабинете. Я, например, для своих клиентов, всегда делаю это сам.
В продолжении темы доступа к обновлениям, кратко (Подробнее про ИТС ПРОФ и ТЕХНО тут.):
Для базовых версий программ 1С ИТС покупать не нужно. Обновления предоставляются бесплатно.
Для версий ПРОФ и КОРП нужно купить сервис «Обновление программ 1С» для получения официальных обновлений программ 1С. Сделать это можно одним из двух способов, в составе договора 1С ИТС (информационно-технологического сопровождения), либо в составе договора 1С:Комплект поддержки. «1С:Комплект поддержки» — это тоже самое, что 1С:ИТС, только поставляется в электронном виде.
Для программ, работающих в облаке с 1С через интернет, стоимость обновлений включена в составе платы за облачный сервис. Таким пользователям покупать ничего не нужно.
Источник: uslugi1s.ru