Вопрос 08.13 экзамена 1С:Профессионал по платформе. Для создания объекта, с использованием которого из одной базы 1С:Предприятие 8 будет производиться обращение через OLE к другой информационной базе 1С:Предприятие 8, используется конструктор:

  1. Новый Base(СтрокаИнициализации)
  2. Новый OLEОбъект
  3. Новый COMОбъект
  4. Создание подобного объекта производится другими средствами
Правильный вариант синтаксиса - третий

Вопрос 08.51 экзамена 1С:Профессионал по платформе. Редактирование OLE-объектов осуществляется:
  1. Встроенным в платформу редактором табличных документов
  2. Встроенным в платформу редактором OLE-объектов
  3. Приложением, связанным с OLE-объектом
Правильный ответ третий, см. определение OLE-объекта.
Вопрос 08.53 экзамена 1С:Профессионал по платформе. Automation-сервер "1С:Предприятие 8"...
  1. предоставляет доступ ко всем свойствам и методам своего глобального контекста
  2. предоставляет доступ к дополнительным свойствам и методам для выполнения действий, специфичных для работы в режиме Automation
  3. позволяет управлять приложением системы "1С:Предприятие 8" из других приложений, а также выполнять действия, аналогичные интерактивным
  4. верны все указанные ответы
Правильный ответ четвертый - Automation дает практически полный доступ к приложению.
Вопрос 08.10 экзамена 1С:Профессионал по платформе. В процедуре, которая будет вызываться при подключении к базе данных через СОМ, нельзя использовать:
  1. ДокОбъект=Док.СоздатьДокумент()
  2. Форма.Открыть()
  3. Запрос=Новый Запрос
  4. Нет правильного ответа
Правильный ответ второй.

Вопрос 08.03 экзамена 1С:Профессионал по платформе. При обращении к базе данных 1С:Предприятие 8 через OLE выполняется процедура - обработчик события "ПриНачалеРаботыСистемы" определенный...

  1. в модуле приложения
  2. в модуле внешнего соединения
  3. в общем модуле
  4. в OLE модуле
Правильный ответ первый, Automation видит модуль приложения.
Вопрос 08.06 экзамена 1С:Профессионал по платформе. При обращении к базе данных 1С:Предприятие 8 через COMConnector выполняется процедура - обработчик события "ПриНачалеРаботыСистемы" определенный...
  1. в модуле приложения
  2. в модуле внешнего соединения
  3. в общем модуле
  4. в СОМ модуле
Правильный ответ второй, для COM доступны только модули с признаком "Внешнее соединение".

Automation Server и Automation Client - инструмент интеграции с другими программными системами.

Automation Server

Основное назначение Automation-сервера 1С:Предприятие 8 - управление приложением системы 1С:Предприятие 8 из других приложений и выполнение действий аналогичных интерактивным действиям.

Automation-сервер 1С:Предприятие 8 предоставляет доступ ко всем свойствам и методам своего глобального контекста, имеет дополнительные свойства и методы для выполнения действий, специфичных для работы в режиме Automation.

Для запуска системы 1С:Предприятие 8 в качестве Automation-сервера из внешнего приложения, выполняется следующая последовательность действий:

  • создается COM-объект с идентификатором V82.Application ;
  • выполняется инициализация системы 1С:Предприятие 8 методом Connect() ;
  • вызываются свойства и методы системы 1С:Предприятие 8 как Automation-сервера.

Пример

В качестве примера можно рассмотреть обращение к информационной базе 1С:Предприятия 8 из программы на языке MS Visual Basic. В данном примере запускается и инициализируется конфигурация 1С:Предприятие 8 с базой данных в каталоге c:\InfoBases\Trade . Далее в программе 1С:Предприятие 8 создается объект типа СправочникМенеджер.Товары и создается новая группа элементов с названием ***** Экспорт из Excel ****** . Во вновь созданную группу каталога записываются данные из таблицы MS Excel.

Sub Excel_to_trade()

Dim trade As Object
Dim Элемент As Object

Set trade = CreateObject("V82.Application") "Создать Automation сервер
trade.Connect(" File=""c:\InfoBases\Trade"";Usr=""Director"";") "Соединиться с информационной базой
Set СправочникТоваров = trade.Справочники. Товары
Set ГруппаТоваров = СправочникТоваров.СоздатьГруппу()
ГруппаТоваров.Наименование = "***** Экспорт из Excel ******"
ГруппаТоваров.Записать

N = 100 "Количество строк в документе
For Count = 1 To N

Set Элемент = СправочникТоваров.СоздатьЭлемент()
Элемент.Наименование = Application.Cells(Count, 2).Value
Элемент.Розн_Цена = Application.Cells(Count, 3).Value
Элемент.Мел_Опт_Цена = Application.Cells(Count, 4).Value
Элемент.Опт_Цена = Application.Cells(Count, 5).Value
Элемент.Родитель = ГруппаТоваров.Ссылка

Элемент.Записать

Контекст исполнения

Объект Automation-сервер 1С:Предприятие 8 в качестве своих свойств может иметь:

  • системные константы,
  • значения заданных в конфигураторе объектов, доступ к которым осуществляется с помощью менеджеров (например, константы, перечисления, справочники, документы, журналы документов, отчеты, обработки, планы видов характеристик, планы счетов, планы видов расчета, регистры);
  • переменные, объявленные в модуле приложения.

Automation-сервер 1С:Предприятие 8 в качестве своих методов может иметь:

  • системные процедуры и функции;
  • процедуры и функции модуля приложения и общих модулей, объявленные с ключевым словом Экспорт ;
  • два дополнительных метода - Connect() и NewObject() .

Automation Client

Как и многие современные программные продукты, 1С:Предприятие 8 может выступать в роли клиентов Automation. Поэтому имеется возможность из системы 1С:Предприятие 8 обращаться к другой копии 1С:Предприятие 8 (например, к другой конфигурации) для обмена данными.

В качестве примера можно рассмотреть обращение к информационной базе 1С:Предприятия 8 из другой информационной базы 1С:Предприятия 8. В данном примере запускается и инициализируется конфигурация 1С:Предприятия 8 с базой данных в каталоге c:\InfoBases\Trade . Далее в этой базе, в справочнике Товары создается новая группа с наименованием *** Экспорт из другой базы 1С:Предприятия 8 *** , и эта группа записывается.

8.41 При определении типа свойства объекта XDTO информация о типе включает:

1. только имя типа

2. имя типа и имя пространства имен

3. имя типа и имя пакета XDTO

4. имя типа и имя фабрики XDTO

8.42 Менеджер WEB сервисов решает задачу:

1. управление пулом соединений с информационными базами

2. поддержка WSDL описания сервиса, реализация протокола SOAP

3. поддержка работы WEB приложения

4. верны ответы 1,2

5. верны ответы 2,3

6. верны ответы 1,2,3

8.43 Объект конфигурации " WE В сервис" используется для:

2. организации обращения к web-сервисам по статической ссылке

3. экспорта функциональности данной информационной базы

8.44 Объект конфигурации " WS Ссылка" используется для:

1. организации динамического обращения к web-сервисам

2. организации обращения к web -сервисам но статической ссылке

3. экспорта функциональности данной информационной базы

8.45 В случае если функция, реализующая операцию WEB сервиса, возвращает какое-либо значение. То такое значение определяется (при настройке соответствующего объекта конфигурации) как имеющее тип:

4. элемент XML

5. объект или значение XDTO

6. верны ответы 1, 2, 3

8.46 При обращении к WEB сервису по статической ссылке последовательность действий следующая:

1. получение wsdl описания, настройка подключения (создание прокси), обращение к операции сервиса

2. настройка подключения (создание прокси), обращение к операции сервиса

8.47 При обращении к WEB сервису по динамической ссылке последовательность действий следующая:

1. получение wsdl описания, настройка подключения (создание прокси), обращение к операции сервиса

2. настройка подключения (создание прокси), обращение к операции сервиса

3. обращение к операции сервиса

8.48 В случае если функция, реализующая операцию WEB сервиса, принимает какое-либо значение в качестве параметра. То такое значение определяется (при настройке соответствующего объекта конфигурации) как имеющее тип:

4. элемент XML

5. объект или значение XDTO

6. верны ответы 1,2,3

8.49 Каким образом можно определить в каких планах обмена для конкретного прикладного объекта указана авторегистрация?

1. В окне редактирования объекта, раздел "Обмен данными"

2. Посредством вызова окна "Палитра свойств" для данного объекта

3. Посредством вызова окна "Дополнительно" для данного объекта (закладка "Планы обмена")

4. Верно все вышеперечисленное

5. Верны ответы 1 и 3

8.50 Для прикладных объектов в окне редактирования объекта конфигурации на закладке "Обмен данными" указываются...

1. объекты, при изменении которых в обмен должен попасть данный объект

2. объекты, которые должны попасть в обмен при изменении данного объекта

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

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

8.51 Редактирование OLE -объектов осуществляется:

1. Встроенным в платформу редактором табличных документов

2. Встроенным в платформу редактором OLE-объектов

3. Приложением, связанным с OLE -объектом

8.52 Внешние файлы табличных документов:

1. Имеют расширение XML

2. Имеют расширение MXL

3. Могут иметь любое расширение

4. Не существуют. Все табличные документы встроены в Конфигурацию

8.53 Automation -сервер "1С:Предприятие 8"...

1. предоставляет доступ ко всем свойствам и методам своего глобального контекста

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

3. позволяет управлять приложением системы "1С:Предприятие8" из других приложений, а также выполнять действия, аналогичные интерактивным

4. верны все указанные ответы

1. невозможно

2. реализуется полностью программным способом

3. реализуется с помощью объекта конфигурации "Планы обмена"

4. реализуется встроенным в платформу мастером обмена

9. Обслуживание прикладного решения

9.1 В каком порядке происходит установка платформы и конфигурации?

1. Необходимо сначала установить платформу, затем установить конфигурацию на основе шаблона

2. Необходимо сначала установить конфигурацию, а после платформу

3. Порядок установки не имеет значения

9.2 Обычная установка платформы "1С:Предприятие 8"...

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

2. предполагает отдельную установку на каждый пользовательский компьютер, дальнейшее обновление платформы возможно проводить только на каждом пользовательском компьютере

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

4. предполагает установку локальной версии на одного пользователя

9.3 Что необходимо сделать для обновления технологической платформы при обычной установке 1С:Предприятия?

1. В режиме конфигуратора указать файл обновлений

2. Запустить программу установки, входящую в состав дистрибутива

3. В режиме конфигуратора указать файл поставки

9.4 Административная установка...

1. предполагает установку платформы на каждом отдельном пользовательском компьютере

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

3. предполагает установку конфигурации на сервер 1С:Предприятие, с определением пользователя с правами доступа Администратора

9.5 При обновлении технологической платформы при административной установке 1С:Предприятия...

1. администратору достаточно обновить платформу только в месте административной установки, обновление платформы на локальных компьютерах смогут произвести сами пользователи

2. администратор должен обновить платформу в месте административной установки и на всех компьютерах локальной сети, пользователи не имеют права на обновление

3. администратор должен обновить платформу только па компьютерах локальной сети, пользователи имеют ту же возможность

4. администратор должен обновить платформу только на компьютерах локальной сети, пользователи не имеют такой возможности

9.6 Допускается ли при обычной установке 1С:Предприятия в клиент-серверном варианте, работа клиентского и серверного приложений разных релизов технологической платформы?

1. Допускается

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

3. Допускается, необходимо выполнять обновление серверного приложения

9.7 Использование режима пакетного запуска...

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

2. позволяет запускать оба режима программы без интерактивного вмешательства

3. позволяет выполнить синтаксический контроль и проверку конфигурации

4. правильный ответ I и 2

5. правильный ответ 1,2 и 3

9.8 Параметры запуска из командной строки 1С:Предприятие...

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

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

3. верпы ответы I и 2

4. пет правильного ответа

9.9 Что позволяет использование командной строки?

Поддержка технологий Automation Server и Automation Client - это один из инструментов интеграции с другими программными системами.

Automation Server

Основное назначение Automation-сервера 1С:Предприятие 8 - управление приложением системы 1С:Предприятие 8 из других приложений и выполнение действий аналогичных интерактивным действиям.

Automation-сервер 1С:Предприятие 8 предоставляет доступ ко всем свойствам и методам своего глобального контекста, имеет дополнительные свойства и методы для выполнения действий, специфичных для работы в режиме Automation.

Для запуска системы 1С:Предприятие 8 в качестве Automation-сервера из внешнего приложения, выполняется следующая последовательность действий:

  • создается COM-объект с идентификатором V82.Application ;
  • выполняется инициализация системы 1С:Предприятие 8 методом Connect() ;
  • вызываются свойства и методы системы 1С:Предприятие 8 как Automation-сервера.

Пример

В качестве примера можно рассмотреть обращение к информационной базе 1С:Предприятия 8 из программы на языке MS Visual Basic. В данном примере запускается и инициализируется конфигурация 1С:Предприятие 8 с базой данных в каталоге c:\InfoBases\Trade . Далее в программе 1С:Предприятие 8 создается объект типа СправочникМенеджер.Товары и создается новая группа элементов с названием ***** Экспорт из Excel ****** . Во вновь созданную группу каталога записываются данные из таблицы MS Excel.

Sub Excel_to_trade()

Dim trade As Object
Dim Элемент As Object

Set trade = CreateObject("V82.Application") "Создать Automation сервер
trade.Connect(" File=""c:\InfoBases\Trade"";Usr=""Director"";") "Соединиться с информационной базой
Set СправочникТоваров = trade.Справочники. Товары
Set ГруппаТоваров = СправочникТоваров.СоздатьГруппу()
ГруппаТоваров.Наименование = "***** Экспорт из Excel ******"
ГруппаТоваров.Записать

N = 100 "Количество строк в документе
For Count = 1 To N

Set Элемент = СправочникТоваров.СоздатьЭлемент()
Элемент.Наименование = Application.Cells(Count, 2).Value
Элемент.Розн_Цена = Application.Cells(Count, 3).Value
Элемент.Мел_Опт_Цена = Application.Cells(Count, 4).Value
Элемент.Опт_Цена = Application.Cells(Count, 5).Value
Элемент.Родитель = ГруппаТоваров.Ссылка

Элемент.Записать

Контекст исполнения

Объект Automation-сервер 1С:Предприятие 8 в качестве своих свойств может иметь:

  • системные константы,
  • значения заданных в конфигураторе объектов, доступ к которым осуществляется с помощью менеджеров (например, константы, перечисления, справочники, документы, журналы документов, отчеты, обработки, планы видов характеристик, планы счетов, планы видов расчета, регистры);
  • переменные, объявленные в модуле приложения.

Automation-сервер 1С:Предприятие 8 в качестве своих методов может иметь:

  • системные процедуры и функции;
  • процедуры и функции модуля приложения и общих модулей, объявленные с ключевым словом Экспорт ;
  • два дополнительных метода - Connect() и NewObject() .

Automation Client

Как и многие современные программные продукты, 1С:Предприятие 8 может выступать в роли клиентов Automation. Поэтому имеется возможность из системы 1С:Предприятие 8 обращаться к другой копии 1С:Предприятие 8 (например, к другой конфигурации) для обмена данными.

В качестве примера можно рассмотреть обращение к информационной базе 1С:Предприятия 8 из другой информационной базы 1С:Предприятия 8. В данном примере запускается и инициализируется конфигурация 1С:Предприятия 8 с базой данных в каталоге c:\InfoBases\Trade . Далее в этой базе, в справочнике Товары создается новая группа с наименованием *** Экспорт из другой базы 1С:Предприятия 8 *** , и эта группа записывается.

Привет Хабравчанам!

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

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


В качестве языка, который будет интегрироваться с 1С, я выбрал Питон. Он очень хорошо подходит для автоматизации процессов. Этому способствуют минималистичность синтаксиса (код набирается очень быстро), богатая стандартная библиотека (меньшая потребность в сторонних модулях), кроссплатформенность - с большой вероятностью, код, написанный в ОС Linix, успешно заработает в Windows.

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

Когда-то в организации стояла программа, написанная на Дельфи и использующая в качестве БД MSSQL/Firebird. В те славные времена можно было подключиться к базе с помощью любого языка и совершить множество действий - выбрать абонентов-должников, разнести поступившие оплаты, зафиксировать показания приборов. Неудивительно, что коллекция скриптов, автоматизирующих рутину, постоянно росла. Программисты могли выполнять любые действия, не открывая саму программу.

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

Основные задачи, стоявшие передо мной - это возможность быстрого получения данных по конкретному лицевому счету - ФИО, адрес, приборы учета, показания приборов, платежи, начисления. Плюс формирование документов - акта сверки, платежной квитанции. Итак, возможность прямого соединения с БД отсутствует - каждый, кто просматривал базу 1С на SQL-сервере, видел, что в массе таблиц вида aaa1, aaa2 разобраться трудно. А строить запросы с такими названиями таблиц и полей просто нереально. К тому же, многие таблицы 1С (особенно самые важные, вроде среза последних, остатков и оборотов) являются виртуальными и разбросаны по разным физическим таблицам, собираясь множественными джоинами. Это способ не подходит.

Платфома 1С предоставляет возможность соединяться с ней через COM-соединение. Подобно многим windows-программам, во время установки 1С в системе регистрируются два COM-объекта - Automation Server и COM Connector. С обоими объектами можно работать, используя язык, в котором предусмотрена поддержка COM-технологии.

Объект Automation Server - это приложение 1С, почти ничем не отличающееся от обычного клиентского приложения. Разница в том, что дополнительно появляется возможность программного управления экземпляром приложения. При работе с объектом COM Connector запускается облегченный вариант 1С-приложения, в котором недоступны формы, а так же функции и методы, имеющие отношение к интерфейсу и визуальным эффектам. Само приложение запускается в режиме «Внешнее соединение». Инициализация глобальных переменных (например, определение текущего пользователя и его настроек) должна выполняться в модуле внешнего соединения 1С. Если в режиме внешнего соединения в коде будет вызвана функция, не доступная в этом режиме, то будет вызвано исключение (которое будет передано в наш питон-скрипт). Вызов небезопасных функций следует обрамлять конструкциями вида

#Если НЕ ВнешнееСоединение Тогда Предупреждение("Привет!"); #КонецЕсли

Поскольку работа с COM-объектами - технология исключительно windows-only, то не удивительно, что в стандартной поставке Питона она отсутствует. Потребуется установить расширение - набор модулей, предоставляющих весь нужный функционал для программирования под Windows на Питоне. Его можно скачать в виде уже собранного exe-установщика. Само расширение предоставляет доступ к реестру, службам, ODBC, COM-объектам и т.д. В качестве альтернативы можно сразу поставить дистрибутив ActiveState Python , в котором расширение Win32 поставляется из коробки.

Некоторое время я экспериментировал с COM-соединением в разработке веб-приложений, в частности, личного кабинета. Были выявлены следующие минусы:

COM-соединение работает медленно. Низкая производительность - известный минус COM-технологии.
- Процесс установки соединения с 1С в зависимости от конфигурации может занять от 1 до 8 секунд (в моем случае - 6 секунд). Стоит ли говорить, что установка соединения на каждый запрос приведет к тому, то каждая страница будет загружаться 8 секунд.
- Поскольку веб-приложения на питоне работают как самостоятельные сервера, то предыдущий пункт можно компенсировать хранением соединения в некоторой глобальной переменной и в случае ошибки восстанавливать его. Как поддерживать соединение на PHP, я, честно говоря, еще не думал.
- Теряется кроссплатформенность веб-приложения.

Исходя из перечисленных выше пунктов, было решено изменить принцип взаимодейстия, разделив его на 2 части - первую платформозависимую (виндовую), выгружающую данные 1С в какой-либо удобный формат, и вторую, не зависимую от платформы, способную работать с данными, ничего не подозревая об 1С в принципе.

Стратегия действий состоит в следующем: питон-скрипт соединяется с 1С, выполняет нужные запросы и выгружает данные в SQLite базу. К этой базе можно подключиться из Питона, PHP, Джавы. Большинство наших проектов работает на питоне, и так как я не выношу писать сырые SQL-запросы руками, то вся работа с базой SQLite выполняется через ORM SQLAlchemy. Потребовалось лишь описать структуру данных базы декларативном стиле:

From sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, Numeric, DateTime, Unicode, Boolean, LargeBinary, ForeignKey Base = declarative_base() class Abonent(Base): __tablename__ = "abonents" id = Column(Integer, primary_key=True) account = Column(Unicode(32), index=True) code = Column(Unicode(32)) address = Column(Unicode(512)) fio = Column(Unicode(256)) source = Column(Unicode(16)) psu = Column(Unicode(256)) tso = Column(Unicode(256)) np = Column(Unicode(256)) street = Column(Unicode(256)) house = Column(Integer) flat = Column(Integer) mro = Column(Unicode(256)) class Payment(Base): __tablename__ = "payments" # и так далее...

Теперь достаточно импортировать этот модуль в любой питон-проект, и можно работать с данными.

Предвижу ваш вопрос - «а почему SQLite»? Главная причина - база нужна только для чтения, поэтому проблемы с записью в SQLite нас волновать не должны. Во-вторых, формат этой этой СУБД удобен - ее удобнее просматривать (существуем множество бесплатных утилит, в том числе супер-расширение для FireFox). В-третьих, в некоторых случаях требовалось получить доступ к абонентам с тех машин, на которых нет соединения с MySQL-сервером. В таком случае достаточно скопировать файл SQLite-базы, и на этой машине будет доступ ко всей информации.

Выгрузка происходит раз в сутки ночью. Занесение данных в 1С можно автоматизировать таким же образом. Например, требуется фиксировать показания, оставленные абонентами на сайте личного кабинета. В этом случае опять соединяемся с 1С и программным методом создаем и проводим документ «Акт снятия показаний». Код я приведу чуть ниже.

Работа с COM-объектами в Питоне немного необычна. Во-первых, утрачивается «питоничность» кода - правила именования переменных и функций в 1С, мягко говоря, не соответствуют Дзену Питона. Во-вторых, всем известно, что объекты 1С зачастую именуются кириллическими символами, что вызовет проблемы при разработке на Питоне… но они решаемы. Предлагаю ознакомиться с кодом:

Import pythoncom import win32com.client V82_CONN_STRING = "Srvr=v8_server;Ref=v8_db;Usr=username;Pwd=megapass;" pythoncom.CoInitialize() V82 = win32com.client.Dispatch("V82.COMConnector").Connect(V82_CONN_STRING)

Как видно из кода, инициализируется клиент для работы с 1С. Определение COM-объекта происходит по имени «V82.COMConnector». Обратите внимание, что это название справедливо для платформы V8.2, если у вас версия 8.1, то имя будет «V81.COMConnector».

У инициализированного клиента мы вызываем метод Сonnect(), передавая ему строку подключения. Строка складывается из имени сервера, базы, пользователя и пароля. Полученный объект V82 хранит в себе соединение с приложением 1С. У него нет метода Disconnect() или чего-то в этом роде. Чтобы отключиться о базы, достаточно удалить объект из памяти функцией del() или присвоить переменной None.

Имея объект, можно обращаться к любым полям и методам глобального контекста 1С, оперировать универсальными объеками типа ТабличныйДокумент, ТаблицаЗначений и тд. Важно учесть, что при работе через COM-соединение 1С работает в режиме «Внешнее соединение». В нем недоступны любые функции для интерактивной работы, например, всплывающие диалоги, уведомления, и, что самое главное, формы. Уверен, что вы не раз проклянете разработчиков конфигурации, которые заключают самый важный функционал в процедуру Кнопка1Нажатие() в модуле формы документа.

Давайте поговорим о такой важдной вещи, как киррилические атрибуты. Не смотря на то, что 1С - двуязычная среда и для каждого русского метода есть англоязычный аналог, рано или поздно потребуется обратиться к киррилическому атрибуту. Если на языках PHP или VBSCript это не вызовет никаких проблем,

Set Con = CreateObject("v81.COMConnector") Set v8 =Con.Connect("строкаПодключения") Set СчетаМенеджер = v8.Документы.Счета.... Set СчетаЗапись= СчетаМенеджер.СоздатьЭлемент() СчетаЗапись.Контрагент = .... .... СчетаЗапись.Записать()

То код на питоне просто вылетит с ошибкой Syntax Error. Что же делать? Править конфигурацию? Нет, достаточно воспользоваться методами getattr и setattr. Передавая в эти функции COM-объект и кириллическое имя аттрибута, можно соответственно получать и устанавливать значения:

#coding=cp1251 catalog = getattr(V82.Catalogs, "ЛицевыеСчета")

Важно следующее: имена реквизитов, а так же параметры функций и методов должны передаваться в кодировке cp1251. Поэтому, чтобы заранее избежать путиницы с кодировками, имеет смысл объявить ее в начале файла: #coding=cp1251. После этого можно передавать строки, не волнуясь об их кодировке. Но! Все строки, полученные из 1С (результаты вызова функций, запросов), будут в кодировке UTF-8.

Пример кода, который выполняет в среде 1С запрос, перебирает результат и сохраняет в SQLite базу:

#coding=cp1251 q = """ ВЫБРАТЬ ЛицевыеСчета.Код КАК code, ЛицевыеСчета.Строение.НаселенныйПункт.Наименование + ", " + ЛицевыеСчета.КраткийАдрес КАК address, ЛицевыеСчета.Абонент.Наименование КАК fio, ЛицевыеСчета.Дивизион.Наименование КАК psu, ВЫРАЗИТЬ(ХарактеристикиЛицевыеСчетаСрезПоследних.Значение КАК Справочник.ТерриториальноСетевыеОрганизации).Наименование КАК tso, ЛицевыеСчета.Строение.НаселенныйПункт.Наименование КАК np, ЛицевыеСчета.Строение.Улица.Наименование КАК street, ЛицевыеСчета.Строение.Дом КАК house, ЛицевыеСчета.ОсновноеПомещение.НомерПомещения КАК flat, ЛицевыеСчета.Дивизион.Родитель.Наименование КАК mro ИЗ Справочник.ЛицевыеСчета КАК ЛицевыеСчета ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ХарактеристикиЛицевыеСчета.СрезПоследних(, ВидХарактеристики = ЗНАЧЕНИЕ(Справочник.ВидыХарактеристик.ТерриториальноСетеваяОрганизация)) КАК ХарактеристикиЛицевыеСчетаСрезПоследних ПО ЛицевыеСчета.Ссылка = ХарактеристикиЛицевыеСчетаСрезПоследних.Объект """ query = V82.NewObject("Query", q) selection = query.Execute().Choose() CONN = db.connect() CONN.query(models.Abonent).delete() while selection.Next(): abonent = models.Abonent() abonent.account = selection.code.strip() abonent.code = selection.code abonent.fio = selection.fio abonent.address = selection.address abonent.psu = selection.psu abonent.tso = selection.tso abonent.source = u"ASRN" abonent.np = selection.np abonent.street = selection.street abonent.house = selection.house abonent.flat = selection.flat abonent.mro = selection.mro CONN.add(abonent) CONN.commit()

Здесь CONN - это сессия соединения с SQLite-базой. Создается объект запроса query, заполняется его текст. Как было замечено выше, текст запроса должен быть в cp1251, для чего вначале объявлена кодировка. После выполнения запроса в базе удаляются все абоненты, чтобы не добавить дубли, затем добавляются в цикле и следует финальный комит.

При работе с запросами я выявил следующие правила.

Выбирая поля, назначайте им названия латиницей, будет гораздо удобнее обращаться к ним через селектор (точку), вместо getattr().
- Выбирайте только примитиные типы данных: строки, числа, дату и булево. Никогда не выбирайте ссылки на объект (документ, справочник)! В данном контексте ссылки вам абсолютно не нужны и даже вредны, потому что любое обращение к реквизиту или методу ссылки приведет к запросу через COM-соединение. Если обращаться к атрибутам ссылки в цикле, то это будет крайне медленно.
- Если вы выбираете поле типа Дата, то оно буде возвращено как объект PyTime. Это специальный тип данных для передачи даты-времени в COM-соединении. С ним не так удобно работать, как с привычным datetime. Если передать этот объект в int(), то вернется timestamp, из которого потом можно получить datetime методом fromtimestamp().

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

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

Link = getattr(V82.Catalogs, "ОтчетыСистемы").FindByDescription("Акт Сверки Элэн") nav_url = V82.GetURL(link, "Отчет") name = V82.ExternalReports.Connect(nav_url) ExternalReport = V82.ExternalReports.Create(name) setattr(ExternalReport, "ЛицевойСчет", reference) table_doc = ExternalReport.GetDoc() path = V82.GetTempFileName("xls") table_doc.Write(path, V82 .SpreadsheetDocumentFileType.XLS) report = models.Report() report.account = reference.Code.strip() report.type = u"act" report.document = open(path, "rb").read() CONN.add(report)

В приведенном фрагменте выполняется следующее. Подключается обработка, формирующая документ. Обработка может быть встроена в конфигурацию, храниться на диске или в базе данных 1С (в каком-то справочнике). Поскольку обработки часто меняются, то, чтобы каждый раз не обновлять конфигурацию, самые часто меняющиеся обработки хранятся в справочнике «ОтчетыСистемы», в реквизите типа «хранилище значения» с именем Отчет. Обработку можно инициализировать, выгрузив ее из базы на диск и подгрузив, либо методом GetURL(), в который нужно передать ссылку на элемент справочника и имя реквизита. Полученному объекту обработки мы назначаем значения реквизитов, вызываем экспортируемую функцию GetDoc(), получаем табличный документ, который сохраняется во временный Excel-файл. Содержимое этого файла записывается в SQlite-базу.

Последнее, что остается рассмотреть - это программное занесение данных в 1С. Предположим, что требуется занести показания от абонентов. Для этого достаточно создать и провести документ «Акт снятия показаний»:

#coding=cp1251 acts = getattr(V82.Documents, "АктСнятияПоказаний") act = acts.CreateDocument() setattr(act, "Показание", 1024.23) setattr(act, "Абонент", "Иванов") # Заполнение прочих реквизитов... act.Write()
Теперь занесение данных автоматизированно.

Итак, я изложил способ, который основан на программной выгрузке и загрузке даных с использованием COM-соединния. Этот метод успешно функционирует в моей организации почти год. База, формируемая из 1С, обслуживает 3 платежные системы, интернет-эквайринг (оплата картами через интернет), а так же личный кабинет. Помимо этого, к базе подключаются различные скрипты для автоматизации рутины.

Несмотря на недостатки метода (медленная скорость COM-соединения), в целом он функционирует стабильно. У нас есть данные в платформонезависимом виде (SQLite), с которыми можно работать из любого языка. И основная часть кода написана на Питоне, а значит, доступны множество средств и приемов, о которых даже нельзя мечтать в 1С.

Это один из возможных способов взаимодейстия с 1С. Я уверен, что он не нов и наверняка уже был кем-то опробован, оптимизирован. Однако, я постарался изложить максимум деталей процесса, чтобы уберечь вас от подводных камней, на которые сам наступал.

Желаю всем удачи, и помните, что не так страшен 1С, как его малюют!


Close