Получить данные с 1с
Приветствую, коллеги! В данной статье будет рассмотрена работа с объектами и ссылками в 1С 8.3, в том числе я расскажу о том, как получать объект по ссылке и наоборот – ссылку из объекта.
Ни для кого не секрет, что в системе 1С очень многое держится на привязке различных типов данных, так как главной задачей языка 1С является обработка данных, которые были получены при помощи запроса.
Чаще всего в 1С данные представляются в виде объектов, хотя бывают случаи, когда данные выступают в роли таблицы. Например, рассмотрим объект «Справочник.ИмяСправочника»: он регулирует работу с определённым справочником, но и у самого объекта есть в наличии свойства (в данном случае – это поля с данными), а также присутствуют методы.
Объект в системе 1С создаётся при помощи специального оператора «Новый», после чего используется соответствующий конструктор для создания объектов. Если у типа объекта может существовать несколько конструкторов, то конструктор для создания объекта будет избран при помощи параметров, как показано в строке программного кода ниже:
Рис. 1 Выбор конструктора объектов для создания объектов
2. Менеджеры получения объектов системы 1С
Если необходимо создать объект 1С, который будет иметь связь с базой данных, то используются особые менеджеры, а не оператор «Новый».
Для всех видов метаданных есть соответствующий менеджер объектов 1С, который осуществляет получение значения из базы с данными, опираясь на признак, либо создание новой базы. Пример кода с созданием объекта через менеджер указан ниже:
Рис. 2 Создание объекта менеджером в 1С
3. Ссылки и объекты в 1С 8.3
Работа с объектами системы 1С:Предприятие может производится при помощи ссылки на данные, либо при помощи самого объекта.
Ссылки в языке 1С – это особые данные, которые можно только считывать. А объект в языке 1С – это данные, которые можно и считывать, и менять, и записывать.
Работа с ссылками выполняется гораздо быстрее, нежели с объектами.
Чтобы получить ссылку на объект, в 1С можно воспользоваться функцией, которая имеет следующий вид:
Рис. 3 Функция, чтобы получить ссылку на объект в 1С
Чтобы получить объект по ссылке, нужно воспользоваться функцией следующего вида:
Рис. 4 Функция, чтобы получить объект по ссылке
Также его можно создать с нуля при помощи следующей функции:
Рис. 5 Вариант функции получения объекта по ссылке
4. Как получить объект по ссылке?
Пускай некоторая переменная «СсылкаНаОбъект» принадлежит какому-то типу ссылки. Это может быть справочник, документ, план по счетам и так далее. Опираясь на это, мы используем специальную функция для того, чтобы получить объект по ссылке в 1С. Выглядит она следующим образом:
Рис. 6 Использование переменной СсылкаНаОбъект
5. Получение ссылки по объекту в 1С 8.3
Рассмотрим обратную процедуру, а именно: получение ссылки из объекта. Пусть есть некоторая переменная «Объект», которая является каким-то из объектных типов, тогда функция для получения ссылки из объекта будет выглядеть так:
Рис. 7 Переменная СсылкаНаОбъект для получения ссылки по объекту
Следует отметить, что реквизит «Ссылка» в 1С может быть заполнен только во время записи самого объекта. В случае, если объект не был прописан, то и соответствующей ссылки существовать не будет.
Специалист компании «Кодерлайн»
Вас могут заинтересовать следующие статьи:
94 [PROP_CODE] => TAGS2 [TITLE] => Вас могут заинтересовать следующие семинары: ) --> 95 [PROP_CODE] => TAGS [TITLE] => Вас могут заинтересовать следующие вебинары: ) -->
Вас могут заинтересовать следующие вебинары:
Программирование в 1С [1] => 1С:Бухгалтерия [2] => 1С:Управление производственным предприятием [3] => 1С: Розница [4] => 1С: CRM [5] => 1С: Управление торговлей [6] => Бюджетирование [7] => СКД [8] => 1С: Конвертация данных [9] => Администрирование 1С [10] => Конвертация данных [11] => Лицензии 1С [12] => Оптимизация [13] => 1С: Документооборот [14] => 1С: ERP [15] => Транспортная логистика [16] => Техническое задание [17] => Продажи [18] => Ценообразование [19] => Планирование [20] => MS SQL Server [21] => Полезные обработки [22] => МСФО [23] => Отчеты в 1С [24] => XML [25] => Внедрение ERP [26] => Перенос данных [27] => Торговое оборудование [28] => РСБУ [29] => 1С:Управление корпоративными финансами [30] => 1С: Колледж [31] => 1С: Аренда и управление недвижимостью [32] => Финансовый учет ) -->
Решил написать статью о том, как вытягивать данные из 1С путем SQL запросов. Все нижесказанное касается 1С версии 8.2, оно также должно работать и в 1С версии 8.1. Особое внимание уделено проблеме с извлечением заголовков перечислений.
В идеале выборку данных из 1С должен делать 1С-программист. Хорошо, если он создаст обработку, которая выдаст данные в так называемую «буферную базу»: csv файлы, таблицы в SQL – что угодно. Проектировщик ХД и ETL должен брать данные из буфера.
В этом случае все работает предельно хорошо: зоны ответственности разделены, если найдена ошибка в данных отчета – ее вначале ищут в кубе, если в кубе все ОК – ищут в ХД, если в ХД все ОК – ищут в ETL, если в ETL все хорошо – значит пускай 1С-программист сам разбирается где у него ошибка в обработке, заполняющей «буферную БД».
Но не всегда такой способ доступен. Бывает, что 1С-специалиста либо вообще нет, либо слишком занят, либо мощностей железа не хватает, чтобы «выталкивать» данные из 1С с помощью обработки. И остается одно – делать извлечение данных с помощью SQL запросов.
Вот это собственно и есть этот способ – «сделать SQL запрос на 1С-базу». Главная задача – корректно написать сами запросы. Я думаю, ни для кого не есть секретом, что в 1С структура данных «хитрая», и что поля и таблицы имеют замысловатые названия. Задача проектировщика ETL – вытянуть данные из этой структуры.
Просмотр метаданных
Существуют обработки, дающие возможность просмотреть то, какие поля справочников/документов в каких таблицах/полях базы данных находятся.
Здесь Вы можете скачать несколько таких обработок (которые мы «отфильтровали» путем перебора десяток подобных, выбрав наилучшие). Они делают почти одно и то же – позволяют посмотреть все поля, понять какое поле на какой справочник ведет, и даже предлагают автоматически построить запрос:
Таким образом, начинаем исследовать нужные нам документы:
Дальше открываем любой из них, и находим то, куда он записывается – в какие регистры:
Ну а дальше найти этот регистр и сгенерировать SQL запрос с помощью показанных выше обработок (как на первом рисунке) не составляет труда.
Мы делаем как правило два уровня SQL запросов: «нижний уровень» — вьюхи для переименования полей, «верхний уровень» – вьюхи, которые берут данные из нижнего уровня, и уже они делают необходимые джойны.
Перечисления
Есть одна большая проблема – это перечисления. Пример:
И теперь если попытаться вытянуть это поле из базы напрямую, то получим вот что:
Да, мы нашли где заголовки перечислений сидят: таблица называется Config, в ней – image поля, в которых сидит зазипованный набор байт, который если раззиповать – получим непонятной структуры набор символов, разделителей и т.д. К сожалению, этот формат данных не документирован.
Вы можете скачать ее отсюда.
Запускается вот так:
Делает следующее: коннектится к 1С с помощью COM, берет оттуда все перечисления, и кладет их в указанную вами таблицу указанной базы, предварительно почистив ее. Таблица должна иметь следующую структуру
Дальше понятно, что SSIS-пакет (или другой механизм) может запустить этот код перед тем, как извлекать данные фактов/справочников, и мы получим заполненную таблицу
Если у Вас будут замечания или дополнительные идеи – все они с радостью принимаются, пишите на ibobak at bitimpulse dot com.
Всем привет! Данная небольшая статья будет посвящена некоторым полезным процедурам и функциям, которые используются достаточно часто. Многие программисты их "изобретают" вновь и вновь с каждой задачей, а они уже существуют готовые, написаны и находятся в модулях "Общего назначения" в типовых конфигурациях, основа которых - это библиотека стандартных подсистем (БСП).
Посыл этой статьи - это прежде всего небольшая "шпаргалка для всех желающих", ну и, если можно так сказать, борьба с "велосипедами". Начинающим и опытным программистам, я надеюсь, что данная статья будет полезна.
Примеры будут приведены для типовой конфигурации БСП, сейчас это - версии 3.1.6.137 на Платформе 1с 8.3.20.1674.
Как обычно, я разобью статью на несколько частей:
1. Работа с данными - таблицы, структуры, массивы и соответствия.
2. Сохранение, чтение и удаление настроек из хранилища.
3. Оповещения пользователя.
Во всех частях я приведу примеры работы - таблицами, массивами, структурами, соответствиями, хранилищем, и типовым БСП оповещениями пользователя об ошибках.
Переходим к первой части статьи - работа с данными.
1.Работа с данными - таблицы, структуры, массивы и соответствия
В данном разделе, как указано в заголовке, привожу некоторые полезные примеры работы с таблицами, структурами, массивами и соответствиями. Перечисленные процедуры и функции находятся в модуле БСП - ОбщегоНазначенияКлиентСервер. Итак:
1.1. Процедура ДополнитьТаблицу(ТаблицаИсточник, ТаблицаПриемник) Экспорт
Процедура дополняет таблицу значений - приемник данными из таблицы значений - источника.
1.2. Процедура ДополнитьТаблицуИзМассива(Таблица, Массив, ИмяПоля) Экспорт
Данная процедура дополняет таблицу значений Таблица значениями из массива.
1.3. Процедура ДополнитьМассив(МассивПриемник, МассивИсточник, ТолькоУникальныеЗначения = Ложь) Экспорт
Процедура дополняет массив приемник значениями из массива источника.
1.4. Процедура ДополнитьСтруктуру(Приемник, Источник, Заменять = Неопределено) Экспорт
Процедура дополняет структуру значениями из другой структуры.
1.5. Процедура ДополнитьСоответствие(Приемник, Источник, Заменять = Неопределено) Экспорт
Данная процедура дополняет соответствие значениями из другого соответствия.
1.6. Процедура УдалитьВсеВхожденияЗначенияИзМассива(Массив, Значение) Экспорт
Процедура удаляет все вхождения переданного значения из массива.
1.7. Процедура УдалитьВсеВхожденияТипаИзМассива(Массив, Тип) Экспорт
Данная процедура удаляет все вхождения значений указанного типа.
1.8. Процедура УдалитьЗначениеИзМассива(Массив, Значение) Экспорт
Процедура удаляет одно значение из массива.
1.9. Функция СвернутьМассив(Знач Массив) Экспорт
Функция возвращает копию исходного массива с уникальными значениями.
1.10. Функция РазностьМассивов(Знач Массив, Знач МассивВычитания) Экспорт
Результат функции - разностью двух массивов, содержащая все элементы первого массива, не существующие во втором массиве.
1.11. Функция СпискиЗначенийИдентичны(Список1, Список2) Экспорт
Функция сравнивает элементы списков значений или массивов по значениям.
1.12. Функция ЗначениеВМассиве(Значение) Экспорт
Данная функция создает массив и помещает в него переданное значение.
1.13. Функция КлючиСтруктурыВСтроку(Структура, Разделитель = ",") Экспорт
Результат работы функции - строка, содержащая ключи структуры, разделенные символом разделителя.
1.14. Функция СвойствоСтруктуры(Структура, Ключ, ЗначениеПоУмолчанию = Неопределено) Экспорт
Функция возвращает значение свойства структуры.
1.15. Функция ПустойУникальныйИдентификатор() Экспорт
Функция возвращает пустой уникальный идентификатор.
На этом закончим первую часть статьи - описании работы с данными и переходим ко второй - работа с хранилищем.
2. Сохранение, чтение и удаление настроек из хранилища.
Перечисленные процедуры и функции находятся в модуле БСП - ОбщегоНазначенияВызовСервера. Отмечу, что в данном разделе, я рассмотрю несколько примеров, касаемых данных форм.
2.1. Процедура ХранилищеНастроекДанныхФормСохранить(КлючОбъекта, КлючНастроек, Настройки, ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено, ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт
Сохраняет настройку в хранилище настроек данных форм, как метод платформы Сохранить.
2.2. Функция ХранилищеНастроекДанныхФормЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено, ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт
Загружает настройку из хранилища настроек данных форм, как метод платформы Загрузить.
2.3. Процедура ХранилищеНастроекДанныхФормУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт
Удаляет настройку из хранилища настроек данных форм, как метод платформы Удалить.
Далее, переходим к третьей части статьи - оповещение пользователя.
3. Оповещения пользователя .
Перечисленные процедуры и функции находятся в модуле БСП - ОбщегоНазначенияКлиентСервер.
3.1. Процедура ДобавитьОшибкуПользователю(Ошибки,ПолеОшибки, ТекстДляОднойОшибки, ГруппаОшибок = Неопределено,НомерСтроки = 0,ТекстДляНесколькихОшибок = "",ИндексСтроки = Неопределено) Экспорт
Процедура добавляет в список ошибок новую ошибку пользователя для дальнейшей отправки с помощью процедуры СообщитьОшибкиПользователю()
3.2. Процедура СообщитьОшибкиПользователю(Ошибки, Отказ = Ложь) Экспорт
Процедура выводит накопленные методом ДобавитьОшибкуПользователю ошибки.
Возвращает текст ошибки заполнения полей и списков.
3.4. Функция ПутьКТабличнойЧасти(Знач ИмяТабличнойЧасти, Знач НомерСтроки, Знач ИмяРеквизита) Экспорт
Функция формирует путь к заданной строке НомерСтроки и колонке ИмяРеквизита.
На этом, пожалуй, все - перейдем к заключению и выводам.
Заключение и выводы
Целью данной статьи, как я написал выше, - является создание небольшой "шпаргалки" для работы с классическими объектами в рамках возможностей библиотеки стандартных подсистем. Естественно, статья не претендует на новшества - их и нет тут, но под рукой ее будет держать полезно - просто быстро посмотрел, вспомнил, скопировал - сразу получил практический результат. Будет полезна всем.
Так же, прошу обратить внимания на следующие статьи по функционалу библиотеки стандартных подсистем, написанных мной ранее. Уверен, что они так же будут полезны вам:
Мои предыдущие интересные материалы по использованию функционала БСП
Спасибо за внимание, до новых встреч. Комментарии отключены - у кого есть вопросы - пишите в личку.
В статье Пример создания кадрового отчета для ЗУП 3.1 была попытка донести до коллег, начинающих доработку ЗУП, что данные в этой конфигурации необходимо получать с помощью программного интерфейса и так называемого механизма замены представлений.
Для дальнейшего изучения этих механизмов попробуем решить такую задачу. Допустим, мы разрабатываем внешнюю печатную форму к справочнику Сотрудники и нам требуются следующие данные: Подразделение, должность по штатном расписанию, фот позиции. Решим задачу тремя разными способами.
В общих модулях ЗУП есть функции для получения данных например, КадровыйУчет.КадровыеДанныеСотрудников(). Воспользуемся ими для решения задачи. Нам требуются кадровые данные сотрудников и данные по позиции штатного расписания сотрудника. Логично предположить, что функцией КадровыйУчет.КадровыеДанныеСотрудников мы вряд-ли такие данные получим. Нужно искать другие функции::
Как видно, код очень простой и компактный. Мне это решение не нравится по нескольким причинам.
- Не все функции для получения данных находятся в программном интерфейсе соответствующего общего модуля. Вендор не обещал обратную совместимость для служебных процедур и функций, которой как раз и является функция УправлениеШтатнымРасписанием.ДанныеПозицийШтатногоРасписания(..).
- К функции выше нет описания. Приходится тратить время на то, чтобы понять что она делает и что надо для ее вызова.
- Таким образом получается несколько коллекций с нужными значениями. Нам требуется их обработать и создать одну коллекцию.
Посмотрим внутрь функции КадровыеДанныеСотрудников(). На вид она очень простая. Создается запрос с менеджером временных таблиц, отрабатывает процедура по созданию временной таблицы с кадровыми данными СоздатьНаДатуВТКадровыеДанныеСотрудников(). Если мы заглянем внутрь функции ДанныеПозицийШтатногоРасписания(), то обнаружим там тоже процедуру по созданию временной таблицы.
Воспользуемся процедурами по созданию временной таблицы в менеджере.
Для временных таблиц запроса с представлениями требовалось определить таблицы-фильтры для отбора данных. В нашем примере такой таблицей служит первая временная таблица с полученными кадровыми данными, конкретно 2 поля, позиция штатного расписания и период.
Теперь мы также имеем 2 источника с нужными данными и в запросе из них получить нужный нам набор легче, чем из коллекций.
Данное решение сложнее первого, но, на мой взгляд, более интересное. Ну и можно заметить, что менеджер временных таблиц осень часто встречается в типовом коде ЗУП.
Но и тут есть крайне досадные недостатки.
- Процедуры по созданию временных таблиц во всех модулях находятся в служебном программном интерфейсе.
- Они почти нигде не описаны. Приходится тратить время на отладчик и на поиск примеров в типовом коде, чтобы понять как ими воспользоваться.
Общий недостаток первых двух способов , что данные получаются за несколько обращений к базе. А очень хочется получить все нужные данные одним запросом и уже работать в оперативной памяти с коллекцией. Конечно, в рамках печатной формы вряд ли это серьезный недостаток, но 1С-совесть за это не дает покоя.
Мы собрали запрос-пустышку. А что если и тут поступить так же? Соберем пустышку :
Получим реально исполняемый запрос процедурой ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц()
Как видно выходных данных у нас немного, но запрос наш просто монстр. Да, он выполнится за одно обращение к базе но получит кучу ненужных данных. 1С-совесть спать не даст.. Полагаю, механизм замены представлений написан для отчетов, поэтому разработчики не заботились об оптимизации запроса, да и зачем? Если СКД сама это сделает. Так и поступит.
Создаем СКД программно, связываем с компоновщиком, компонуем макет.
Запрос в макете компоновки заметно похудел.
Отлично. Дальше дело вкуса. Можно вывести результат в коллекцию, можно получить выборку.
Конечно, и этот метод не идеален.
- Требуются дополнительные усилия по созданию СКД, тем более полностью программно.
- Получение макета компоновки, как правило, занимает много времени.
Однако , мне такой способ видится наиболее полезным.
Макет компоновки можно закешировать, как, тема не этой статьи, но способы оптимизации есть. Работа со схемой компоновки данных мне видится гораздо более полезной для опыта разработчика , нежели изучение дебрей ЗУП на предмет поиска способов вытащить данные. Здесь мы знаем лишь об одной функции ЗарплатаКадрыОбщиеНаборыДанных.ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц() И из нее, если нам надо, можем распутать клубок с процедурами по созданию временных таблиц. Да, эта функция тоже находится в служебном программном интерфейсе, но если разработчик ее переименует или изменит, будет проще разобраться в работе одной функции, чем искать, куда переехала СоздатьВТ из УправленияШтатнымРасписанием.
К статье прилагается обработка с примерами. Тестировалось на релизе Зарплата и управление персоналом КОРП, редакция 3.1 (3.1.14.369).
В обычном приложении у элемента формы 1С 8.3 было свойство "Значение", доступное как для чтения, так и для записи. Какой аналог в управляемом приложении?
Элементы формы 1С 8.3 могут содержать реквизиты двух видов: реквизиты объекта 1С и реквизиты формы.
Красным помечен реквизит объекта 1С Контрагент, а зеленым – реквизит формы в 1С.
Интерактивно выберем эти элементы в пользовательском режиме 1С и попробуем прочитать их «программно» кнопкой «Прочитать».
Если читать значения реквизитов в клиентской процедуре, то код для 1С Предприятия будет следующий:
Все бы хорошо: мы получили на клиенте значения реквизитов объекта 1С и формы, но – не значения элементов формы 1С. На клиенте значение элементов формы 1С получить нельзя.
2. Как получить значения из элементов формы 1С
Чтобы получить значения из элементов формы 1С, нам потребуется серверный вызов:
Именно на сервере у элемента формы 1С 8.3 становится доступно свойство ПутьКДанным, по которому его можно извлечь либо из Объекта, который имеет тип ДанныеФормыСтруктура:
…либо из Формы, которая имеет тип ФормаКлиентскогоПриложения:
Форма и ее элементы не видны на сервере без контекста. То есть код для 1С:Предприятия выдаст множество ошибок.
Также Форму нельзя передать как параметр в процедуру и функцию на сервер или в общий модуль.
Еще хочется разобрать момент, когда нам возможно увидеть состояние различающихся значений в элементе форме 1С и в объекте. Это возможно в событии элемента ОбработкаВыбора.
Например, при значении поля Контрагент - Ассоль, мы выбрали контрагента Бакалея:
Новое значение доступно как параметр процедуры ВыбранноеЗначение.
Система дает шанс что-то сделать в этой ситуации.
Специалист компании ООО «Кодерлайн»
Вас могут заинтересовать следующие статьи:
94 [PROP_CODE] => TAGS2 [TITLE] => Вас могут заинтересовать следующие семинары: ) --> 95 [PROP_CODE] => TAGS [TITLE] => Вас могут заинтересовать следующие вебинары: ) -->
Вас могут заинтересовать следующие вебинары:
Читайте также: