|
Структура, вложенная в структуру, принимает значения из неё | ☑ | ||
---|---|---|---|---|
0
lenkavovka
03.08.18
✎
06:59
|
Всем привет!
Столкнулись с непонятным для нас поведением системы. Задача была простая: посчитать набор количественных показателей для каждого вида занятости сотрудников по такому шаблону: [code]ИтогиШаблон = Новый Структура("КоличествоППС, КолвоСтавокПолнВсего, По38Включит, КолвоСтавокПолнКН, КолвоСтавокПолнДН, Итого", 0, 0, 0, 0, 0, 0);[/code] Поскольку видов занятости три (основное и два вида совместительства), плюс нужны общие итоги, то делаем по этому шаблону новую структуру: [code]ИтогиПодраздедения = Новый Структура("Общ, ОМР, Внутр, ВнешСовм", ИтогиШаблон, ИтогиШаблон, ИтогиШаблон, ИтогиШаблон);[/code] Но когда устанавливаем ИтогиПодраздедения.Общ.КоличествоППС = 1, то оказывается, что становится ИтогиШаблон.КоличествоППС = 1, и вдобавок все значения ИтогиПодраздедения.ХХХ.КоличествоППС становятся равны единицы. То есть появляется какая-то обратная зависимость: структура, которую использовали во вторичной структуре в виде шаблона, сама принимает значения из вторичной структуры, и эти значения передаёт в другие места, в которых тоже используется как шаблон. В итоге проблему решили так: [code]ИтогиПодраздедения = Новый Структура("Общ, ОМР, Внутр, ВнешСовм", Новый Структура("КоличествоППС, КолвоСтавокПолнВсего, По38Включит, КолвоСтавокПолнКН, КолвоСтавокПолнДН, Итого", 0, 0, 0, 0, 0, 0), Новый Структура("КоличествоППС, КолвоСтавокПолнВсего, По38Включит, КолвоСтавокПолнКН, КолвоСтавокПолнДН, Итого", 0, 0, 0, 0, 0, 0), Новый Структура("КоличествоППС, КолвоСтавокПолнВсего, По38Включит, КолвоСтавокПолнКН, КолвоСтавокПолнДН, Итого", 0, 0, 0, 0, 0, 0), Новый Структура("КоличествоППС, КолвоСтавокПолнВсего, По38Включит, КолвоСтавокПолнКН, КолвоСтавокПолнДН, Итого", 0, 0, 0, 0, 0, 0));[/code] Ни разу не изящно, правда? Подскажите, пожалуйста, есть ли более оптимальные решения? Непонятно в принципе, почему так себя ведут структуры. |
|||
1
fgaabbb
03.08.18
✎
07:21
|
а что удивляет? если использовать ссылку на объект много раз в разных местах, от этого не станет много объектов
смотри: https://codernote.ru/1c/kopirovanie-struktury-v-1s/ - если таких задач много, заведи себе общий модуль и туда эту функцию, будет тебе капелька изящества |
|||
2
Локи-13
03.08.18
✎
07:54
|
ИтогиШаблон это ссылка на объект:
Структура("КоличествоППС, КолвоСтавокПолнВсего, По38Включит, КолвоСтавокПолнКН, КолвоСтавокПолнДН, Итого", 0, 0, 0, 0, 0, 0) |
|||
3
lenkavovka
03.08.18
✎
08:13
|
Понятно, в 1С нельзя скопировать объект запросто, как в других средах разработки. Результат будет ссылкой на объект.
Спасибо за пояснения! |
|||
4
Сияющий в темноте
03.08.18
✎
08:15
|
Для любителей еще задача-положить структуру в структуру,а во внутреннюю структуру ссылку на внешнюю,и посмотреть отработает ли сборка мусора
что такое обьект-это адрес в памяти,где хранятся данные обьекта,когда мы из одной переменной копируем значение в другую,то копируется адрес в памяти,а не его содержимое,в результате,две переменных ссылаются на один и тот же обьект. Если бы при копировании переменной обьекты бы копировались(что,например,можно сделать в си плюс плюс),то работа с обьектами была бы очень нетривиальной,т.к.изменения,вносимые в обьект в одной переменной,не отражались бы в основном обьекте и приходилось бы писать все через множество точек. Сразу замечу,что строки,не обьекты и при присвоении одной переменной значения другой переменной строка копируется. Еще,в 1с массив это обьект и ведет себя как любой другой обьект,а например в Visual Basic,массив это значение и при копировании значения создается новый массив с таким же содержимым. Если хочется получить копию структуры,то можно сделать так Функция СкопироватьСтруктуру(ИсходнаяСтруктура) НоваяСтруктура=Новый Структура; Для Каждого КлючЗначение Из ИсходнаяСтруктура Цикл НоваяСтруктура.Вставить(КлючЗначение.Ключ,КлючЗначение.Значение); КонецЦикла; Возврат НоваяСтруктура; КонецФункции |
|||
5
Скиурус
03.08.18
✎
08:27
|
>>Непонятно в принципе, почему так себя ведут структуры.
Книжичку про ООП прочитать надо хоть одну, и станет понятно. >>Понятно, в 1С нельзя скопировать объект запросто, как в других средах разработки. Копия = Новый ФиксированнаяСтруктура(МояСтруктура); Любопытно узнать пример среды разработки, в котором операция "=" для коллекции определена как копирование, а не присваивание указателя. |
|||
6
Cool_Profi
03.08.18
✎
08:46
|
(5) С++ при наличии конструктора копирования
|
|||
7
rphosts
03.08.18
✎
08:53
|
(6)т.е. ты предлагаешь воспользоваться перезагрузкой операций?
|
|||
8
Скиурус
03.08.18
✎
14:27
|
(6) В какой-то степени ты прав, да. В STL конструкторы копирования определены для всего подряд. Ну так это же Си++, там в ногу себе стрелять принято :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |