1с как программно изменить метаданные

Обновлено: 05.07.2024

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

Приблизительный алгоритм действий:

Предполагается, что конфигурации у вас уже объединены, но фактически есть их 2 версии - отличающиеся УИДом определенного объекта (в моем примере это справочник)

1. В КД создаем новые правила обмена. В качестве конфигураций источника и приемника используем одинаковую конфигурацию - любую из имеющихся двух версий

2. Создаем ПКО этого справочника (для всех реквизитов). Если для нас важно сохранить внутренние идентификаторы элементов справочника, устанавливаем галочку "Искать объект приемника по внутреннему идентификатору объекта источника". Для реквизитов ссылочного типа создаем ПКО только с полями поиска.

3. Создаем правила конвертации всех объектов информационной базы, где упоминается этот справочник (только поля поиска и реквизит с типом значения, соответствующим данному справочнику). Желательно, чтобы галочка " Искать объект приемника по внутреннему идентификатору объекта источника" тоже была установлена.

4. Создаем правила выгрузки данных для всех объектов информационной базы, где упоминается этот справочник. Сам справочник выгрузится по ссылке :).

5. Создаем резервную копию базы данных, которую планируем обновить

6. Выгружаем из обновляемой базы данные

7. Обновляем конфигурацию этой базы (файлом поставки с измененным GUID справочника)

8. Выполняем загрузку данных обратно в эту базу

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

Если метаданные не изменились (почти не изменились) то, возможно, удобнее воспользоваться стандартной обработкой ВыгрузкаЗагрузкаДанныхXML.

Выгружаем объекты в XML.

Загружаем измененную конфигурацию с потерей информации из объекта МД (или реквизита) с изменившимся идентификаторам.

При необходимости модифицируем файл метаданных, добавляя недостающие реквизиты. Сделать это относительно не сложно, выгружаем образец XML из свежей конфигурации, смотрим глазами и через групповую замену текста приводим структуру XML файла к новой.

//
Вариант 2. Переименовать объект МД (или реквизит) в *_OLD, обновить конфигурацию через сравнение, перебросить значение объекта МД (или реквизита), загрузить измененную конфигурацию.

1. ВыгрузкаЗагрузкаДанныхXML - сопоставляет объекты метаданных и объекты ИБ по внутреннему идентификатору. Соответственно, если при загрузке не будет найден объект метаданных со "старым" идентификатором - выдаст ошибку. Модифицировать XML файл - теоретически возможно, но надо учесть, что надо знать старый и новый GUID справочника, а также старые и новые GUID элементов этого справочника

2. как вы предлагаете перебросить значения объекта МД (или реквизита) ?

1. Обработка сопоставляет метаданные по имени, а ссылки на элементы конечно по идентификаторам.
<V8Exch:Data>
<CatalogObject.Контрагенты>
<Ref>0ccd343a-7ee1-11dd-7284-00119526ff1f</Ref>

2. Написать обработку или воспользоваться УниверсальныеПодборИОбработкаОбъектов.epf

1. Обработка сопоставляет метаданные по имени, а ссылки по идентификаторам.
<V8Exch:Data>
<CatalogObject.Контрагенты>
<Ref>0ccd343a-7ee1-11dd-7284-00119526ff1f</Ref>

2. Написать обработку или воспользоваться УниверсальныеПодборИОбработкаОбъектов.epf

При объединении метаданных нескольких похожих, но все таки различающихся конфигураций оказалось, что некоторые идентичные объекты метаданных в разных конфигурациях имеют различные идентификаторы, что не дает возможность объединить конфигурации без потери данных.
1. При сравнении/ объединении конфигураций, можно объекты сопоставлять.
2. Если требуется конвертация реквизита, то делается это обработку.

(3) awk,
1. при сравнении, объединении - сопоставление объектов происходит по имени объекта метаданных. при этом сопоставление можно задать вручную.

при создании файла поставки и затем обновлении конфигурации, находящейся на поддержке - сопоставление происходит только по внутреннему идентификатору. при этом при обновлении конфигурации файлом поставки (не через сравнение, объединение) - справочник "Номенклатура", например, со старым GUID будет удален, и вместо него будет добавлен такой же справочник "Номенклатура", но уже с новым GUID. Все данные в базе, связанные с этим справочником, конечно же, пропадут.

2. насчет конвертации реквизита - не совсем понял вашу мысль

Да проще все делается.

1. Переименовывается объект основной конфигурации, Номенклатура -> УдалитьНоменклатура.

2. Обновляется до конфигурации поставщика.

3. Делается обработка:

Пока Выборка.Следующий() Цикл

ОбъектЗаполнения = НайтиИлиСоздать(Выборка);
ЗаполнитьЗначенияСвойств(ОбъектЗаполнения, Выборка);

(7) awk,
я наверное туплю, поясните, что вы делаете этой обработкой ?

что я смог понять:
1. старый справочник переименовываем, обновляем конфигурацию файлом поставки, получаем в конфигурации 2 справочника - старый и новый
2. пишем обработку, которая копирует элементы справочника из старого в новый

вопросы:
1. как вы обработкой измените типы значения реквизитов других объектов ИБ, в которых есть ссылки на элементы старого справочника, а главное, как вы выполните во всех этих реквизитах замену ссылок на элементы старого справочника на ссылки на элементы нового справочника .

1. Есть такой метод НайтиСсылки.
2. Я, скорее всего, вообще не совсем понимаю модель обновления.

Вариант 1 (девелоп):

Есть три конфигурации. Вы их сливаете в одну и поставляете потребителю.

Тогда проблема старых гуидов - это надуманная проблема. Так как возникнуть она может только если клиент модифицировал конфигурацию сам. А то что он сам наделал - это уже его головная боль или ваши дополнительные деньги (какие тут три поставки?).

Вариант 2 (продакшан):

У вас есть база и вы хотите ее слить с двумя и более. Тогда зачем использовать механизм поставки? Тут скорее применение инструмента не по назначению (топором дрова рубят, а не бреются, хотя это не запрещено, но вряд ли целесообразно). В данном случае больше подойдет хранилище конфигурации, а не механизм поставки.

Вариант 3 (обновление):

Вы переходите от старой версии к новой. Тогда одно из двух либо у вас совместимые базы (бух 2.0 -> бух 3.0, вариант 3.а) либо не совместимые (бух. 1.6 -> 2.0, вариант 3.б).

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

Если у вас несовместимые конфигурации, то очевидно что будет выгрузка/конвертация/загрузка всей базы.

Так что способ в вашей статье я могу отнести только к 3.а или к 3.б, поскольку считаю вас квалифицированным специалистом, который не будет бриться топором (вариант 2) или не соблюдать правила при доработке типовых конфигураций у клиента (вариант 1). А так же знает, что конфигурация 1 + конфигурация 2 = конфигурация 3, но не как ни конфигурация 12 или конфигурация 21.

В принципе статью нужно было бы начинать с объяснения того, как можно объединить продукты, что в результате получится, как при этом перенести/сохранить данные. Было бы очень познавательно, особенно для новичков.

(9) awk,
ок, поясню немного ту ситуацию, с которой столкнулся я и для которой было выработано данное решение.

в организации было порядка 8 вариантов конфигураций бухгалтерских баз, основанных на одной конфигурации "Бухгалтерия для Украины". все эти конфигурации обновлялись и дорабатывались независимо, пока мне это не надоело и я не объединил их конфигурации в одну.

собственно, так и было выработано решение - выгрузить/загрузить данные через КД. иных вариантов я до сих пор не вижу. кстати, как мне мог бы помочь метод НайтиСсылки ? он может изменить тип значения реквизита объекта ?

по вашей классификации, можно считать, что у меня были 2 несовместимые конфигурации

(10) vdscom,
1. А зачем файл поставки? Если можно просто подключать и обновлять напрямую с хранилища?
2.

Есть Конфигурация 1 (КФ 1) и Конфигурация 2 (КФ 2)

Допустим Контрагенты КФ1 <> Контрагенты КФ2.

Берем КФ1 преименовываем справочник Контрагенты в кф1Контрагенты
Преименовываем рекфизиты с типом Контрагенты в кф1Контрагент, кф1Грузополучатель и т.д.


Константы в 1С используются для хранения условно-постоянной информации. То есть это те значения, которые редко меняются. Например, основная организация, валюта регламентированного учета, дата начала применения какого-нибудь приказа и т.п.

Одна константа может хранить только одно значение. Типы могут быть как примитивными, так и ссылками на другие объекты базы данных.

Важно понимать, что в 1С константы это не глобальные переменные, которые нельзя изменить в коде. Это некие значения, которые хранятся в базе данных. Их можно изменить как программно, так и интерактивно в пользовательском режиме.

В дереве метаданных константы находятся в разделе Константы:

Константа

В свойствах константы нужно указать тип. Составной тип тоже можно указать:

Константа

Форма констант

Использовать стандартные команды

команда для открытия формы константы

Так выглядит снегерированная платформой форма константы:

форма константы

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

Основная форма константы

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

Форма константы

Внешне она ничем не отличается от формы по умолчанию. Но теперь форму можно изменить, а также можно использовать обработчики формы в модуле формы.

обработчики формы

При создании общей формы можно выбрать тип формы Форма констант, тогда будет создана общая форма со всеми константами из конфигурации:

Форма констант

Справа есть основной реквизит формы НаборКонстант, откуда можно перетягивать константы мышкой на форму:

НаборКонстант

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

Использовать стандартные команды

Редактирование констант возможно в пользовательском режиме через меню Все функции:

Все функции

Как получить и изменить значение константы

Для получения и изменения значения константы предназначены методы Получить и Установить. Получить и изменить значение константы можно только на сервере. Нельзя получить значение константы на клиенте.

При написании небольших автоматизированных тестов часто надо обойти всю конфигурацию и проверить, например, для всех форм какое-нибудь свойство. Это всё легко делается через свойство глобального контекста "Метаданные", но чтоб дорбаться до обхода реквизитов надо написать кучу вложенных циклов. При этом код становится слабочитаемым и слабомодифицируемым.

Ниже приведен небольшой модуль, который решает задачу легко и удобно. Создана специальная функция РазвернутьСтрокуОбходаМетаданных, которая может по строке типа "Метаданные.Справочники.*.Реквизиты.*" построить массив строк с перечислением всех реквизитов всех справочников. При помощи этой и нескольких других функций в экспортных функциях модуля реализованы вполне прикладные задачи - получение всех реквизитов, всех макетов, всех форм конфигурации и построение таблицы всех составных типов.

Разместил: E_Migachev  Версии: | 8.x | 8.2 УП |  Дата: 19.01.2014   Прочитано: 37489

Распечатать

Похожие FAQ

Еще в этой же категории

Как программно получить Картинку из базы и сохранить ее преобразовав в другой формат?  4
//Получим и сохраним Общую картинку из библиотеку картинок конфигурации ИмяКартинки = Метаданные.ОбщиеКартинки.OutlookExpress; ВыбраннаяКартинка = БиблиотекаКартинок ; // Сохраним полученную картинку в c:temp ВыбраннаяКартинка.Записать(" c:te Получить список Справочников конфигурации  1
НаКлиенте Процедура ПоКнопкеЧтениеИзМетаданных(Команда) // Вставить содержимое обработчика. Перем СписокСправочников; СписокСправочников = Новый СписокЗначений; СписокСправочников = СправочникиИзМетаданных(); Для Сч = 0 По СписокСправочников Получить список Документов конфигурации  0
//ЭлементыФормы.ОбъектПоиска - Поле Выбора на форме СписокВыбора = ЭлементыФормы.ОбъектПоиска.СписокВыбора; Для Каждого Документ Из Метаданные.Документы Цикл //Проверим, есть ли права на просмотр? Да- добавляем, Нет - пропускаем Если ПравоДосту Перебор Основных Реквизитов формы  0
//Перебор Основных Реквизитов формы Для Каждого Рек из ЭтаФорма.Метаданные().Реквизиты Цикл Сообщить(рек.Имя+" - " +рек.Синоним+" - " +Строка(рек.Тип)); КонецЦикла; // или так Для Каждого Рек из Метаданные().Реквизиты Цикл Сообщить(рек.Имя+" Пример обращения к метаданным  0
спрНомен = Метаданные.Справочники.Номенклатура; Сообщить(" Имя справочника " " " + спрНомен.Имя + " " " " ); Сообщить(" Комментарий " + спрНомен.Комментарий); Сообщить(" ВидИерархии " + спрНомен.ВидИерархии); Сообщить(" КоличествоУровней " + Посмотреть все в категории Метаданные

Распечатать

1С Предприятие что это?  11
Что такое 1С? 1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » - конкретный продукт, который выпускает компания 1С . Что такое V82.COMConnector.1: Не найдена лицензия COM-соединением  1
При подключении из одной базы к другой через COM внезапно стала появляться следующая ошибка: «V82.COMConnector.1: Не найдена лицензия COM-соединением», хотя никаких изменений на серверах не делалось. Релиз платформы был 8.2.13. Обновил до 14-го – не База 1С при запуске уходит в дамп и вылетает  1
В последнее время частенько обращаются пользователи у которых после замены или ремонта компьютера 1С не запускается, а точнее при открытии уходит в dump и вылетает. Как правило, решение одно: Отключить аппаратное ускорение видеокарты В Window Блокировка записей, невозможно изменить или удалить из регистра. Конфликт блокировок MS SQL + 1C  3
При попытке удалить запись из регистра сведений - получаю ошибку: она заблокирована, ошибка блокировок и т.д. Отключил всех пользователей, перезапустил сервер, пробую удалить - опять ошибка блокировки :( Путем тестов было вяснено, что проблема Быстрый перенос списка баз с одного компьютера на другой  0
Для 8.1 : 1. Список баз 8.1 можно сохранять в файл.Для этого правой кнопкой мыши по корневому элементу " Информационные базы " , далее " Сохранить ссылку в файл " . 2. Получаем файл с расширением v8i , это текстовый файл в кодировке UTF-8. Ес Посмотреть все результаты поиска похожих

Еще в этой же категории

Получить список Справочников конфигурации  1
НаКлиенте Процедура ПоКнопкеЧтениеИзМетаданных(Команда) // Вставить содержимое обработчика. Перем СписокСправочников; СписокСправочников = Новый СписокЗначений; СписокСправочников = СправочникиИзМетаданных(); Для Сч = 0 По СписокСправочников Получить список Документов конфигурации  0
//ЭлементыФормы.ОбъектПоиска - Поле Выбора на форме СписокВыбора = ЭлементыФормы.ОбъектПоиска.СписокВыбора; Для Каждого Документ Из Метаданные.Документы Цикл //Проверим, есть ли права на просмотр? Да- добавляем, Нет - пропускаем Если ПравоДосту Перебор Основных Реквизитов формы  0
//Перебор Основных Реквизитов формы Для Каждого Рек из ЭтаФорма.Метаданные().Реквизиты Цикл Сообщить(рек.Имя+" - " +рек.Синоним+" - " +Строка(рек.Тип)); КонецЦикла; // или так Для Каждого Рек из Метаданные().Реквизиты Цикл Сообщить(рек.Имя+" Пример обращения к метаданным  0
спрНомен = Метаданные.Справочники.Номенклатура; Сообщить(" Имя справочника " " " + спрНомен.Имя + " " " " ); Сообщить(" Комментарий " + спрНомен.Комментарий); Сообщить(" ВидИерархии " + спрНомен.ВидИерархии); Сообщить(" КоличествоУровней " + Обход метаданных (полезные функции)  0
При написании небольших автоматизированных тестов часто надо обойти всю конфигурацию и проверить, например, для всех форм какое-нибудь свойство. Это все легко делается через свойство глобального контекста " Метаданные" , но чтоб дорбаться до обхода р Посмотреть все в категории Метаданные

Читайте также: