Когда необходим файл конфигурации приложения?
Перед разработкой конфигурационного файла сначала необходимо спросить себя, нужен ли вообще какой-либо внешний файл с данными? Разве мы не можем просто поместить их в виде константных значений прямо в исходном коде? Собственно, достаточно известная концепция The Twelve-Factor App давно отвечает на этот вопрос:
Подходы рекомендованные этой концепцией предписывают, чтобы любые параметры, зависящие от среды, такие как учетные данные базы данных, находились во внешнем файле. В противном случае их реализуют просто обычными константами в коде. Другой вариант использования, который я часто вижу, – это хранение динамических переменных (данных) во внешнем файле (базе данных), например, черный blacklist или белый whitelist список пользователей. Ими могут быть числа в заданном диапазоне (например, длительность тайм-аута) или любые текстовые файлы с произвольным содержимым. Отметим, что эти динамические переменные (данные) остаются неизменными вне зависимости от особенностей исполняемой среды.
В свою очередь файл конфигурации делает программное обеспечение более гибким и легким для редактирования его функциональных возможностей. Однако, если он слишком сильно разрастается, рациональнее все таки перенести его в базу данных.
Интеграция 1С 8 и HostCMS
Интеграции 1С с сайтами очень сложно оценивать, ибо на сайте разработчика CMS, а может, и на странице конкретного модуля, зачастую можно найти инструкцию подключения обмена, но в ходе работы постоянно появляются подводные камни: то одно не выгружается, то другое, порой, кажется, все данные передаются, но документы или элементы справочников не заполняются. А перерабатывать типовой механизм зачастую бывает себе дороже. Причем бывают и ситуации, когда нужно вносить изменения и в 1С, и на сайте. Стоимость таких работ возрастает и встает вопрос о том, нужно ли это вообще. Сейчас я расскажу о том, как мы подключали HostCMS, а в конце статьи приведу результаты обмена.
1 ответ
4
Лучший ответ
Добавлено вопрос об этом на примерах google github repo
См. Вопрос здесь: https://github.com/googlesamples/google-services/issues/186
Короче говоря, это было исправлено путем добавления google-services.json в корневую папку/приложение, которая затем перезаписывается google-service.json в каждой папке с ароматом.
Протестировал его, и он работает хорошо. Хотя это все еще может быть ошибкой с плагином сервисов google и как это работает, по крайней мере, есть обходной путь.
18 март 2016, в 08:52
Поделиться
Ещё вопросы
- 1получение цикла перенаправления для декоратора admin_only
- 1Отличное местоположение для мобильных устройств с функцией «Мое местоположение» на картах Google.
- Chrome webRequest API — фильтрация запросов на расширение
- Angularjs Не могу передать данные JSON в директиву от контроллера
- 1Как распечатать двойную кавычку, используя принтер Zebra с EPL?
- 1Добавляем динамическую строку в таблицу, но она очищает данные в строке
- Fancybox-фон меняется, когда активен
- 1PHP программно выбирает поля без зацикливания
- 1Имя для коллекции объектов команд
- Почему обтекание вызывает размытие моего ввода?
- 1FabricJS — Возможность выводить (в PNG) небольшой раздел холста, а не весь холст
- 1Файл Angular 4 Local рабочей области (‘angular.json’) не найден
- Создание динамического неупорядоченного списка и добавление его в div
- 1Объедините несколько файлов CSV в JavaScript, используя фильтрацию
- 1Самый быстрый способ сортировки большого количества массивов в Python
- Проблемы JSON и localStorage
- 1Как получить размер нарисованного изображения в Android
- Как устранить неполадки прерванного подключения MySQL?
- 1Параллельный Cython OpenMP для Black Scholes с интегрированным NumPy, серийный код 10M, варианты 3.5s, параллельный
- 1Убить всю активность при выходе
- Написание скрипта создает и вызывает хранимую процедуру
- Как передать выбранный индекс $ в ng-repeat?
- 1Как читать файл NetCDF и писать в CSV, используя Python
- 1Циклирование результатов с помощью внешнего вызова API и findOneAndUpdate
- 2Извлечение имени метода в виде строки из отражения или жестко закодированной строки?
- Как посчитать количество нажатий на все div на странице?
- 1Реализация List вместо ArrayList при использовании обобщенных типов вместо необработанных типов
- Почему этот график d3 не рендерится?
- 1Невозможно записать данные в файл с помощью Python
- 1Я опубликовал приложение на Android Market. Как мне разрешить / включить автоматические обновления для него?
- Как использовать шоу с несколькими элементами без идентификатора
- Конструктор класса шаблона C ++
- 1SQLAlchemy + запрашивает асинхронный шаблон
- JQuery плагин срабатывает дважды
- 1Линейный поиск строк в Java
- 1Обнаружение столкновения между движущимся и неподвижным объектом
- 2Вызов анализатора Roslyn из командной строки
- 1MonoDroid: перебирать элементы управления в Activity?
- 1PHP-сайт, разработанный с использованием Laravel 5, не отображается после хостинга
- 1читать файл, используя пакет файловой системы
- Использование путей в MEAN-приложении socket.io
- 2Внедрение свойства в провайдере нестандартного членства с использованием Castle
- Изменение разрешения SetTimer в Windows
- 1Почему панды не позволяют использовать категориальный столбец в групповом режиме?
- 2Запустите функцию дополнительной очистки при сбое теста (при сбое подтверждения)
- 2Варианты многопроектного решения Visual Studio
- 1Composer dump-autoload выдает ошибку preg_match
- Динамически генерируемая кнопка отправки формы не работает
- Невозможно определить причину синтаксической ошибки
- Jcarousel и отзывчивый макет
Интеграция 1С 8 и HostCMS
Интеграции 1С с сайтами очень сложно оценивать, ибо на сайте разработчика CMS, а может, и на странице конкретного модуля, зачастую можно найти инструкцию подключения обмена, но в ходе работы постоянно появляются подводные камни: то одно не выгружается, то другое, порой, кажется, все данные передаются, но документы или элементы справочников не заполняются. А перерабатывать типовой механизм зачастую бывает себе дороже. Причем бывают и ситуации, когда нужно вносить изменения и в 1С, и на сайте. Стоимость таких работ возрастает и встает вопрос о том, нужно ли это вообще. Сейчас я расскажу о том, как мы подключали HostCMS, а в конце статьи приведу результаты обмена.
Пишем текст анонса для информационного выпуска
Текст информационного выпуска должны будете написать вы. Об этом вас попросят после проверки решения. За основу можете взять какой-нибудь подходящий анонс с сайта 1С. Написать текст о своем решении по этому примеру и дополнить следующей “служебной” информацией:
- Название продукта
- Версия 1С:Предприятие
- Разработчик (или партнер 1С, если вы франчайзи)
- Отрасль (список отраслей можно посмотреть на сайте в разделе http://www.1c.ru/rus/partners/solutions/default.jsp)
- Вариант работы (файловый, клиент-серверный)
- Режим запуска (управляемое или обычное приложение)
- Конфигурируемость, используемая защита
См. пример в материалах, приложенных к статье.
Получение файла с сервера
Для получения файла с сервера используется метод НачатьПолучениеФайлаССервера. Данный метод получит файл из временного хранилища и запишет его на диск компьютера клиента. Первым параметром нужно передать описание оповещения с именем процедуры, которая будет вызвана после получения файла с сервера. Вторым параметром нужно передать адрес файла во временном хранилище на сервере. Третьим — путь к файлу на клиенте, куда будет записан файл (такого файла может еще не существовать, тогда он будет создан).
//получаем адрес файла на сервере
АдресФайлаНаСервере = АдресФайлаНаСервере();
ПутьКфайлуНаКлиенте = «F:\Клиент\123.txt»;
ПослеПолучения = Новый ОписаниеОповещения(«ПослеПолучения», ЭтотОбъект);
НачатьПолучениеФайлаССервера(ПослеПолучения,
АдресФайлаНаСервере,
ПутьКфайлуНаКлиенте);
&НаСервере
Функция АдресФайлаНаСервере()
//помещаем файл на сервере во временное хранилище
ДД = Новый ДвоичныеДанные(«F:\Сервер\123.txt»);
Возврат ПоместитьВоВременноеХранилище(ДД, УникальныйИдентификатор);
КонецФункции
&НаКлиенте
Процедура ПослеПолучения(ПолученныйФайл, ДопПараметры) Экспорт
Сообщить(«Файл » + ПолученныйФайл.ПолноеИмя + » записан на диск»);
КонецПроцедуры
1 |
//получаем адрес файла на сервере ПутьКфайлуНаКлиенте= «F:\Клиент\123.txt»; ПослеПолучения= Новый ОписаниеОповещения(«ПослеПолучения»,ЭтотОбъект); НачатьПолучениеФайлаССервера(ПослеПолучения, АдресФайлаНаСервере, ПутьКфайлуНаКлиенте); Функция АдресФайлаНаСервере() //помещаем файл на сервере во временное хранилище ДД= Новый ДвоичныеДанные(«F:\Сервер\123.txt»); Возврат ПоместитьВоВременноеХранилище(ДД,УникальныйИдентификатор); КонецФункции Процедура ПослеПолучения(ПолученныйФайл,ДопПараметры)Экспорт Сообщить(«Файл «+ПолученныйФайл.ПолноеИмя+» записан на диск»); КонецПроцедуры |
В процедуре, которая будет вызвана после получения файла первым параметром будет объект типа ОписаниеПереданногоФайла. Свойство ПолноеИмя данного объекта будет содержать полный путь к файлу на клиенте, куда он был записан. Этот путь будет совпадать с третьим параметром метода НачатьПолучениеФайлаССервера.
Создание первой поставки
Откроем конфигуратор базы для создания поставки, это может быть абсолютно любая конфигурация, будь то снятая с поддержки типовая конфигурация или написанная с нуля. В данном примере будет создана новая пустая база, в конфигурации которой будут произведены следующие изменения в свойствах конфигурации:
- Имя: ОтраслевоеРешение
- Синоним: Отраслевое решение
- Поставщик: Моя компания
- Версия: 1.0.0.1
Настройки поставки (Конфигурация — Поставка конфигурации — Настройка поставки) оставим без изменений, так как на дальнейшие действия это не повлияет.
Перейдем к созданию файлов поставки
- Конфигурация — Поставка конфигурации — Создать файлы поставки и обновления конфигурации.
- Выберем наш ранее созданный каталог Versions через кнопку Каталог файлов поставки.
- Снимем флажок Создать файл обновления конфигурации.
- После нажатия кнопки Выполнить в указанном каталоге будет создан файл 1Cv8.cf
Файлы поставки созданы, перейдем к созданию комплекта поставки
- Комплект поставки (Конфигурация — Поставка конфигурации — Комплект поставки)
- Выберем Создать новое описание комплекта поставки
- Наименование и поставщика оставим без изменений
- Укажем путь: MyCompany\IndustrySolution\1_0_0_1. По этому пути будет установлен шаблон
- Оставим флажки Текущая конфигурация и Текущая информационная база без изменений
- После нажатия кнопки Готово откроется форма комплекта поставки
- Позиционируемся на файле конфигурации и изменяем значение свойства наименование в шаблоне: Моя компания\Отраслевое решение. Это своего рода каталог в списке шаблонов
- Позиционируемся на файле выгрузки информационной базы и изменяем значение свойства наименование в шаблоне: Моя компания\Отраслевое решение (демо)
- Создадим каталог 1.0.0.1 в ранее созданном каталоге Distribute
- Создадим комплект, откажемся от сохранения описание комплекта поставки, выберем созданный на прошлом шаге каталог 1.0.0.1
В указанном каталоге будут созданы установочные файлы комплекта, которые можно упаковать в SFX архив для отправки.
В форме комплекта поставки присутствует две кнопки:
- Создать файлы комплекта — в выбранном каталоге создаст файлы комплекта согласно указанному пути (MyCompany\IndustrySolution\1_0_0_1).
- Создать комплект — в выбранном каталоге создаст установочные файлы комплекта, после установки которого мы получим файлы комплекта.
Конструктор мобильного клиента Simple WMS Client: способ создать полноценный ТСД без мобильной разработки. Теперь новая версия — Simple UI (обновлено 14.11.2019)
Simple WMS Client – это визуальный конструктор мобильного клиента для терминала сбора данных(ТСД) или обычного телефона на Android. Приложение работает в онлайн режиме через интернет или WI-FI, постоянно общаясь с базой посредством http-запросов (вариант для 1С-клиента общается с 1С напрямую как обычный клиент). Можно создавать любые конфигурации мобильного клиента с помощью конструктора и обработчиков на языке 1С (НЕ мобильная платформа). Вся логика приложения и интеграции содержится в обработчиках на стороне 1С. Это очень простой способ создать и развернуть клиентскую часть для WMS системы или для любой другой конфигурации 1С (УТ, УПП, ERP, самописной) с минимумом программирования. Например, можно добавить в учетную систему адресное хранение, учет оборудования и любые другие задачи. Приложение умеет работать не только со штрих-кодами, но и с распознаванием голоса от Google. Это бесплатная и открытая система, не требующая обучения, с возможностью быстро получить результат.
5 стартмани
Зачем?
Конечно, ваша разработка может быть успешной и без “1С:Совместимо!”. Но я выделю несколько причин, почему все же стоит сертифицироваться.
1. Решение станет лучше. При подготовке продукта к сертификации придется перепроверить все модули, интерфейс, подготовить документацию, демо-базу и т.д. В общем обеспечить все то, что должно быть у хорошего тиражируемого решения.
2. Повышается статус вашего решения. Сертификат говорит о том, что специалисты из 1С посмотрели и проверили вашу разработку. И она соответствует стандартам 1С (ну или близка к этому). Для кого-то из потенциальных будущих пользователей это может быть существенным фактором в пользу внедрения вашего решения.
3. О вашем решении узнают партнеры 1С. Информация о сертификациях на “1С:Совместимо!” попадает в информационные выпуски 1С. Эти выпуски читают партнеры 1С (не буду утверждать, что все), и возможно как раз сейчас сталкиваются с задачами, которые помогает решать ваша разработка.
Набор подсистем «Умные таблицы»
Данный набор подсистем – прикладная библиотека, призванная помочь программисту 1С быстрее решать ряд типовых задач бизнес-логики, таких как: ведение статусов объектов, отправка почтовых сообщений в определенное время, ведение произвольных таблиц с возможностью редактирования, сохранения и группировки, ориентированные на расчет бюджетных таблиц (план продаж, ретробонусы B2C, проценты по договорам B2B и договорные условия по КАМ), расчет коммерческой политики для бюджетных таблиц, исполнение произвольных алгоритмов с хранением кода в информационной базе, определение рабочих баз, хранение файлов во внешних СУБД (Postgre SQL, MS SQL и MongoDB) и выполнение произвольного кода после изменений ссылочного объекта вне транзакции изменения.
1 стартмани
StartManager 1.4 — Развитие альтернативного стартера Промо
Очередная редакция альтернативного стартера, являющегося продолжением StartManager 1.3. Спасибо всем, кто присылал свои замечания и пожелания, и тем, кто перечислял финансы на поддержку проекта. С учетом накопленного опыта, стартер был достаточно сильно переработан в плане архитектуры. В основном сделан упор на масштабируемость, для способности программы быстро адаптироваться к расширению предъявляемых требований (т.к. довольно часто просят добавить ту или иную хотелку). Было пересмотрено внешнее оформление, переработан существующий и добавлен новый функционал. В общем можно сказать, что стартер эволюционировал, по сравнению с предыдущей редакцией. Однако пока не всё реализовано, что планировалось, поэтому еще есть куда развиваться в плане функциональности.
1 стартмани
Безопасность мобильных приложений 1С, взгляд по диагонали
Что приходит первое в голову при словах «1С Предприятие»?
Даже тем, кто далек от ИТ, представляется большущий компьютер (а тем, кто недалек, стойка двух-юнитных серверов), рядом слушает музыку сервера (как вариант просто музыку) сисадмин, за стеной в опен-спейсе менеджеры принимают заказы и бухгалтерия, сдающая отчетность. «Зарплата, зарплата!»: слышны их радостные крики. «И кадры»: уточняет HR. Да, все верно. Это 1С.
Кто в теме, напомнит про крики не совсем приятные: «Все тормозит! Сделайте что-нибудь, #тыжпрограммист». И борющихся за живучесть ИТ-шников. В обычном офисном потоке дел, редко кто задумывается о безопасности. А тех, кто задумывается, прошу под кат…
Hydra — упрощаем разработку, динамически создавая иерархическую структуру конфигурации приложения
Рассмотрим последним, в этой статье, способ создания и поддержки конфигурации для вашего приложения, который по сути является гораздо большим, чем просто загрузчик и парсер файлов с настройками.
Hydra – это платформа, разработанная для гибкой и элегантной настройки самых сложных приложений. Которая помимо чтения, записи и валидации корректности файлов конфигурации, реализовывает свою достаточно рациональную стратегию упрощения управления несколькими конфигурационными файлами, переопределения (перезаписи) их с использованием интерфейса командной строки, создания snapshot снимка состояния приложения перед каждым его запуском (между перезапусками) и т.д.
Чтение
Рассмотрим основы использования hydra. Так в следующем примере команда , добавленная в командную строку при запуске скрипта, позволяет добавить новое поле (настройку) в конфигурацию приложения, а также осуществить перезапись значения существующего поля (значения настройки) .
import hydra from omegaconf import DictConfig, OmegaConf @hydra.main(config_name="config") def my_app(cfg: DictConfig) -> None: print(OmegaConf.to_yaml(cfg)) if __name__ == "__main__": my_app() # запускаем в командной строке скрипт с командами # python3 source/hydra_basic.py +APP.NAME=hydra # # результат его выполнения # APP: # ENVIRONMENT: test # DEBUG: true # NAME: hydra1.1
Валидация
Hydra прекрасно интегрируется с декоратором для выполнения основных проверок корректности, таких как проверка типов или значения полей. Однако у нее нет поддержки метода расширенной проверки значений, как это описано в моей предыдущей статье.
from dataclasses import dataclass from omegaconf import MISSING, OmegaConf import hydra from hydra.core.config_store import ConfigStore @dataclass # @dataclass(frozen=True) способ определения полей только для чтения class MySQLConfig: driver: str = "mysql" host: str = "localhost" port: int = 3306 user: str = MISSING password: str = MISSING @dataclass class Config: db: DBConfig = MISSING cs = ConfigStore.instance() cs.store(name="config", node=Config) cs.store(group="db", name="mysql", node=MySQLConfig) @hydra.main(config_path="conf", config_name="config") def my_app(cfg: Config) -> None: print(OmegaConf.to_yaml(cfg)) if __name__ == "__main__": my_app()
Группа конфигураций
Hydra вводит концепцию под названием config group . Идея которой состоит в том, чтобы сгруппировать файлы конфигурации одного типа (или для выполнения одних задач) и затем выбирать один из них во время выполнения приложения. Например, у вас имеется группа настроек «Базы данных» с одной конфигурацией для Postgres, а другой для MySQL.
Когда конфигурация приложения станет более сложной, то в вашей программе она может иметь следующую структуру (пример из документации Hydra).
├── conf │ ├── config.yaml │ ├── db │ │ ├── mysql.yaml │ │ └── postgresql.yaml │ ├── schema │ ├── school.yaml │ ├── support.yaml │ └── warehouse.yaml └── my_app.py
Например, вы хотите протестировать свое приложение с различными комбинациями опций , и , это можно сделать следующим образом:
python my_app.py db=postgresql schema=school.yaml
Далее…
Hydra поддерживает использование нескольких наборов параметров конфигурации с опцией , при этом запускаются параллельно несколько задач с различными файлами конфигурации. Например, для предыдущего примера мы можем запустить скрипт следующим образом:
python my_app.py schema=warehouse,support,school db=mysql,postgresql -m
В этом случае в основном потоке запускаются 6 задач одновременно:
- Launching 6 jobs locally - Sweep output dir : multirun/2019-10-01/14-44-16 - #0 : schema=warehouse db=mysql - #1 : schema=warehouse db=postgresql - #2 : schema=support db=mysql - #3 : schema=support db=postgresql - #4 : schema=school db=mysql - #5 : schema=school db=postgresql
Вывод
В этой статье мы рассмотрели несколько способов управления конфигурацией приложений в Python. Независимо от того какой из них вы выберете, всегда необходимо думать о удобочитаемости файлов конфигурации, дальнейшей их поддержки, а также способах обнаружения ошибок для случаев их некорректного использования. Таким образом, конфигурационный файл – это по сути еще один тип кода.
Готовые решения для инвентаризации товаров и основных средств на мобильных устройствах для КА, УТ, ERP и БП 3.0 на базе Simple UI
В расширениях для Бухгалтерия 3.0 и КА2.4/УТ11.4/ERP2.4 представлены готовые рабочие места для онлайн и оффлайн инвентаризации товаров (для БП 3.0 также инвентаризации основных средств) на базе бесплатного конструктора мобильного фронта Simple UI. При этом используется расширенная работа с идентификацией товаров и ОС с помощью различных подходов – сканирование штрих кода, распознавание артикулов и инвентарных номеров и различные поиски. Также используются различные возможности платформы Simple UI. Данная разработка может быть полезна как конечным пользователям, так и разработчикам в качестве заготовки, так как на базе этих блоков можно сделать ввод любого документа конфигурации , связанного с товаром или с ОС.
Тестировалось на 1С 8.3.13.1865, КА 2.4.8.63 и БП 3.0.74.69
5 стартмани