Изменение структуры баз 1С 7.7 без долгой реструктуризации. Часть 1. Справочники

13.08.13

Разработка - Инструментарий разработчика

На днях встретил вопрос на форуме про возможность внесения изменений в конфигурацию без долгого сохранения в рабочей базе большого объема.
Вот решил поделиться опытом, как это делал я. База у нас была объемом порядка 120 Гб. К базе обращался сайт в режиме 24/7, поэтому важно было быстро сохранять изменения и желательно без последующего монопольного запуска для восстановления индексов и процедур и без отключения пользователей от базы.
Это первая часть статьи и посвящена она справочникам. С одной стороны - это самый простой объект, с другой стороны, именно про справочник спрашивалось на форуме.
Если статья будет востребована, то я напишу аналогичные про документы, регистры и может еще что.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Выгрузки конфигураций
.rar 12,11Kb
6
6 Скачать (1 SM) Купить за 1 850 руб.

Смысл моей реализации – выполнение структурных изменений в базе SQL средствами самого SQL сервера с последующей заменой файлов 1cv7.md и 1cv7.dds в рабочей базе. Причем так, чтобы 1С не «догадалась», что эти изменения сделала не она сама.

Опытным путем можно проверить, что, например, изменение интерфейсов, прав, перечислений – не являются, по сути, структурными изменениями. Поэтому в данном случае достаточно просто подменить 1cv7.md.

Совсем по другому дело обстоит со справочниками, документами, регистрами и т.п.

Предупреждение: все алгоритмы проверяйте на тестовых базах и не забывайте про бэкап.

Помните: drop table и truncate table выполняются очень быстро Wink

Все скрипты приведены для MS SQL версии 2005 и выше. Для версии 2000 будут некоторые отличия в синтаксисе.

Итак, начнем. Будем двигаться от простого к сложному.

После каждого шага Вы можете подменять файлы md и dds в базе Тест и проверять работоспособность.

Для начала создадим самую простую конфигурацию (на sql сервере назовем ее Test). Это будет «рабочая база». Заполним ее немного данными.

Выгрузку конфигурации до изменений и после всех изменений, при желании, можно скачать в приложенном файле.

Через выгрузку-загрузку (для быстроты) создадим еще одну базу (на sql сервере назовем ее Test2). Это будет «копия». Причем копию при реальной работе можно и нужно делать без данных: т.е. просто скопировать 1cv7.md в пустую папку и запустить конфигуратор. Так изменения будут сохранятся гораздо быстрее.

 

Теперь наши изменения: в конфигураторе изменения вносим в базе Тест2, скрипты выполняем в контексте базы Тест.

1.      Добавление признака «Отбор для реквизита» для реквизита «Вес» справочника Номенклатура.

 

В зависимости от наличия владельца и/или родителя в этом случае могут быть созданы 1 или 2 индекса. В нашем случае создался один индекс «VI14» с полями «Вес», «Наименование» и «row_id».

Сравнение файлов dds до и после изменений:

 

 

Задача самая простая: создать такой же индекс в рабочей базе. Предварительно проверяем его существование и удаляем, если он есть.

В этом, и некоторых последующих случаях, можно попросить SSMS сделать скрипт за нас. В нем будет много относительно лишнего кода – я постараюсь лишнее удалять, чтобы не путать.

  

Текст скрипта:

USE Test

GO

 IF  EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[SC12]') AND name = N'VI14')

      DROP INDEX [VI14] ON [dbo].[SC12]

 GO

 CREATE UNIQUE NONCLUSTERED INDEX [VI14] ON [dbo].[SC12]  ([SP14] ASC, [DESCR] ASC, [ROW_ID] ASC)


 2.       Добавление колонки «Поставщик» (Строка (50)) в справочник Номенклатура.

Здесь мы рассматриваем добавление колонки в существующий справочник, в котором уже есть данные.

