Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
25 ноя 2024, 12:13

Доступ к элементу формы

Автор The_Immortal, 17 июн 2014, 15:29

0 Пользователей и 1 гость просматривают эту тему.

The_Immortal

Всех приветствую!

Есть конфигурация ЗиКБУ, в которой имеется справочник Сотрудники. У каждого сотрудника есть занимаемая ставка, которая на форме присутствует в закладке "Кадровые данные":



Необходимо программно получить данное значение, причем не обращаясь к элементам формы. Я пытался понять откуда берутся эти данные, т.к. соответствующего реквизита к справочнику нет. Оказалось, что это регистр сведений:


, а поле "Занимаемых ставок" - это Ресурс в Регистре Сведений "РаботникиОрганизаций".

Только вот как достучаться до этого Ресуерса, увы, идей нет...
Я получаю данные из 1С посредством COMConnection из VBA.

Пример:
    Set Ref = v8.Справочники.СотрудникиОрганизаций.НайтиПоНаименованию("Иванова Светлана Витальевна")
    If Ref.Наименование = "" Then
...
, где Ref - ссылка на элемент справочника "Сотрудники", а Ref.Наиманование - соответствующее свойство.

Я пробовал обращаться таким образом:
Ref.МестоРаботы.ЗанимаемыхСтавок.Значение, но это неправильно...

У регистра сведений "РаботникиОрганизаций" есть измерение "Сотрудник", у которого тип "СправочникСсылка.СотрудникиОрганизаций". Я пытался получить конкретные значения по регистру:
Regist = v8.РегистрыСведений.РаботникиОрганизаций.ЗанимаемыхСтавок.ПолучитьПоследнее(Ref), но так тоже не выходит.

Будьте добры, подскажите, пожалуйста, в каком направлении копать?


Спасибо!

pavl_vs

Это можно сделать так:
ВЫБРАТЬ
РаботникиОрганизацийСрезПоследних.Сотрудник КАК Сотрудник,
РаботникиОрганизацийСрезПоследних.ЗанимаемыхСтавок
ПОМЕСТИТЬ ВТСотрудники
ИЗ
РегистрСведений.РаботникиОрганизаций.СрезПоследних(&ДатаАктуальности, ) КАК РаботникиОрганизацийСрезПоследних
ГДЕ
РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)

The_Immortal

pavl_vs,
Цитата: pavl_vs от 17 июн 2014, 16:39
Это можно сделать так:
...

Благодарю! А нельзя как-нибудь попроще? Я выше специально показал, какими примитивными действиями могу оперировать через COM. Боюсь, что приведенный пример едва ли можно адаптировать под нужный синтаксис...

Dethmontt

[/code]
Цитата: The_Immortal от 17 июн 2014, 16:50А нельзя как-нибудь попроще?
Проще чем вам написали некуда!
Цитата: The_Immortal от 17 июн 2014, 16:50Боюсь, что приведенный пример едва ли можно адаптировать под нужный синтаксис...
Если не знаете как сделать, это не значит что этого сделать нельзя...
Запрос = v8.Newobject("Запрос");
Запрос.Текст = "Текст что привели выше";
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

pavl_vs

Куда уж проще! - всего четыре содержательных строки.
Вы же написали "программными средствами". Регистр сведений содержит нужную Вам информацию на любую разумную дату и то, что написано мною, является обычным делом.
Временную таблицу можно исключить (она хороша в консоли запросов).

The_Immortal

Dethmontt, благодарю, буду пробовать.

Правильно ли я понимаю, что результат запроса - не уволенные сотрудники и соответствующие им ставки на сегодняшний день?

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

Варианты:
1 (самый простой). Программно выполнить встроенный отчет "Списки сотрудников" (там формируется вся нужная инфомрмация), это дело экспортировать в xml/xls и потом уже делать сравнение средствами VBA.
Трудности: как запустить этот отчет из того же VBA - я не представляю. По идее, можно сделать внешнюю обработку и запускать ее (в фоновом режиме), которая будет формировать отчет и экспортировать его в xls, но и это я не знаю как реализовать :(

2. Все делать из VBA, не обращаясь к промежуточным файлам, что я сейчас и пытаюсь делать...

pavl_vs

С этого и надо было начинать!

Второе, как мне представляется, невозможно. Если я не прав - коллеги поправят.

Поэтому - первое. Но здесь не все в порядке: отчет Списки сотрудников берет начальные данные, на момент приема, а не "срез последних".
Если я правильно понял и если бы мне пришлось провести описанное сравнение базы 1С и xls-данных (и особенно, если это делать необходимо регулярно), то сделал бы небольшой внешний, например, отчет с выгрузкой всех необходимых данных по сотру (или по списку) в Excel-файл; ну а дальше VBA.

The_Immortal

pavl_vs,
Цитата: pavl_vs от 17 июн 2014, 17:43Второе, как мне представляется, невозможно.
Эм... Может быть, я что-то не так описал. Вроде как ничего не возможного. Мне в переменную типа Object надо поместить результат Вашего запроса, ну а дальше уже мелочи.
Правда, результат запроса, поместить все равно не удается (запрос упростил для примера):
        Set Запрос = v8.NewObject("Запрос")
        Запрос.Текст = "ВЫБРАТЬ РаботникиОрганизацийСрезПоследних.Сотрудник КАК Сотрудник, РаботникиОрганизацийСрезПоследних.ЗанимаемыхСтавок КАК Ставка"
        Set Выборка = Запрос.Выполнить()
- на последнюю строку выдается ошибка
ЦитироватьApplication-defined or object-defined error 1001
Dethmontt, не подскажите, в чем может быть проблема?


Цитата: pavl_vs от 17 июн 2014, 17:43Но здесь не все в порядке: отчет Списки сотрудников берет начальные данные, на момент приема, а не "срез последних".
Не очень понял, что Вы имели в виду. Данный отчет формирует актуальные на данный момент ставки. Это точно. Или мы о разном говорим?

cska-fanat-kz

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

1С_КомОбъект.ЭкспортныйМетод();
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Dethmontt

Цитата: The_Immortal от 17 июн 2014, 18:00Application-defined or object-defined error 1001
Dethmontt, не подскажите, в чем может быть проблема?

Почитай про маршалинг на MSDN будет полезно.

При выполнении запроса в чужой среде (VBA) нужно стараться избавляться от сложных типов

Ты тянешь ссылку в VBA
"ВЫБРАТЬ РаботникиОрганизацийСрезПоследних.Сотрудник КАК Сотрудник,
Тяни строку так как ссылка тебе в VBA не пригодиться =)))
"ВЫБРАТЬ РаботникиОрганизацийСрезПоследних.Сотрудник.Наименование КАК Сотрудник,
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск