По ссылке или по значению? Ключевое слово Знач и с чем его едят

09.10.15

Разработка - Математика и алгоритмы

В принципе, любой программист 1С знает, зачем нужно ключевое слово "Знач", позволяющее передавать параметры в метод "по значению". Однако часто оказывается, что все не так просто и термины "по значению" и "по ссылке" вызывают путаницу. В данной заметке хотел бы расставить точки в этом вопросе. Теперь можно будет кидать коллегам ссылку на эту статью в спорах про значение и ссылку )))

Заранее извиняюсь за пафосную аннотацию про "расстановку точек", но надо же как-то завлечь вас в статью)) Со своей стороны постараюсь, чтобы аннотация все же оправдывала ваши ожидания.

Вкратце о чем речь

Все это и так знают, но все же в начале напомню, как в 1С могут передаваться параметры метода. Передаваться они могут "по ссылке" и "по значению". В первом случае, мы передаем в метод то же самое значение, что и в точке вызова, а во втором - его копию.

Процедура ПоСсылке(Параметр)
    Параметр = 2;
КонецПроцедуры

Параметр = 1;
ПоСсылке(Параметр);

Сообщить(Параметр); // выведет 2

По умолчанию в 1С аргументы передаются по ссылке, и изменение параметра внутри метода будет видно извне метода. Здесь дальнейшее понимание вопроса зависит от того, что именно вы понимаете под словом "изменение параметра". Так вот, имеется в виду повторное присваивание и ничего более. Причем, присваивание может быть неявным, например вызовом метода платформы, который возвращает что-то в выходном параметре.

Но если мы не хотим, чтобы наш параметр передавался по ссылке, то мы можем указать перед параметром ключевое слово Знач.

Процедура ПоЗначению(Знач Параметр)
    Параметр = 2;
КонецПроцедуры

Параметр = 1;
ПоЗначению(Параметр);

Сообщить(Параметр); // выведет 1

Все работает, как обещано - изменение (а правильнее сказать "замена") значения параметра не приводит к изменению значения вне метода.

 

Ну а в чем прикол-то?

Интересные моменты начинаются, когда мы начинаем передавать в качестве параметров не примитивные типы (строки, числа, даты и т.п.), а объекты. Вот тут-то и всплывают такие понятия, как "мелкая" и "глубокая" копия объекта, а также указатели (не в терминах C++, а как абстрактные дескрипторы (handles)).

При передаче объекта (например, ТаблицыЗначений) по ссылке, мы передаем само значение указателя (некий handle), который в памяти платформы "держит" объект. При передаче по значению платформа сделает копию этого указателя.

Иными словами, если, передавая объект по ссылке, в методе мы присвоим параметру значение "Массив", то в точке вызова получим массив. Повторное присваивание значения, переданного по ссылке, видно из места вызова.

Процедура ОбработатьЗначение(Параметр)
    Параметр = Новый Массив;
КонецПроцедуры

Таблица = Новый ТаблицаЗначений;
ОбработатьЗначение(Таблица);

Сообщить(ТипЗнч(Таблица)); // выведет Массив

Если же, мы передадим объект по значению, то в точке вызова наша ТаблицаЗначений не пропадет.

Содержимое объекта и его состояние

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

Процедура ОбработатьЗначение(Параметр)
    Параметр.Очистить();
КонецПроцедуры

Таблица = Новый ТаблицаЗначений;
Таблица.Добавить();
ОбработатьЗначение(Таблица);

Сообщить(Таблица.Количество()); // выведет 0

При передаче объектов в методы платформа оперирует указателями (условными, не прямыми аналогами из C++). Если объект передается по ссылке, то ячейка памяти виртуальной машины 1С, в которой лежит данный объект, может быть перезаписана другим объектом. Если объект передается по значению, то указатель копируется и перезапись объекта не приводит к перезаписи ячейки памяти с исходным объектом.

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

И это верно всегда, за исключением...

 

Клиент-серверное взаимодействие

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

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

В стандартах разработки фирмы 1С рекомендуется всегда в параметрах использовать ключевое слово Знач, если мы не собираемся явно возвращать в параметре некое значение. Это хорошо по нескольким причинам:

  • Явное объявление намерений программиста. Глядя на сигнатуру метода, можно четко сказать, какие параметры входные, а какие выходные. Такой код легче читать и сопровождать
  • Для того, чтобы изменение на сервере параметра "по ссылке" было видно в точке вызова на клиенте, параметры, передаваемые на сервер по ссылке, платформа обязательно будет сама возвращать на клиента, чтобы обеспечить поведение, описанное в начале статьи. Если параметр не нужно возвращать, то будет перерасход трафика. Для оптимизации обмена данными параметры, значения которых нам не нужны на выходе, нужно помечать словом Знач.

Здесь примечателен второй пункт. Для оптимизации трафика платформа не будет возвращать значение параметра на клиент, если параметр помечен словом Знач. Все это замечательно, но приводит к интересному эффекту.

Как я уже говорил, при передаче объекта на сервер происходит сериализация, т.е. выполняется "глубокая" копия объекта. А при наличии слова Знач объект не поедет с сервера обратно на клиента. Складываем эти два факта и получаем следующее:

&НаСервере
Процедура ПоСсылке(Параметр)
    Параметр.Очистить();
КонецПроцедуры

&НаСервере
Процедура ПоЗначению(Знач Параметр)
    Параметр.Очистить();
КонецПроцедуры

&НаКлиенте
Процедура ПоЗначениюКлиент(Знач Параметр)
    Параметр.Очистить();
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьЗнач()

    Список1= Новый СписокЗначений;
    Список1.Добавить("привет");
    Список2 = Список1.Скопировать();
    Список3 = Список1.Скопировать();    

    // объект копируется полностью,
    // передается на сервер, потом возвращается.
    // очистка списка видна в точке вызова
    ПоСсылке(Список1);

    // объект копируется полностью,
    // передается на сервер. Назад не возвращается.
    // Очистка списка НЕ ВИДНА в точке вызова
    ПоЗначению(Список2);

    // копируется только указатель объекта
    // очистка списка видна в точке вызова
    ПоЗначениюКлиент(Список3);

    Сообщить(Список1.Количество());
    Сообщить(Список2.Количество());
    Сообщить(Список3.Количество());

КонецПроцедуры

Резюме

Если вкратце, то резюмировать можно следующим образом:

  • Передача по ссылке позволяет "затереть" объект совсем другим объектом
  • Передача по значению не позволяет "затереть" объект, но изменения внутреннего состояния объекта будут видны, т.к. идет работа с одним и тем же экземпляром объекта
  • При серверном вызове работа идет с РАЗНЫМИ экземлярами объекта, т.к. выполнялось глубокое копирование. Ключевое слово Знач запретит копирование серверного экземпляра обратно в клиентский, и изменение внутреннего состояния объекта на сервере не приведет к аналогичному изменению на клиенте.
Надеюсь, что этот несложный перечень правил позволит вам легче решать споры с коллегами насчет передачи параметров "по значению" и "по ссылке"

Знач по значению по ссылке

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    1753    stopa85    12    

33

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    4415    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    7455    4    SpaceOfMyHead    17    

56

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7854    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

Математика и алгоритмы Платформа 1С v8.3 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4444    fishca    13    

36

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8832    John_d    73    

46

Механизм анализа данных. Кластеризация.

Математика и алгоритмы Анализ учета Платформа 1С v8.3 Анализ и прогнозирование Бесплатно (free)

Подробный разбор, с примером использования, встроенного механизма кластеризации 1С.

31.08.2021    7797    dusha0020    8    

70
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
110. awk 741 13.10.15 11:32 Сейчас в теме
(109) starik-2005,
Можно найти много общего между обезьяной и человеком, как, впрочем, и различного, но, согласитесь, основным различием все-таки будет уровень интеллекта.
Абсолютно согласен. У многих обезьян интеллект гораздо выше чем у многих людей.
Те различия, о которые Вы тут скописпастили, не являются существенными различиями в языках
Это те различия которые не позволяют иметь совместимость на уровне исходного текста Си и Си++. А следовательно не корректно говорить дальше о разнице. Си и Си++ - это два разных языка. Кстати про объектную модель в Си++ я слышу впервые. Про STL слышал, про стандартные библиотеки слышал, про объектно-ориентированное программирование, проектирование и архитектуру слышал...
111. Brawler 454 13.10.15 11:40 Сейчас в теме
(110) awk, Си или Си++ - ЭТО ДВА РАЗНЫХ ЯЗЫКА. Никакой совместимости разработчики не обязаны делать. Вы еще приплетите совместимость с Visual Basic и Си или С++...
А может с Жабой? Нет, давайте с РНР!

То что Си и С++ схожи это плюс только в том, что зная Си можно с некоторым дискомфортом читать тексты на С++ да так же и в обратную сторону.
Кому нужен Си, выберут его, а кто-то С++, найдутся и не кто возьмет за основу ассемблер.
112. awk 741 13.10.15 11:55 Сейчас в теме
(111) Brawler,

Си или Си++ - ЭТО ДВА РАЗНЫХ ЯЗЫКА


!!!ВОТ-ВТО-ВОТ!!! А не (102):

В последствии стандарт был дополнен С99 и С11, которые, в общем и целом, вбирали в себя все отличия между С и С++, кроме указанного мной - объектной модели. В стандарт С11 даже была включена многопоточность, реализуемая соответствующими библиотеками.
115. starik-2005 3033 13.10.15 14:14 Сейчас в теме
(110) awk,

объектная модель
Определения в Интернете
Объе́ктно-ориенти́рованное, или объектное, программи́рование — парадигма программирования, в которой основными концепциями являются понятия объектов и классов. В случае языков с прототипированием вместо классов используются объекты-прототипы.
http://ru.wikipedia.org/wiki/Объектная_модель


(111) Brawler, C и С++ - это разные языки, но имеющие общий синтаксис, отличающийся только в наличии в С++ объектной модели, о которой гражданин awk проспал лекцию. Но я уж никак не могу быть в этом виноват.
116. awk 741 13.10.15 14:45 Сейчас в теме
(115) starik-2005, Вы лжец Нет такого определения по ссылке.
Прикрепленные файлы:
117. starik-2005 3033 13.10.15 15:54 Сейчас в теме
(116) awk, ух ты. Чувствую себя Псаки ))) Что Ваших пробелов в образовании не закрывает, к сожалению. "Над лошадью смеется тот, кто не осмеливается смеяться над ее хозяином" (с) Д'Артаньян. В данном случае Вы просто не владеете номенклатурой понятий. наберите в гугле слова "Объектная модель", а потом спросите меня, как я их туда засунул.
118. awk 741 13.10.15 16:15 Сейчас в теме
(117) starik-2005, Так это гугл, а не Википедия... Семен Семеныч.... А дальше гугла не пробывали ходить?
Прикрепленные файлы:
119. starik-2005 3033 13.10.15 17:18 Сейчас в теме
(118) awk, а не пробовали понять, почему в википедии перенаправление с "объектной модели" на "ООП" сделано?
121. ИНТЕГРА 25 13.10.15 18:01 Сейчас в теме
(119) starik-2005, ну согласись уже что коряво назвал. А то он от тебя не отстанет :) мне тоже не по душе твое выражение было )
"Объектная модель" это все таки скорее архитектура программного кода, а ООП это механизм с помощью которого она реализуется. А в целом ты правильно сказал. На твердую 4! ))))
96. ИНТЕГРА 25 12.10.15 18:29 Сейчас в теме
(93) starik-2005, Ты меня жёстко подловил :) Я прочитал твою фразу
Даже дедушка Строуструп не знает язык Си++
подсознательно принял ее за истину и начал отвечать. Перепутал его с Деннисом Ритчи. Очень торопился переключиться на программирование, после ответов на вопросы :)
Скажи хотя бы что ты под ней имел ввиду ))))
97. starik-2005 3033 12.10.15 18:37 Сейчас в теме
(96) ИНТЕГРА, ну это не моя фраза - это во-первых. Ну и во-вторых - я не знаю, что тот, кто ее сказал, имел ввиду. И я читал ту самую книжку, поэтому даже не в курсе, что имеет ввиду товаришчъ "awk", говоря о двух...
98. ИНТЕГРА 25 12.10.15 18:43 Сейчас в теме
(97) starik-2005, У меня уже 12 часов ночи. Спать пора :) Это awk тебе оценку поставил )
100. starik-2005 3033 12.10.15 18:44 Сейчас в теме
(98) ИНТЕГРА, но фраза-то все равно не моя. Видимо действительно это про Вас: "хочется спать, но нужно спорить в интернете" )))
ИНТЕГРА; +1 Ответить
80. starik-2005 3033 11.10.15 12:19 Сейчас в теме
(76) ИНТЕГРА, а вообще, как мне кажется, главное - это без фанатизма. Вот, например, у нас в конторе есть сервис автопечати. Он какие-то документы выкидывает на принтер в определенное время. Принтеров масса, документов много печатается. Если брать 1С, то решается все путем запуска клиента. который отправляет на принтер генерируемые печатные формы. Опытным путем доказано, что проблем с ним крайне много. Пока сидели на 8.2., то каждый второй раз приходилось перезапускать печать. Осложнялось тем, что печатать надо было не только MXL, генерируемые 1С, но и ряд других документов, при этом основными проблемами были: зависания клиента, недоступность ключа, "холостой" вывод документов на принтер, когда ничего не печаталось, но команда печати 1С-кой выполнялась, зависание спулера винды, ... Когда эстафета по поддержке данного сервиса перешла мне, то я предложил изменить вообще систему - уйти при печати от 1С вообще. Сначала пытался найти программу, которая умеет пакетно печатать PDF-файлы - благо 1С умеет их сохранять. Оказалось, что все, что я нашел для винды - это редкостное г. при существенном объеме печати или весьма недешевое ПО, которое будет иметь те же проблемы со спулером винды, что и 1С. В итоге предложил алтернативу - сервер печати на Debian-системе. Все поныли, но, как оказалось впоследствии, такая система проявила себя 100% надежной. За последний год у нас почти не было ошибок при печати документов, а все возникающие ошибки были из-за недоступности некоторых принтеров. Система при этом оказалась крайне проста в развертывании и добавлении новых принтеров - всем этим занимается теперь отдел техподдержки, а не разработчики 1С. А состоит система из виртуалки на базе Debian-принтсервера и PHP-скрипта, который выкидывает на LPR еще ненапечатанные файлы. 1С только печатные формы генерит да в нужную папочку складывает. В данном случае ROI оказался крайне высоким.
81. Evil Beaver 8107 11.10.15 21:57 Сейчас в теме
(76) ИНТЕГРА, как же мне нравятся вот эти рассуждения про "настоящего программиста"! Лучше них только дамские рассуждения про "настоящего мущщину", который тоже всем и всё должен ))))

А вообще, все давно знают, что настоящие программисты пользуются бабочками. Все остальные - дилетанты.
mivari; jif; korzhishe; dmpas; alex_4x; awk; +6 Ответить
72. alex_4x 85 09.10.15 12:28 Сейчас в теме
А есть понимание как этот байт код 1С овский получить из модуля, какие есть команды ?
Закрытые декомпиляторы я знаю что есть, а открытые для чтения и понимания есть ?
82. alex_4x 85 12.10.15 12:00 Сейчас в теме
Мне кажется что если бы все в совершенстве владели С++, то половины языков не было бы нужно извобретать. PHP например, или PERL... Всё это можно реализовать на си, даже без плюсиков. Но кому-то это не так удобно и понятно. Для каждой цели и разрабатывают свой упрощенный язык, с своей спецификой и те кто на нем пишет меньше думают о реализации того что уже реализовано и могут больше времени потратить на другие аспекты. Есть язык даже для программирования нейронных сетей. Отдельный такой язык, название не помню. Но это не значит что прям надо в совершенстве владеть С++. Я битовыми операциями очень давно не пользовался, они мне не нужны. В рамках парадигмы 1С я даже не пытаюсь создавать классы, а зачем? Зато не ошибешься в тех местах где мог бы ошибиться. Надо признать, это упрощает и убыстряет кодирование. Конечно это уже не настоящее программирование, но в этом есть плюсы - скорость, меньше ошибок, многое сделано уже заранее, простота.
83. Evil Beaver 8107 12.10.15 12:13 Сейчас в теме
(82) alex_4x,
уже не настоящее программирование

Ну вот, опять "настоящее/ненастоящее". Разумеется, оно настоящее. Вы заставляете ЭВМ делать то, для чего ее приобрели. Это программирование. А вообще, "настоящие" программисты пробивают двоичные разряды на перфокарте. Это единственный "язык", который понимает компьютер. Какие "плюсы", какие ассемблеры, о чем вы вообще?
85. starik-2005 3033 12.10.15 14:37 Сейчас в теме
(82) alex_4x, в действительности объектная модель весьма упрощает программирование, позволяя делать в строку кода то, что в обычном случае делается в сто - за счет как раз полиморфизма, инкапсуляции и наследования. То, что в 1С это не используется, связано с архитектурой самой 1С, как проблемно-ориентированной платформы, позволяющей решать определенный круг задач. Т.к. сложные вещи взаимодействия с СУБД, ком-соединениями, формами и прочим в 1С по большей части реализованы, то собственные объекты не особо и нужны.
86. awk 741 12.10.15 16:49 Сейчас в теме
(85) starik-2005, (82) alex_4x,

Ребят почитали бы http://www.intuit.ru/studies/courses/40/40/info

Да и закрыли бы тему какой лучше...
87. starik-2005 3033 12.10.15 17:03 Сейчас в теме
(86) awk, а кто тут говорит о "какой лучше"? Разное для разного - главное, чтобы без фанатизма.
103. Brawler 454 12.10.15 23:15 Сейчас в теме
(86) awk, еще год назад я вам бы там этот обучающий курс (да хоть любой) за час экстерном на пятерку сдать мог)))
105. awk 741 12.10.15 23:33 Сейчас в теме
108. Brawler 454 13.10.15 08:09 Сейчас в теме
(105) awk, а сейчас сайт претерпел изменения и не так просто программным способом ответить на вопросы))) а так как потребности никакой в этом нет, то и способ не изыскиваю)))
91. ИНТЕГРА 25 12.10.15 17:24 Сейчас в теме
(82) alex_4x, Отвечу просто, не своими словами (в инете найдёте кто это сказал у меня не получилось):

"Чем примитивнее язык, тем примитивнее мышление человека, тем примитивнее становится сам человек и тем легче таким управлять".

По поводу управлять это уже немного мимо, но суть очень правильная в этих словах. Изучайте сложные языки и решения в том числе и на 1С будут проще для казалось-бы сложных задач.
92. klinval 337 12.10.15 18:01 Сейчас в теме
(91) ИНТЕГРА, Ну допустим сделать 2 клона одного программиста 1С. 1 клон будет год изучать Си++, потом год писать на 1С, второй все 2 года будет писать на 1С. Вы считаете, что априори 1 клон через 2 года будет лучше кодить на 1С чем второй? Я так не думаю.

Тут наверное правильно говорить о какой-то базе у программиста 1С. Т.е. если человек закончил техническую специальность - это хорошо, т.к. многое в 1С для него будет понятно и само-собой разумеющееся, т.к. кокой-бы он язык программирования ни изучал: основные принципы похожи. Если же у программиста 1С нет за плечами ни опыта программирования на другом языке ни базы в виде технической специальности - то ему будет просто трудней. Именно трудней, но это не значит, что он всю жизнь будет обязательно хуже программиста с нужной базой. При должном желании можно стать в своей специальности лучшим имея заведомо "низкий старт".
HystriX; Brawler; +2 Ответить
94. ИНТЕГРА 25 12.10.15 18:15 Сейчас в теме
(92) klinval, 2 года это смешно. Давай поговорим хотя бы о 10. Если у тебя опыта меньше 10 нам не о чем разговаривать (у меня около 20).
113. klinval 337 13.10.15 13:31 Сейчас в теме
(94) ИНТЕГРА,
2 года это смешно. Давай поговорим хотя бы о 10.

Ну так в чём проблема, переформулируем задачу:
Ну допустим сделать 2 клона одного программиста 1С. 1 клон будет N/2 изучать Си++, потом N/2 писать на 1С, второй все N лет будет писать на 1С. Вы считаете, что априори 1 клон через N лет будет лучше кодить на 1С чем второй?
Соответственно любые условия считаем равными, т.е. например оба приступают кодить на новой платформе сразу после выхода; оба кодят одинаковое количество часов в неделю; обучению уделяют одинаковое количество часов и т.д.
У вас N=10. Какой ответ?
114. klinval 337 13.10.15 13:55 Сейчас в теме
ИНТЕГРА,
В дополнение - каждый программист обязан знать язык Си++, иначе он не более чем сисадмин.

Если у тебя опыта меньше 10 нам не о чем разговаривать (у меня около 20).

Клише на клише... Может сразу все свои требования к настоящему Программисту и к тому кто с Вами может разговаривать озвучите?

Вот мне просто интересно: если вы работодатель и к вам устраиваются на работу программистом 1С. Вы подготовили тесты (ну там написать мелкую обработку например). Первый знает C++, опыта программистом больше 10 лет, тесты прошёл хуже чем второй, на доп вопросы отвечал тоже хуже. Второй тесты прошёл лучше, но не знает C++ ни других языков (как ему в трудовой написать Программист если он не знает C++!!??) и опыта программистом менее 10 лет (да как он посмел вообще со мной разговаривать:)).
Вы бы из-за принципа взяли первого или вообще не можете представить себе такой ситуации, что кто-то может без знания C++ и с меньшим опытом быть лучше?
120. ИНТЕГРА 25 13.10.15 17:55 Сейчас в теме
(114) klinval, при прочих равных психологических составляющих однозначно возьму Сиплюсовца! И тут меня не переубедить :) потомучто через пол года он даст лучший результат. А чистый 1Сник так и останется кодером. Кстати ты пример из моей практики привел практически 1-в-1.

По поводу опыта. Интернет-форум наитупейшая вещь в этом плане. Малоопытные тупо задавят массой и не узнаешь кто из них действительно стоящий. Каждый второй сыпет цитатами из инета. Ну смешно ведь. Пример из практики приводите реальный, а не "n/2 и n лет" ну п..ц слов больше нет ))))) ну и на послндок - если ктото кроме 1С ничего не кодил в жизни, то конечно он будет оправдываться какой он компитентный, из принципа, хотя сам не слышал ни о паттернах проектирования, ни о нормальных требованиях к оформлению кода и тп... рекурсию элементарно на практике не применяли ни разу. А ты применял? Можешь вспомнить?
122. Brawler 454 13.10.15 20:42 Сейчас в теме
(120) ИНТЕГРА, спорный момент, что программиста С++ нужно брать беспрекословно и отдавать именно ему предпочтение.
Очень часто "настоящие" программисты не могут с людьми общаться, а это в деле разработки прикладных решений для бизнеса очень важное упущение.
Да и как это я "настоящий" программист буду программировать на недо языке 1С? Позор, позор меня ждет в моих кругах...

Я уже говорил выше, что у нас в конторе вояют чудо программу на делфях ХЕ, так вот главный в группе разработчиков даже не желает хоть приблизительно узнать объектную модель 1С, так сказать хоть с вершками идеологии тамошней ORM познакомиться, да что там, от слов бухучет и субконто у него паралич мозга и как следствие агрессия и слова типа иди отсюда со своей 1С. Вот вам и "настоящие" программисты. Втемяшат себе в голову что их С++ или Делфи или еще чего за язык, ИДОЛ и в корне не хотят ничего знать, даже идеологию. Компилируемый язык в машинный код НАШЕ ВСЕ! Но бизнесу та ведь не нужны филигранные отточенные программные коды выигрывающие 1 мс времени из-за примененной сортировки "дырявым пузырьком" (шутка), логика которой приснилась во сне программисту и он даже документации к ней не написал, бизнесу нужна прозрачность логики в программе, легкость ее модификации... дальше сами продолжить можете. Главное минимизация издержек.

Как показывает практика, пока человек не поработает, и не покажет себя, нельзя однозначно говорить, что он не справится с задачей.
Для этого и придуманы договора с испытательным сроком! Не подошел человек, берете следующего кандидата из ранее рассматриваемых.
А можно их и параллельно в дело пустить, а потом выбрать из двоих одного.
131. ИНТЕГРА 25 14.10.15 16:42 Сейчас в теме
(122) Brawler, знаю таких программисто тоже, которые не любят 1С. По мне так это ограниченные люди. Система слишком хороша и распространена, чтобы ее игнорировать. А Си++ если он умеет разговаривать с людьми через пару месяцев обскачет 1Сника. Я в этом уверен.
(123) starik-2005, А мы в школе с братом своим одноклассникам вели информатику иногда, по просьбе учителя, тк она понимала что некоторые вещи можем лучше объяснить. И им были интнресны такие уроки. :)
123. starik-2005 3033 13.10.15 23:11 Сейчас в теме
(120) ИНТЕГРА, я в свое время в университете работал в лабе, где занимались дендрохронологическими и флористическими исследованиями. Вроде биология, а математики там было весьма и весьма. И был там пакет программ для анализа временных рядов - немцы подарили, а так он 3к долларов стоил (тогда евро еще не было, а в марках как-то не мерили). Хороший был пакет, но глючный. Написан на С, под MS DOS. А мы (т.е. я, а ребята с лабы в качестве постановщиков задач были) потом написали тоже достаточно серьезный пакет для обработки временных рядов на Borland Pascal под Protect Mode. Так вот в PM в DOS можно было только 65к переменных инициализировать, хотя память можно было юзать всю (для обычных DOS-программ - только первые 640 кб + видеопямять (кто помнит адреса А000 и B800?))) Так что по поводу опыта и знания архитектуры, то я в курсе, что к чему в персональных компьютерах и изнутри, и снаружи.

(121) ИНТЕГРА, по поводу "коряво назвал", то это от образования зависит. Кому-то кажется, что коряво. Я на ООП перешел в 1997-м году - так на нем все и делал, пока в 1С не залез в 1999-м ))) В том же паскале не было классов - были объекты. В Delphi уже появились классы, хотя я до сих пор не могу понять, чем они от объектов отличаются ))) Те же яйца, только в профиль, хотя умные дяди пишут, что класс - это тип, а объект - это переменная, имеющая тип класса. Видимо это от того, что в Борланд Паскале не было классов, и аналог newClass = class(oldClass) записывался как newTObject = Object(oldTObject), т.к. изначально в паскале не было ключевого слова class, а в объектном паскале Делфи слово object используется для других целей. Таким образом awk должен сейчас сказать, что т.к. код на Борланд Паскале не будет компилироваться в объектном паскале, то это разные языки программирования, что я лично расцениваю как полный бред, уж извините.

(122) Brawler, по поводу "тру программеров", то они вполне могут не понимать ничего в бухгалтерии, т.к. их это ни коим образом не касается. Если бы те программеры, которые пишут код платформы, разбирались в бухгалтерии, то у 1С не было бы никаких шансов занять лидирующие позиции на рынке. Не надо смешивать проблемно-ориентированное программирование (ПОП) с системным и прикладным. Хотя в ПОП и есть иногда необходимость использовать прикладное программирование (тот же рекурсивный обход дерева значений), но целью этого в большинстве своем является изменение данных в СУБД, а не что-то иное.

Кстати, сортировка пузырьком - полная хрень. Есть рекурсивный алгоритм quicksort - он куда быстрее, для списков в 100к позиций на пентиуме 75-м (да, давно это было) скорость сортировки была в доли секунды. А пузырьковая сортировка в школе изучается и ничего сложного из себя не представляет. Но отсортировать - это полдела. Часто надо искать значения в списке. Двоичный поиск по упорядоченному списку дает поиск в среднем за логарифм по основанию два от количества элементов списка деленное на два итераций. А обычные программисты удивляются, почему это в индексированной таблице такая высокая производительность поиска. Просто понимать надо, как все работает, тогда и вопросов таких глупых не будет. Но, с другой стороны, нафига нормальный программист идет в 1с-ники. Я пошел потому, что не было другой работы в регионе. Теперь вот есть. но уже привык к 1С, но реально хочется заняться действительно интересным программированием, а не втыканием в СКД-отчет невозможных полей и группировок - хоть какое-то развлечение для ума.
124. awk 741 14.10.15 00:16 Сейчас в теме
(123) starik-2005,
1. За делфи обджект паскаль и паскаль сказать не могу ибо знаю (знаю громко сказано, скорее что-то помню из...) только паскаль.
2. Биолог освоивший язык программирования - теперь понятно сравнения обезьян с человеком.
3. Пузырьковая сортировка - это один из способов сортировки с временной сложностью О(n), у QuickSort O(n*log(n)), а если посмотреть полный список алгоритмов, то есть более быстрые нежели QuickSort. Рекомендую Скиену почитать...

(121) ИНТЕГРА, Скорее на твердый кол... И дело не в резании слуха, хотя термин "объектная модель" еще более не конкретен чем ООП (да-да за 40 лет ООП так и не дали общепризнанное определение, известно только что в ООП обязательно должны быть наследование инкапсуляция и полиморфизм). А в том что наличие поддержки Классов это только 1-5% отличий.
126. starik-2005 3033 14.10.15 10:09 Сейчас в теме
(124) awk, лучше Кнута почитайте, а то во всех биологов начинаете видеть, даже в тех, в ком их нет. Но если уж говорить о биологии, то именно она имеет неплохие математические методы, позволяющие сравнивать различные последовательности, к которым, в частности, можно отнести и ДНК, и языки программирования. Если говорить о С и С++, то при таком сравнении они будут куда ближе, чем шимпанзе и хомо сапиенс. А если говорить о паскале, то синтаксис объектного паскаля и паскаля от борланд схож, некоторые различия появляются как раз в реализации ООП. то же самое с С и С++. В обоих этих языках вполне можно написать с += а = х, и компилятор скушает их совершенно одинаково. Кстати, что будет в "с", если в "х" положить 1, а в "с" - 3?
125. Evil Beaver 8107 14.10.15 09:31 Сейчас в теме
Коллеги, я предлагаю закончить фаллометрию или продолжить её где-то в другом месте )
HystriX; awk; klinval; artbear; dmpas; +5 Ответить
127. пользователь 14.10.15 10:10
Сообщение было скрыто модератором.
...
128. artbear 1448 14.10.15 10:53 Сейчас в теме
(0) Андрей, пиши модераторам, пусть удалят весь флуд
130. Evil Beaver 8107 14.10.15 11:19 Сейчас в теме
(128) artbear, ну ты меня уже опередил, а так - да, дельный совет. Спасибо.
129. пользователь 14.10.15 10:58
Сообщение было скрыто модератором.
...
132. sss999 48 03.07.19 08:53 Сейчас в теме
134. WKBAPKA 214 30.07.19 13:48 Сейчас в теме
Правильнее было бы сказать, что передача по значению, это передача ссылки на объект с возможностью манипулирования данными этого объекта. Создание нового объекта с таким же именем ограничит область видимости методом в котором этот объект создан. А вот при создании нового объекта с таким же именем без Знач, будет означать удаление старого объекта в куче и создании нового с передачей ссылки вызываемому методу.
1С зло )
137. Evil Beaver 8107 31.07.19 23:49 Сейчас в теме
(134) возможно, вы поняли, что сказали, но я нет.
140. WKBAPKA 214 01.08.19 10:25 Сейчас в теме
(137)

Процедура МояПроцедура(Знач Структ1)
    Перем Структ1;
    Структ1 = Новый Структура;
КонецПроцедуры

что будет?
141. Evil Beaver 8107 01.08.19 15:19 Сейчас в теме
(140) будет перекрытие области видимости имен. Вы чего спросить-то хотите? Вы пишете:
передача по значению, это передача ссылки на объект с возможностью манипулирования данными этого объекта

Это не так. Передавать по значению можно и примитивные типы, механизм передачи параметров вообще не зависит от типа значения, которое засунуто в параметр. Поэтому что передача объекта, что передача примитива - это передача переменной или значения этой переменной в случае "Знач". И никаких манипуляций с видимостью и удалением чего бы то ни было из кучи
142. WKBAPKA 214 01.08.19 15:39 Сейчас в теме
(141) спросить хочу, как это выглядеть будет технически.
Вот что пишет 1С

Передача параметров по ссылке
По умолчанию, во встроенном языке 1С:Предприятия 8 передача параметров в процедуры и функции осуществляется по ссылке. Это означает, что изменение формального параметра внутри процедуры или функции будет отражаться на значении фактического параметра, переданного при вызове процедуры или функции.


читаем дальше:

При передаче параметра вызываемой процедуры или функции по значению, изменение значения формального параметра внутри процедуры или функции никак не влияет на фактический параметр, передаваемый при вызове процедуры или функции. Указание, что параметр нужно передавать по значению, осуществляется с помощью ключевого слова Знач.


из чего можно сделать вывод, что происходит банальное копирование значения переменной (создание новой переменной с записью в нее значения или указателя) . В случае с примитивными типами, в стеке, а в случае со ссылочными данными в некоторой области динамической памяти (в Java это называется heap, куча). Т.е. создание НОВОГО объекта и размещения этого объекта в памяти.


Ку́ча (англ. heap) в информатике и программировании — название структуры данных, с помощью которой реализована динамически распределяемая память приложения.

Размер кучи — размер памяти, выделенный операционной системой (ОС) для хранения кучи (под кучу).


В итоге, при передаче ссылочного параметра с помощью Знач мы получаем новый объект.
Я не думаю, что господа из 1С реализовали у себя как то по другому.
146. Evil Beaver 8107 01.08.19 16:08 Сейчас в теме
(142) О господи... рукалицо... вы точно 1С-ник?
143. WKBAPKA 214 01.08.19 15:43 Сейчас в теме
Как думаете, какое значение в итоге будет записано в наименование?

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

Процедура НекотороеДействие(Знач Спр)
	Спр.Наименование = "Имя 2";
КонецПроцедуры
Показать
148. Evil Beaver 8107 01.08.19 16:10 Сейчас в теме
(143) Имя 2. Вы передали по значению handle объекта. Если вы запишете туда слово из трех букв, но в процедуре "КнопкаВыполнитьНажатие" все равно будет Справочник. А если бы передавали по ссылке - была бы строка из трех букв.
144. WKBAPKA 214 01.08.19 15:51 Сейчас в теме
Короче, фигню они пишут

Процедура КнопкаВыполнитьНажатие(Кнопка)
	Структура = Новый Структура("Знач", 1);
	НекотороеДействие(Структура);
	
	Сообщить(Структура.Знач);
КонецПроцедуры

Процедура НекотороеДействие(Знач Структ)
	Структ.Вставить("Знач", 2);
КонецПроцедуры	
Показать


в этом варианте значение параметра знач в сообщить будет 2

Процедура КнопкаВыполнитьНажатие(Кнопка)
	Структура = Новый Структура("Знач", 1);
	НекотороеДействие(Структура);
	
	Сообщить(Структура.Знач);
КонецПроцедуры

Процедура НекотороеДействие(Знач Структ)
	Структ = Новый Структура;
	Структ.Вставить("Знач", 2);
КонецПроцедуры	

Показать


а в этом варианте значение параметра знач в сообщить будет 1

1С зло :)
150. Evil Beaver 8107 01.08.19 16:21 Сейчас в теме
(144) кто "они" пишут фигню?

Вы нифига не понимаете в том как работают языки, кидание умными словами про "кучу" из Java только усугубляет этот факт. Эти два примера кода неидентичны и работают строго так, как должны работать по документации и по здравому смыслу. Держите в уме не Java, где нет понятия "передачи по ссылке", а C++, где такое понятие есть. 1С и С++ работают одинаково при передаче по ссылке:

void ByValue(int value){ value = 7; }
void ByReference(int& value) { value = 7; }

void main(void)
{
  int a = 5;
  ByValue(a);
  cout << a; // prints 5
  ByReference(a);
  cout << a; // prints 7
}
Показать


А теперь тот же пример, но с указателем на объект (переменная в 1С)


class V8Variable { RealData* dataPointer; }

void ByValue(V8Variable value){ value = new V8Variable; }
void ByReference(V8Variable& value) { value = new V8Variable; }

void main(void)
{
  // а тут домашнее задание
}
Показать
145. WKBAPKA 214 01.08.19 15:58 Сейчас в теме
Если не происходит явного создания новой структуры с таким же именем Знач ни на что не влияет. Нежданчик )
149. Evil Beaver 8107 01.08.19 16:14 Сейчас в теме
(145) не происходит и не должно. Перечитайте статью еще раз или смените профессию.
153. WKBAPKA 214 01.08.19 16:50 Сейчас в теме
(149)
У каждого здравый смысл свой. Какой смысл передавать ссылку с использованием Знач, если изменение ссылки переданной по значению изменяет внешний объект? Да, на ИТС в особенностях передачи параметра это описано.
Те примеры, что вы нас С привели, на Java будут работать также, только где там ключевое слово Знач?
За счёт строгой типизации как раз и понятно, что будет происходить.
И не надо со мной в таком тоне. Я понимаю, у вас голова большая и кучерявая, но я вам не хамил.
154. Evil Beaver 8107 01.08.19 17:50 Сейчас в теме
(153) Изменение Ссылки != Изменение Объекта. Для этого написана эта заметка. Это разжевано сотни раз в официальной документации и форумах, а люди почему-то до сих пор эти понятия путают.

Я не зря постоянно отсылаю к C++. Копирование указателя не является копированием объекта. При передаче в метод указатель - копируется, а объект нет. Стоит изучить C(++) и большая куча вопросов по основным ЯП отпадет сама собой.

А за тон, извините, но когда я вижу безаппеляционные и при этом неверные утверждения, я завожусь.
155. WKBAPKA 214 01.08.19 18:07 Сейчас в теме
(154) для меня Знач было очевидным, строго создание нового объекта (его копирование), если говорить не про клиент серверное взаимодействие. А получается, что нет. Тогда глубокого смысла в этом ключевом слове я не вижу. Когда я передаю параметр в Java у меня не может быть двухсмыслицы. Если я создам явно объект, с таким же именем, это будет новый объект. А тут выходит, что передача по Знач до фени, позволяет менять данные объекта, если я явно не создам новый с таким же именем. Тогда зачем это ключевое слово в принципе? И где тогда тут здравый смысл и логика? Я внимательно прочитал вашу статью. Вы сами в комментариях писали, что многие вещи узнали опытным путем. А кто из программистов 1с задумывается об этом? А потом думаешь, почему конфигурация на УФ запускается раз в 10 медленнее и отжирает память.
157. Evil Beaver 8107 01.08.19 18:12 Сейчас в теме
(155) здравый смысл и логика в слове Знач следующая:

Процедура ЗаполнитьТаблицу(ТаблицаЗначений)
   ТаблицаЗначений = "ЖУЙ"!
КонецПроцедуры

Т = Новый ТаблицаЗначений;
ЗаполнитьТаблицу(Т);
Сообщить(Т.Количество()); // Упс..


Знач запрещает ЗАМЕНУ значения в переданном параметре. Это НЕ копирование.
158. WKBAPKA 214 01.08.19 18:15 Сейчас в теме
(157) я понимаю, а смысл? Это рассчитано на идиотов? Какому идиоту прийдёт в голову ссылку заменить на строку? А кому это в голову прийдёт, то тут и Знач не поможет.
160. Evil Beaver 8107 01.08.19 18:20 Сейчас в теме
(158)

Какому идиоту прийдёт в голову ссылку заменить на строку


Ну хорошо, если вам так будет понятнее, то

Процедура ЗаполнитьТаблицу(ТаблицаЗначений)
   ТаблицаЗначений = Новый ТаблицаЗначений;
КонецПроцедуры

Т = Новый ТаблицаЗначений;
Т.Колонки.Добавить("МояКолонка");
ЗаполнитьТаблицу(Т);
Сообщить(Т.Колонки.Количество()); // Упс..


Переданный в процедуру объект это ТОТ ЖЕ САМЫЙ объект. Поэтому у него можно вызвать метод, например Очистить(), независимо от Знач.
А вот переписать содержимое ячейки памяти, в которой лежит переданный объект нельзя, если передавалось по Знач. Таким образом, Знач обеспечивает семантику "входного" параметра, а отсутствие Знач - семантику "выходного параметра".

Почему по умолчанию не сделано наоборот - вопрос к дизайнерам языка 1С, а скорее даже к дизайнерам языка Visual Basic, где поведение именно такое и который служил прообразом языка 1С.
163. WKBAPKA 214 01.08.19 18:25 Сейчас в теме
(160) так я никогда такого не сделаю. У меня параметр метода всегда будет с другим именем, например, пТаблицаЗначений, иначе я сам запутаюсь, с чем я работаю. Вот в этом и не очевидность.
164. Evil Beaver 8107 01.08.19 18:27 Сейчас в теме
(163) ууу, как все запущено-то.. венгерских нотаций подвезли. И таблицы значений, поди, префиксуете буквами тз? не дай бог потом такой код читать "абырвалг_парам_лПеременная" Ужас!
mivari; Brawler; +2 Ответить
167. WKBAPKA 214 01.08.19 18:30 Сейчас в теме
(164) нет, код понятен. Без абырвалг. Не по адресу пишите. Просто в моем случае видно, где параметр метода, где переменная модуля, а где локальная переменная метода.
170. Brawler 454 01.08.19 18:57 Сейчас в теме
171. WKBAPKA 214 01.08.19 19:17 Сейчас в теме
(170) не знаю как там в Delphi, но в 1с у тебя переменная может быть одновременно данными объекта, переменной модуля объекта и переменной модуля формы и реквизитом формы Ахренительно потом отлавливать прикольно ошибки. Записываешь документ интерактивно, а он после записи еще раз вызывает диалоговое окно подтверждения записи. А ты потом ищешь причину. Вот это дермокод, согласен
173. spacecraft 01.08.19 19:25 Сейчас в теме
(171) ну, если начать обсругать Java, то можно тоже не мало "ласковых" привести.
Чего стоит только "синоним" Java: "NullPointerException".
А уж этот геморой с примитивными типами в коллекциях, точнее их отсутствие. И приделывание к ним оберток.
Так что Java далеко не идеальный ЯП.

И сравнивать строго типизированные ЯП с не строго типизированными вообще не имеет смысл.
174. WKBAPKA 214 01.08.19 19:27 Сейчас в теме
(173)спору нет. Поэтому есть правила хорошего тона при написании программ. Я стараюсь писать так, чтобы мою писанину потом понял другой программист. А не заворачивать код до такого состояния, что и обфускатор не нужен
175. spacecraft 01.08.19 19:30 Сейчас в теме
(174) причем тут хороший тон написания и возможности языка?
Кто мешает "хорошо" писать на 1С? Просто вот это самое "хороший тон" у каждого свой.
177. WKBAPKA 214 01.08.19 20:43 Сейчас в теме
(175) что значит, у каждого свой? когда вы работаете в команде, вы придерживаетесь общих правил? или каждый пишет как хочет? нет, вы по любому договоритесь к каким то общим правилам написания кода.
Поэтому, в других языках давно уже придумали шаблоны проектирования, общие правила описания переменных, констант, классов. Можно конечно так надрочиться, что писать сложные конструкции в одной строке, только другому программисту, кто будет читать этот код, будет не сильно хорошо. Поэтому есть правила. Код должен быть читабельным, понятным. Что тут плохого?
179. spacecraft 01.08.19 20:54 Сейчас в теме
(177)
что значит, у каждого свой? когда вы работаете в команде, вы придерживаетесь общих правил? или каждый пишет как хочет? нет, вы по любому договоритесь к каким то общим правилам написания кода.

Корпоративный регламент и "хороший тон"(это Ваш термин в контексте ЯП) не одно и тоже. И могут отличаться.
"хороший тон" это вообще субъективное понятие.
Некоторых устраивает "венгерская" нотация, а некоторых от нее воротит. На вкус и цвет все фломастеры разные.

Но разговор был про возможности ЯП. И в пример ставили Java. Я не согласен, что Java нужно ставить в пример и говорить, что в 1С все плохо, а в ней все хорошо.
183. WKBAPKA 214 01.08.19 21:03 Сейчас в теме
(179) скажем так, в Java намного лучше, просто 1С и Java предназначены для решения разных задач. А подхода Java мне в 1С не хватает.
И не надо меня агитировать за 1С. Я с 1С работаю с 1998 года и ее преимущества и недостатки хорошо знаю.
Может я не очень академически подкован в некоторых вопросах, как тут некоторые товарищи, но некоторые мои разработки работают на несколько порядков быстрее, чем аналогичные по функционалу. И я могу дать фору практически любому бухгалтеру и/или финансовому директору, в части знания бухгалтерии и управленческого учета.
186. spacecraft 01.08.19 21:09 Сейчас в теме
(183) взрыв мозга. Успокойтесь, никто вас не агитирует. Наоборот. Не нравится идите в Java.
Судя по вашим высказываниям, только краем уха слышали про Java и тонкости работы в 1С.
Так что фору будете давать, но не здесь.
187. WKBAPKA 214 01.08.19 21:12 Сейчас в теме
(186) да вы правы, только краем уха. Поэтому и зарабатываю на 1С последине 20 лет. На Java под Андроид написал пару коммерческих проектов. Но Андроид только изучаю, мало времени. А на ваши тонкости программирования в 1С насмотрелся. Тонкость на тонкости, что иногда срыгнуть хочется. Настолько все тонко, что некоторые вещи просто приходиться переписывать.
188. spacecraft 01.08.19 21:15 Сейчас в теме
(187) вот не выношу людей, которые кичатся "зарабатываю на 1С последине 20 лет" и хают свой же инструмент.
Продолжайте и дальше обновлять 1С 7.7.
189. WKBAPKA 214 01.08.19 21:19 Сейчас в теме
(188) а я не выношу людей, которые ничего не знают о человеке, но делают какие то свои примитивные выводы.
Узбагойтесь, я 7.7 не занимаюсь давно, в последний раз переносил данные конвертацией в 8-ку в прошлом году.
Да да, я застал еще 6.0, писал на 7.5, 7.7 и 8.х
И в моем активе есть ряд коммерческих продуктов, которые продавались также и через Инфостарт.

Я не хаю инструмент, как вы изволили выразиться, я выражаю свое мнение, на которое, кстати, имею право.
190. spacecraft 01.08.19 21:26 Сейчас в теме
(189) во-первых, вы сами не знаете знаний собеседника и его опыт.
во-вторых, я сужу чисто по вашим же здесь высказываниям по поводу 1С и Java и даже С++. Эти высказывания оставляют желать лучшего о ваших знаниях.
Зато самозабвенно и голословно начали высказывать о своих достижениях. Что на фоне выше перечисленного, очень даже сомнительно.
Да, не будем забивать ветку оффтопиком. На этом все.
192. WKBAPKA 214 01.08.19 21:29 Сейчас в теме
(190) ну и где я писал, что вы там полный профан? ткните пальцем.
что я писал про знания Java или С++? я C без ++ видел издалека в далеком 1998 году.
А вот Java знаю относительно не плохо.
Теперь давайте перейдем к делу. Что я написал про Java, что вам показалось "оставляет желать лучшего"?
193. spacecraft 01.08.19 21:42 Сейчас в теме
(192)
ну и где я писал, что вы там полный профан? ткните пальцем.

Читаем: (187) "А на ваши тонкости программирования в 1С насмотрелся."
что я писал про знания Java или С++? я на C без ++ видел издалека в далеком 1998 году.

Читаем:(156) "Знание C++ в этом вопросе не поможет, т.к. это такая себе фишка 1с."
Теперь давайте перейдем к делу. Что я написал про Java, что вам показалось "оставляет желать лучшего"?

Тут в общем контексте высказываний понятно. Вот на пример:
"Те примеры, что вы нас С привели, на Java будут работать также, только где там ключевое слово Знач?
За счёт строгой типизации как раз и понятно, что будет происходить. "
Судя по высказыванию, вы не понимаете что такое ссылка в Java. И почему там нет слова аналогичного Знач. Потому что там все передается как Знач.
В 1С наоборот.
196. WKBAPKA 214 01.08.19 21:50 Сейчас в теме
(193) блин, потому что там передаются переменные строго по типу и там нет такой конструкции как Знач, что не ясно?

public void myMethod(String var 1, int var 2, MyObject var 3) {
}

какие могут быть разночтения?

а в 1С

Процедура МояПроцедура(ХЗ) 
КонецПроцедуры


что такое ХЗ? Хрен знает... не надо приписывать мне свои домыслы.
198. WKBAPKA 214 01.08.19 21:53 Сейчас в теме
(193) и я нихрена никогда не смогу сделать вот так

void myMethod(MyObject var1) {
   var1 = 2;     
}


а вот так смогу

void myMethod(MyObject var1) {
   var1 = new MyObject();     
}


и тут нет никаких разночтений, т.к. понятно все

а в C передача параметра по ссылке

void boo(int &value)
{
    value = 7;
}


в Java такого в принципе нет. И это особенность языка. Как и Знач в 1С. А вот реализация этой особенности может быть своя.
Откуда мне знать, без документации, как создатели языка реализовали тот или иной принцип?
Вот я об этом.
Рядовой программист 1С не то что не понимает разницы, что такое передача по ссылке и по значению, а зачастую даже не понимает, что такое переменная.
199. Brawler 454 01.08.19 21:57 Сейчас в теме
(198) Вопросы жесткой типизации данных выходят за рамки темы "По ссылке или по значению? Ключевое слово Знач и с чем его едят".

Примите как данность в 1С везде в переменных/параметрах используется тип данных Variant вернее его внутренний аналог в платформе 1С.


>> Откуда мне знать, без документации, как создатели языка реализовали тот или иной принцип?
Для этого есть документация и ее нужно всегда читать, когда начинаешь изучать язык программирования, чтобы изначально понимать все нюансы языка.
200. WKBAPKA 214 01.08.19 22:02 Сейчас в теме
(199) + 1, поэтому и срач такой. я думал, что ключевое слово Знач изолирует передаваемое значение, что я могу делать с этим значением что угодно и это никак не повлияет на значение внешнего блока.
Но я ошибался. И автор статьи расписал в статьей эту особенность.
Но тема сисек не раскрыта до сих пор, ибо передавать мы можем не просто ссылки на объекты типа Структура или ТаблицаЗначений, но также и на документы и справочники.
И вот тут бы мне хотелось услышать гуру, что в этом случае означает ключевое слово Знач, как оно влияет на передачу этих самых ссылок. Почему я не могу передать мутабельное значение на сервер (в контексте обычного, а не управляемого приложения)
201. Brawler 454 01.08.19 22:10 Сейчас в теме
(200) Есть такое понятие сериализация, и вот не все объекты возможно сериализовать в XML или какой другой вариант представления объекта в виде текста без каких либо последствий и передать на сервер и обратно.

Допустим вы на стороне клиента открыли файл на диске и начали его читать. Открыт у вас объект для работы с файлом, при помощи его методов чтение и производите, и вот вам что-то в голову ударило и вы с клиента на сервер хотите передать этот объект работающий с файлом. Что будет? Какое его поведение вы ожидаете? Что думаете файл продолжит на сервере читаться? В Табличный документ, который подтянул в свои настройки параметры вашего принтера локального, будучи переданным на сервер продолжит взаимодействовать с вашим принтером, о котором сервер вообще не в курсе?

Думайте шире, почему сложные объекты попали в перечень тех, которые нельзя гонять с клиента на сервер и обратно.
203. WKBAPKA 214 01.08.19 22:13 Сейчас в теме
(201) нееее. я про не сложные объекты, я про обычные объекты в терминах 1С, справочники и документы и про контекст сервер - сервер, т.е. обычное приложение, где разделение на клиент и сервер условно.
205. Brawler 454 01.08.19 22:28 Сейчас в теме
(203)

пусть все будет выполняться на сервере

Перем МутабельнаяПеременная;

Процедура ПроцА(МутабельныйПераметр)
  МутабельныйПераметр.ЧислоБ = 3;
КонецПроцедуры

Процедура ПроцБ(Знач МутабельныйПераметр)
  МутабельныйПераметр.ЧислоБ = 4;
КонецПроцедуры

Процедура ПроцС(МутабельныйПераметр)
   МутабельныйПераметр= Новый Структура("ЧислоА,ЧислоБ", 3, 7);
КонецПроцедуры

Процедура ПроцД(Знач МутабельныйПераметр)
   МутабельныйПераметр= Новый Структура("ЧислоА,ЧислоБ", 1, 8);
КонецПроцедуры

МутабельнаяПеременная = Новый Структура("ЧислоА,ЧислоБ", 2, 2);

ПроцА(МутабельнаяПеременная);
Сообщить(МутабельнаяПеременная.ЧислоА + ЧислоБ); // 5

ПроцБ(МутабельнаяПеременная);
Сообщить(МутабельнаяПеременная.ЧислоА + ЧислоБ); // 6

ПроцС(МутабельнаяПеременная);
Сообщить(МутабельнаяПеременная.ЧислоА + ЧислоБ); // 10

ПроцД(МутабельнаяПеременная);
Сообщить(МутабельнаяПеременная.ЧислоА + ЧислоБ); // 10
Показать
206. WKBAPKA 214 01.08.19 22:38 Сейчас в теме
(205) я ссылочные объекты, справочники, документы и т.п.
226. Brawler 454 02.08.19 17:57 Сейчас в теме
(206) Ничего не меняется, прикладные объекты вы передаете или нет, ну разве что если к примеру СправочникСсылка или ДокументСсылка передаете, то эти объекты изначально ReadOnly и их вы в принципе не поменяете пока не получите объект по этой ссылке и не начнете его менять в памяти или попутно записывать в базу банных.
204. WKBAPKA 214 01.08.19 22:25 Сейчас в теме
(201) Ну я же не могу передать на сервер ссылку на не записанный в БД объект. Вот в чем беда. Мне это не понятно, потому как оно все выполняется синхронно, в основном потоке, что гарантирует неизменность переданного объекта, когда его еще нет в БД физически. Значит изменить его в теории никто не может. Но в тоже время, этот объект считается мутабельным и передать я его не могу .
229. starik-2005 3033 04.08.19 11:27 Сейчас в теме
(204) а на клиенте нет того "объекта", который на сервере (если мы говорим о документе или элементе справочника, например). Передать его на сервер поэтому в принципе нельзя, но можно в серверной процедуре формы преобразовать реквизит в объект, передать на сервер, получить назад и преобразовать обратно в реквизит. Но, с другой стороны, часто это не нужно делать, т.к. если нам нужно что-то поменять (рассчитать ставку НДС, например, при изменении номенклатуры), то мы можем передать строку таблицы формы, которую уже в общем модуле обработать. Другое дело, что 1С потащит на сервер весь контекст формы, поэтому если в документе даже 1к строк, это становится весьма медленным. И тут тоже есть выход - передавать строку в виде структуры, также и нужные для расчета реквизиты шапки, а ненужные вещи не трогать и не ползать на сервер с контекстными вызовами вообще.
207. spacecraft 01.08.19 23:37 Сейчас в теме
(198)
и я нихрена никогда не смогу сделать вот так

Зато можно сделать так:
class Test1 {

    @Test
    fun test1(){
        var var1 = MyObjectImpl(1)
        myMeted1(var1)
        assertThat(var1.var1, equalTo(3))
    }

    private fun myMeted1(var1: MyObjectImpl){
         var1 += 2
    }
}

data class MyObjectImpl(var var1: Int) {

    operator fun plusAssign(increment: Int){
         var1 += increment
    }
}
Показать


Вот это и есть особенность, такая же как и Знач в 1С, если не учитывать особенность типизации. Это отдельная тема. Не нужно все рассматривать в куче.
Мы можем поменять объект, а не саму ссылку.
208. WKBAPKA 214 01.08.19 23:43 Сейчас в теме
209. spacecraft 01.08.19 23:44 Сейчас в теме
(208) и в чем разница при выполнении?
210. WKBAPKA 214 01.08.19 23:48 Сейчас в теме
(209) в смысле? Ты шутишь. Я Kotlin не знаю. Я не понимаю синтаксис языка. Напиши на Java
211. spacecraft 01.08.19 23:53 Сейчас в теме
(210) так он простейший, если знаешь java. Но более лаконичный.
Что тут не понятно?
Создает дата класс. Переопределяем операцию += так, чтобы к свойству прибавлялось значение.
Далее создаем функцию myMeted1. В ней к переменной содержащей объект типа нашего нового класса прибавляем 2.
Ну и в функции запуска создаем переменную. Инициализируем новым объектом типа нашего класса с передачей в конструктор класса цифру 1.
Вызываем функцию myMeted1 с передачей параметром этот объект.
213. WKBAPKA 214 01.08.19 23:58 Сейчас в теме
(211) я не против, но напиши на java
214. spacecraft 01.08.19 23:58 Сейчас в теме
(213) в отличие от java тут поддерживается переопределение таких операторов как +=
216. WKBAPKA 214 02.08.19 00:01 Сейчас в теме
(214) каким боком тут java? Напиши плж тоже самое на java
217. spacecraft 02.08.19 00:10 Сейчас в теме
(216) объектный код kotlin и java один. Как из kotlin можно вызывать код на java, так и наоборот.
Полного аналога привести не смогу, из-за ущербности java.
Но вот похожий функционал, но не выразительный:
public class Test2 {
    @Test
    public void TestMetod(){
        MyClass var1 = new MyClass();
        var1.var1 = 1;
        myMetod(var1);
        assert var1.var1 == 3;
    }

    private void myMetod(MyClass var1){
        var1.var1 += 2;
    }
}

class MyClass{
    public int var1 = 0;
}
Показать
218. WKBAPKA 214 02.08.19 08:35 Сейчас в теме
(217) объектный код может и не отличается, но есть нюансы языка, которые я не знаю.

Не вижу в этом коде ничего необычного.
219. spacecraft 02.08.19 08:42 Сейчас в теме
(218) я к тому, что все в java передается по значению, как в 1С с Знач. Но это не означает, что объект копируется. И объект можно изменять.
221. WKBAPKA 214 02.08.19 08:55 Сейчас в теме
(219) я и не писал, что в Java как то по другому. Просто в Java не возникает вопросов, т.к. там тип передаваемого параметра известен и изменить его на другой нельзя. Изменение значения примитива внутри метода, не изменит значение в вызывающем блоке.
А в 1С можно. В 1С без Знач меняется, а со Знач меняется для объектных типов, если явно не создал такой же объект. В связи с этим появляются вопросы, а что же тогда происходит при передаче структуры, например, с клиента на сервер, когда клиент и сервер две удаленные физические машины. Объект сериализуется, передается на сервер. Но что тогда означает Знач в этом случае, что передается? ссылка или значение? Ведь на сервере этой структуры нет. Разве можно передать по ссылке?
Оставьте свое сообщение