Заполнение и изменение периодических реквизитов в справочнике через документ в 1с7.7

1. yakov_frolov 29.03.22 20:45 Сейчас в теме
Всем привет! Скажите пожалуйста, каким кодом, можно изменять реквизиты справочника из табличной части документа. в 1с7.7

Справочни - Классы;

Реквизиты справочника:
Классы - Периолический;
КатУч1 - Переодический;
КатУч2 - Переодический;
КатУч3 - Переодический;

Реквизиты табличной части документа одноименные.

Заранее спасибо.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Ivanov_OM 38 29.03.22 22:46 Сейчас в теме
    СпрКлассы = СоздатьОбъект("Справочник.Классы");
    СпрКлассы.ИспользоватьДату(ДатаДокумента);
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
    СпрКлассы.Классы = Док.Классы;
    СпрКлассы.КатУч1 = Док.КатУч1;
    СпрКлассы.КатУч2 = Док.КатУч2;
    СпрКлассы.КатУч3 = Док.КатУч3;
    СпрКлассы.Записать();
КонецЦикла;
Показать
3. yakov_frolov 29.03.22 23:27 Сейчас в теме
(2)
СпрКлассы = СоздатьОбъект("Справочник.Классы");
СпрКлассы.ИспользоватьДату(ДатаДокумента);
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
СпрКлассы.Классы = Док.Классы;
СпрКлассы.КатУч1 = Док.КатУч1;
СпрКлассы.КатУч2 = Док.КатУч2;
СпрКлассы.КатУч3 = Док.КатУч3;
СпрКлассы.Записать();
КонецЦикла;


Большое спасибо за отзыв и помощь, но ругается на переменную Док...
5. ishelper 30.03.22 00:46 Сейчас в теме
(3)
ругается на переменную Док...
Если код выполняется непосредственно из документа (из модуля или из модуля формы), то просто уберите "Док." из кода.

Если не из документа... то ждите, пока штатный телепат форума выйдет из отпуска.

P.S. За 6 с лишком лет на форуме можно было научиться хотя бы мало-мальски вразумительно ставить задачу.
7. yakov_frolov 30.03.22 10:00 Сейчас в теме
(5)
P.S. За 6 с лишком лет на форуме можно было научиться хотя бы мало-мальски вразумительно ставить задачу.
Я тут, ранее покупал нужные мне обработки, или заказывал какие то проекты... сейчас вот сам решил посидеть и поизучать... начал с 7-ки т.к. на мой взгляд она более лёгкая, и для того чтоб понять оно вообще моё или нет, решил попробовать... так что камнями пожалуйста не кидайте...))
4. VictorRGB2 14 30.03.22 00:20 Сейчас в теме
(3) ну это документ, по которому заполняются реквизиты справочника
(2) я бы дополнил

// если нет реквизита обработки с нужным документом, найдем его по номеру
Док = СоздатьОбъект("Документ.КакойТоТам"); 
Док.НайтиПоНомену(<НомерДокумента>);
лДокумент = Док.ТекущийДокумент();

СпрКлассы = СоздатьОбъект("Справочник.Классы");

лДокумент .ВыбратьСтроки();
Пока лДокумент .ПолучитьСтроку() = 1 Цикл
  // чтобы заполнять реквизиты справочника, нужно получит элемент этого справочника
  СпрКлассы.НайтиПоРеквизиту(<НужноеЗначениеРеквизита>);
  // или СпрКлассы.НайтиПоКоду(<НужныйКод>);
  // или создать новый СпрКлассы.Новый();

   лЭлемент = СпрКассы.ТекущийЭлемент(); 
   лЭлемент.ИспользоватьДату(лДокумент.ДатаДок);

    лЭлемент.Классы = лДокумент .Классы;
    лЭлемент.КатУч1 = лДокумент .КатУч1;
    лЭлемент.КатУч2 = лДокумент .КатУч2;
    лЭлемент.КатУч3 = лДокумент .КатУч3;
    лЭлемент .Записать();
КонецЦикла;
Показать
6. ZergKRSK 130 30.03.22 03:55 Сейчас в теме
(4)
Док.НайтиПоНомену(<НомерДокумента>);

Найдет первый попавшийся документ этого вида с таким номером. Учитывая что нумерация большинства документов это год - так делать нельзя.
8. FetisovAN 30.03.22 10:59 Сейчас в теме
(6) я вообще сомневаюсь что будет работать метод НайтиПоНомеНу
9. ZergKRSK 130 30.03.22 11:08 Сейчас в теме
(8) ну опечатка очевидна
12. FetisovAN 30.03.22 11:23 Сейчас в теме
(9) ну тоже самое про дату, я думаю когда он себе делает, он вставляет вторым параметром дату
17. ZergKRSK 130 30.03.22 11:28 Сейчас в теме
(12) абсолютно не тоже самое, опечатка в информации и отсутствие информации абсолютно разные вещи))
14. VictorRGB2 14 30.03.22 11:25 Сейчас в теме
(6) если человек не ждет готового кода, то сообразит, что можно и дату добавить
НайтиПоНомеру(Номер, Дата)
но скорее всего, судя по комментам автора ниже, у него уже есть документ, поэтому можно ничего не искать а использовать напрямую переменную реквизита
10. yakov_frolov 30.03.22 11:08 Сейчас в теме
(4)
    Процедура ОбработкаПроведения()
		
    СпрКлассы = СоздатьОбъект("Справочник.Классы");
    СпрКлассы.ИспользоватьДату(ДатаДок);
    ВыбратьСтроки();
    	Пока ПолучитьСтроку() = 1 Цикл
    	Классы = СпрКлассы.Класс;
    	КатУч1 = СпрКлассы.КатУч1;
    	КатУч2 = СпрКлассы.КатУч2;
        КатУч3 = СпрКлассы.КатУч3;
    	СпрКлассы.Записать();
	КонецЦикла;
	
	КонецПроцедуры
Показать

Вот так синтаксис без ошибок, но в клиенте при проведении получается вот это...
СпрКлассы.Записать();
{Документ.ЗаполнениеСправочникаКлассы.Модуль Документа(11)}: Не выбран элемент!
16. VictorRGB2 14 30.03.22 11:27 Сейчас в теме
(10) ну, конечно, не выбран
где элемент справочника СпрКлассы ?
а нет его, потому и ошибка
его надо или выбрать или создать
в (4) показывал пример как это делается
11. alex_bob 248 30.03.22 11:19 Сейчас в теме
Я конечно тоже не телепат, но предположу что в табличной части документа должны быть разные элементы справочника Классы и какой-то из реквизитов табличной части должен иметь тип "Справочник.Класс".
13. yakov_frolov 30.03.22 11:23 Сейчас в теме
(11)
Тогда в табличной части документа, нужно выбирать Класс из справочника... а задача стоит обратная... нужно документом сформировать справочник классы с численностью на дату, что бы в дальнейшем можно было менять численность в справочнике именно документом...
15. alex_bob 248 30.03.22 11:27 Сейчас в теме
То есть нужно создавать новые элементы в справочнике Классы? Распишите уже подробно исходную задачу, а то вам никто не сможет помочь.
18. yakov_frolov 30.03.22 11:36 Сейчас в теме
(15)В общем задача стоит такая....
Есть документ ЗаполнениеСправочникаКлассы, в нем есть табличная часть: Классы (Строка), КатУч1(Число), КатУч2(Число), КатУч3(число)...
Есть Справочник Классы, в нем реквизиты: Класс(Строка), КатУч1(Число), КатУч2(Число), КатУч3(число).


Нужно, что бы при проведении документа, заполнялся справочник классы, данными из табличной части Документа НА ДАТУ... потому как в будущем могут быть документы, которые могут изменять реквизиты справочника. Что бы в дальнейшем можно было делать перерасчеты...
19. alex_bob 248 30.03.22 11:40 Сейчас в теме
У справочника Классы есть Код или Наименование? Каким образом вы планируете определять, есть уже в справочнике нужный класс или нужно создавать новый?
20. yakov_frolov 30.03.22 11:42 Сейчас в теме
(19)
Я наименование отсек... (не заполняю) В качестве наименования реквизит Класс, код автоматом... поиск по реквизиту Класс..
21. alex_bob 248 30.03.22 11:54 Сейчас в теме
Воот. Теперь начинает что-то проясняться.
Тогда примерно так:
Процедура ОбработкаПроведения()
        
    СпрКлассы = СоздатьОбъект("Справочник.Классы");
    СпрКлассы.ИспользоватьДату(ДатаДок);
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
        Если СпрКлассы.НайтиПоРеквизиту("Классы", Классы) = 0 Тогда
            СпрКлассы.Новый();
            СпрКлассы.Классы = Классы;
        КонецЕсли;
        
        СпрКлассы.КатУч1 = КатУч1;
        СпрКлассы.КатУч2 = КатУч2;
        СпрКлассы.КатУч3 = КатУч3;
        СпрКлассы.Записать();
    КонецЦикла;
Показать
22. yakov_frolov 30.03.22 12:03 Сейчас в теме
(21)
СпрКлассы = СоздатьОбъект("Справочник.Классы");
СпрКлассы.ИспользоватьДату(ДатаДок);
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Если СпрКлассы.НайтиПоРеквизиту("Классы", Классы) = 0 Тогда
СпрКлассы.Новый();
СпрКлассы.Классы = Классы;
КонецЕсли;

СпрКлассы.КатУч1 = КатУч1;
СпрКлассы.КатУч2 = КатУч2;
СпрКлассы.КатУч3 = КатУч3;
СпрКлассы.Записать();
КонецЦикла;
Показать


Чутка пропустили момент.. реквизит справочника Классы называется Класс...
23. alex_bob 248 30.03.22 12:05 Сейчас в теме
А говорил одноименные.
24. yakov_frolov 30.03.22 12:15 Сейчас в теме
(23)
Есть документ ЗаполнениеСправочникаКлассы, в нем есть табличная часть: Классы (Строка), КатУч1(Число), КатУч2(Число), КатУч3(число)...
Есть Справочник Классы, в нем реквизиты: Класс(Строка), КатУч1(Число), КатУч2(Число), КатУч3(число).


Нужно, что бы при проведении документа, заполнялся справочник классы, данными из табличной части Документа НА ДАТУ... потому как в будущем могут быть документы, которые могут изменять реквизиты справочника. Что бы в дальнейшем можно было делать перерасчеты...


Где я такое сказал?
25. alex_bob 248 30.03.22 12:19 Сейчас в теме
В сообщении (1). Но не суть.
Процедура ОбработкаПроведения()
        
    СпрКлассы = СоздатьОбъект("Справочник.Классы");
    СпрКлассы.ИспользоватьДату(ДатаДок);
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
        Если СпрКлассы.НайтиПоРеквизиту("Класс", Классы) = 0 Тогда
            СпрКлассы.Новый();
            СпрКлассы.Класс = Классы;
        КонецЕсли;
        
        СпрКлассы.КатУч1 = КатУч1;
        СпрКлассы.КатУч2 = КатУч2;
        СпрКлассы.КатУч3 = КатУч3;
        СпрКлассы.Записать();
    КонецЦикла;
Показать
27. yakov_frolov 30.03.22 12:27 Сейчас в теме
(25)
СпрКлассы = СоздатьОбъект("Справочник.Классы");
СпрКлассы.ИспользоватьДату(ДатаДок);
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Если СпрКлассы.НайтиПоРеквизиту("Класс", Классы) = 0 Тогда
СпрКлассы.Новый();
СпрКлассы.Класс = Классы;
КонецЕсли;

СпрКлассы.КатУч1 = КатУч1;
СпрКлассы.КатУч2 = КатУч2;
СпрКлассы.КатУч3 = КатУч3;
СпрКлассы.Записать();
КонецЦикла;
Показать


Теперь такое вот...

Если СпрКлассы.НайтиПоРеквизиту("Класс", Классы) = 0 Тогда
{Документ.ЗаполнениеСправочникаКлассы.Модуль Документа(7)}: Недостаточное число параметров передано при вызове функции/процедуры объекта
26. alex_bob 248 30.03.22 12:21 Сейчас в теме
Замечания:
1. В таком случае реквизит Класс НЕ должен быть периодическим.
2. У реквизита Класс должен быть включен признак "Сортировка" - иначе поиск по реквизиту работать не будет.
28. yakov_frolov 30.03.22 12:27 Сейчас в теме
(26) Поменял реквизит Класс..
29. alex_bob 248 30.03.22 12:43 Сейчас в теме
(27)
Если СпрКлассы.НайтиПоРеквизиту("Класс", Классы, 1) = 0 Тогда
30. yakov_frolov 30.03.22 12:46 Сейчас в теме
(29)
Это сам решил, спасибо ))) буду дальше ковырять))
31. yakov_frolov 30.03.22 15:24 Сейчас в теме
(29) А можно еще один вопросик задать?
32. alex_bob 248 30.03.22 16:06 Сейчас в теме
33. CheBurator 2696 30.03.22 20:14 Сейчас в теме
35. yakov_frolov 03.04.22 16:46 Сейчас в теме
(32) Нужна помощь...

Есть такая таблица (во вложении)
Никак не могу сообразить, как 1) Сделать так, что бы результат попадал в поле результат без конопки расчитать и 2) все тоже самое только с кнопкой расчитать...

В модуле документа такой код

Функция РасчетПедОклад()
    РезультатКатУч1 = КатУч1 * Нагрузка * Константа.СтоимостьУЧ * Константа.КоэфПересчета;
	РезультатКатУч2 = (КатУч2 * Нагрузка * Константа.СтоимостьУЧ * Константа.КоэфПересчета) * 2;
	РезультатКатУч3 = (КатУч3 * Нагрузка * Константа.СтоимостьУЧ * Константа.КоэфПересчета) * 3;
	Возврат РезультатКатУч1+РезультатКатУч2+РезультатКатУч3;
КонецФункции]



Понимаю что где то я недопонимаю, но где понять могу, но мозг не понимает как это исправить ))
Прикрепленные файлы:
34. CheBurator 2696 30.03.22 20:17 Сейчас в теме
Док.НайтиПоНомеру(<НомерДокумента>);
лДокумент = Док.ТекущийДокумент();


Так тоже делать не надо..
Как минимум

Результат = Док.НайтиПоНомену(<НомерДокумента>);
Если Результат =0 Тогда
// здесь отлуп
Возврат;
КонецЕсли;

лДокумент = Док.ТекущийДокумент();
36. user1203706 14 03.04.22 17:06 Сейчас в теме
(34)
Как минимум

Результат = Док.НайтиПоНомену(<НомерДокумента>);


Так тоже делать не надо, если есть периодичность номера. Нужно втыкать дату в параметр метода.
53. CheBurator 2696 03.04.22 18:04 Сейчас в теме
(36) про дату - в самом начале написали.
37. user1203706 14 03.04.22 17:09 Сейчас в теме
(35) есть такое понятие как формула реквизита. Воткни свою функцию в формулу нужного реквизита и радуйся.
38. yakov_frolov 03.04.22 17:09 Сейчас в теме
(37)Да делал.... не работает... не получается...
39. user1203706 14 03.04.22 17:11 Сейчас в теме
(38) ну, нам отсюда не видно, что делал и что не получается.
ЗЫ: а за код обращения к константе в (35) надо стальной линейкой по пальчикам стучать, чтоб не повадно было.
40. yakov_frolov 03.04.22 17:13 Сейчас в теме
(39) Я тока учусь... а как правильно? ))
41. yakov_frolov 03.04.22 17:15 Сейчас в теме
(39) В конфигураторе вот так сделано....
Прикрепленные файлы:
42. user1203706 14 03.04.22 17:23 Сейчас в теме
(41) ну и ? Чего не работает то ? В формулах остальных числовых реквизитах что ? Туда тоже этот же расчет воткни
43. yakov_frolov 03.04.22 17:24 Сейчас в теме
45. yakov_frolov 03.04.22 17:25 Сейчас в теме
(42) Да не работает нифига.... только что попробовал...
44. user1203706 14 03.04.22 17:25 Сейчас в теме
(43) ну на пусто и имеешь дырку от бублика. Твоя формула будет выполняться только при изменении колонки с ней.
В других колонках установи свою формулу в которой устанавливай результат нужный, в зависимости от реквизита.
И..это будет одна процедура
46. user1203706 14 03.04.22 17:25 Сейчас в теме
47. yakov_frolov 03.04.22 17:26 Сейчас в теме
(46) да...
маленько переписал код.... так правильно?
Функция РасчетПедОклад()
	СтоимостьУЧ = Константа.СтоимостьУЧ.Получить(ДатаДок);
	КоэфПересчета = Константа.КоэфПересчета.Получить(ДатаДок);
    РезультатКатУч1 = КатУч1 * Нагрузка * СтоимостьУЧ * КоэфПересчета;
	РезультатКатУч2 = (КатУч2 * Нагрузка * СтоимостьУЧ * КоэфПересчета) * 2;
	РезультатКатУч3 = (КатУч3 * Нагрузка * СтоимостьУЧ * КоэфПересчета) * 3;
	Возврат РезультатКатУч1 + РезультатКатУч2 +РезультатКатУч3;
КонецФункции;
48. user1203706 14 03.04.22 17:30 Сейчас в теме
(47) неа..
Вот это воткни в модуль, и во всех числовых колонках вызов еЁ

Процедура РасчетПедОклад()
	СтоимостьУЧ = Константа.СтоимостьУЧ.Получить(ДатаДок);
	КоэфПересчета = Константа.КоэфПересчета.Получить(ДатаДок);
    РезультатКатУч1 = КатУч1 * Нагрузка * СтоимостьУЧ * КоэфПересчета;
	РезультатКатУч2 = (КатУч2 * Нагрузка * СтоимостьУЧ * КоэфПересчета) * 2;
	РезультатКатУч3 = (КатУч3 * Нагрузка * СтоимостьУЧ * КоэфПересчета) * 3;
	Результат = РезультатКатУч1 + РезультатКатУч2 +РезультатКатУч3;
КонецПроцедуры
49. user1203706 14 03.04.22 17:32 Сейчас в теме
+СтоимостьУЧ сделай глобальной переменной модуля и получи её в ПриОткрытии, например.
Врят ли ты константы меняешь всегда.
Короче, закешируй константы в ПриОткрытии.
51. yakov_frolov 03.04.22 17:34 Сейчас в теме
(49)Ок понял, сейчас пробую....
50. user1203706 14 03.04.22 17:33 Сейчас в теме
Ну и КоэфПересчета , аналогично:

Перем СтоимостьУЧ ,КоэфПересчета ;

Процедура ПриОткрытии()
    СтоимостьУЧ = Константа.СтоимостьУЧ.Получить(ДатаДок);
    КоэфПересчета = Константа.КоэфПересчета.Получить(ДатаДок);
КонецПроцедуры

Процедура РасчетПедОклад()
    РезультатКатУч1 = КатУч1 * Нагрузка * СтоимостьУЧ * КоэфПересчета;
    РезультатКатУч2 = (КатУч2 * Нагрузка * СтоимостьУЧ * КоэфПересчета) * 2;
    РезультатКатУч3 = (КатУч3 * Нагрузка * СтоимостьУЧ * КоэфПересчета) * 3;
    Результат = РезультатКатУч1 + РезультатКатУч2 +РезультатКатУч3;
КонецПроцедуры
Показать
52. yakov_frolov 03.04.22 17:42 Сейчас в теме
(50)Спасибо, заработало.... )))
54. yakov_frolov 03.04.22 20:47 Сейчас в теме
(50)И новая головная боль...
Имею Справочник Сотрудники, в нем есть реквизит "Категория" (Справочник периодический) и является отдельным справочником метаданных в котором есть реквизит "Процент", так вот задача, как мне в процедуре, обратить к реквизиту Процент через справочник сотрудники....
Прикрепленные файлы:
57. CheBurator 2696 04.04.22 09:43 Сейчас в теме
(54) Конечно сильно делать Спр.Сотрудники, в котором реквизит "Сотрудник"...
58. yakov_frolov 04.04.22 12:46 Сейчас в теме
(57) ну, ничего, пока учусь... научусь не буду так делать )))
59. CheBurator 2696 07.04.22 23:34 Сейчас в теме
55. user1203706 14 03.04.22 22:10 Сейчас в теме
(54)

 Категория  = Сотрудник.Категория.Получить(ВыбДата);
 Процент = Категория.Процент;
56. пользователь 03.04.22 22:24
Сообщение было скрыто модератором.
...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот