Версия для печати темы (https://pro1c.org.ua/index.php?showtopic=5516)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Получить значение реквизита ДатаБазыИндекса в спр. Сотрудники

Автор: ignsv 03.12.11, 18:07

Делаю перенос с 7.7 в 8.2. с БУХ в БУХ (знаю, надо пользоваться типовой обработкой. Но тут много индивидуального)
При формировании документа "Прием на работу в организацию" в 8.2. мне надо получать с спр.Сотрудники (7.7.) значение "Дата увеличения з/п" - ДатаБазыИндекса;

Тест такой:
спр - тут мы уже получили с 7.7 записи справочника и обрабатываем их...

        спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 1 Цикл       
        
        СпрИ = Спр.ТекущийЭлемент();  
        Если СпрИ.ЭтоГруппа() = 1  Тогда    
        Продолжить;
        Иначе
                 сотр = Справочники.СотрудникиОрганизаций.НайтиПоНаименованию(СпрИ.Наименование).Ссылка;
                
        НовСтр     = Док.РаботникиОрганизации.Добавить();     
        НовСтр.ДатаПриема     = СпрИ.ДатаПриема;
        НовСтр.Сотрудник     = Сотр;
                                        .....


Проблема в чем : ДатаБазыИндекса - его и нету в списке реквизитов и получить его я не могу.
ни так : СпрИ.ДатаБазыИндекса
ни так:СпрИ.ДатаБазыИндекса .Получить(ДатаОстатков)

Автор: mister-x 03.12.11, 18:10

Цитата
Проблема в чем : ДатаБазыИндекса - его и нету в списке реквизитов и получить его я не могу.
тобто це реквізит форми? якщо - так, тоді потрібно подивитись логіку його заповнення

Автор: ignsv 03.12.11, 18:12

Вобщем подскажите как мне получить нужные значения . Заранее спасибо

ні.

стоп я вже запутався . я в 7.7 взагалі не працював . тобто так виходить що він реквізит форми

Автор: mister-x 03.12.11, 18:23

а що у 8.2 немає реквізитів форми - є

Цитата
тоді потрібно подивитись логіку його заповнення
скористайтесь в модулі форми довідника у 7.7 контекстним пошуком ДатаБазыИндекса

Автор: ignsv 03.12.11, 18:24

з коду довідника "Сотрудники" в 7.7:

1. спочатку ДатаБазыИндекса прив`язуються до ДатыПриема

Процедура ИзмДатаПриема()
    Если Выбран() = 0 Тогда
        ДатаБазыИндекса = ДатаПриема;
    КонецЕсли;
КонецПроцедуры


2.
Процедура СохранитьДатаБазыИндекса()   
    Если дСтараяДатаНачаларасчетаИндексации = ДатаБазыИндекса Тогда
        Возврат;
    КонецЕсли;
    
    Если Выбран() = 0 Тогда
        Записать();
    КонецЕсли;
    
    Если ПустоеЗначение(ДатаБазыИндекса) = 1 Тогда
        ДатаБазыИндекса = глДатаНачалаРасчетаИндексации    
    КонецЕсли;
    
    Спр = СоздатьОбъект("Справочник.Сотрудники");
    Спр.НайтиЭлемент(ТекущийЭлемент());
    Спр.ПризнакИзмененияДоходаДляИндексации.Установить(НачМесяца(ДатаБазыИндекса),1);
    Спр = "";
КонецПроцедуры


3.
Процедура ПриОткрытии()     
    СохранениеПериодическихРеквизитов(2, "*");
    
    Форма.ИспользоватьЗакладки(1);
    Форма.Закладки.ДобавитьЗначение("Основной","Общие");
    Форма.Закладки.ДобавитьЗначение("Зарплата","Данные по з/п");
    Форма.Закладки.ДобавитьЗначение("Паспорт","Паспортные данные");
    Форма.Закладки.ДобавитьЗначение("Налоговые","Налоговые данные");
    Форма.ИспользоватьСлой("Основной, Общий",2);
    
    Активизировать("Фамилия",0);
    Если Выбран() = 1 Тогда
        НачФирма = Фирма;
    КонецЕсли;

    Если ПустоеЗначение(ТекущийЭлемент()) = 1 Тогда
        ДатаБазыИндекса = глДатаНачалаРасчетаИндексации;
    Иначе
        ДатаБазыИндекса = глПрочитатьДатуИзмененияДоходаДляИндексации(ТекущаяДата(),"ПризнакИзмененияДоходаДляИндексации",ТекущийЭлемент());
        ДатаБазыИндекса = Макс(ДобавитьМесяц(ДатаБазыИндекса, -1), глДатаНачалаРасчетаИндексации)
    КонецЕсли;
    дСтараяДатаНачаларасчетаИндексации = ДатаБазыИндекса;

    УстДоступность();
КонецПроцедуры

Автор: mister-x 03.12.11, 19:32

ось ключові стрічки

ДатаБазыИндекса = глПрочитатьДатуИзмененияДоходаДляИндексации(ТекущаяДата(),"ПризнакИзмененияДоходаДляИндексации",ТекущийЭлемент());
ДатаБазыИндекса = Макс(ДобавитьМесяц(ДатаБазыИндекса, -1), глДатаНачалаРасчетаИндексации)

потрібно ще проаналізувати процедуру глПрочитатьДатуИзмененияДоходаДляИндексации і змінну глДатаНачалаРасчетаИндексации

Автор: Pepe 03.12.11, 20:18

Я так зрозумів, що це все потрібно для розрахунку індексації. Вона нараховується через два місяці після прийому співробітника:

...ДатаБазыИндекса = ДатаПриема
дСтараяДатаНачаларасчетаИндексации = ДатаБазыИндекса....,

або через два місяці після зміни ставки заробітної плати.

Автор: mister-x 03.12.11, 21:26

Цитата
...ДатаБазыИндекса = ДатаПриема
перекидаються вже записані елементи довідника - тому процедура ИзмДатаПриема() не використовується

Автор: igmig65 03.12.11, 23:57

Цитата
Проблема в чем : ДатаБазыИндекса - его и нету в списке реквизитов и получить его я не могу.
ни так : СпрИ.ДатаБазыИндекса
ни так:СпрИ.ДатаБазыИндекса .Получить(ДатаОстатков)

В бух 77, этот реквизит заполняется функцией, при открытии элемента Вашего СпрИ. Чтоб получить актуальное значение(на вашу ДатуОстатков??или ДатуЗагрузки/выгрузки?), нужно найти значение (1) периодического реквизита ПризнакИзмененияДоходаДляИндексации текущего СпрИ на эту дату . тоестьэто целая функция (глобальная), которая возвращает дату: Функция глПрочитатьДатуИзмененияДоходаДляИндексации(НП, ИмяРеквизита, Объект = "") Экспорт

Автор: alex1c 04.12.11, 13:16

Цитата(igmig65 @ 03.12.11, 23:57) *
В бух 77, этот реквизит заполняется функцией, при открытии элемента Вашего СпрИ. Чтоб получить актуальное значение(на вашу ДатуОстатков??или ДатуЗагрузки/выгрузки?), нужно найти значение (1) периодического реквизита ПризнакИзмененияДоходаДляИндексации текущего СпрИ на эту дату . тоестьэто целая функция (глобальная), которая возвращает дату: Функция глПрочитатьДатуИзмененияДоходаДляИндексации(НП, ИмяРеквизита, Объект = "") Экспорт

а реквизит в справочнике называется "ПризнакИзмененияДоходаДляИндексации", но пользоваться надо функцией глПрочитатьДатуИзмененияДоходаДляИндексации

Автор: ignsv 04.12.11, 15:14

если нужно запускать функцию для выдачи Искомой даты. Нужные параметры : 1.ПризнакИзмененияДоходаДляИндексации - 0/1 получаем. 2. дата тоже есть. 2.текущий элемент(спрИ) тоже есть.
Подскажите как мне заставить выполнять нужную функцию .. ( к справочнику в 7.7 я попадаю так:

ТекСправочникИ = "Сотрудники";
спр = БазаИ.CreateObject("Справочник."+ТекСправочникИ);

Автор: sava1 04.12.11, 16:37

Варианта2
1.Выгружаем справочник из 7 а в 8 загружаем
2.По ОЛЕ - пишем 7-й запрос с получением даты изменения
2,5. Можно поиграться с EvalExpr() (в 7 написать функцию с Экспорт)

Автор: sava1 04.12.11, 19:05

вдогонку

V7 = Новый COMобъект("V77.Application");
СпрНом = V7.CreateObject("Справочник.Номенклатура");
СпрЦены = V7.CreateObject("Справочник.Цены");
Периодический = V7.CreateObject("Периодический");
....
....
Периодический.ИспользоватьОбъект("Цена",СпрЦены);
Периодический.ВыбратьЗначения();
Пока Периодический.ПолучитьЗначение() > 0 Цикл
   //В цикл не входит хотя в 1с7  4 раза изменялась цена

        Строка = СписокНовыхЦен.Добавить();
    Строка.Дата = Периодический.ДатаЗнач;
    Строка.Цена = Периодический.Значение;
КонецЦикла;

Автор: Домовик 04.12.11, 23:53

зразу вибачаюсь, якщо нісенітниця, бо розумію проблему лише дуже абстрактно :
може тимчасово створити для об'єкту реквізит, промоделювати ситуацію розрахунку з присвоєнням значення реквізиту (тобто фізичному полю). а вісімки уже просто забрати готовеньке....

Автор: sava1 05.12.11, 8:08

в 8 нужно заполнить регистр сведений ПараметрыРасчетаИндексации

Автор: ignsv 06.12.11, 16:04

to sava1
регистр сведений ПараметрыРасчетаИндексации заполнен уже только не тем чем надо. Там стоят даты приема. а у нас есть более поздние даты Индексации ЗП


вот еще мучаюсь так:

Подключить(); 
    //    
    //
    //ТекСправочникИ = "Сотрудники";
    
    Сообщить("______________________________");
    Сообщить("Приказ о приёме");
    
    ТовОле = БазаИ.CreateObject("Справочник.Сотрудники");
    ТовОле.ВыбратьЭлементы();
    
    Пока ТовОле.ПолучитьЭлемент()=1 Цикл
        СпрИ = ТовОле.ТекущийЭлемент();
         Если СпрИ.ЭтоГруппа()= 1 ИЛИ СпрИ.ПометкаУдаления() = 1 Тогда
          Продолжить;
          КонецЕсли;
             // Пометка = Спри.ПризнакИзмененияДоходаДляИндексации.Получить(ДатаОстатков);
         //Если Пометка = 0 Тогда
         //Пометка = "0";
         //Иначе  Пометка = "1";
         //КонецЕсли;
        ДатаЗП = БазаИ.EvalExpr("глПрочитатьДатуИзмененияДоходаДляИндексации("+ "20110102,ПризнакИзмененияДоходаДляИндексации"+","+Спри.Наименование+")");// тут точно ошибка бо СПРИ.Наименование идет как Иванов В.В.
                                                                                                                          // и 1с не понимает  что такое "В."  
                                                                                                                          //как вариант: я окончательно запутался ))


можете подсказать как корректно передать параметры в функцию
знаю что надо передавать Строкой с 8-ки.
1й. параметр - дата на которую смотреть.
2й. Это признак (0,1) - реквизит
3й. текущий элемент

так передаеться с модуля справочника Сотрудники:
 ДатаБазыИндекса = глПрочитатьДатуИзмененияДоходаДляИндексации(ТекущаяДата(),"ПризнакИзмененияДоходаДляИндексации",ТекущийЭлемент());


так в общем модуле:
 Функция глПрочитатьДатуИзмененияДоходаДляИндексации(НП, ИмяРеквизита, Объект = "")  Экспорт

Автор: sava1 06.12.11, 16:09

Что общего в 7 и 8 у Сотрудников (Код,Наименование,ИНН) - ?

Автор: ignsv 06.12.11, 17:05

Цитата(sava1 @ 06.12.11, 16:09) *
Что общего в 7 и 8 у Сотрудников (Код,Наименование,ИНН) - ?


Все, кроме Код.

Автор: Домовик 06.12.11, 19:35

ДатаБазыИндекса = глПрочитатьДатуИзмененияДоходаДляИндексации(ТекущаяДата(),"ПризнакИзмененияДоходаДляИндексации",ТекущийЭлемент());

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

Автор: mister-x 06.12.11, 19:42

Цитата
......это из модуля спр фирмы. датабазыиндекса -реквизит формы, но не реквизит объекта справочник. сделайте его реквизитом объекта, поставьте нужную рубочую дату и откройте справочник фирмы.
він сам по собі не заповниться, потрібна ще обробка для його заповнення

Автор: Домовик 06.12.11, 20:08

у 7.7 присвоїться, а з 8 тягнуть...

Автор: Домовик 07.12.11, 10:21

і взагалі, для чого тоді тягнути, якщо це реквізит довідника Фірми? В сотрудниках його не бачу.

Автор: sava1 07.12.11, 11:04

У каждого свой справочник...
А по-делу - проще всего: в 7 выбираем в ТЗ (ИНН,Дата).Сохраняем тз в файл.
в 8 - парсим файл,синхронизируем по ИНН, добавляем запись в РС

Автор: mister-x 07.12.11, 11:29

Цитата
у 7.7 присвоїться...
не присвоїться - хіба у тих, що відкриватимемо вручну. Хоча, можливо, ви мали на увазі - присвоєння обробкою smile.gif.

Автор: ignsv 07.12.11, 11:36

в справочнике Фирмы там стоит базовый период - а в карточках сотрудников там разные ( и зачастую последние) данные.
вот еще думаю реквизит ПризнакИзмененияДоходаДляИндексации он у нас периодический булевый а в его истории хранится даты ( последняя как раз та что мне надо ...)
думаю надо читать эту историю и забирать последнее значение. только вот в теории понимаю, а на практике вообще ничего не могу слепить ((.

Автор: Домовик 07.12.11, 11:54

Точно! Я только код ваша, вторую, начала тянуть, куда ваша дата записывается.Читается-читается, ваша история, можно взять. Сори, да в сотрудниках есть тоже реквизит.

Во второй части кода есть. Записывается ваша дата в историю Признака, хотела сказать.

Есть в синтакс-помощнике папка Периодический. Там есть ВыбратьЗначения(), ПолучитьЗначение(). Но по-Хорошему последнее нужно.

Атрибут ДАтаЗнач, еще ОбратныйПорядок использовать

Автор: ignsv 07.12.11, 12:37

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



когда я делаю через


Сотр= V7.CreateObject("Справочник.Сотрудники");
Периодический = V7.CreateObject("Периодический");
....
....
Периодический.ИспользоватьОбъект("ПризнакИзмененияДоходаДляИндексации",Сотр);
Периодический.ВыбратьЗначения();
Пока Периодический.ПолучитьЗначение() > 0 Цикл


тут она не видит Признак Изменения дохода как периодический реквизит

Автор: Домовик 07.12.11, 12:38

вот похожий синтаксиз.

            П = СоздатьОбъект("Периодический");
            П.ИспользоватьОбъект("НомерЛистаКассовойКниги",Касса);
            П.ВыбратьЗначения(НачалоГода, КонГода(НачалоГода));
            Если П.ПолучитьЗначение() = 1 Тогда
                Если П.ДатаЗнач = НачалоГода Тогда
                    ЛистовЗаГод = П.Значение;
                Иначе
                    П.Удалить();
                КонецЕсли;
                Пока П.ПолучитьЗначение() = 1 Цикл
                    П.Удалить();
                КонецЦикла;
            КонецЕсли;


Методы и атрибуты

Автор: ignsv 07.12.11, 13:26

пасиб.. уже и я что то тоже получил )))). щас буду вытягивать ..

Все. получил что надо было. всем спасибо за помощь! особенно Домовик`у и Sava1 за коды и наводки )).

Автор: Домовик 11.12.11, 11:01

"не присвоїться - хіба у тих, що відкриватимемо вручну. Хоча, можливо, ви мали на увазі - присвоєння обробкою smile.gif."


Mister-x, так, у випадку довідника Фірми -відкрити ручками.)) у випадку "Сотрудники" була одна кучерява ідея: в обробці використати в циклі ОткрытьФорму(Спр.ТЕкущийЭлемент()), там в ПриОткрытии() все розраховується. ну і статусВозврата(0),
але Запис змін...... коли форма відкрита, то до обєкту не підступишся. і в процедурі не пропишеш.

Тому ваш спосіб - перепрописати розрахунки в самій обробці.

Але в даному випадку -є дані в періодичному реквізиті.

Автор: igmig65 11.12.11, 14:17

А вообще, например в ЗиК, ДатаБазыИндекса для РАСЧЕТА индексации может получаться по двум ссылкам, или в спр.Сотр или в Штатном. Тоесть на опр. дату для сотрудника эта дата может быть дата приема, а для его штатной единицы(повысили оклады) Дата повышения. Актуальной будет считаться макс.
Нужно знать принцип расчета индексации той конф-ции в которую грузите, тоесть 8, возможно там все реализовано по другой схеме, и привязка идет к нескольким объектам, вернее характеристикам объектов(Сотр и Штатное в 7).

Автор: Домовик 11.12.11, 15:34

В теме искали дату увелич. зарплаты.

на свій кучерявий спосіб:
є спосіб записати зміни роботи процедури ПриОткрытии() в довіднику Сотрудники
В ПриОткрытии() дописати форма.Закрыть(), а Записать() вызвать в процедурі приЗакрытии() формы.

Тільки треба очки закрити, коли обробка буде виконуватись )))

Автор: mister-x 12.12.11, 10:31

Цитата
а Записать() вызвать в процедурі приЗакрытии() формы
така річ не пройде - при закритті форми, в базу данних цей об'єкт не дозапишеться

Автор: Домовик 12.12.11, 17:11

або ви не перевіряли, або маєте на увазі щось інше.
Працює.

Автор: mister-x 12.12.11, 17:27

Цитата(ignsv @ 07.12.11, 13:26) *
пасиб.. уже и я что то тоже получил )))). щас буду вытягивать ..

Все. получил что надо было. всем спасибо за помощь! особенно Домовик`у и Sava1 за коды и наводки )).
автор вирішив дане питання, вже починається офтоп. Тему закриваю. Якщо потрібно автору відкрити тему - нехай звернеться в ПП.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua