1с как программно изменить метаданные
Доброе время суток ! Можно ли с помощью внешней обработки изменить структуру документа или справочника, одним словом Метаданных ? Мне надо всем документам и Справочникам добавить 2 однаковых реквизитов.
НовыйРеквизит(); Синтаксис: НовыйРеквизит(НазваниеРеквизита) Назначение: создает новый реквизит справочника Возвращает: Объект "РеквизитСправочника" Параметры НазваниеРеквизита - строка, идентификатор нового реквизита?>
Только нафига все это? Сделал один реквизит и копипастом его, копипастом - один фиг быстрее будет чем обработку калякать
Можно только это черевато. Да и можно только в том случае если база не за лочена. Про возможность разлочить петь не надо ибо не правильно это.
Скачал отсюда Версия ActiveMD v0.5 beta Написал такой код: МД=СоздатьОбъект("ActiveMD.MDFile"); Пишет: файл успешно открыт OLE.IMDRef Реквизит=Спр.НовыйРеквизит("ДатаКорр");
Получил, Рахмет ! Еще 2 вопроса: Как добавить ОбщийРеквизит Документам ? Можно ли добавить ОбщийРеквизит Справочникам ?
Кинул Общих реквизитов справочников не бывает. А вот с добавлением общего реквизита документов, кажись, облом. По крайней мере я не знаю как :(
кстати АктивМД у меня плохо работает. Кое что вообще не меняет. Хотя пишет, что мд удачно сохранен. Но не сохраняет, даже ошибку не выдает. Поэтому давно перестал им пользоваться. Глючный он какой то.
Ну если ГКомп-ом разобрать, аккуратно вписать, а потом собрать - думаю что можно. Опять же чем вручную штатно добавить польза - разберешься со структурой МД :)
Ладно сделаю вручную. Возник вопрос по документам, как расширить длину Номера документа: Делаю так: Оишбок не выдает, и результат тоже не положительный
Через ActiveMD версия 2.0.2 изменил структуру справочников. Были добавлены одинаковые реквизиты всем справочникам. Потом эту конфигурацию загрузил на другую. Реквизиты в ноую конфигурацию тоже добавлены. Потом хотел добавить их в форму элемента, но там их нету. Они видны только в форме списка. Если без ActiveMD версия 2.0.2, вручную удалить и добавить то видно. В чем дело ?
При объединении метаданных нескольких похожих, но все таки различающихся конфигураций оказалось, что некоторые идентичные объекты метаданных в разных конфигурациях имеют различные идентификаторы, что не дает возможность объединить конфигурации без потери данных. Проблема была решена использованием механизма конвертации данных.
Приблизительный алгоритм действий:
Предполагается, что конфигурации у вас уже объединены, но фактически есть их 2 версии - отличающиеся УИДом определенного объекта (в моем примере это справочник)
1. В КД создаем новые правила обмена. В качестве конфигураций источника и приемника используем одинаковую конфигурацию - любую из имеющихся двух версий
2. Создаем ПКО этого справочника (для всех реквизитов). Если для нас важно сохранить внутренние идентификаторы элементов справочника, устанавливаем галочку "Искать объект приемника по внутреннему идентификатору объекта источника". Для реквизитов ссылочного типа создаем ПКО только с полями поиска.
3. Создаем правила конвертации всех объектов информационной базы, где упоминается этот справочник (только поля поиска и реквизит с типом значения, соответствующим данному справочнику). Желательно, чтобы галочка " Искать объект приемника по внутреннему идентификатору объекта источника" тоже была установлена.
4. Создаем правила выгрузки данных для всех объектов информационной базы, где упоминается этот справочник. Сам справочник выгрузится по ссылке :).
5. Создаем резервную копию базы данных, которую планируем обновить
6. Выгружаем из обновляемой базы данные
7. Обновляем конфигурацию этой базы (файлом поставки с измененным GUID справочника)
8. Выполняем загрузку данных обратно в эту базу
Специальные предложения
Если метаданные не изменились (почти не изменились) то, возможно, удобнее воспользоваться стандартной обработкой ВыгрузкаЗагрузкаДанныхXML.
Выгружаем объекты в XML.
Загружаем измененную конфигурацию с потерей информации из объекта МД (или реквизита) с изменившимся идентификаторам.
При необходимости модифицируем файл метаданных, добавляя недостающие реквизиты. Сделать это относительно не сложно, выгружаем образец XML из свежей конфигурации, смотрим глазами и через групповую замену текста приводим структуру XML файла к новой.
//
Вариант 2. Переименовать объект МД (или реквизит) в *_OLD, обновить конфигурацию через сравнение, перебросить значение объекта МД (или реквизита), загрузить измененную конфигурацию.
1. ВыгрузкаЗагрузкаДанныхXML - сопоставляет объекты метаданных и объекты ИБ по внутреннему идентификатору. Соответственно, если при загрузке не будет найден объект метаданных со "старым" идентификатором - выдаст ошибку. Модифицировать XML файл - теоретически возможно, но надо учесть, что надо знать старый и новый GUID справочника, а также старые и новые GUID элементов этого справочника
2. как вы предлагаете перебросить значения объекта МД (или реквизита) ?
1. Обработка сопоставляет метаданные по имени, а ссылки на элементы конечно по идентификаторам.
0ccd343a-7ee1-11dd-7284-00119526ff1f
2. Написать обработку или воспользоваться УниверсальныеПодборИОбработкаОбъектов.epf
1. Обработка сопоставляет метаданные по имени, а ссылки по идентификаторам.
0ccd343a-7ee1-11dd-7284-00119526ff1f
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С Предприятие что это? 12
Что такое 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. Ес Посмотреть все результаты поиска похожих
Еще в этой же категории
Получить список Справочников конфигурации 2
НаКлиенте Процедура ПоКнопкеЧтениеИзМетаданных(Команда) // Вставить содержимое обработчика. Перем СписокСправочников; СписокСправочников = Новый СписокЗначений; СписокСправочников = СправочникиИзМетаданных(); Для Сч = 0 По СписокСправочников Получить список Документов конфигурации 0
//ЭлементыФормы.ОбъектПоиска - Поле Выбора на форме СписокВыбора = ЭлементыФормы.ОбъектПоиска.СписокВыбора; Для Каждого Документ Из Метаданные.Документы Цикл //Проверим, есть ли права на просмотр? Да- добавляем, Нет - пропускаем Если ПравоДосту Перебор Основных Реквизитов формы 0
//Перебор Основных Реквизитов формы Для Каждого Рек из ЭтаФорма.Метаданные().Реквизиты Цикл Сообщить(рек.Имя+" - " +рек.Синоним+" - " +Строка(рек.Тип)); КонецЦикла; // или так Для Каждого Рек из Метаданные().Реквизиты Цикл Сообщить(рек.Имя+" Пример обращения к метаданным 0
спрНомен = Метаданные.Справочники.Номенклатура; Сообщить(" Имя справочника " " " + спрНомен.Имя + " " " " ); Сообщить(" Комментарий " + спрНомен.Комментарий); Сообщить(" ВидИерархии " + спрНомен.ВидИерархии); Сообщить(" КоличествоУровней " + Обход метаданных (полезные функции) 0
При написании небольших автоматизированных тестов часто надо обойти всю конфигурацию и проверить, например, для всех форм какое-нибудь свойство. Это все легко делается через свойство глобального контекста " Метаданные" , но чтоб дорбаться до обхода р Посмотреть все в категории Метаданные
При написании небольших автоматизированных тестов часто надо обойти всю конфигурацию и проверить, например, для всех форм какое-нибудь свойство. Это всё легко делается через свойство глобального контекста "Метаданные", но чтоб дорбаться до обхода реквизитов надо написать кучу вложенных циклов. При этом код становится слабочитаемым и слабомодифицируемым.
Ниже приведен небольшой модуль, который решает задачу легко и удобно. Создана специальная функция РазвернутьСтрокуОбходаМетаданных, которая может по строке типа "Метаданные.Справочники.*.Реквизиты.*" построить массив строк с перечислением всех реквизитов всех справочников. При помощи этой и нескольких других функций в экспортных функциях модуля реализованы вполне прикладные задачи - получение всех реквизитов, всех макетов, всех форм конфигурации и построение таблицы всех составных типов.
Похожие FAQ
Еще в этой же категории
Как программно получить Картинку из базы и сохранить ее преобразовав в другой формат? 4
//Получим и сохраним Общую картинку из библиотеку картинок конфигурации ИмяКартинки = Метаданные.ОбщиеКартинки.OutlookExpress; ВыбраннаяКартинка = БиблиотекаКартинок ; // Сохраним полученную картинку в c: temp ВыбраннаяКартинка.Записать(" c: te Получить список Справочников конфигурации 2
НаКлиенте Процедура ПоКнопкеЧтениеИзМетаданных(Команда) // Вставить содержимое обработчика. Перем СписокСправочников; СписокСправочников = Новый СписокЗначений; СписокСправочников = СправочникиИзМетаданных(); Для Сч = 0 По СписокСправочников Получить список Документов конфигурации 0
//ЭлементыФормы.ОбъектПоиска - Поле Выбора на форме СписокВыбора = ЭлементыФормы.ОбъектПоиска.СписокВыбора; Для Каждого Документ Из Метаданные.Документы Цикл //Проверим, есть ли права на просмотр? Да- добавляем, Нет - пропускаем Если ПравоДосту Перебор Основных Реквизитов формы 0
//Перебор Основных Реквизитов формы Для Каждого Рек из ЭтаФорма.Метаданные().Реквизиты Цикл Сообщить(рек.Имя+" - " +рек.Синоним+" - " +Строка(рек.Тип)); КонецЦикла; // или так Для Каждого Рек из Метаданные().Реквизиты Цикл Сообщить(рек.Имя+" Пример обращения к метаданным 0
спрНомен = Метаданные.Справочники.Номенклатура; Сообщить(" Имя справочника " " " + спрНомен.Имя + " " " " ); Сообщить(" Комментарий " + спрНомен.Комментарий); Сообщить(" ВидИерархии " + спрНомен.ВидИерархии); Сообщить(" КоличествоУровней " + Посмотреть все в категории Метаданные
Метаданные | Версия | |
---|---|---|
Вывести вид и представление вида Журнала Расчетов Зарплата | [7.x] | |
Как по значению "Тип" получить строку например "Документ.Счет" | [8.x, 8.2 УП] | |
Как получить список реквизитов операции и проводок? | [7.x] | |
Как программно получить Картинку из базы и сохранить ее преобразовав в другой формат? | [8.x, 8.2 УП] | |
Обход метаданных (полезные функции) | [8.x, 8.2 УП] | |
Перебор Основных Реквизитов формы | [7.x, 8.x] | |
Получить список Документов конфигурации | [7.x, 8.x] | |
Получить список Справочников конфигурации | [7.x, 8.x, 8.2 УП] | |
Пример обращения к метаданным | [8.x] | |
Функции ЕстьРеквизитДокумента и ЕстьРеквизитОбъекта | [8.x, 8.2 УП, 8.3] | |
Функция возвращает ссылку на заданный реквизит объекта метаданных Документ | [7.x] | |
Функция устанавливает новое значение реквизита документа или справочника. | [7.x] |
Читайте также: