Как создать библиотеку в 1с
Эта статья дает представление о работе внешних компонент в системе «1С: Предприятие».
Будет показан процесс разработки внешней компоненты для системы «1С: Предприятие» версии 8.2, работающей под управлением ОС семейства Windows с файловым вариантом работы. Такой вариант работы используется в большинстве решений, предназначенных для предприятий малого бизнеса. ВК будет реализована на языке программирования C++.
Внешние компоненты «1C: Предприятие»
- с использованием Native API
- с использованием технологии COM
Структура ВК
Внешняя компонента системы «1С: Предприятие» представлена в виде DLL-библиотеки. В коде библиотеки описывается класс-наследник IComponentBase. В создаваемом классе должны быть определены методы, отвечающие за реализацию функций внешней компоненты. Более подробно переопределяемые методы будут описаны ниже по ходу изложения материала.
Запуск демонстрационной ВК
- Выполнить сборку внешней компоненты, поставляемой с подпиской ИТС и предназначенной для демонстрации основных возможностей механизма внешних компонент в 1С
- Подключить демонстрационную компоненту к конфигурации 1С
- Убедиться в корректной работоспособности заявленных функций
Компиляция
Демонстрационная ВК расположена на диске подписки ИТС в каталоге «/VNCOMP82/example/NativeAPI».
Для сборки демонстрационной ВК будем использовать Microsoft Visual Studio 2008. Другие версии данного продукта не поддерживают используемый формат проекта Visual Studio.
Открываем проект AddInNative. В настройках проекта подключаем каталог с заголовочными файлами, необходимыми для сборки проекта. По умолчанию они располагаются на диске ИТС в каталоге /VNCOMP82/include.
Результатом сборки является файл /bind/AddInNative.dll. Это и есть скомпилированная библиотека для подключения к конфигурации 1С.
Подключение ВК к конфигурации 1С
Создадим пустую конфигурацию 1С.
Ниже приведен код модуля управляемого приложения.
Если при запуске конфигурации 1С не было сообщено об ошибке, то ВК была успешно подключена.
В результате выполнения приведенного кода в глобальной видимости конфигурации появляется объект ДемоКомп, имеющий свойства и методы, которые определены в коде внешней компоненты.
Демонстрация заложенного функционала
Произвольное имя внешней компоненты
Задача: Изменить имя внешней компоненты на произвольное.
В предыдущем разделе использовался идентификатор AddInNativeExtension, смысл которого не был пояснен. В данном случае AddInNativeExtension — это наименование расширения.
В коде ВК определен метод RegisterExtensionAs, возвращающий системе «1С: Предприятие» имя, которое необходимо для последующей регистрации ВК в системе. Рекомендуется указывать идентификатор, который в известной мере раскрывает суть внешней компоненты.
Приведем полный код метода RegisterExtensionAs с измененным наименованием расширения:
В приведенном примере имя ВК изменено на SomeName. Тогда при подключении ВК необходимо указывать новое имя:
Расширение списка свойств ВК
- Изучить реализацию свойств ВК
- Добавить свойство строкового типа, доступное для чтения и записи
- Добавить свойство строкового типа, доступное для чтения и записи, которое хранит тип данных последнего установленного свойства. При установке значения свойства никаких действий не производится
- Убедиться в работоспособности произведенных изменений
Полное описание методов, включая список параметров подробно описан в документации, поставляемой на диске ИТС.
Рассмотрим реализацию приведенных методов класса CAddInNative.
В демонстрационной ВК определены 2 свойства: Включен и ЕстьТаймер (IsEnabled и IsTimerPresent).
В глобальной области видимости кода библиотеки определено два массива:
которые хранят русское и английское названия свойств. В заголовочном файле AddInNative.h определяется перечисление:
- Добавить имя добавляемого свойства в массивы g_PropNames и g_PropNamesRu (файл AddInNative.cpp)
- В перечисление Props (файл AddInNative.h) перед ePropLast добавить имя, однозначно идентифицирующее добавляемое свойство
- Организовать память под хранение значений свойств (завести поля модуля компоненты, хранящие соответствующие значения)
- Внести изменения в методы GetPropVal и SetPropVal для взаимодействия с выделенной на предыдущем шаге памятью
- В соответствии с логикой приложения внести изменения в методы IsPropReadable и IsPropWritable
Перечисление Props будет иметь вид:
Для значительного упрощения кода будем использовать STL C++. В частности, для работы со строками WCHAR, подключим библиотеку wstring.
Для сохранения значения метода Тест, определим в классе CAddInNative в области видимости private поле:
Для передачи строковых параметров между «1С: Предприятие» и внешней компонентов используется менеджер памяти «1С: Предприятие». Рассмотрим его работу подробнее. Для выделения и освобождения памяти соответственно используются функции AllocMemory и FreeMemory, определенные в файле ImemoryManager.h. При необходимости передать системе «1С: Предприятие» строковый параметр, внешняя компонента должна выделить под нее память вызовом функции AllocMemory. Ее прототип выглядит следующим образом:
где pMemory — адрес указателя, в который будет помещен адрес выделенного участка памяти,
ulCountByte — размер выделяемого участка памяти.
Пример выделения памяти под строку:
Для удобства работы с строковыми типами данными опишем функцию wstring_to_p. Она получает в качестве параметра wstring-строку. Результатом функции является заполненная структура tVariant. Код функции:
Тогда соответствующая секция case оператора switch метода GetPropVal примет вид:
Метода SetPropVal:
Для реализации второго свойства определим поле класса CaddInNative
в котором будем сохранять тип последнего переданного значения. Для этого в метод CaddInNative::SetPropVal добавим команду:
Теперь при запросе чтения значения второго свойства будем возвращать значение last_type, чего требует обозначенное задание.
Проверим работоспособность произведенных изменений.
Для этого приведем внешний вид конфигурации 1С к виду:
Расширение списка методов
- Расширить функционал внешней компоненты следующим функционалом:
- Изучить способы реализации методов внешней компоненты
- Добавить метод-функцию Функц1, которая в качестве параметра принимает две строки («Параметр1» и «Параметр2»). В качестве результата возвращается строка вида: «Проверка. Параметр1, Параметр2»
- Убедиться в работоспособности произведенных изменений
- Добавить имя метода в массивы g_MethodNames и g_MethodNamesRu (файл AddInNative.cpp)
- Добавить осмысленный идентефикатор метода в перечисление Methods (файл AddInNative.h)
- Внести изменения в код функции GetNParams в соответствии с логикой программы
- При необходимости внести изменения в код метода GetParamDefValue, если требуется использовать значения по умолчанию параметров метода.
- Внести изменения в функцию HasRetVal
- Внести изменения в логику работы функций CallAsProc или CallAsFunc, поместив туда непосредственно исполняемый код метода
Отредактируем функцию GetNProps, чтобы она возвращала количество параметров метода «Тест»:
Внесем изменения в функцию CAddInNative::GetParamDefValue:
Благодаря добавленной строке
в случае отсутствия одного или нескольких аргументов соответствующие параметры будут иметь пустое значение (VTYPE_EMPTY). Если необходимо наличие значения по умолчанию для параметра, следует задать его в секции eMethTest оператора switch функции CAddInNative::GetParamDefValue.
Так как метод «Тест» может возвращать значение, необходимо внести изменения в код функции HasRetVal:
И добавим исполняемый код метода в функцию CallAsFunc:
Скомпилируем компоненту и приведем код конфигурации к виду:
Таймер
- Изучить реализацию таймера в демонстрационной ВК
- Модифицировать метод «СтартТаймер», добавив возможность передавать в параметрах интервал срабатывания таймера (в миллисекундах)
- Убедиться в работоспособности произведенных изменений
Рассмотрим реализацию таймера в демонстрационной ВК.
Так как мы рассматриваем процесс разработки внешней компоненты для ОС семейства Windows, не будем рассматривать реализацию таймера в других операционных системах. Для ОС GNU/Linux, в частности, реализация будет отличаться синтаксисом функции SetTimer и TimerProc.
В исполняемом коде вызывается метод SetTimer, в который передается функция MyTimerProc:
Идентефикатор созданного таймера помещается в переменную m_uiTimer, чтобы в последствии его можно было отключить.
Функция MyTimerProc выглядит следующим образом:
Приведем код метода CallAsProc к виду:
Теперь проверим работоспособность. Для этого в модуле управляемого приложения конфигурации напишем код:
Взаимодействие с системой «1С: Предприятие»
Тип данных tVariant
При обмене данными между внешней компонентой и системой «1С: Предприятие» используется тип данных tVariant. Он описан в файле types.h, который можно найти на диске с ИТС:
- смесь (union), предназначенную непосредственно для хранения данных
- идентификатор типа данных
- Определение типа данных, которые в данный момент хранятся в переменной
- Обращение к соответствующему полю смеси, для непосредственного доступа к данным
Приложение
Выбор технологии
Платформа 1С:Предприятия представляет два способа, для подключения сторонних библиотек – это технология внешних компонент ( NativeAPI ), а также технология COM . Ввиду сложности использования технологии NativeAPI , для реализации функционала внешних компонент в среде 1С:Предприятие была выбрана технология COM . Несмотря на то, что она не является кросплатформенной, создание внешних компонент на основе этой технологии несложно и достаточно подробно описано в различных источниках, например:
Поскольку внешние компоненты OneScript используют типы, определенные в ядре движка, их непосредственное использование для создания COM компоненты затруднительно и наиболее быстрым подходом, является копирование функционала внешней компоненты путем создания промежуточных классов или Ctrl + C , Ctrl + V .
Пример реализации
В качестве примера реализации вышеизложенного подхода, используем компоненту преобразования текста, в формате markdown в текст, в формате html . Исходный код, а также бинарные файлы расположены по нижеследующим ссылкам:
Данная внешняя компонента OneScript реализует нижеследующие функции (в скобках указаны англоязычные наименования функций):
Получить Html Из Markdown(GetHtmlFromMarkdown)
ПолучитьСтрокуИз Markdown ( GetStringFromMarkdown )
В данном случае, мы создадим COM visible сборку, с функциями, имена которых совпадают с англоязычными наименованиями в компоненте OneScript и скопируем туда функционал исходных функций (в данном случае я использовал Ctrl + C , Ctrl + V ).
После компиляции, мы получаем dll , которую можно зарегистрировать как COM объект при помощи regasm и использовать в 1С:Предприятие.
Ниже приведены примеры использования компоненты из среды OneScript и 1С:Предприятие.
1 С : Предприятие
Как можно увидеть, код использования в 1С:Предприятие и OneScript полностью идентичен, за исключением создания объекта, что позволяет без особых трудозатрат переносить код между платформами.
Более сложный случай
К сожалению, не всегда есть возможность одинаковой реализации интерфейса в компоненте OneScript и COM объекте. В качестве примера такой библиотеки, рассмотрим компоненту, которая преобразует текст в формате yaml в дерево соответствий и массивов. Исходный код, а также бинарные файлы расположены по нижеследующим ссылкам:
Данная компонента имеет единственную функцию:
Прочитать Yaml ( ReadYaml )
И все бы ничего, однако функция возвращает не примитивный тип, а в общем случае дерево, состоящее из соответствий, массивов и примитивных типов. Соответственно в 1С:Предприятие эти коллекции будут выглядеть как COM объекты, а доступ к ним будет возможен при условии, что возвращаемые объекты являются COM visible и то, как показывает практика не всегда. На основании всего вышеизложенного возможны два варианта – это написание COM оберток к возвращаемым типам, с реализацией необходимого функционала или реализация функций доступа к элементам коллекций. Выберем второй вариант, как более простой.
Для реализации функционала библиотеки в среде 1С:Предприятие, создадим COM объект, реализующий необходимые функции:
ReadYamlString – осуществляет преобразование и возвращает дерево объектов как COM объект
GetValueType – возвращает тип объекта. 0 – Соответствие ( Dictionary ), 1 – Массив ( ArrayList ), 2 – Простое значение
GetByIndex – возвращает объект из массива по индексу .
GetByKey – возвращает объект из коллекции типа Соответствие по ключу.
ToArray – преобразует коллекцию соответствие в массив Структур Ключ, Значение
GetKeyByIndex – получает значение ключа по индексу из массива пар Ключ, Значение
GetValueByIndex – получает Объект по индексу из массива пар Ключ, Значение
После компиляции, мы получаем dll , которую можно зарегистрировать как COM объект при помощи regasm и использовать в 1С:Предприятие.
Теперь мы можем использовать необходимый функционал из 1С:Предприятие, однако, с переносимостью дела обстоят чуть лучше, чем никак.
Для обеспечения переносимости кода на прикладном уровне, создадим общий модуль примерно следующего содержания:
Теперь, разместив данный модуль в конфигурации и общих модулях web -приложения OneScript , мы получим прикладной код, который можно переносить между платформами OneScript и 1С:Предприятие простым копированием. В случае вышеописанной библиотеки, прикладной код в OneScript и 1С:Предприятие будет выглядеть примерно следующим образом:
Реализована работа с библиотекой MarkdigMarkdownProcessor как с обработкой для использования совместно с каркасной конфигурацией версии 2.0 . Подсистема для сравнения/объединения - БиблиотекаMarkdownПроцессор.
Теперь работа с библиотекой будет выглядеть примерно следующим образом:
Реализована работа с библиотекой YamlDotNet как с обработкой для использования совместно с каркасной конфигурацией версии 2.0 . Подсистема для сравнения/объединения - БиблиотекаYamlПроцессор.
Теперь, работа с библиотекой в OneScript и 1С:Предприятие выглядит примерно следующим образом:
Надеюсь, что все вышеизложенное поможет писать код, который можно без особых усилий переносить между OneScript и 1С:Предприятие .
Форум
Постановка задачи
Требуется создать простейшую систему учета для библиотеки, которая позволит выдавать книги читателям, отслеживать задолженности читателя и формировать отчеты по совершенным операциям за заданный период.
Конфигурация, по-видимому, должна содержать справочник Книги. У каждой книги есть уникальный библиотечный номер (код). Необходимо отметить, что может быть несколько экземпляров одного и того же произведения.
В программе должны фиксироваться следующие события:
- Выдача книг читателю из библиотеки на определенный срок
- Продление книги
- Возврат книги читателем в библиотеку
- Потеря книги читателем
Для каждого события в конфигурации необходимо предусмотреть соответствующий документ.
Правила работы библиотеки следующие:
- Читатель может взять в библиотеке только определенное количество книг (задается директором библиотеки).
- Читатель берет книги обычно на месяц, но может сразу взять книгу на больший срок, если явно скажет об этом.
- Читатель может продлевать книгу, т.е. сообщать о том, что он вернет ее позже указанного ранее срока.
- При просрочке возврата книги, читатель получает предупреждение.
- Когда предупреждений у читателя накапливается больше определенного предела, он лишается правом пользования библиотекой на 1 месяц.
- При потере книги читатель лишается правом пользования библиотекой на 1 месяц, независимо от количества предупреждений.
В программе должна быть возможность сформировать библиотечную выписку, которая показывает все совершенные операции за заданный период. Необходимо иметь возможность выбрать операции только по указанному читателю и/или по указанной книге.
В программе должна быть возможность узнать долги конкретного читателя на данный момент, т.е. какие книги у него сейчас на руках и когда он должен их вернуть.
Объекты конфигурации
В конфигурации потребуется создать следующие объекты:
Справочник "Произведения" (форма элемента)
Экранная форма элемента справочника Произведения выглядит следующим образом:
Справочник "Книги" (форма списка)
Экранная форма списка справочника Книги выглядит следующим образом:
Документ "Выдача книги"
Экранная форма документа выглядит следующим образом:
Модуль формы см. в конфигурации "Мини-библиотека".
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
СпрКниги.НайтиЭлемент(Книга);
СпрКниги.Статус = Перечисление.СтатусКниги.Выдана;
СпрКниги.Читатель = Читатель;
СпрКниги.ДатаВыдачи = ДатаДок;
СпрКниги.СрокВозврата = СрокВозврата;
СпрКниги.Записать();
Документ "Продление книги"
Экранная форма документа выглядит следующим образом:
Модуль формы см. в конфигурации "Мини-библиотека".
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
Если Число(НовыйСрокВозврата)<>0 Тогда
СпрКниги.НайтиЭлемент(Книга);
СпрКниги.СрокВозврата = НовыйСрокВозврата;
СпрКниги.Записать();
Документ "Возврат книги"
Экранная форма документа выглядит следующим образом:
Модуль формы см. в конфигурации "Мини-библиотека".
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
СпрКниги.НайтиЭлемент(Книга);
СпрКниги.Статус = Перечисление.СтатусКниги.Свободна;
СпрКниги.Читатель = 0;
СпрКниги.ДатаВыдачи = 0;
СпрКниги.СрокВозврата = 0;
СпрКниги.Записать();
Документ "Потеря книги"
Экранная форма документа выглядит следующим образом:
Модуль формы см. в конфигурации "Мини-библиотека".
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
СпрКниги.НайтиЭлемент(Книга);
СпрКниги.Статус = Перечисление.СтатусКниги.Списана;
СпрКниги.Читатель = 0;
СпрКниги.ДатаВыдачи = 0;
СпрКниги.СрокВозврата = 0;
СпрКниги.Записать();
УстановитьРеквизитСправочника(Читатель, "Блокирован", Перечисление.ДаНет.Да, ДатаДок);
УстановитьРеквизитСправочника(Читатель, "Блокирован", Перечисление.ДаНет.Нет, ДатаДок + Константа.КолвоДнейБлокировки);
Отчет "Библиотечная выписка"
Экранная форма диалога отчета выглядит следующим образом:
Пример работы отчета:
Модуль отчета см. в конфигурации "Мини-библиотека".
Отчет "Долги читателя"
Экранная форма диалога отчета выглядит следующим образом:
Пример работы отчета:
Модуль отчета см. в конфигурации "Мини-библиотека".
Дополнительные функции
Вам предлагается самостоятельно реализовать следующие дополнительные функции:
Цель блога описать интересные и полезные примеры программирования в системе 1С:Предприятие 8.
четверг, 25 октября 2012 г.
Учет книг в конфигурации "Библиотека"
Так получилось, что первое мое место работы было в компании франчайзи 1С. Когда я туда устроился, то был самым младшим и на меня вешали различного рода задачи - следить за бекапами, давать доступ к базам и другое. Компания обладала большой библиотекой, как и любой другой фран, примерно 300 книг по 1С, бухгалтерскому, налоговому учету, учету заработной платы и другие. И так получилось роль библиотекаря "доверили" мне. Я принимал новые книги, выдавал, возвращал. На тот момент весь учет книг велся в бумажном виде - просто записывалось кто когда взял. Ой как трудно было делать срез последних что бы узнать у кого книга, а потом еще искать ее на полке.
Сначала я для всех книг сформировал уникальные номера, потом а выстроил их на полках по порядку - это существенно ускорило работу, но эта таблица на листочке А4 мешала.
Тут вышла 8.2 и ее тогда еще мало кому известный управляемый интерфейс, и я подумал отличное время для изучения управляемых форм, заодно напишу конфигурацию, которая бы вела учет книг.
Может кому то знакома эта проблема с книгами - предлагаю посмотреть конфигурацию. Строго не судите, делал для обучения, возможны ошибки и недоработки.
В архиве конфигурация и выгрузка информационной базы с заполненными данными, тут может пригодится справочник книг, что бы не вбивать вручную.
Привет всем кто смотрит данную тему может из вас найдётся добрый человек которому не трудно будет собрать простенькую базу 1 с .
Вот описание:Минимальный список характеристик:
• Автор книги, название, год издания, цена, количество экземпляров, краткая аннотация;
• номер читательского билета, ФИО, адрес и телефон читателя, дата выдачи книги читателю и дата сдачи книги читателем, отметка о выбытии.
Книга имеет много экземпляров и поэтому может быть выдана многим читателям.
Выборки:
• Выбрать книгу, для которой наибольшее количество экземпляров находится "на полках" (не выданы читателям).
• Выбрать читателей, которые имеют задолженность более 4 месяцев.
• Определить книгу, которая была наиболее популярной весной 2000 года.
• Определить читателей, у которых на руках находятся книги на общую сумму более 100 руб.
Создание конфигурации "Учёт заявок на обслуживание компьютерной техники"
Доброго времени суток, хочу написать проект на 1С ПРЕДПРИЯТИЕ, но не знаю как, ранее с 1C не.
Создание конфигурации на тему "аренда мест на рынке".
Работ с арендаторами на рынке: аренда мест на рынке. Я добавил там справочники: ОбъектыАренды.
Создание конфигурации "Электронный журнал" в 1С Предприятие
Ребят,начал изучать 1С,попросили написать простенькую конфигурацию,чтобы была банальная анкета.
Создание конфигурации "Учет читателей"
Создаю конфигурацию "Учет читателей" Возник вопрос, а именно: 1. Возможно ли сделать печать.
у 1С есть уже готовые конфиги "Библиотека" и "Библиотека ПРОФ", прежде чем приступать к изобретению очередного велосипеда глянь сначала их
QwertyZ, типовые конфигурации глобальные. сложные и платные) ТС, как я понимаю, надо попроще и бесплатно
Создание конфигурации "Казначейство"
Распишите или подскажите пожалуйста,что должно быть в конфигурации тема казначейство. Какие.
Создание дипломного проекта "Электронная библиотека"
Здравствуйте. Пишу диполом на 1с. Электронная Библиотека. Итак суть проблемы: Я хотел бы чтобы в.
"Библиотека", проведение книг
Ребята, всем добрый день. Мне очень нужна ваша помощь! Мне необходимо создать конфигурацию.
Читайте также: