Эволюция расширения конфигурации

Запуск Apache 2.4 с модулем 1С внутри Docker контейнера

Про Apache и про Linux слышали, наверное, все. А вот про Docker пока нет, но он сильно набирает популярность последнее время и не зря. Поделюсь своим опытом и дам пошаговую инструкцию настройки веб-сервера Apache с модулем 1С внутри Docker контейнера на Linux хосте. При этом сам сервер 1С может находиться совсем на другой машине и на другой операционной системе

Это не важно, главное чтобы Apache смог достучаться до сервера 1С по TCP. В статье дам подробное пояснение по каждой используемой команде со ссылками на документацию по Docker, чтобы не создавалось ощущение непонятной магии

Также прилагаю git репозиторий с описанием всей конфигурации, можете попробовать развернуть у себя буквально за 10 минут.

Когда проблема в поломке физического интерфейса

Неисправные физические интерфейсы, особенно на мобильном гаджете, желательно не использовать совсем (не нагружать током во избежание усугубления поломки), даже если телефон или планшет сохранил способность к зарядке через них. Организовать передачу контента можно либо по беспроводной связи (Wi-Fi, bluetooth), либо через облачные сервисы, которые доступны на том и другом устройстве. В частности, iTunes и iCloud для техники Apple, Google Drive, Яндекс Диск, Dropbox, Microsoft OneDrive и множество других — для всех.

Облачными сервисами удобно пользоваться для передачи фото, видео, музыки, документов и других типов файлов. Для синхронизации контактов на Андроиде и ПК достаточно возможностей почты Gmail. А чтобы управлять телефоном непосредственно с компьютера, можно поставить на них приложение вроде MyPhoneExplorer (состоит из 2 частей — для телефона и для ПК), которое поддерживает и проводное, и беспроводное соединение устройств, не требуя установки драйверов. Очень удобно.

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

Часто встречающиеся ошибки 1С и общие способы их решения Промо

Статья рассчитана в первую очередь на тех, кто недостаточно много работал с 1С и не успел набить шишек при встрече с часто встречающимися ошибками. Обычно можно определить для себя несколько действий благодаря которым можно определить решится ли проблема за несколько минут или же потребует дополнительного анализа. В первое время сталкиваясь с простыми ошибками тратил уйму времени на то, чтобы с ними разобраться. Конечно, интернет сильно помогает в таких вопросах, но не всегда есть возможность им воспользоваться. Поэтому надеюсь, что эта статья поможет кому-нибудь сэкономить время.

Копирование числовых ячеек из 1С в Excel Промо

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

Сервер 1С:Предприятие на Ubuntu 16.04 и PostgreSQL 9.6, для тех, кто хочет узнать его вкус. Рецепт от Капитана

Если кратко описать мое отношение к Postgres: Использовал до того, как это стало мейнстримом.
Конкретнее: Собирал на нем сервера для компаний среднего размера (до 50 активных пользователей 1С).
На настоящий момент их набирается уже больше, чем пальцев рук пары человек (нормальных, а не фрезеровщиков).
Следуя этой статье вы сможете себе собрать такой же и начать спокойную легальную жизнь, максимально легко сделать первый шаг в мир Linux и Postgres.
А я побороться за 1. Лучший бизнес-кейс (лучший опыт автоматизации предприятия на базе PostgreSQL).
Если, конечно, статья придется вам по вкусу.

1С:Предприятие Бухгалтерия переход с редакции 2.0 на 3.0. Практика перевода информационной базы для работы в управляемом приложении. Промо

Из информационного выпуска 1С № 16872 от 08.07.2013г. стало известно об относительно скором необходимом переходе на редакцию 1С:Бухгалтерия 3.0. В данной публикации будут разобраны некоторые особенности перевода нетиповой конфигурации 1С:Бухгалтерия 2.0 на редакцию 3.0, которая работает в режиме «Управляемое приложение».
Публикация будет дополняться по мере подготовки нового материала. Публикация не является «универсальной инструкцией».

Update 3. Права доступа. 14.08.2013
Update 4. Добавлен раздел 0. Дополнен раздел 4. Добавлен раздел 7. Внесены поправки, актуализирована информация. 23.11.2013.

1 стартмани

1С:Предприятие Бухгалтерия переход с редакции 2.0 на 3.0. Практика перевода информационной базы для работы в управляемом приложении. Промо

Из информационного выпуска 1С № 16872 от 08.07.2013г. стало известно об относительно скором необходимом переходе на редакцию 1С:Бухгалтерия 3.0. В данной публикации будут разобраны некоторые особенности перевода нетиповой конфигурации 1С:Бухгалтерия 2.0 на редакцию 3.0, которая работает в режиме «Управляемое приложение».
Публикация будет дополняться по мере подготовки нового материала. Публикация не является «универсальной инструкцией».

Update 3. Права доступа. 14.08.2013
Update 4. Добавлен раздел 0. Дополнен раздел 4. Добавлен раздел 7. Внесены поправки, актуализирована информация. 23.11.2013.

1 стартмани

Допиливаем форму выбора серий номенклатуры для отображения остатков Промо

В этой статье я хочу рассмотреть задачу, которая довольно часто возникает у начинающих (и не только) разработчиков, адаптирующих типовые конфигурации (УТ, КА, УПП) на предприятиях торговли. Речь пойдет про отображение остатков в форме выбора серий номенклатуры при подборе в документы. Это актуально в тех случаях, когда не ведется партионный учет по сериям, либо когда документы вводятся неоперативно и нет возможности воспользоваться волшебной кнопкой «Заполнить и провести». На первый взгляд задача банальна, но я хочу показать некоторые «грабли», на которые часто наступают новички в процессе ее реализации, а также сопоставлю алгоритмы решения на платформе 8.1 и 8.2.

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. Независимо от того какой из них вы выберете, всегда необходимо думать о удобочитаемости файлов конфигурации, дальнейшей их поддержки, а также способах обнаружения ошибок для случаев их некорректного использования. Таким образом, конфигурационный файл – это по сути еще один тип кода.

1С:Предприятие Бухгалтерия переход с редакции 2.0 на 3.0. Практика перевода информационной базы для работы в управляемом приложении. Промо

Из информационного выпуска 1С № 16872 от 08.07.2013г. стало известно об относительно скором необходимом переходе на редакцию 1С:Бухгалтерия 3.0. В данной публикации будут разобраны некоторые особенности перевода нетиповой конфигурации 1С:Бухгалтерия 2.0 на редакцию 3.0, которая работает в режиме «Управляемое приложение».
Публикация будет дополняться по мере подготовки нового материала. Публикация не является «универсальной инструкцией».

Update 3. Права доступа. 14.08.2013
Update 4. Добавлен раздел 0. Дополнен раздел 4. Добавлен раздел 7. Внесены поправки, актуализирована информация. 23.11.2013.

1 стартмани

Администрирование конфигураций 1С (недокументированные особенности работы)

Многие мои коллеги по работе и по профессии, уверен, сталкиваются с аналогичными ситуациями, когда программа 1С при работе с конфигурацией, мягко говоря, работает «странно». Как говорит один хороший знакомый (к слову, один из авторов УТ 11):
— «вот, ну согласись, нанять пару серьезных методистов — реальных дядечек с реального производства, до начала разработки — единственная ЭЛЕМЕНТАРНАЯ политика, как можно было этого не сделать???? там их НЕТ. Причем это 0 в плане затрат на разработку, там нет ограничений бюджета, это просто самый тупой прокол.»
В этой статье приведу способы лечения пресловутых проколов (за последний месяц).

Копирование числовых ячеек из 1С в Excel Промо

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

Часто встречающиеся ошибки 1С и общие способы их решения Промо

Статья рассчитана в первую очередь на тех, кто недостаточно много работал с 1С и не успел набить шишек при встрече с часто встречающимися ошибками. Обычно можно определить для себя несколько действий благодаря которым можно определить решится ли проблема за несколько минут или же потребует дополнительного анализа. В первое время сталкиваясь с простыми ошибками тратил уйму времени на то, чтобы с ними разобраться. Конечно, интернет сильно помогает в таких вопросах, но не всегда есть возможность им воспользоваться. Поэтому надеюсь, что эта статья поможет кому-нибудь сэкономить время.

Dynaconf — мощный конфигуратор настроек для приложений Python

Dynaconf — это очень мощная система для конфигурации настроек в Python, которая поддерживает следующие форматы файлов: yaml, json, ini, toml и python. Она также позволяет автоматически загружать файл и поддерживает настраиваемые правила для валидации данных настроек. Проще говоря, он охватывает практически весь функционал трех предыдущих рассмотренных вариантов и даже выходит за рамки этого. Например, вы можете сохранить зашифрованный пароль и используя для его расшифровки. Он прекрасно интегрирован с Flask, Django и Pytest. Я не буду упоминать все его возможности в этой статье, и поэтому для более подробной информации обратитесь к его документации.

Чтение

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

# .env
# ROOT_PATH_FOR_DYNACONF="config/"
# SETTINGS_FILE_FOR_DYNACONF=""

from dynaconf import settings

print(settings)
# xiaoxu_database

Валидация

Одна из наиболее интересных, в частности для меня, возможностей dynaconf – это его настраиваемый валидатор. Как упоминалось ранее, Configureparser недостаточно строго проверяет корректность INI файлов настроек, но это можно легко реализовать в dynaconf. В следующем примере мы проверяем, существуют ли определенные ключи в файле с настройками и имеется ли в нем конкретный ключ с корректным значением. Если вы читаете настройки из файла YAML или TOML, которые как мы говорили ранее, поддерживают несколько типов данных, то вы даже можете проверить, находится ли значение настройки, например, число в заданном диапазоне.

# settings.ini
# 
# ENVIRONMENT = test
# DEBUG = True
# USERNAME = xiaoxu
# PASSWORD = xiaoxu
# HOST = 127.0.0.1
# PORT = 5432
# DB = xiaoxu_database

# 
# DEBUG = False

from dynaconf import settings, Validator

settings.validators.register(
    Validator('ENVIRONMENT', 'DEBUG', 'USERNAME', must_exist=True),
    Validator('PASSWORD', must_exist=False),
    Validator('DEBUG', eq='False', env='production')
)

# запускаем валидатор
settings.validators.validate()

# dynaconf.validator.ValidationError: PASSWORD cannot exists in env test

Интеграция с Pytest

Еще одна интересная особенность dynaconf – это возможность его интеграции с pytest. Так настройки для модульного тестирования unit testing обычно существенно отличаются в различных средах. Для этого вы можете использовать параметр , чтобы ваше приложение могло прочитать значения настроек из внешнего файла, или использовать фикстуру для замены определенных пар ключ и значение в файле настроек.

import pytest
from dynaconf import settings

@pytest.fixture(scope="session", autouse=True)
def set_test_settings():
    settings.configure(FORCE_ENV_FOR_DYNACONF="testing")

def test_dynaconf(monkeypatch):
    monkeypatch.setattr(settings, 'HOST', 'localhost')

Обновляем конфигурацию приложения во время его выполнения

Dynaconf в своем составе содержит метод , который очищает значения настроек и перезапускает все загрузчики вашего приложения. Это полезно, если вы хотите, чтобы приложение перезагружало файл настроек во время выполнения и соответственно в последствие изменяло свое поведение. Например, приложение должно автоматически перезагрузить настройки, если файл конфигурации был открыт и изменен (откорректирован).

Запуск Apache 2.4 с модулем 1С внутри Docker контейнера

Про Apache и про Linux слышали, наверное, все. А вот про Docker пока нет, но он сильно набирает популярность последнее время и не зря. Поделюсь своим опытом и дам пошаговую инструкцию настройки веб-сервера Apache с модулем 1С внутри Docker контейнера на Linux хосте. При этом сам сервер 1С может находиться совсем на другой машине и на другой операционной системе

Это не важно, главное чтобы Apache смог достучаться до сервера 1С по TCP. В статье дам подробное пояснение по каждой используемой команде со ссылками на документацию по Docker, чтобы не создавалось ощущение непонятной магии

Также прилагаю git репозиторий с описанием всей конфигурации, можете попробовать развернуть у себя буквально за 10 минут.

Синтаксис

Параметры

Параметр Описание
Указывает имя удаленного сервера, на котором расположена служба. Имя должно использовать формат UNC (например, \мисервер). Чтобы запустить SC.exe локально, не используйте этот параметр.
Указывает имя службы, возвращенное операцией жеткэйнаме .
Указывает тип службы. Эти способы могут быть следующими:
  • собственный — указывает службу, которая выполняется в собственном процессе. Он не предоставляет доступ к исполняемому файлу другим службам. Это значение по умолчанию.
  • Share — указывает службу, которая выполняется как общий процесс. Он использует исполняемый файл совместно с другими службами.
  • kernel — указывает драйвер.
  • филесис — указывает драйвер файловой системы.
  • REC — указывает драйвер, распознаваемый файловой системой, который определяет файловые системы, используемые на компьютере.
  • адаптация — указывает драйвер адаптера, который определяет устройства, такие как клавиатуры, мыши и диски.
  • взаимодействие — указывает службу, которая может взаимодействовать с рабочим столом и получать входные данные от пользователей. Интерактивные службы должны запускаться под учетной записью LocalSystem. Этот тип должен использоваться в сочетании с Type = владеть или Type = Shared (например, Type = взаимодействиеType = владеет). При использовании типа = взаимодействие само по себе вызывает ошибку.
Указывает тип запуска для службы. Эти способы могут быть следующими:
  • Загрузка — указывает драйвер устройства, который загружается загрузчиком.
  • система — указывает драйвер устройства, который запускается во время инициализации ядра.
  • автоматически указывает службу, которая автоматически запускается при каждом перезапуске компьютера и выполняется, даже если никто из них не входит в систему.
  • Demand — указывает службу, которая должна быть запущена вручную. Это значение по умолчанию, если Start = не задано.
  • Disabled (отключено ) — указывает службу, которая не может быть запущена. Чтобы запустить отключенную службу, измените тип запуска на другое значение.
  • отложенный — автоматически указывает службу, которая запускается автоматически через некоторое время после запуска других автоматических служб.
Указывает серьезность ошибки, если служба не запускается при запуске компьютера. Эти способы могут быть следующими:
  • Обычная — указывает, что ошибка записывается в журнал и отображается окно сообщения, информирующее пользователя о том, что не удалось запустить службу. Запуск будет продолжен. Это параметр по умолчанию.
  • серьезная — указывает, что ошибка регистрируется (по возможности). Компьютер пытается перезапуститься с последней удачной конфигурацией. Это может привести к тому, что компьютер сможет перезапуститься, но служба по-прежнему может не запуститься.
  • критическая — указывает, что ошибка записывается в журнал (если возможно). Компьютер пытается перезапуститься с последней удачной конфигурацией. Если последняя удачная конфигурация завершается сбоем, запуск также завершается сбоем, а процесс загрузки останавливается с ошибкой остановки.
  • Ignore — указывает, что ошибка записывается в журнал, и запуск продолжится. Пользователю не выдается уведомление, кроме записи ошибки в журнал событий.
Указывает путь к двоичному файлу службы. Значение по умолчанию для BinPath =, и эта строка должна быть указана.
Указывает имя группы, членом которой является эта служба. Список групп хранится в реестре в подразделе хклм\систем\куррентконтролсет\контрол\сервицеграупордер . По умолчанию используется значение NULL.
Указывает, следует ли получить TagID из вызова CreateService. Теги используются только для драйверов загрузки и запуска системы.
Указывает имена служб или групп, которые должны быть запущены перед этой службой. Имена разделяются косой чертой (/).
указывает имя учетной записи, в которой будет выполняться служба, или задает имя объекта драйвера Windows, в котором будет выполняться драйвер. Значение по умолчанию — LocalSystem.
Указывает описательное имя для идентификации службы в программах пользовательского интерфейса. Например, имя подраздела одной конкретной службы — wuauserv, которое имеет более понятное отображаемое имя автоматическое обновление.
Указывает пароль. Это необходимо, если используется учетная запись, отличная от учетной записи LocalSystem.
/? Отображение справки в командной строке.

Remarks

  • Каждый параметр командной строки (параметр) должен включать знак равенства как часть имени параметра.

  • Между параметром и его значением требуется пробел (например, Type =an). Если пространство не указано, операция завершается ошибкой.

Пакет Cofigureparser из состава стандартной библиотеки Python

В этом разделе рассмотрим пакеты, предназначенные непосредственно для управления конфигурацией приложения. И начнем со встроенного в стандартную библиотеку Python пакета: Configureparser.

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

Чтение

import configparser

def read_ini(file_path, config_json):
    config = configparser.ConfigParser()
    config.read(file_path)
    for section in config.sections():
        for key in config:
            print((key, config))
 
read_ini("source/data/sample.ini", config_json)
# ('environment', 'test')
# ('debug', 'True')
# ('username', 'xiaoxu')
# ('password', 'xiaoxu')
# ('host', '127.0.0.1')
# ('port', '5432')
# ('db', 'xiaoxu_database')

Как видно из примера Configureparser не может «угадать» типы данных, содержащихся в файле конфигурации, так как значение каждой настройки сохраняется в виде строки. Тем не менее, он предоставляет несколько полезных методов для преобразования строк (значений настроек) в нужный тип данных. Наиболее интересным из них является метод преобразующий значения в логический тип, то есть он может распознавать некоторые логические значения, например, /, /, / и /.

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

import configparser

def read_ini_extra(file_path, dict_obj=None):
    config = configparser.ConfigParser()
    if dict_obj:
        config.read_dict(dict_obj)
    else:
        config.read(file_path)
    debug = config.getboolean("DEBUG")
    print(type(debug))
    # <class 'bool'>
    name = config.get('APP', 'NAME', fallback='NAME is not defined')
    print(name)
    return debug

# читаем ini файл
read_ini_extra(file_path="source/data/sample.ini")

# читаем данные в словарь
config_json = read_json(file_path="source/data/sample.json")
read_ini_extra(dict_obj=config_json)

Валидация

Валидация данных с Configureparser не так проста, как для пакетов, работающих с форматами YAML и JSON. Во-первых, он не возбуждает исключения FileNotFoundError если файла настроек не существует, а вместо этого вызывает исключение типа KeyError, как при попытке доступа к отсутствующему ключу.

Кроме того, этот пакет «игнорирует» некоторые ошибки форматирования, например, неправильное использование отступа. Так в приведенном ниже примере, в случае если в файле присутствует дополнительная табуляция или пробел перед настройкой , то вы получите неправильные значения для обеих настроек и .

ENVIRONMENT=test
	DEBUG=true
USERNAME=xiaoxu
PASSWORD=xiaoxu
HOST=127.0.0.1
PORT=5432

Тем не менее, Configureparser может возбуждать исключение ParserError при наличии нескольких ошибок (см. пример кода с тестами ниже). И в большинстве случаев этого достаточно для определения проблемных мест в самом файле настроек.

import pytest

def test_validation_configureparser():
    # не возбуждается FileNotFoundError, возбуждается KeyError
    # как и для случая отсутствия ключа (параметра настройки)
    with pytest.raises(KeyError):
        read_ini_extra(file_path="source/data/non_existing_file.ini")

    # 
    # ENVIRONMENT = test
    #     DEBUG = True
    # не возбуждается исключение из-за неверной расстановки отступов
    debug = read_ini_extra(
        file_path="source/data/sample_wrong_indentation.ini"
    )
    print(debug)
    # None
    # Однако, config вернет 'test\nDEBUG = True'

    # 
    # ENVIRONMENT = test
    # DEBUG  True

    # 
    # USERNAME = xiaoxu
    # PASSWORD xiaoxu
    with pytest.raises(configparser.ParsingError):
        debug = read_ini_extra(
            file_path="source/data/sample_wrong_key_value.ini"
        )
    # выведет все ошибки
    # configparser.ParsingError: Source contains parsing errors: 'source/data/sample_wrong_key_value.ini'
    #         : 'DEBUG  True\n'
    #         : 'PASSWORD xiaoxu\n'

1С и ODBC

ODBC (Open Database Connectivity) — это программный интерфейс, универсальное средство доступа к базам данных, разработанное для обмена между источниками (базами данных) разного типа. Данный интерфейс принято считать более низкоуровневым, чем библиотека ADOdb, однако причина эта кроется не в более низком качестве, но в том, что ODBC послужила своего рода фундаментом более поздней ADOdb – работу с последней поддерживают все типы баз, работающие и с первой.
В данной статье мы расскажем о том, как взаимодействуют ODBC и 1С, а точнее, поговорим о механизме 1С ВнешнийИсточникДанных и его использовании с вышеупомянутым интерфейсом.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: