1с сохранить настройки объединения в файл
Иногда требуется создать внешнюю обработку с большим количеством реквизитов (в том числе и с табличной частью), первое, что мы делаем для сохранения настроек в этом случае - устанавливаем свойство формы АвтоматическоеСохранениеДанныхВНастройках в Использовать. Затем ставим напротив всех нужных реквизитов галочки "Сохранение" и наслаждаемся результатом.
Однако, очень часто обработку нужно проверять на тестовой базе или другом сервере и т.п., поэтому требуется сохранить все значения реквизитов формы (в том числе табличной части) в файл, а потом загрузить из файла уже в другой конфигурации.
То, что это возможно легко понять по намёкам на форумах, однако ни одного законченного решения найти не удалось. Что ж, к этому нам не привыкать, начинаем придумывать велосипед.
Пробуем сначала сохранить значения всех реквизитов формы в файл. Поиски в интернете приводят нас к процедуре ЗначениеВФайл и функции ЗначениеВСтрокуВнутр, приём последней пользоваться как бы не рекомендуется, якобы она предназначена для обмена с 7.7. Обе конструкции языка доступны только на сервере и толстом клиенте, поэтому возникает вопрос, как бы обойти значения всех реквизитов формы &НаСервере.
выдаст вполне ожидаемую не для всех ошибку: Итератор для значения не определен.
Тоже самое ожидает нас и с переменными ЭтаФорма, ЭтотОбъект. На такую простую вещь можно потратить пару часов, однако отладчик и поисковики творят чудеса - получить значения всех реквизитов формы внешней обработки на сервере можно с помощью следующего кода:
Казалось бы, теперь всё просто, однако не совсем. Табличная часть, как и таблица значений имеют не совсем ожидаемый тип значений, их тип ДанныеФормыКоллекция. А ведь они должны быть обязательно выгружены для сохранения, иначе в файле получим только их уникальные индификаторы.
В результате этого знания получаем:
Это даже работает, но радоваться рано - этот код неправильный! Мы допустили одну из самых распространенных ошибок при написании кода на управляемых формах. Выбрав имя файла на клиенте, а потом передав его на сервер, мы забыли, что при клиент-серверном режиме работы код, выполняемый на стороне сервера, будет запущен под другим пользователем. И далеко не факт, что этот пользователь будет иметь доступ туда (например, локальный диск терминальной сессии по RDP), куда мы сохраняем файл.
Поэтому переписываем код, сохраняем файл теперь на клиенте, правда придётся воспользоваться не очень рекомендуемой функцией ЗначениеВСтрокуВнутр:
Теперь перейдём к загрузке из файла. Мы не будем использовать, как мы уже выяснили, следующий неправильный код с передачей только имени файла на сервер:
А напишем другой вариант, например, используя временное хранилище:
Если внимательно посмотреть код, то легко заметить, что после получения данных из временного хранилища (с типом ДвоичныеДанные) мы вынуждены записать их во временный файл. Другого нормального способа получить данные с типом Строка из временного хранилища попросту нет.
Чтобы не насиловать файловую систему временными файлами, давайте перепишем код, без использования временного хранилища, но с использованием не очень рекомендуемой функции ЗначениеИзСтрокиВнутр:
Как видно, вариантов сохранения настроек в файл и чтения настроек из файла очень много, даже в этой статье мы рассмотрели далеко не все, однако эти варианты рабочие и должны сэкономить вам время, когда у вас возникнет такая необходимость.
В прикрепленной ниже внешней обработке используется последний вариант сохранения и чтения настроек через файл из этой статьи, ну и, конечно, автосохранение штатными средствами в информационной базе.
При объединении конфигураций, содержащих большое количество изменений, хочется иметь возможность запомнить те настройки, которые были выполнены. Речь идёт о режимах объединения, индивидуальных настройках модулей и так далее. Особенно актуально это в тех случаях, когда объединение выполняется регулярно, или когда оно выполняется в несколько этапов.
Теперь у вас есть такая возможность. И даже более. Потому что теперь вы можете полностью автоматизировать операции сборки конфигураций.
XML файл настроек объединения конфигураций
Настройки объединения конфигураций (или настройки обновления конфигурации на поддержке) вы можете сохранять теперь в xml файл. Также вам доступна и обратная операция – загрузка этих настроек из файла.
Сохранять настройки вы можете вручную (командой Сохранить настройки объединения в файл…), или автоматически.
При этом в файл сохраняются:
- Минимальная версия платформы, поддерживающая данную версию настроек;
- Описания конфигураций;
- Параметры объединения;
- Признаки участия объекта/свойства в объединении;
- Установленные порядки подчиненных объектов;
- Настройки объединения свойств, в том числе настройки объединения модулей.
Так как файл сохранения настроек имеет формат XML, то у вас появляется ещё одна возможность его создания – вручную сформировать содержимое этого файла. Такой способ, по сравнению с формированием файла командой или автоматически, имеет дополнительные преимущества. Вы можете устанавливать правила не только на отдельные свойства, но и на объекты, с учетом вложенных объектов и подсистем. В том числе поддерживается иерархическая установка правил с возможностью уточнять правила для вложенных объектов. Это позволяет вам создавать универсальные шаблоны объединения.
Загрузить настройки объединения вы можете двумя способами. Во-первых, командой Загрузить настройки из файла…. При этом выполняется сброс к настройкам по умолчанию, и загрузка настроек из файла.
Во-вторых, командой Добавить настройки из файла…. Эта команда загружает настройки из файла, а те настройки, которых нет в файле, не сбрасываются.
При загрузке настроек платформа проверяет описания конфигураций. В случае если они не совпадают, выводится окно с описанием отличий. В нем вы можете либо продолжить загрузку настроек, либо отказаться от неё.
Интерфейс сравнения, объединения
Так как работа с настройками объединения требует новых действий, мы доработали интерфейс окна сравнения и объединения конфигураций.
Все команды мы собрали в подменю Действия, а самые востребованные из них вынесли в командную панель.
К дереву основной конфигурации мы добавили колонку, в которой цветом отображаются элементы дерева с измененными настройками по умолчанию. Светло-зеленый цвет означает, что объекты или свойства с измененными настройками по умолчанию есть среди подчиненных. А зеленый цвет означает, что настройки по умолчанию изменены у самого объекта или свойства.
Также мы добавили флажок Сохранять настройки автоматически. Если он установлен, то перед объединением настройки автоматически сохраняются в указанный файл.
Интерфейс объединения модулей
Следуя вашим пожеланиям, мы улучшили интерфейс объединения модулей. Например, в заголовке формы теперь выводится название модуля. Кроме этого в окне редактирования отображаются номера строк.
Окна сравнения и редактирования теперь синхронизированы. При нажатии мышью на номер строки в одном окне, курсор в другом окне перемещается на соответствующую строку. Аналогичным образом синхронно перемещается курсор при нажатии на кнопки перехода по отличиям в методе.
Окну редактирования мы добавили командную панель и реализовали синтаксическую подсказку при редактировании текста программы. В контекст подсказки входит основная конфигурация (необъединенная) и весь текущий объединенный модуль.
Пакетный режим конфигуратора
Мы выполнили ряд доработок для того, чтобы вы могли использовать новую функциональность в пакетном режиме запуска конфигуратора.
Во-первых, для объединения конфигураций с использованием файла настроек мы добавили новый параметр командной строки MergeCfg.
Кроме этого в параметр обновления конфигурации, находящейся на поддержке, UpdateCfg, мы добавили новые опции. Они позволяют выполнять обновление с использованием файла настроек.
И, наконец, для построения отчета о сравнении конфигураций мы реализовали новый параметр командной строки CompareCfg.
Все эти изменения параметров командной строки позволят вам автоматизировать операции объединения и обновления конфигураций, стоящих на поддержке.
Механизм сравнения и объединения конфигураций позволяет сравнивать между собой два прикладных решения и объединять их полностью или выборочно по результатам сравнения.
Такая возможность используется, например, когда одно прикладное решение разрабатывается несколькими независимыми разработчиками, или в случае, когда в исходную конфигурацию нужно загрузить сделанные изменения.
Этот механизм обеспечивает не только сравнение общих свойств объектов прикладного решения (справочников, документов и т. д.), но и сравнение их отдельных реквизитов, табличных частей. Также выполняется сравнение форм: сравниваются тексты модулей, тексты описаний и макеты.
Все результаты сравнения можно просмотреть в детальном виде.
Установка соответствия объектов
При запуске режима сравнения система анализирует сравниваемые конфигурации и устанавливает соответствие между объектами конфигураций, исходя из их имен:
Однако не исключена ситуация, когда одинаковые объекты прикладного решения будут иметь различные имена или наоборот, различные объекты будут называться одинаково. В этом случае разработчик имеет возможность отказаться от соответствий, установленных по умолчанию, и установить их вручную:
Сравнение конфигураций
Результат сравнения конфигураций отображается в специальном окне:
Разработчик имеет возможность настроить состав информации, отображаемой в этом окне. Возможен просмотр всех объектов прикладного решения, только отличающихся, только измененных, присутствующих только в какой-либо одной конфигурации или только неизмененных объектов.
Для каждого отличающегося объекта можно просмотреть детальную информацию об отличиях:
Кроме того, информация об отличиях может быть получена в виде отчета:
Объединение конфигураций
Для выполнения объединения конфигураций следует отметить те объекты прикладного решения, которые будут участвовать в объединении и установить режим объединения конфигураций.
Установка режима объединения конфигураций возможна как для всей конфигурации в целом, так и для каждого элемента прикладного решения в отдельности:
Варианты сравнения и объединения конфигураций
Система поддерживает сравнение и объединение различных видов конфигураций. В качестве сравниваемых конфигураций могут выступать:- основная конфигурация;
- конфигурация базы данных;
- конфигурация, сохраненная во внешнем файле;
- конфигурация поставщика.
Таким образом, например, возможно сравнение двух конфигураций, сохраненных во внешних файлах, или сравнение основной конфигурации с конфигурацией поставщика.
Сохранение / загрузка настроек объединения конфигураций
Настройки объединения конфигураций (или настройки обновления конфигурации на поддержке) можно сохранять в xml файл. Также доступна и обратная операция — загрузка этих настроек из файла.
Пакетный режим запуска конфигуратора также поддерживает использование настроек при объединении и обновлении конфигураций. Таким образом при объединении конфигураций, содержащих большое количество изменений, когда объединение выполняется регулярно, существует возможность полностью автоматизировать операции сборки конфигураций.
Использование внешней программы
Существует целый ряд сторонних специализированных программ, с помощью которых можно выполнять объединение модулей. Если недостаточно встроенных возможностей 1С:Предприятия, или если хочется использовать одну из сторонних программ, есть возможность подключить её в настройках конфигуратора и использовать для сравнения, настройки объединения и собственно объединения модулей конфигурации.
Для самых распространённых программ в конфигураторе 1С:Предприятия уже содержатся параметры командной строки для их запуска в различных режимах:При желании можно использовать и другие программы, которые поддерживают запуск из командной строки. Их параметры нужно добавить в настройки конфигуратора самостоятельно.
Использование объекта ХранилищеОбщихНастроек. Считаю этот вариант наиболее удобным и гибким.
Объект доступен в глобальном контексте. Содержит следующие методы:
Сохранение настроек:
// ключи могут быть произвольными строками
КлючОбъекта = " MIKO " ;
КлючНастроек = "ПанельТелефонии" ;
// настройки могут быть произвольного типа
Настройки = Новый Структура ( "Это настройки произвольного типа, к примеру структура" , "" );
ИмяПользователя = ИмяПользователя ();
// имя пользователя - пользователь владелец настроек, если параметр не указать,
// то настройки будут сохранены для ТЕКУЩЕГО пользователя
ИмяПользователя = ИмяПользователя ();
ХранилищеОбщихНастроек .C охранить ( КлючОбъекта , КлючНастроек , Настройки , , ИмяПользователя );
Под пользователем понимается именно пользователь информационной базы! Пример получения имени текущего пользователя:
// получим имя
ИмяТекущегоПользователя = ИмяПользователя ();
// в типовых конфигурация используется справочник "Пользователи"
// в этом справочнике в стандартном реквизите "Код" обычно
// хранят информацию по имени пользователя, пример получения имени:
ИмяПользователя = Справочники . Пользователи . НайтиПоНаименованию ( "Администратор" ). Код ;
// обычно "Код", для этого справочника - строка фиксированной длинны, потому вероятно разумно обрезать пробелы справа:
ИмяПользователя = СокрП ( ИмяПользователя );
Восстановление настроек:
КлючОбъекта = " MIKO " ;
КлючНастроек = "ПанельТелефонии" ;
ВладелецНастроек = ИмяПользователя ();
// Для восстановления настроек необходимо воспользоваться функцией Загрузить
СтруктураНастроек = Неопределено;
Попытка
СтруктураНастроек = ХранилищеОбщихНастроек . Загрузить ( КлючОбъекта , КлючНастроек ,, ВладелецНастроек );
// если настроек нет, то будет возвращено значение "Неопределено"
Исключение
Сообщить ( "Нет прав на восстановление настроек." );
КонецПопытки;
Если СтруктураНастроек = Неопределено Тогда
Сообщить ( "Не вышло восстановить настройки!" );
КонецЕсли;
ВладелецНастроек - это имя пользователя, владельца настроек. Параметр очень важный.
Настройки других пользователей могут получать ТОЛЬКО пользователи с расширенными правами.
Необходимо право "АдминистрированиеДанных".
Пробелы справа игнорируются!
Плюсы
- Возможно работать со значениями настроек других пользователей.
- Доступность: Сервер, толстый клиент, внешнее соединение.
Получение всех ключей настроек по ключу объекта
// Пример получения всех настроек по ключу объекта
КлючОбъекта = "MIKO" ;
ВладелецНастроек = ИмяПользователя ();
Попытка
// возвращает список значений
// элементы списка - ключи настроек
СтруктураНастроек = ХранилищеОбщихНастроек . ПолучитьСписок ( КлючОбъекта , ВладелецНастроек );
Исключение
Сообщить ( "Нет прав на восстановление настроек." );
КонецПопытки;
Подведем итог
В рамках этой заметки я рассказал о двух вариантах работы с настройками пользователя. Пробуйте :).
Читайте также: