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

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

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


Проблема в чем : ДатаБазыИндекса - его и нету в списке реквизитов и получить его я не могу.
ни так : СпрИ.ДатаБазыИндекса
ни так:СпрИ.ДатаБазыИндекса .Получить(ДатаОстатков)
mister-x
Цитата
Проблема в чем : ДатаБазыИндекса - его и нету в списке реквизитов и получить его я не могу.
тобто це реквізит форми? якщо - так, тоді потрібно подивитись логіку його заповнення
ignsv
Вобщем подскажите как мне получить нужные значения . Заранее спасибо

ні.

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

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

1. спочатку ДатаБазыИндекса прив`язуються до ДатыПриема
Процедура ИзмДатаПриема()
    Если Выбран() = 0 Тогда
        ДатаБазыИндекса = ДатаПриема;
    КонецЕсли;
КонецПроцедуры


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


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

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

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

потрібно ще проаналізувати процедуру глПрочитатьДатуИзмененияДоходаДляИндексации і змінну глДатаНачалаРасчетаИндексации
Pepe
Я так зрозумів, що це все потрібно для розрахунку індексації. Вона нараховується через два місяці після прийому співробітника:
...ДатаБазыИндекса = ДатаПриема
дСтараяДатаНачаларасчетаИндексации = ДатаБазыИндекса....,

або через два місяці після зміни ставки заробітної плати.
mister-x
Цитата
...ДатаБазыИндекса = ДатаПриема
перекидаються вже записані елементи довідника - тому процедура ИзмДатаПриема() не використовується
igmig65
Цитата
Проблема в чем : ДатаБазыИндекса - его и нету в списке реквизитов и получить его я не могу.
ни так : СпрИ.ДатаБазыИндекса
ни так:СпрИ.ДатаБазыИндекса .Получить(ДатаОстатков)

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

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

ТекСправочникИ = "Сотрудники";
спр = БазаИ.CreateObject("Справочник."+ТекСправочникИ);
sava1
Варианта2
1.Выгружаем справочник из 7 а в 8 загружаем
2.По ОЛЕ - пишем 7-й запрос с получением даты изменения
2,5. Можно поиграться с EvalExpr() (в 7 написать функцию с Экспорт)
sava1
вдогонку
V7 = Новый COMобъект("V77.Application");
СпрНом = V7.CreateObject("Справочник.Номенклатура");
СпрЦены = V7.CreateObject("Справочник.Цены");
Периодический = V7.CreateObject("Периодический");
....
....
Периодический.ИспользоватьОбъект("Цена",СпрЦены);
Периодический.ВыбратьЗначения();
Пока Периодический.ПолучитьЗначение() > 0 Цикл
   //В цикл не входит хотя в 1с7  4 раза изменялась цена

        Строка = СписокНовыхЦен.Добавить();
    Строка.Дата = Периодический.ДатаЗнач;
    Строка.Цена = Периодический.Значение;
КонецЦикла;
Домовик
зразу вибачаюсь, якщо нісенітниця, бо розумію проблему лише дуже абстрактно :
може тимчасово створити для об'єкту реквізит, промоделювати ситуацію розрахунку з присвоєнням значення реквізиту (тобто фізичному полю). а вісімки уже просто забрати готовеньке....
sava1
в 8 нужно заполнить регистр сведений ПараметрыРасчетаИндексации
ignsv
to sava1
регистр сведений ПараметрыРасчетаИндексации заполнен уже только не тем чем надо. Там стоят даты приема. а у нас есть более поздние даты Индексации ЗП


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


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

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


так в общем модуле:
 Функция глПрочитатьДатуИзмененияДоходаДляИндексации(НП, ИмяРеквизита, Объект = "")  Экспорт
sava1
Что общего в 7 и 8 у Сотрудников (Код,Наименование,ИНН) - ?
ignsv
Цитата(sava1 @ 06.12.11, 16:09) необходимо зарегистрироваться для просмотра ссылки
Что общего в 7 и 8 у Сотрудников (Код,Наименование,ИНН) - ?


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

......это из модуля спр фирмы. датабазыиндекса -реквизит формы, но не реквизит объекта справочник. сделайте его реквизитом объекта, поставьте нужную рубочую дату и откройте справочник фирмы.
mister-x
Цитата
......это из модуля спр фирмы. датабазыиндекса -реквизит формы, но не реквизит объекта справочник. сделайте его реквизитом объекта, поставьте нужную рубочую дату и откройте справочник фирмы.
він сам по собі не заповниться, потрібна ще обробка для його заповнення
Домовик
у 7.7 присвоїться, а з 8 тягнуть...
Домовик
і взагалі, для чого тоді тягнути, якщо це реквізит довідника Фірми? В сотрудниках його не бачу.
sava1
У каждого свой справочник...
А по-делу - проще всего: в 7 выбираем в ТЗ (ИНН,Дата).Сохраняем тз в файл.
в 8 - парсим файл,синхронизируем по ИНН, добавляем запись в РС
mister-x
Цитата
у 7.7 присвоїться...
не присвоїться - хіба у тих, що відкриватимемо вручну. Хоча, можливо, ви мали на увазі - присвоєння обробкою smile.gif.
ignsv
в справочнике Фирмы там стоит базовый период - а в карточках сотрудников там разные ( и зачастую последние) данные.
вот еще думаю реквизит ПризнакИзмененияДоходаДляИндексации он у нас периодический булевый а в его истории хранится даты ( последняя как раз та что мне надо ...)
думаю надо читать эту историю и забирать последнее значение. только вот в теории понимаю, а на практике вообще ничего не могу слепить ((.
Домовик
Точно! Я только код ваша, вторую, начала тянуть, куда ваша дата записывается.Читается-читается, ваша история, можно взять. Сори, да в сотрудниках есть тоже реквизит.

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

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

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



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


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


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

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


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

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


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

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

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

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

Тільки треба очки закрити, коли обробка буде виконуватись )))
mister-x
Цитата
а Записать() вызвать в процедурі приЗакрытии() формы
така річ не пройде - при закритті форми, в базу данних цей об'єкт не дозапишеться
Домовик
або ви не перевіряли, або маєте на увазі щось інше.
Працює.
mister-x
Цитата(ignsv @ 07.12.11, 13:26) необходимо зарегистрироваться для просмотра ссылки
пасиб.. уже и я что то тоже получил )))). щас буду вытягивать ..

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