Основной нюанс здесь в том, что 1С 7.7 не допускает хранение NULL в колонках таблицы. Поэтому создавая колонку, необходимо указать дефолтовое значение для добавляемой колонки.

В нашем случае это будет пустая строка: ‘’. Если бы тип данных был «Число», то пустое значение было бы 0.

У агрегатных объектов, например, если бы колонка была типа «Справочник.Контрагенты» - пустое значение было бы ‘     0   ’, если просто «Справочник» - то ‘   0     0   ’ и т.д.

Сохраним изменения в базе Тест2:

 

 Посмотрим отличия в DDS:

 

 

Дам некоторые пояснения по скрипту. В MS SQL указание значения по умолчанию – это создание объекта constraint в таблице.

Мой совет: чтобы данный скрипт можно было выполнить несколько раз в одной базе (например, в случае какого-либо сбоя) лучше давать констрейтантам явные имена. Если написать просто:  

  alter table SC12 add sp26 char(50) not null default ''

 

то констрейнт будет иметь сгенерированное имя, причем при каждом удалении и создании колонки имя констрейнта будет меняться.

Перед удалением колонки нужно удалять все объекты, в которых данная колонка задействована (кроме таблиц конечно), в т.ч. констрейнты (вот здесь и понадобится имя), индексы и т.п. 

В нашем случае индексов по колонке нет, поэтому удаляем констрейнт, затем саму колонку (если они есть) и создаем новую колонку нужного типа.

Текст скрипта:

use Test

go

 if exists(select 1 from sys.objects where name = 'df_sc12_sp26' AND parent_object_id = OBJECT_ID('dbo.SC12'))

      alter table SC12 drop constraint df_sc12_sp26

go

 if exists (select 1 from sys.columns where name = 'sp26' AND object_id = OBJECT_ID('dbo.SC12'))

      alter table SC12 drop column sp26

go

 alter table SC12 add sp26 char(50) not null constraint df_sc12_sp26 default ''


3.      Изменение типа колонки «Поставщик» справочника Номенклатура

При изменении типа колонки, например изменении длины поля типа «строка», или изменение разрядности «числа», можно воспользоваться скриптом, приведенным ниже.

Поменяем длину поля Поставщик с 50 на 10 символов.

 

 

Обратите внимание: если в таблице уже есть строки больше 10 символов – преобразование на SQL из 50 в 10 не будет выполнено:

 

 

 

 

То же произойдет, если попытаться преобразовать колонку типа «Строка» в «Число» при наличии записей, которые не приводятся безусловно к типу число:

  

Если какая-то колонка не используется и Вы хотите задействовать ее под новые данные, то ее предварительно нужно удалить и создать новую с тем же идентификатором и в том же порядковом месте. Это будет рассматриваться при описании документов в следующей части статьи.

В скрипте проверяем наличие колонки и меняем тип.

Текст скрипта:

use Test

go

if exists (select 1 from sys.columns where name = 'sp26' AND object_id = OBJECT_ID('dbo.SC12'))

      alter table SC12 alter column sp26 char(10) not null

go


   4.      Добавление справочника «Контрагенты»

И последний на сегодня пример: добавление справочника в конфигурацию. Добавляем справочник Контрагенты с одним реквизитом «ИНН».

Изменений в DDS гораздо больше:

 

Здесь помимо создания самой таблицы в SQL, необходимо создать соответствующие индексы и процедуры.

В общем случае, достаточно создать только таблицу, подменить md и запустить базу монопольно – 1С остальное сделает сама. Но наши цели: 1. Понимание процесса; 2. Возможность запуска без монопольного режима.

При создании скриптов (в т.ч. получения текста сгенерированных процедур) удобно использовать функции SSMS, как это описано в шаге 1.

По самому скрипту: как обычно – проверяем наличие объекта, если есть удаляем, создаем объект. Проверку наличия индексов не проверяем, т.к. при удалении таблицы – индексы также удаляются.

Текст скрипта:

use Test

go

 --Таблицы

if exists (select 1 from sys.objects where object_id = OBJECT_ID('dbo.SC27'))

      drop table dbo.sc27    

go

 create table dbo.SC27(

      [ROW_ID] [int] IDENTITY(1,1) NOT NULL,

      [ID] [char](9) NOT NULL,

      [CODE] [char](5) NOT NULL,

      [DESCR] [char](25) NOT NULL,

      [ISMARK] [bit] NOT NULL,

      [VERSTAMP] [int] NOT NULL,

      [SP29] [char](12) NOT NULL,

      constraint [PK_SC27] primary key clustered ([ROW_ID] asc)

      )

go

 --Индексы

create unique nonclustered index CODE on dbo.SC27 (CODE ASC, ROW_ID ASC)

go

 create unique nonclustered index DESCR on dbo.SC27 (DESCR ASC, ROW_ID ASC)

go

 create unique nonclustered index IDD on dbo.SC27 (ID ASC)

go

 --Процедуры

 if exists (select 1 from sys.objects where object_id = OBJECT_ID('dbo._1sp_SC27_ByID'))

      drop procedure [dbo].[_1sp_SC27_ByID]

go   

 create procedure dbo._1sp_SC27_ByID (@id CHAR(9)) AS

      select * from SC27 with (nolock) where ID=@id

go

 if exists (select 1 from sys.objects where object_id = OBJECT_ID('dbo._1sp_SC27_MaxID'))

      drop procedure dbo._1sp_SC27_MaxID

go

 create procedure dbo._1sp_SC27_MaxID (@id CHAR(9) OUTPUT) AS

      set nocount on select @id=MAX(ID) from SC27 with (nolock) if @id is null select @id='         '

go

 if exists (select 1 from sys.objects where object_id = OBJECT_ID('dbo._1sp_SC27_MaxRowID'))

      drop procedure dbo._1sp_SC27_MaxRowID

go

 create procedure dbo._1sp_SC27_MaxRowID (@i int OUTPUT) AS

      set nocount on select @i=MAX(ROW_ID) from SC27 with (nolock) if @i is null select @i=0

go

 if exists (select 1 from sys.objects where object_id = OBJECT_ID('dbo._1sp_SC27_TLock'))

      drop procedure dbo._1sp_SC27_TLock

go

 create procedure dbo._1sp_SC27_TLock AS

      set nocount on declare @i int select @i=1 from SC27 with (tablock, holdlock) where 0=1

go

 if exists (select 1 from sys.objects where object_id = OBJECT_ID('dbo._1sp_SC27_TLockX'))

      drop procedure dbo._1sp_SC27_TLockX

go

 create procedure dbo._1sp_SC27_TLockX AS

      set nocount on declare @i int select @i=1 from SC27 with (tablockx, holdlock) where 0=1

go

реструктуризация обновление реорганизация

См. также

Инструментарий разработчика Системный администратор Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Консоль запросов к базе SQL, не требующая внешних компонент

10 стартмани

29.04.2015    22278    57    Gvozdod    8    

16

Инструментарий разработчика Системный администратор Программист Платформа 1С v7.7 Платформа 1С v8.3 Абонемент ($m)

Очередная редакция альтернативного стартера, являющегося продолжением StartManager 1.3. Спасибо всем, кто присылал свои замечания и пожелания, и тем, кто перечислял финансы на поддержку проекта. С учетом накопленного опыта, стартер был достаточно сильно переработан в плане архитектуры. В основном сделан упор на масштабируемость, для способности программы быстро адаптироваться к расширению предъявляемых требований (т.к. довольно часто просят добавить ту или иную хотелку). Было пересмотрено внешнее оформление, переработан существующий и добавлен новый функционал. В общем можно сказать, что стартер эволюционировал, по сравнению с предыдущей редакцией. Однако пока не всё реализовано, что планировалось, поэтому еще есть куда развиваться в плане функциональности.

1 стартмани

23.04.2014    168350    1882    Alexoniq    1596    

499

Инструментарий разработчика Программист Платформа 1С v7.7 Платформа 1С v8.3 Россия Абонемент ($m)

Согласитесь, что окно стандартное сообщений в 1С иногда приносит больше неудобств, чем пользы. И тем более разные "Предупредить"... Что с этим окном только не делают! Его отцепают от формы, делают маленьким, умудряются спрятать за границы экрана. А потом звонят программистам с претензией, что документ почему-то не проводится, отя ничего и не пишет. У вас такого не было? А вот у нас было и не раз )))

1 стартмани

04.09.2013    33404    61    O-Planet    78    

49

Инструментарий разработчика Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Встала недавно задача для одной организации, которая все еще на 1С 7.7 немного автоматизировать работу отдела продаж. А именно уйти от ручного заполнения договоров, сделанных юристами в MS Word. Договора от разных фирм и разного назначения отличались. Переводить их в таблицы 1С очень не хотелось и нашел способ прямо в файлах Word сделать небольшие дополнения, чтобы можно было печатать, используя именно эти заготовки юристов.

1 стартмани

14.07.2013    27641    56    adamx    11    

14

Инструментарий разработчика Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Давным давно, когда я еще плотно писал на 7.7 работа с формами была мучительной и неудобной. Приходилось каждый элемент выкладывать, выравнивать на форме ручками, прописывать код в модуле. Иногда при разработке очередной формы приходила в голову мысль: "а где-то я уже похожее делал..." и начинался мучительный поиск подходящего кода в своих запасах........

1 стартмани

21.02.2013    18342    36    MarSeN    14    

17

Инструментарий разработчика Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Анализируем различные данные в 1С, используя OLAP-технологии со всеми прелестями. Т.е. наглядное отображение данных, быстрые расчеты, горизонтальные и вертикальные группировки любой вложенности, удобная фильтрация, Drag'n'Drop и ещё много приятных вещей от MS. Обработка на входе принимает практически любую таблицу значений (ТЗ в которой колонкам указаны типы значений, строка, число и т.п.), на выходе имеем на форме 1С сводную таблицу и график по этой ТЗ, с которой работаем, как и в Excel со сводной таблицей и диаграммой. Взял за основу разработку «OLAP Анализ счёта» ( http://infostart.ru/public/14964/ ) от JohnyDeath и переделал под любую ТЗ. Опционально используется «Прогресс бар для 1С 77» (http://infostart.ru/public/14061/ ) от Gmix.

1 стартмани

21.12.2012    36347    51    venger    7    

23

Инструментарий разработчика Программист Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Весь код на 1С 7.7, собранный для повторного использования за 8 лет работы.

10 стартмани

25.11.2012    35451    249    adhocprog    51    

70
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. logos 214 14.08.13 09:12 Сейчас в теме
Отличная статья, сам на днях учился добавлять регистры на базу семерки. Реструктуризация при добавлении регистра не проходила более чем за сутки, такой простой рабочей базы был непозволительной роскошью. Правда я не догадался указывать дефолтное значение, за что Вам огромное спасибо.
Ветер в поле; +1 Ответить
2. DenisCh 14.08.13 09:55 Сейчас в теме
Хорошо разложено и описано.
3. NikolaenkoIgor 20.08.13 22:45 Сейчас в теме
Отличная статья. Ждём продолжения.
4. Abadonna 3968 21.08.13 12:09 Сейчас в теме
Статья хорошая - плюс. 7.7 - бяка!
5. Ветер в поле 3 22.07.24 10:51 Сейчас в теме
Кстати, по мотивам этой статьи была написана обработка, которая автоматизирует создание скрипта обновления и выполняет его. К сожалению, Инфостарт наотрез отказался публиковать статью с этой обработкой. Поэтому опубликовал ее на 1cpp.ru. Искать по фразе "Обработка для ручного обновления базы SQL платформы 7.7"
Оставьте свое сообщение