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

Публикация № 388527

Разработка - Практика программирования

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

196
В принципе, любой программист 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.Количество());

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

Резюме

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

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

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. karpik666 2717 12.08.15 18:18 Сейчас в теме
Наверное я зажрался, но плюсовать не хочется. Подобное уже читал на ИТС http://its.1c.ru/db/metod8dev#content:2606:hdoc. Единственное, что почерпнул это понятие "мелкая" и "глубокая". В любом случае спасибо за статью.
АлександрЯрославичъ; Irwin; kalyaka; klinval; rozer; Xershi; DoctorRoza; +7 Ответить
2. tormozit 5594 12.08.15 19:51 Сейчас в теме
(1) А где ссылка на особенности передачи параметров при вызове сервера?
3. karpik666 2717 12.08.15 20:07 Сейчас в теме
(2) tormozit, вот конкретно про это где-то читал здесь же на форуме. Пока все что нашел это комментарий fixin http://forum.infostart.ru/forum24/topic135262/message1396038/#message1396038 Ну и в целом по ветке там идет обсуждение "знач". Но помнится была более подробная информация, к сожалению сейчас не смогу привести ссылки.
4. tormozit 5594 12.08.15 20:23 Сейчас в теме
(3) Получается на ИТС про это нет. Я лично не находил. Поэтому статья намного больше раскрывает тему, чем ИТС. Так что плюсовать можно =)
alexovik; SeiOkami; mvxyz; HystriX; baton_pk; Liris; dgolovanov; Гарин; Созинов; Evil Beaver; artbear; rtnm; JohnyDeath; +13 Ответить
8. karpik666 2717 13.08.15 04:26 Сейчас в теме
(4) tormozit, но не находите, что если вычленить суть, то какая-то бедненькая статья получается?

Как известно, не все объекты платформы являются сериализуемыми. Именно отсюда растет ограничение, что не все объекты можно передать в серверный метод с клиента. ... Выполняется "глубокая" копия объекта. А при наличии слова Знач объект не поедет с сервера обратно на клиент.
14. Evil Beaver 6291 13.08.15 10:18 Сейчас в теме
(4) tormozit, спасибо за поддержку)) Можно и не плюсовать, я ж не ради плюсов, а вдруг кому-то помочь получится. Сами недавно на работе выясняли что да как, вот по итогам выяснения - статья.
(7) CheBurator,
...указатель копируется и перезапись объекта не приводит к перезаписи ячейки памяти с исходным объектом

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

Есть таблица на стопицот тыщ строк. Ее можно передавать хоть по ссылке, хоть по значению - сами стопицот тыщ строк не копируются, копируется только адрес этой таблицы. А вот если мы передаем эту таблицу на сервер, то вся она копируется. Более того, если в серверном методе не было слова Знач, то вся она еще и обратно на клиента поедет.
alexovik; akocur; dj_serega; +3 2 Ответить
133. alexovik 17 30.07.19 09:58 Сейчас в теме
(14) Если честно, спасибо Вам огромное за Вашу статью, сам парился полдня, потому что не мог скопировать полностью КомпоновщикНастроек пока не нашел Вашу статью, попробывал передачу через Знач и через клиент - сервер и получилось как хотелось. Еще раз спасибо за статью! :)
135. АлександрЯрославичъ 31.07.19 10:40 Сейчас в теме
138. Brawler 449 01.08.19 01:07 Сейчас в теме
(1) за мудрено пишите

передача параметра по значению = выделяется в памяти еще грубо говоря одна переменная, которой присваивается то же самое значение и код вызванного метода (процедуры/функции) использует в свое работе именно эту новую переменную, и не может попортить значение другой переменной. Однако так как, если в переменных лежит один и тот же мутабельный объект, то изменить его свойства вызванный метод вполне способен и тогда когда метод закончит свою работу, то вызвавший его ранее метод будет работать с уже измененным объектом внутри переменной, но сама переменная так и будет ссылаться на тот же объект, что был в ней изначально. С простыми типами типа Число, Булево, Строка... там все просто, в новой переменной вызванный метод может изменить только само значение новой переменной и это никак не повлияет на значение той переменной, что была использована в качестве аргумента для вызова метода.

передача параметра по ссылке = в том же паскале это означает, что передается адрес переменной в памяти без ее копирования и что любые манипуляции с этой переменной скажутся на значении этой переменной и когда вызванный метод завершит свою работу, то переменная может быть уже измененной до неузнаваемости

отдельная история с аргументами метода, которые являются константами, то есть например Sin(60), где 60 константа. хоть как их передавай, хоть как их меняй в вызванном методе, это не повлияет на код вызвавший этот метод, так как это не переменная и нигде значение далее не используется

1С не зло, просто нужно уметь готовить, упс.., программировать понимая основы, это все в книжках описано по разным языкам программирования, разделы типа передача параметров в функции/процедуры/методы.
139. WKBAPKA 211 01.08.19 10:21 Сейчас в теме
(138) что мудрено?
есть примитивные типы данных, а есть структуры данных (классы, объекты). Я не знаю как в 1С, но в Java хранятся они в разных областях памяти. Для манипулирования объектом используются указатели. При присвоении значения новой переменной, новая переменная содержит указатель на ту же область памяти. И я могу манипулировать данными объекта.
Пример:
Var1 = new MyObject();
Var1.doSomething(10);

Var2 = Var1;
Var2.doSomething(12);

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

Константы в переменных 1С как таковые отсутствуют, т.к. для работы констант нужно использовать Константы.ИмяКонстанты.
147. Brawler 449 01.08.19 16:09 Сейчас в теме
(139) Постольку поскольку в 1С нет жесткой типизации данных, то можно говорить, что там вообще один единственный тип данных Variant и хранятся данные возможно вообще все в куче, но это не точно, да и не важно где они хранятся, зачем прикладному программисту так много знать о том что завтра может уже работать и по другому.

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

В своей практике программирования на 1С вообще не приходится сталкиваться с тем чтобы так клонировать данные в памяти.
В мире того же C# есть свои танцы с бубноми по теме клонирования объектов и там это решается по своему гуглите "Копирование объектов. Интерфейс ICloneable".
152. Evil Beaver 6291 01.08.19 16:33 Сейчас в теме
(147) Парни, ну вот вы нашли друг-друга то....

1С НИЧЕМ не отличается от С++ и C# в части передачи значений в методы. От Java тоже ничем не отличается, только в Java нет передачи по ссылке, поэтому все идет "по значению". Если в Java вы передали List в метод, то этот ТОТ ЖЕ САМЫЙ List и никакой копии его не происходит. Создайте в Java List на миллиард записей размером по килобайту. А теперь передайте этот List в какой нибудь метод. Заметна потеря времени на "копирование при передаче по значению"? Нет, т.к. никакого копирования нет, передается только указатель. Но передается он "по значению", т.к. нельзя заменить значение, лежащее в этом указателе, так, чтобы это изменение было видно за пределами метода.

Итого: 1С работает строго так, как все другие известные мне языки, имеющие методы и параметры в них. Не выдумывайте того чего нет, почитайте еще раз статью, там как раз про мелкие и глубокие копии написано. Подумайте еще раз над термином и погуглите его, а после, не ведите споров о том, в чем разбираетесь поверхностно.
151. Evil Beaver 6291 01.08.19 16:27 Сейчас в теме
(139)
уверен, что происходит создание копии передаваемого объекта

НЕТ! Передача переменной-объекта в 1С ничем не отличается от передачи переменной-объекта в Java. Просто в Java нет понятия "передача по ссылке" и вы не можете там поэкспериментировать с этим поведением.
5. starik-2005 1961 12.08.15 20:46 Сейчас в теме
Вопрос: если на сервере создать функцию, возвращающую новый экземпляр объекта, получу ли я таким образом копию, например, структуры?

Типа так:

Код

&НаКлиенте
Процедура МояПроц()
  МояСтруктура = Новый Структура("параметр1, Параетр2, Параметр3", 1, 2, 3);
  МояВтораяСтруктура = КопироватьЧтоТ(МояСтруктура);
  МояВтораяСтруктураюПараметр2 = 5;
  Сообщить(МояСтруктура.Параметр2);
КонецПроцедуры

&НаСервере
Функция КопироватьЧтоТо(Знач Ссылка)
  Возврат Ссылка
КонецФункции

Показать полностью


Вот что выдаст "Сообщить": два или пять?
13. Evil Beaver 6291 13.08.15 10:06 Сейчас в теме
(5) starik-2005, делать серверный вызов ради копирования структуры - зло. Чтобы получить глубокую копию проще всего сделать ЗначениеВСтрокуВнутр/ИзСтрокиВнутр
mvxyz; pbazeliuk; +2 Ответить
20. starik-2005 1961 13.08.15 14:19 Сейчас в теме
(13) я о принципе говорю, а не о серверном вызове для копирования структуры. Еще не встречал задачи, где бы потребовалось структуру копировать.
6. baton_pk 392 12.08.15 21:19 Сейчас в теме
Передача параметров по ссылке по-умолчанию дичайше удручает...
15. Evil Beaver 6291 13.08.15 10:20 Сейчас в теме
(6) baton_pk, ну так с Visual Basic же язык копировали. Символ камента только другой взяли.
7. CheBurator 3399 13.08.15 00:17 Сейчас в теме
Ничего не понял

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

Получается два указателя на один и тот же объект?
Как тогда по по одному указателю модифицируем объект а по второму указателю получаем немодифицированный объект?

Так что всетаки копируется ? Указатель на объект или создается копия объекта?
Разьясните плиз
9. karpik666 2717 13.08.15 06:55 Сейчас в теме
(7) CheBurator, тут имеется ввиду, что когда мы имеем дело с не простыми типами и если это не клиент-серверное взаимодействие, то в любом случае мы передаем его по ссылке, даже если используется указатель "знач", изменяя его в какой-то процедуре по значению - мы изменим и исходный объект, Однако если в функции будет использован указатель "Знач" , например
 функция функция1(Знач Параметр1)
и будем присваивать какое-то значение Параметр1, то исходный объект не изменится на присваиваемый нами. А при клиент-серверном взаимодействии указатель "Знач" используется лишь для того, чтобы показать необходимо ли возвращать переменную на клиент с сервера или нет.
siliconvalet; HystriX; klinval; +3 Ответить
11. Brawler 449 13.08.15 08:43 Сейчас в теме
(7) CheBurator,

// первая переменная со ссылкой на массив в памяти
А = Новый Массив();
// Вторая ссылка на тот же массив в памяти
Б = А;
// по ссылке А добавим значение в массив
А.Добавить("А");
// по ссылке Б добавим значение в массив
Б.Добавить("Б");
// поместим в переменную Б другую ссылку
Б = Новый Массив();
// выведем число элементов массивов
Сообщить("А =" + А.Количество());
Сообщить("Б =" + Б.Количество());
Показать


А теперь, если на примере обращения к функциям.
НашМассив = Новый Массив();

ПоЗначению(НашМассив, "А");
Сообщить("Количество элементов = " + НашМассив.Количество()); // Вернет "Количество элементов = 1"
// что произошло? 
// Переменная НашМассив была передана в функцию по значению, то есть в функцию ушла не ссылка на переменную НашМассив , а переменная НашМассив была скопирована в другую область так сказать памяти (если не ошибаюсь, то в стек вызова метода, давно не углублялся так низко))) и уже ссылка на эту область памяти была передана в функцию, а в этой области находится ссылка на все тот же массив, это как Б = А. 
// Две переменные ссылаются на один объект в памяти, просьба не путать с простыми типами данных типа Число, Дата и т.д.
// И вот пришла копия переменной в функцию, но так как мы знаем, что в переменной массив, то смело добавляем в него новый элемент, при этом добавляется этот элемент в тот один единственный массив на который ссылаются две переменные.
// И вот после добавления нового элемента мы берем и перезаписываем значение переменной находящейся в функции, именное значение переменной записывается, не значения массива, а происходит полное затирание данных в переменной и в нее записывается ссылка на НОВЫЙ массив.
// но так как переменной осталось жить не долго, вызов функции подходит к концу, то и новый пустой массив убирается из памяти вместе со второй переменной
// а вот изначальная переменная НашМассив все так же ссылается на тот же массив но уже с добавленным в него элементом


ПоСсылке(НашМассив, "Б");
Сообщить("Количество элементов = " + НашМассив.Количество()); // Вернет "Количество элементов = 0"
// что произошло?
// ну тут все проще, в функцию передается ссылка на область в памяти в которой находится ссылка на массив в памяти и все, никакого копирования.
// мы так же успешно добавляем элемент в массив и потом помещаем в переменную НашМассив новый массив, а так как в функцию был передан адрес самой переменной НашМассив, то значит поменяв значение в ней, внутри функции, теперь это значение будет доступно в этой же переменной и по окончании работы функции
// иной раз можно получить неожиданное поведение программы, когда при вызове метода типа нашего ПоСсылке, и передав в него переменную НашМассив в качестве параметра по ссылке, после завершения метода можно обнаружить, что НашМассив уже не массив, а тупо Число или иного рода значение... ну делайте выводы так сказать

Функция ПоЗначению(Знач МассивКакПараметр, Знач ЧтоДобавитьВМассив)
  МассивКакПараметр.Добавить(ЧтоДобавитьВМассив);
  МассивКакПараметр = Новый Массив();
КонецФункции

Функция ПоСсылке(МассивКакПараметр, Знач ЧтоДобавитьВМассив)
  МассивКакПараметр.Добавить(ЧтоДобавитьВМассив);
  МассивКакПараметр = Новый Массив();
КонецФункции
Показать
10. Serg82 30 13.08.15 08:35 Сейчас в теме
Вот к чему приводит разделение на сервер и клиент, простые понятия уже не так просто объясняются.

Жесть какая-то в будущем будет, прогнозирую управляемое разделение на вызов нескольких серверов.

типа когда можешь управлять на каком сервере будет исполняться код в кластере серверов)
12. alex_4x 81 13.08.15 09:19 Сейчас в теме
А многопоточность в 1С 8.3 есть ?

Чтобы можно было так написать

thread1.Start();
thread2.Start();
thread3.Start();
thread4.Start();

thread1.Wait();
thread2.Wait();
thread3.Wait();
thread4.Wait();

Сообщить("Шеф, усё готово!");
18. su_mai 88 13.08.15 12:39 Сейчас в теме
(12) alex_4x, А очень надо? Хотите решать коллизии не только с блокировками транзакций, но еще и потоков?
21. starik-2005 1961 13.08.15 14:20 Сейчас в теме
(18) su_mai, про "коллизии" тоже есть статься: http://infostart.ru/public/384485/
19. starik-2005 1961 13.08.15 14:18 Сейчас в теме
16. rtnm 579 13.08.15 10:45 Сейчас в теме
Я вижу так:

Процедура КакаяТоПроцедура(Знач Значение)
   Значение = 123;
КонецПроцедуры


Это тоже самое, с точки зрения получаемого результата, что и:

Процедура КакаяТоПроцедура(Значение)
   КопияЗначения = Значение; //Это делает платформа за кулисами
   КопияЗначения = 123;
КонецПроцедуры


Ну или такое копирование можно представить перед вызовом:

Значение = 111;
КопияЗначения = Значение; //Это делает платформа за кулисами
КакаяТоПроцедура(КопияЗначения);


Т.е. в случае использования ключевого слова "знач" платформа просто создает новую переменную и в нее копирует значение, вот так "КопияЗначения=Значение", и именно с этой копией вы работаете внутри процедуры.
Это конечно не относится к особенностям ключевого слова "знач" при передачи управления с &НаКлиенте на &НаСервере и обратно.
17. avto1c 13.08.15 12:01 Сейчас в теме
&НаКлиенте
Процедура ПоЗначениюКлиент(Знач Параметр)
...

И
&НаКлиенте
Процедура ПоЗначениюКлиент(Параметр)
...

Одно и тоже?...
Косяк однако.
22. starik-2005 1961 13.08.15 14:22 Сейчас в теме
(17) avto1c, как раз не одно и то же. В одном случае параметр с ключевым словом "знач", а во втором случае - нет. В принципе это аналог Var в определении функции/процедуры в Pascal.
23. cssprite 27 14.08.15 09:17 Сейчас в теме
Другими словами, в 1С есть примитивные и ссылочные типы данных. Примитивные (базовые) типы содержат непосредственно значения, ссылочные содержат ссылки (указатели) на данные.
При вызове процедуры/функции без изменения контекста, при передаче параметров по значению:

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

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

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

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

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


и

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

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

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



Но это только до тех пор, пока мы не изменим саму переменную, при передаче параметра по значению, для ссылочного типа, с этого момента мы просто потеряем доступ к данным исходной переменной:

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

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

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


и

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

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

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


и для закрепления

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

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

Сообщить(Таблица.Количество()); // выведет 2
Показать
mivari; Alexx48; korzhishe; kalyaka; Созинов; IAmChukcha; suggestive; klinval; rtnm; +9 Ответить
24. klinval 276 14.08.15 10:16 Сейчас в теме
Не понял прикола в главе "Содержимое объекта и его состояние"...
Либо я уже "глубоко" засел в управляемом приложении и отвык от обычного, либо это реально тот редкий пример когда в контексте клиент-серверного взаимодействия всё намного понятнее.
25. Evil Beaver 6291 14.08.15 10:52 Сейчас в теме
(24) klinval, а что непонятного? У вас есть массив, у него содержимое. Или например, объект ЧтениеXML, а у него состояние - текущий узел, на котором стоит чтение. Состояние объекта это его внутренние данные.
26. klinval 276 14.08.15 11:12 Сейчас в теме
(25) думаю в примере к "Содержимое объекта и его состояние" корректней добавить "Знач", т.к. то что всё изменится без "Знач" было понятно и так, а то что со "Знач" программа всё-равно может поменять "исходный" объект - это ранее в статье не объяснялось.
27. Evil Beaver 6291 14.08.15 17:12 Сейчас в теме
(26) klinval, как это не объяснялось?
Вот ссылка на ИТС из первого комментария: http://its.1c.ru/db/metod8dev#content:2606:hdoc
Вот прямая цитата из статьи:
При передаче по значению копируется не весь объект, а только его указатель. Экземпляр объекта остается одним и тем же. Неважно, как вы передаете объект, по ссылке или по значению - очистка таблицы значений приведет к очистке именно таблицы. Эта очистка будет видна везде, т.к. объект был один-единственный и неважно, как именно он передавался в метод.
30. klinval 276 17.08.15 12:27 Сейчас в теме
(27) не правильно выразился: я имел ввиду не "не объяснялось", а "не приводилось примеров". Просто до этого куча примеров про то, что если передать по ссылке, то чтобы мы внутри процедуры не сделали - это изменит объект и вне этой процедуры. Так-же до этого приводится примеры как мы передаём "по значению" и вне процедуры мы никаких изменений объекта на видим. И тут в теме "Содержимое объекта и его состояние" говорится, что, оказывается иногда если передать "по значению" объект можно изменить. И в этой теме почему-то пример про передачу "по ссылке"... Тут я считаю логичней либо 2 примера, либо 1 "по значению", но никак не 1 "по ссылке".
Evil Beaver, не сочтите, что я придираюсь, просто хотел внести посильный вклад в развитие статьи. А так статья хорошая, я плюсанул.
28. alex_4x 81 17.08.15 10:48 Сейчас в теме
Так всё же, как сделать много потоков на сервере для вычисления?
Предположим задача такая - есть массив товаров и их много. нужно запустить в "Х" потоков расчет количества документов отгрузки, в которых товар присутсвует за период
Для разных процессов можно разбить по товарам, можно по периодам, результат должен быть помещен в оборотный регистр.
как это сделать ? пример может кто-то сделать?
"Х" - задается на входе в функцию фабрику потоков.

29. starik-2005 1961 17.08.15 12:08 Сейчас в теме
(28) alex_4x, да вообще не вопрос, но задача решается куда проще посредством запроса - SQL уже в несколько потоков получает выборки, поэтому достаточно написать "SEL ECT Товар,COUNT(DISTINCT Ссылка) FR OM Документ.ДокументОтгрузки.Товары GROUP BY Товар WHERE Товар IN (&СписокТоваров)".
Но если хочется для этого использовать многопоточность, то вариант следующий:
1. Задать количество потоков
2. Получить список товаров
3. Получить список из Н товаров для следующего потока
4. Если количество потоков меньше Х, то стартануть еще один поток и запомнить его (фоновоеЗадание.Выполнить("ИмяПроцедуры", Массивпараметров))
5. Если потоков Х, то дождаться завершения любого из потоков (опрашивать потоки через "НЕ ФоновыеЗадания.ПолучитьФоновоеЗадание(ИдентификаторФЗ).Состояние = СостоянияФЗ.Активно").
6. Если данных больше нет - выйдем, иначе к п.3.
31. starik-2005 1961 17.08.15 17:14 Сейчас в теме
А вот ведь интересная штука высветилась на тему копирования структуры. Оказалось, что при обходе в цикле с вставкой нового ключа структуры работает быстрее, чем при использовании "изСтрокиВнутр()".

Вот такой был пример:
Код
Стр = новый Структура("Поле1, Поле2, Поле3, Поле4, Поле5, Поле6, Поле7, Поле8, Поле9, поле10",
 1,
  Дата(2014,12,3),
   "Сложный случай",
   Новый УникальныйИдентификатор,
   ""+(Новый УникальныйИдентификатор),
   17672672.11223,
   "прыволрфволдрыолрв офрволрфылорв лофыр ловролф ыр длрфылдо рволдфыр олывр",
   11,
   Константы.Инсталляция.получить(),
   Константы.Инсталляция.получить().Организация);

Время = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для А = 1 по 100000 Цикл
   Стр1 = ОбщийМодульХХХ.ВернутьКопиюСтруктуры(Стр);
КонецЦикла;
Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - Время);

Время = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для А = 1 по 100000 Цикл
  Стр1 = ЗначениеИЗСтрокиВнутр(ЗначениеВСтрокуВнутр(Стр));
КонецЦикла;
Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах() - Время);
Показать полностью


В первом случае у меня было 15 136 мс, во втором - 15 789 мс = на 650 мс больше. При меньшем размере структуры (3 записи) результат повторяется в пользу цикла с вставкой элемента структуры по ключу. У вас также? Версия платформы 8.3.5.1248.
32. Evil Beaver 6291 18.08.15 16:16 Сейчас в теме
(31) starik-2005,
на 650 мс больше


Это называется "в пределах погрешности измерений" )
33. starik-2005 1961 18.08.15 18:33 Сейчас в теме
(32) за 20 тестов ВСЕГДА второе выполнялось медленнее первого на 500-1000 мс.
34. starik-2005 1961 18.08.15 18:39 Сейчас в теме
(32) вот сделал 4 теста, время такое:

1.
15 164
15 460

2.
14 665
15 398

3.
15 132
15 288

4.
15 132
15 662

Понятно, что загрузка сервера "плавающая", но ВСЕГДА второе выполняется дольше первого.
35. starik-2005 1961 18.08.15 18:47 Сейчас в теме
(32) а вот для 1 000 000 итераций:

149 684
155 643

Сразу все стало ясно - "в строку - из строки" выполняется медленнее, чем создание новой структуры и добавление в нее данных в цикле.
38. Evil Beaver 6291 19.08.15 10:37 Сейчас в теме
(35) starik-2005, а если у вас структура структур, в каждой из которых таблицы значений, а в них - СпискиЗначений, которые содержат еще структуры и ТаблицыЗначений? ИзСтроки-ВСтроку это глубокая копия (всего графа объектов). А поэлементное добавление - совсем другой процесс, совсем другие алгоритмы и скорости.
40. starik-2005 1961 19.08.15 11:52 Сейчас в теме
(38) мож потестите что-нибудь такое и выложите результаты? В 99% случаев копируются структуры с простыми типами. Более того, я в жизни еще пока не встречал случаев, зачем мне бы нужно было скопировать структуру.
41. Evil Beaver 6291 19.08.15 14:06 Сейчас в теме
(40) starik-2005, я же не призываю вас делать только сериализацию и ничего больше. Просто если мне нужно получить глубокую копию коллекции и я не знаю, что в ней, то я лучше сделаю сериализацию.
42. starik-2005 1961 19.08.15 15:14 Сейчас в теме
(41) предположу, что 1С для сериализации и десериализации вызывает стандартные методы внутренних объектов платформы, которые, возможно, в ряде случаев отрабатывают медленнее, чем методы вставки значения в структуру.
43. FlyVodolaz 20.08.15 09:01 Сейчас в теме
(38) (41)
Я бы не стал использовать ЗначениеИзСтрокиВнутр И ЗначениеВСтрокуВнутр если не знаю, что в структуре. Попробуйте сами. Объект - это основной реквизит управляемой формы.

&НаСервере
Функция Тест()
	Стр = Новый Структура("Объект", Объект);
	Стр1 = Тест1(ЗначениеВСтрокуВнутр(Стр));
КонецФункции

&НаСервереБезКонтекста
Функция Тест1(С)
	Возврат ЗначениеИЗСтрокиВнутр(С);
КонецФункции
Показать
36. klinval 276 19.08.15 09:19 Сейчас в теме
Evil Beaver Если вызывать процедуру/функцию &НаСервере с процедуры, которая тоже выполняется &НаСервере будут работать правила описанные в "Клиент-серверное взаимодействие" или описанные выше?
37. WKBAPKA 211 19.08.15 09:44 Сейчас в теме
тю :)
целая статья на простую тему. в описании к с или jave для работы с объектами это все описано :)
39. Evil Beaver 6291 19.08.15 10:38 Сейчас в теме
(37) WKBAPKA, А про 1С не было. А теперь - есть :)
44. WKBAPKA 211 20.08.15 09:18 Сейчас в теме
(39)
:)
не ну да, когда встречаешь загадочное Знач, думаешь, нафига его придумали. А вот когда читаешь про объекты, что это такое, как они хранятся в памяти, как ими манипулировать, сразу все становиться понятно :)
45. AlexO 127 23.08.15 22:52 Сейчас в теме
(0) Это похвально, что вы попытались разобраться несколько глубже в ахинее от 1С, чем 1с написала в так называемой своей "документации". И это здорово, что сумели подметить очередную "лажу" от 1С, на этот раз - в передаче переменных.
Но, к сожалению, так и не сумели разобраться в этом, и до сих пор не вырвались за рамки "одноэсового" понимания программирования.
Мало того, еще и примеры с ошибками написали - переменная одна, а передаете другую:
Таблица = Новый ТаблицаЗначений;
Таблица.Добавить();
ОбработатьЗначение(Параметр);

И вот это все:
При передаче объектов в методы платформа оперирует указателями (условными, не прямыми аналогами из C++)....
Передача по значению не позволяет "затереть" объект, но изменения внутреннего состояния объекта будут видны, т.к. идет работа с одним и тем же экземпляром объекта...
При серверном вызове работа идет с РАЗНЫМИ экземлярами объекта, т.к. выполнялось глубокое копирование...

- все абсолютно неверно.
Вот что делает такой код:
Параметр = Таблица;

Не напрягайтесь, вы все равно не знаете. А "делает" он вот что:
организует ("копируем") новую ячейку (область) памяти, хранящую данные, со своим отдельным указателем (handler).
Соответственно, все примитивные типы данных (число, булево, etc) так и хранятся - указатель и ячейка с данными; и "по значению" и "по ссылке" работают правильно - в первом случае передается указатель на другую ячейку памяти с теми же данными (число или булево), во втором - указатель на существующую.
А что же происходит в 1С с другими, так называемыми "уникальными типами данных" - они же "псевдообъекты" 1С, - (ТЗ, массив, etc)?
В случае использования 1с-типов (ТЗ, массив, etc) - в физической ячейке памяти (на которую ссылается handler, хранящийся в переменной), хранятся не сами данные (например, типа ТЗ), а внутренний 1с-указатель на другую область памяти, где 1с-платформой организована структура своего уникального (ТЗ, массив, etc) типа данных.
В результате - как бы мы не передавали ТЗ или массив (по ссылке или значению), его "передача" куда-то и использование как объекта (например, очистка) - всегда будут отрабатывать на объекте, передавай хоть по значению, хоть по ссылке.
Потому что без разницы, когда передаем указатель на внутренний 1с-указатель (который "указывает" на данные, и обрабатывается исключительно платформой 1с) в случае передачи переменной "по ссылке", или сам указатель на внутренний 1с-указатель (передача "по значению") - в любом случае 1с получит и отработает свою внутреннюю ссылку, если ей "укажут", что работа - с объектом (например, вызов метода "Очистить") - она его "вытащит" по своей внутренней ссылке и обработает. Поэтому и "придумано" 1с для ТЗ - метод "Скопировать", который реально копирует весь объект не только с новым указателем, но и с новой "внутренней ссылкой". Массив, увы, обделен и этим, для него этот метод "забыли" реализовать.
Более того, при копировании переменной "Параметр = Таблица", содержащей псевдообъект 1С - происходит все ровно то же самое: создается новый указатель с новой ячейкой памяти, содержащие все ту же самую внутреннюю ссылку на все тот же объект! Неожиданно?
Однако, есть универсальный способ обойти эту одноэсовую "похабщину" в передаче псевдообъектов в параметрах/переменных - об этом далее.
А вот если эту внутреннюю ссылку "подменить" (например, в вызванной функции сменить одну внутреннюю ссылку - на другую: ТЗ заменить массивом (галочка "Заменить на массив" в примере)) - все опять будет работать "как надо" и для псевдообъектов 1С: внутренняя ссылка тоже будет меняться, и теперь передача переменных будет работать как положено - по ссылке меняется переменная, по значению - не меняется.
По клиент-серверу, или УФ, по которым вы также не разобрались, о чем я писал в комментариях (ага, эти ваши "капоты"): зная лень и имманентность ошибок 1с - уверен, что там абсолютно все то же самое по передаче переменных.
Все это прекрасно иллюстрирует пример, который реально отражает положение дел, и действительно является примером, а не набором кода.
Прикрепленные файлы:
Передача переменных в 1С.epf
47. AlexO 127 24.08.15 11:09 Сейчас в теме
(45) AlexO, небольшая неточность (описка):
Потому что без разницы, когда передаем указатель на внутренний 1с-указатель (который "указывает" на данные, и обрабатывается исключительно платформой 1с) в случае передачи переменной "по ссылке", или сам указатель на внутренний 1с-указатель (передача "по значению")
следует читать как:
"Потому что без разницы, когда передаем указатель на внутренний 1с-указатель (который "указывает" на данные, и обрабатывается исключительно платформой 1с) в случае передачи переменной "по ссылке", или сам внутренний 1с-указатель (передача "по значению")"
53. Evil Beaver 6291 25.08.15 09:44 Сейчас в теме
(45) AlexO, здравствуй дорогой друг))
Не напрягайтесь, вы все равно не знаете. А "делает" он вот что

Не, ну хорошо, допустим, я ничего не знаю. Но вот с чего вы стали считать, что вы - знаете? :):):):)
artbear; dgolovanov; +2 Ответить
46. alex_4x 81 24.08.15 10:26 Сейчас в теме
Мне кажется бесполезно говорить про понятие указатель, если тот кому говорят о них знаком с программированием только на основе конструктора 1С.
Этот как раз тот случай, когда 1С не учит, а разрушает мозг. Всё вроде как сделано для удобного программирования, но криво, косо и ужасно коряво задокументировано. За кажущейся простотой языка скрывается то, что в документации нет никаких внятных объяснений ни про работу виртуальной машины 1С, ни про то как отрабатывают директивы препроцессора, что происходит с исключениями, как отрабатывают транзакции, ну и в том числе где в памяти какие переменные хранятся, каков срок их жизни и кто имеет к ним доступ (это уже вообще такие мелочи). На сях например можно легко и непринужденно получить несколько разных указателей на одну и ту же строку или переменную и работать через разные указатели с одним и тем же экземпляром значения, но так простите там указатель это тип значения, может быть указатель на указатель или массив указателей (так все многоразмерные массивы по факту представлены). В 1С мало того что нет объектных типов, так даже для строк/чисел обязательного приведения типов нет, а ведь это основа статического анализа корректности кода. 1С как фирма ставила перед собой цель - сделать псевдоязык, на котором сможет кодить даже главбух. Они добились своего - язык простой и не требовательный к чистоте кода. А то что получающийся код может изобиловать ашипками и самыми тривиальными неоднозначностями, которые выплывут только в процессе выполнения (возможности проверить на соответствие типов до выполнения то нет).

И всё таки не понятно, почему уже фактически завоевав рынок, 1С продолжает это движение "язык для детского сада, штаны на лямках, пусть криво и косо, главное просто". Ведь с их размахом, с их желанием автоматизировать крупные организации, с озвученным "клиент-серверным" развитием, от этого псевдоязыка надо бежать как от чумы. Ну это моё мнение. Если оставлять псевдоязык, то приводить его к нормам таких языков как java, c++.
48. AlexO 127 24.08.15 11:47 Сейчас в теме
(46) alex_4x,
Мне кажется бесполезно говорить про понятие указатель, если тот кому говорят о них знаком с программированием только на основе конструктора 1С.
Ну, тут народ весьма активно муссирует "указатель - не указатель", "работа с памятью" и прочие выдернутые абзацы из студенческих лекций по программированию.
В 1С мало того что нет объектных типов, так даже для строк/чисел обязательного приведения типов нет, а ведь это основа статического анализа корректности кода.
Такого не будет никогда, т.к. полностью "сорвет крышу" всей 1С, и поставит крест на её псевдообъектах в нынешнем виде, т.е. полностью всю платформу - на свалку.
И всё таки не понятно, почему уже фактически завоевав рынок, 1С продолжает это движение "язык для детского сада, штаны на лямках, пусть криво и косо, главное просто".
Потому что 1С за 20 лет так и не удосужились изучить, что есть программирование, и что такое языки программирования.
Вот и поделку за поделкой, обычно полностью (или частично) отвергающую предыдущий релиз поделки.
Из ближайшего - ждем срыв крыши у тру-одноэсников, когда с выходом 8.3.7 их любимые УФ, за "тонкость", "удобство", "скорость" и "прогрессивностЬ" которых они порвали немеряно рубашек - снова станут "наполовину ОФ" ))
49. Brawler 449 24.08.15 13:51 Сейчас в теме
(48) AlexO,
снова станут "наполовину ОФ"

Это вы о чем? Ради красивого словца?
50. AlexO 127 24.08.15 16:17 Сейчас в теме
(49) Brawler, как вам объяснить, если вы не знаете ни УФ, ни ОФ? Ну, поверьте, УФ стали снова "частично ОФ". И за счет этого улучшился немного функционал интерфейса форм.
51. Brawler 449 24.08.15 21:44 Сейчас в теме
(50) AlexO, просвятите, я послушаю, вы так уверенно заявляете, о моей некомпетентности, что даже не хочется вам перечить, а просто хочется послушать умного человека.
Расскажите чего там с обычными формами было, что там стало с декларативными управляемыми формами, и что стало так сказать выражаясь уже не вашими словами, но интерпретирую вас, с модерн управляемыми формами.
Evil Beaver; +1 1 Ответить
57. AlexO 127 25.08.15 17:51 Сейчас в теме
(51) Brawler, (53) вы даже со ЗНАЧ не разобрались. А уже - "давай нам про формы, мы даже знаем слово "декларативные"... ))
58. Evil Beaver 6291 26.08.15 09:56 Сейчас в теме
(57) AlexO, слушай друг, я уже устал добиваться от тебя адекватных реакций. На прямые просьбы рассказать про твое "мастерство" и "знание" ты начинаешь лепить отмазки. Вывод - ты трололо и болтун. Несмотря на твои слова о том, что ты-то уж все знаешь и вообще мега-программист, у тебя здесь всего одна унылая публикация. А недавно и ни одной не было. Где творения твоего гения, покажешь может? Нет, не покажешь, их нет. Ты просто балабол, с тобой скучно. Если brawler хочет и дальше с тобой препираться, ради бога, а я пас. Я тебя и твою никчемность уже давно знаю ))
mivari; kuzyara; Brawler; klinval; +4 Ответить
65. WKBAPKA 211 09.10.15 09:34 Сейчас в теме
(48) AlexO,
1C решает основные задачи да и ладно.
А с УФ полностью согласен. Тормоза еще те. А реализация конфигураций под УФ, это застрелиться можно )
52. Brawler 449 25.08.15 07:16 Сейчас в теме
(46) alex_4x, я давно уже расценивают язык программирования 1С как скриптовый со всеми вытекающими. Как-то проще жить с этим грузом тогда ))
Можно ругать 1С и их язык сколько угодно долго, но как попробуешь допустим в версии 7 Ариса попрограммировать на встроенном бейсике, так сразу с любовью вспоминаешь 1С )) Как говорится, бывает и хуже, а то что имеем уже хорошо, что оно у нас есть.
54. alex_4x 81 25.08.15 11:28 Сейчас в теме
(52) Brawler, Ну да, конечно всё познается в сравнении. Но ведь есть например ява для далвиковской виртуальной машины на андроиде. Тоже скриптовый язык со всеми вытекающими последствиями, но реализовано концептуально более "продвинуто".
Я не понимаю, почему выше написали что явная типизация типов данных на корню убьет весь язык 1С. Да, придется дописать уже написанные скрипты. Можно сделать директиву препроцессора #ТипизацияТиповВключена и #ИменемНуралиеваРаботайЧертоваХреньЧтобыНеСлучилосьАминьДелит­ьНаНольМожно
55. Evil Beaver 6291 25.08.15 12:01 Сейчас в теме
(54) alex_4x, ява - скриптовый язык? А я вот задумался, действительно, а что такое "скриптовый" язык? Есть где-то определение?
136. WKBAPKA 211 31.07.19 20:19 Сейчас в теме
(46) на этот вопрос можно ответить только тогда, когда перешел с 1С на нормальный язык программирования. Все очень просто, как ты и писал, язык рассчитан на "программистов". Даже некоторые отклонения от простоты, где уже есть разного рода билдеры, надо вызывать разные методы, стопорят мозг обычному 1С-нику. А уже про знания разного рода паттернов, я молчу
По себе сужу.
Когда я начал изучать Java, классно круто. Но все не понятно. Мне понадобилось достаточно много времени что бы просто въехать (с учетом работы на 1С). По прошествии нескольких лет, я еще даже не middle. Вещи, в стиле лямда выражений вводят меня на короткое время в ступор, ну а про Kotlin даже не хочу говорить. Программировать на Java может только программист. А это большая разница, программист на 1С и на Java.
Если сравнивать тот же Java с 1С,это как сравнивать 7.7 с 8.х и то натянуто.
Уровень квалификации уже нужен другой
56. alex_4x 81 25.08.15 14:03 Сейчас в теме
Возможно Ява не скриптовый язык. Но та ява, которая в далвике и выполняется виртуальной машиной, она ж фактически не компилируется. Она переводится в некий псевдокод, который как скрипт отрабатывается виртуальной машиной. Получается что Ява на андроиде имеет некие признаки скриптового языка.
Dalvik - виртуальная машина Java, которая используется для запуска программ (только с APK-расширением)
с целью сделать доступ быстрее и обеспечить безопасность системы. Dalvik использует собственный байт-код.
При разработке приложения под Android переводятся компилятором в специальный машинно-независимый низкоуровневый код.
При выполнении на платформе именно Dalvik интерпретирует и выполняет такую программу.
59. awk 692 08.10.15 13:13 Сейчас в теме
(56) alex_4x, Dalvik - это регистровая виртуальная машина, а не интерпретатор. Так что java не скрипт.
60. Evil Beaver 6291 08.10.15 17:06 Сейчас в теме
(59) awk, интерпретатор и машина (стековая/регистровая) это ортогональные понятия вроде как... Одно другого же не исключает. Вообще, интерпретатор это чего такое? У него машины нет?
62. awk 692 08.10.15 22:35 Сейчас в теме
(60) Все-таки разница есть. Если по аналогии с БУ то есть трансляция учета, а есть трансформация. Так вот: Интерпретатор выполняет трансляцию, а компилятор трансформацию. Виртуальная машина - это интерпретатор байт кода. JIT - это компилятор. А интерпретатор языка - вообще никакой компиляции не выполняет. На интерпретируемых языках пишут сценарии, а на компилируемых - программы. Когда говорят, что: "1С-совцы не программисты" - я говорю: "Да, они сценаристы". Но 95% людей это все по барабану.


Но та ява, которая в далвике и выполняется виртуальной машиной, она ж фактически не компилируется


Глупость полная. Компиляция для Dalvik проходит дважды:

1. Исходники java -> байт код
2. Байт код -> DEX байт код
63. baton_pk 392 09.10.15 08:08 Сейчас в теме
(62) awk, ходят некоторые слухи, что 1С всё-таки исполняет байт-код, а не интерпретирует эти ваши Пока и Если :)
64. awk 692 09.10.15 08:53 Сейчас в теме
(63) baton_pk, Это не байт-код,

{}

но...
66. Evil Beaver 6291 09.10.15 11:08 Сейчас в теме
(64) awk, вот это
{}
сериализованный байт-код. По крайней мере, в том смысле, в котором я понимаю этот термин. Поток инструкций формата опкод+аргумент
68. awk 692 09.10.15 11:40 Сейчас в теме
(66) Каждый код операции байт-кода — один байт. У 1С не байт код.
71. Evil Beaver 6291 09.10.15 12:20 Сейчас в теме
(68) awk, Википедия говорит про байт-код:
Байт-код называется так, потому что длина каждого кода операции традиционно составляет один байт


То есть, оп.код обычно маленькое число, операций немного. У 1С меньше 255, что влезает в байт. А сама операция может быть и длиннее байта, там еще аргументы, а их длина может быть разной...
73. awk 692 09.10.15 15:35 Сейчас в теме
(71) Строка "255" в UTF-8 - это 3 байта. Так что формально у 1С не байт код.
74. Brawler 449 09.10.15 15:48 Сейчас в теме
(73) awk, ну тогда МУЛЬТИ байт код ))))
75. Evil Beaver 6291 10.10.15 11:35 Сейчас в теме
(73) awk, ну я ж не зря написал "сериализованный" )) В памяти-то оно наверняка не строками в момент исполнения. А так, да, мы друг-друга поняли )
61. ИНТЕГРА 22 08.10.15 17:55 Сейчас в теме
Или я туплю или куча опечаток в примерах кода. Читать даже не хочется. "Аффтор жжот". В любом случае статья явно не для программистов.
67. Evil Beaver 6291 09.10.15 11:09 Сейчас в теме
(61) ИНТЕГРА, примеры опечаток тогда уж приведите, я с удовольствием поправлю.
69. ИНТЕГРА 22 09.10.15 11:51 Сейчас в теме
(67) печально-известный AlexO написал тоже об этом. В этом топике Я, как ни странно, на его стороне. Конечно он перегибает по поводу проблемности 1С.

Вот такие несогласованные вызовы:
Таблица = Новый ТаблицаЗначений;
ОбработатьЗначение(Параметр);

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


В более сложный пример даже вникать не стал.
70. Evil Beaver 6291 09.10.15 12:15 Сейчас в теме
(69) ИНТЕГРА, спасибо за конструктив. Исправлю, конечно, набирал прямо в редакторе Инфостарта. Но опечатка в коде не меняет сути темы.
76. ИНТЕГРА 22 11.10.15 06:28 Сейчас в теме
(70) суть темы в том, что настоящий программист обязан сам понимать как описанные ситуации должны обрабатываться системой без всяких примеров. И если имеются разногласия в поведении системы с правильным пониманием, то это уже проблема системы. Именно об этом не многоуважаемый AlexO пытался донести кучей лишних слов.
В дополнение - каждый программист обязан знать язык Си++, иначе он не более чем сисадмин.
77. Brawler 449 11.10.15 11:29 Сейчас в теме
каждый программист обязан знать язык Си++

(76) ИНТЕГРА, больно сильное заявление однако.
Вы бьете ниже пояса программистам, которые пишут на том же Object Pascal )))
88. ИНТЕГРА 22 12.10.15 17:03 Сейчас в теме
104. Brawler 449 12.10.15 23:22 Сейчас в теме
(88) ИНТЕГРА, про устаревший паскаль расскажите группе программистов в моем отделе вояющих софт внутрикорпоративный на делфях ХЕ2 (а главное расскажите это руководителю моего подразделения), да и еще знаю примеры поделок на данном языке и в данной IDE ну то бишь Delphi. И их даже продают!
ИМХО делфи я бы уже похоронил, не язык, а именно среду разработки. Как замену рассматриваю только VS + C#.
Для реализации учетных задач, так вообще ИМХО 1С на коне, да не супер возможности для реализации всяких рюшечек (красявости UI типа ribbon интерфейса) нравящихся руководителям, но не из-за рюшечек единых же в организация строится учет.
107. ИНТЕГРА 22 13.10.15 06:41 Сейчас в теме
(104) Brawler,
группе программистов в моем отделе вояющих софт внутрикорпоративный на делфях ХЕ2... И их даже продают!

Что только не продают; на чем только не пишут :) Я-же говорю о вечном. Паскаль я забросил, когда напоролся на проблемы в нем с виртуализацией методов (тогда еще он был TURBO). И понял, что надо двигаться дальше. Очень хороший язык для обучения, чтобы потом перейти к Си++.

ИМХО делфи я бы уже похоронил, не язык, а именно среду разработки. Как замену рассматриваю только VS + C#.
Для реализации учетных задач, так вообще ИМХО 1С на коне, да не супер возможности для реализации всяких рюшечек (красявости UI типа ribbon интерфейса) нравящихся руководителям, но не из-за рюшечек единых же в организация строится учет.

Ну вот, и ты туда-же. Все правильно говоришь. Че спорить-то? :)
78. starik-2005 1961 11.10.15 11:59 Сейчас в теме
(76) ИНТЕГРА, не С++ - это лишь один из языков программирования. И если уж говорить о понимании того, как работает процессор, то можно заявить, что каждый программист должен знать ассемблер (я, например, для трех архитектур ассемблер знаю: Z80 (Спектрум), СМ (PDP-8, ДВК, ...), х86 (IBM-совместимые ПК). При том не просто знать команды, но и понимать архитектуру портов ввода-вывода (PC) / системных регистров (CM), знать вектора прерываний, ... В итоге так мы дойдем до системного программиста, который решает совершенно иные задачи. Если верить книге "Совершенный код" (Макконнелл), то системный код куда сложнее прикладного и при ревизиях кода (методология уменьшения ошибок в программе примерно в 8 раз эффективнее тестирования) количество просматриваемых строк системного кода на порядок ниже, чем прикладного.

Да, знать какой-нибудь компилируемый язык программирования - это хорошо. Уметь написать на нем что-либо - еще лучше. Но эти знания сами по себе не дают никакого преимущества при разработке систем на базе 1С. Но если есть возможность применить подобные знания - это плюс. Например, у нас в конторе мы написали два приложения на Delphi. Первое - это стартер 1С, который получает информацию о списке баз из вебсервиса базы 1С, в которой содержится информация о пользователях и доступных им базах. Вторая - это принтер чеков для автоматической печати чеков из систем онлйан-бронирования. И все это из-за глючности самой 1С и невозможности доверить ей критические задачи, в которых время является одним из решающих факторов. Я не могу быть уверен, что клиент 1С. печатающий чеки по обработке ожидания, в один прекрасный момент не умрет. А вот постоянно рестартующий и самодиагностирующий комплекс на Delphi мало того, что запускается считанные микросекунды, так и анализ своей функциональности за доли секунды проверяет и при необходимости заменяет зависший процесс. В этом плюс такого подхода. Но если необходимо работать с сотней разных документов, сотней печатных форм, все это где-то хранить и не требовать немедленного доступа - 1С вполне подойдет. И в знаниях языков низкого и среднего уровня для доработки такой системы необходимости. ИМХО, нет.
oleg-x; HystriX; klinval; +3 Ответить
89. ИНТЕГРА 22 12.10.15 17:09 Сейчас в теме
(78) starik-2005, Прочел твое сообщение только первый абзац. Молодец, что знаешь что-то еще помимо 1С. Это тебе дает преимущество при разработке перед чистым 1С-ником хотябы уже потому, что тебе не надо тратить время на понимание как работает передача параметров в функцию и делать детские ошибки, которые очень тяжело отловить.

Второй абзац прочел "по-диагонали", тк там лирика с которой я не согласен.
79. baton_pk 392 11.10.15 12:04 Сейчас в теме
настоящий программист обязан

Attention! Holy-war detected!

(76)
каждый программист обязан знать язык Си++

Почему не Си, не Раст, не Д, не Го, не ассемблер каждого из семейств процессоров?
Даже дедушка Строуструп не знает язык Си++. Вы вообще читали его стандарт целиком?
HystriX; Evil Beaver; +2 Ответить
84. Evil Beaver 6291 12.10.15 12:19 Сейчас в теме
(79) baton_pk,
Почему не Си

Ага, даешь еще дров в костер холивара! Линус Торвальдс, например, глумливо материт "плюсовцев" и их язык. А равно как и ООП, считая его ересью от программирования. Си-плюс-плюсники - НЕНАСТОЯЩИЕ ПРОГРАММИСТЫ!
90. ИНТЕГРА 22 12.10.15 17:14 Сейчас в теме
(79) baton_pk, Во времена Строуструпа не было Си++. Технологии развиваются, требованию растут. Сегодня это базовые знания. Стандарт конечно читал, естественно не весь, тк во многих вещах опыт позволяет разбираться самостоятельно. Именно опыт грамотной разработки - это то что я хочу "навязать" сообществу не согласных.
93. starik-2005 1961 12.10.15 18:07 Сейчас в теме
(90) ИНТЕГРА, "Бьерн Страуструп — программист, автор языка программирования C++. Википедия" - гугл. Именно он написал книжку С++. разница между С++ и С в наличии в первом объектной модели по большому счету.
ИНТЕГРА; +1 Ответить
95. awk 692 12.10.15 18:23 Сейчас в теме
(93) starik-2005,
разница между С++ и С в наличии в первом объектной модели
Садись, два... :))))
99. starik-2005 1961 12.10.15 18:43 Сейчас в теме
(95) awk, всегда интересно узнать от других то, что поможет мне что=то понять лучше. Пока не вижу, в чем же, по-Вашему, отличие между С и С++.
101. awk 692 12.10.15 21:49 Сейчас в теме
(99) starik-2005, О каких версиях Си и Си++ идет речь?
102. starik-2005 1961 12.10.15 22:23 Сейчас в теме
(101) awk, ну как бы стандартом считают ANSI C (ISO C), написанная на котором программа будет компилироваться на любом компиляторе. В последствии стандарт был дополнен С99 и С11, которые, в общем и целом, вбирали в себя все отличия между С и С++, кроме указанного мной - объектной модели. В стандарт С11 даже была включена многопоточность, реализуемая соответствующими библиотеками.


В конце 1970-х годов С начал вытеснять Бейсик с позиции ведущего языка для программирования микрокомпьютеров. В 1980-х годах он был адаптирован для использования в IBM PC, что привело к резкому росту его популярности. В то же время Бьёрн Страуструп и другие в лабораториях Bell Labs начали работу по добавлению в С возможностей объектно-ориентированного программирования. Язык, который они в итоге сделали, C++, оказал большое влияние на разработку ПО, но так и не смог сравняться по популярности[1] с Си, особенно в UNIX-подобных системах.
- Википедия.

Здесь, собственно, и говорится о том, что первоначально Бьерн занимался именно добавлением в С объектной модели. В остальном они в последней версии стандарта практически идентичны, если не считать накопленных за время совместного развития деталей, влияние которых на синтаксис весьма условно, а на функционал - менее, чем заметно.
106. awk 692 12.10.15 23:47 Сейчас в теме
(102) starik-2005, Я не вижу смысла вам что-то расписывать, так как с то же страницы, откуда вы выдернули свою цитату есть:

Язык программирования C++ произошёл от Си. Однако в дальнейшем С и C++ развивались независимо, что привело к росту несовместимости между ними. Редакция C99 добавила в язык несколько конфликтующих с C++ особенностей. Эти различия затрудняют написание программ и библиотек, которые могли бы нормально компилироваться и работать одинаково и в С и в C++, что, конечно, запутывает тех, кто программирует на обоих языках.

Бьёрн Страуструп, придумавший C++, неоднократно выступал за максимальное сокращение различий между С и C++ для создания максимальной совместимости между этими языками. Противники же такой точки зрения считают, что так как С и C++ являются двумя различными языками, то и совместимость между ними не так важна, хоть и полезна. Согласно этому лагерю, усилия по уменьшению несовместимости между ними не должны препятствовать попыткам улучшения каждого языка в отдельности.

Различия между этими языками, существующие на сегодня[когда?]:

inline — подставляемые функции существуют в глобальном пространстве C++, а в Си — в пространстве файла (статическом пространстве). Другими словами, это значит, что в C++ любое определение подставляемой функции (независимо от переопределения функций) должно соответствовать правилу одного определения, требующего того, чтобы любая подставляемая функция была определена только один раз. В С же одна и та же подставляемая функция может быть определена по-разному в разных компилируемых файлах одной программы.
В отличие от C++, макрос bool в C99 требует включения соответствующего заголовочного файла stdbool.h. В стандарте C99 определён собственный тип логических данных _Bool. Предыдущий стандарт С (C89) не определял булевый тип вообще, поэтому для этого часто использовались различные (а значит, несовместимые) методы.
Символьные константы (заключённые в одинарные кавычки) по умолчанию имеют: тип int в С и тип char в C++. Поэтому в С справедливо равенство sizeof('a') == sizeof(int), а в C++ — равенство sizeof('a') == sizeof(char).[11]
Некоторые новые возможности C99, в первую очередь, restrict, не включены в C++.


Что наводит меня на мысль о бессмысленности больших постов для вас. Вы их не прочтете...
109. starik-2005 1961 13.10.15 10:31 Сейчас в теме
(106) awk, это говорит как раз об обратном - о бессмысленности Вам читать любые длинные посты, ибо сути Вы все равно не улавливаете ))) Те различия, о которые Вы тут скописпастили, не являются существенными различиями в языках, а вот объектная модель - различие существенное, указывающее на принципиальную разницу. А то, что Вам хочется, чтобы Вы тоже были правы, в принципе ненаказуемо. Другое дело, что излишняя педантичность Вам мешает. Можно найти много общего между обезьяной и человеком, как, впрочем, и различного, но, согласитесь, основным различием все-таки будет уровень интеллекта.
Оставьте свое сообщение

См. также

Агрегатные функции СКД, о которых мало кто знает 316

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    9955    ids79    42       

Отслеживание выполнения фонового задания 133

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Универсальные функции Разработка

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    8221    ids79    14       

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив 241

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    10338    ids79    24       

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты 126

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    9247    ids79    6       

Обработчики событий при записи объектов. Зачем и что за чем? 189

Статья Программист Нет файла v8 Бесплатно (free) Математика и алгоритмы

Программисту, имеющему немного опыта на платформе 1С 8.3, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта.... Эта шпаргалка была создана в процессе обучения и реального опыта с целью разложить всё по полочкам, чтобы было четкое понимание в каком случае какой обработчик нужно использовать и в какой последовательности они запускаются при записи и проведении документов. Данная статья будет полезна в большей степени начинающим разработчикам. Но и опытным позволит освежить информацию, упорядочить её.

25.07.2019    10351    4    AlbinaAAA    22       

Управление качеством кода 126

Статья Программист Руководитель проекта Нет файла v8 Бесплатно (free) Математика и алгоритмы Рефакторинг и качество кода

О SonarQube, АПК, EDT. Какие преимущества дает их использование. Для каких команд подходит.

22.07.2019    6937    Stepa86    23       

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ 134

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Инструментарий разработчика Практика программирования Разработка

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    8671    ids79    24       

"Меньше копипаста!", или как Вася универсальную процедуру писал 170

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    6205    SeiOkami    48       

Создание отчетов с помощью СКД - основные понятия и элементы 192

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования Математика и алгоритмы

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    17377    ids79    16       

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017 176

Статья Программист Нет файла v8 v8::Запросы Бесплатно (free) Практика программирования Разработка

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    11512    dmurk    134       

Регистры накопления. Структура хранения в базе данных 174

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    17206    YPermitin    27       

Выполнение внешней обработки в фоновом задании 147

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    9812    Eret1k    22       

Выгрузка документа по условию 5

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    4798    m-rv    2       

Как прикрутить ГУИД к регистру сведений 23

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8 Разработка

... и немного теории обмена данными. В частности, разберем боль всех, кто пишет небанальные обмены данными: как набору записей регистра сведений назначить гуид и далее использовать его в обмене для идентификации этого набора.

16.04.2019    7334    m-rv    16       

О расширениях замолвите слово... 191

Статья Программист Стажер Нет файла v8 Бесплатно (free) Практика программирования Разработка

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    16323    ellavs    122       

Git-репозитории для 1С-кода (опыт использования при небольших проектах) 200

Статья Программист Стажер Нет файла v8 Windows Бесплатно (free) Практика программирования Разработка

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    12682    ellavs    83       

Трюки с внешними источниками данных 164

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Разработка

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    12800    YPermitin    52       

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS) 162

Статья Программист Нет файла v8 v8::Права Бесплатно (free) Практика программирования БСП (Библиотека стандартных подсистем) Роли и права

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    15426    ids79    9       

EnterpriseData – часть 2. Процесс выгрузки данных 127

Статья Программист Нет файла v8 v8::УФ Россия Бесплатно (free) Практика программирования Обмен через XML

Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

26.12.2018    12690    ids79    27       

Новый подход к обмену данными EnterpriseData 203

Статья Программист Нет файла v8 v8::УФ Россия Бесплатно (free) Практика программирования Обмен через XML

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

14.12.2018    21371    ids79    72       

Программное заполнение пользовательских параметров и отборов СКД 135

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Публикация представляет из себя краткие примеры того, как можно заполнять параметры СКД программно так, чтобы все параметры и отборы были доступны в быстрых настройках и в обычных (типовых) настройках параметров и отборов СКД.

13.11.2018    19572    Unk92    18       

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С 126

Статья Программист Нет файла v8 v8::blocking 1cv8.cf Бесплатно (free) Математика и алгоритмы Практика программирования

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    20803    ids79    40       

Вспомогательные инструкции в коде 1С 104

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    20425    tormozit    100       

Произвольный код в фоновом режиме 164

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования

Задача: реализовать выполнение произвольного кода в фоновом режиме без изменения конфигурации, т.е. во внешней обработке.

03.09.2018    14561    nikita0832    41       

Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C 144

Статья Программист Нет файла v8 Россия Бесплатно (free) Математика и алгоритмы Практика программирования

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

23.08.2018    21219    Rain88    42       

Повышаем эффективность разработки правил обмена 123

Статья Программист Нет файла v8 КД ОС Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8

Как повысить скорость и качество разработки правил обмена? Как вести групповую разработку правил обмена? Как облегчить сопровождение правил обмена после передачи в эксплуатацию? Об этом и многом другом вы можете узнать из этой статьи.

25.06.2018    19291    olegtymko    47       

Введение в механизм представлений в ЗУП ред. 3 153

Статья Программист Нет файла v8 v8::СПР ЗУП3.x Бесплатно (free) Практика программирования

В нашей организации на первом же телефонном собеседовании на должность разработчика по ЗУП ред. 3 вас обязательно спросят о том, что такое "Представления".

04.06.2018    24329    xrrg    82       

Как сделать запрос на изменение данных 75

Статья Программист Нет файла v8 v8::Запросы 1cv8.cf Бесплатно (free) Практика программирования

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    21156    m-rv    21       

Строим графы средствами 1С (без GraphViz) 42

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

Множество статей на Инфостарте описывают, как работать с компонентой GraphViz, чтобы построить ориентированный граф. Но практически нет материалов, как работать с такими графами средствами 1С. Сегодня я расскажу, как красиво строить графы с минимальным пересечением. Нам этот метод пригодился для отрисовки алгоритмов в БИТ.Финансе, т.к. типовой механизм не устраивал. Еще это может быть полезно для визуализации различных зависимостей: расчета себестоимости, графы аффилированности компаний и т.д. Надеюсь, эта статья поможет сделать мир 1С красивее и гармоничней:) Итак, поехали...

23.05.2018    16944    slozhenikin_com    19       

Распределение расходов пропорционально продажам 9

Статья Программист Пользователь Нет файла v8 v8::ОУ УТ10 УУ Финансовый учет и бюджетирование (FRP) Учет доходов и расходов Бесплатно (free) Практика программирования

Финансовая модель. Распределение административных расходов по подразделениям пропорционально продажам за месяц. Дополнительные реквизиты против бизнес-процессов!

13.05.2018    11316    Rustig    9       

Просмотр временных таблиц запроса в отладчике без изменения кода 126

Статья Программист Нет файла v8 v8::Запросы 1cv8.cf Бесплатно (free) Практика программирования

Данный способ можно использовать для просмотра содержимого временных таблиц запросов (менеджеров временных таблиц) без внесения изменений в код.

24.04.2018    24326    avfed@rambler.ru    19       

Минимализмы 3 351

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Универсальные функции

Очередная серия "минимализмов" [http://infostart.ru/public/306536/, https://infostart.ru/public/460935/]. Также, как и в предыдущих статьях, здесь приведена подборка коротких оригинальных авторских решений некоторых задач. Ранее эти решения были разбросаны по моим комментариям к чужим публикациям.

19.02.2018    35533    ildarovich    44       

Этюды по программированию. Взаимодействие с Microsoft Word 109

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

Часто приходится заниматься созданием сложных документов Word с таблицами, вложенными фрагментами, хитрым оформлением и прочими радостями жизни. Это - попытка как-то структурировать полученный опыт, чтобы не приходилось перерывать ворох старых обработок в поисках крупиц истины. Надеюсь, эта статья будет полезна и Вам.

11.12.2017    25816    milkers    23       

Метод формирования движений в типовых регистрах нетиповыми регистраторами 31

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования

Вариант решения задач с проведением по типовым регистрам нетиповыми регистраторами. Зачем - чтобы при сравнении конфигурации не обращать внимание на свойства регистров и исключить вероятность допущения горькой оплошности при обновлении информационных баз, заменив типы регистраторов основной конфигурации типами конфигурации поставщика. Для программных продуктов, имеющих в своем составе метаданных документ "Корректировка регистров"("Корректировка записей регистров").

05.12.2017    21292    itriot11    34       

1С: Конвертация данных 3. Инструкции и примеры. EnterpriseData (универсальный формат обмена) 720

Статья Программист Нет файла v8 КД Бесплатно (free) Перенос данных из 1C8 в 1C8 Практика программирования Обмен через XML

Что такое КД3? Как начать использовать? Полезные дополнения к документации. Что нужно исправить в типовых обработках и конфигурации. Как изменить правила обмена не снимая конфигурацию с поддержки. Как отлаживать правила обмена?

19.11.2017    137429    MaxS    251       

Заполнение данных по ИНН контрагента с помощью альтернативного сервиса огрн.онлайн 131

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

Код для заполнения данных по ИНН контрагента из ЕГРЮЛ с сайта огрн.онлайн.

01.11.2017    22663    slava_1c    49       

Программные перечисления, ч.2: приемы кэширования при разработке 66

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

Все знают, что такое кэш, и зачем он нужен. Но в 1С разработчик обычно использует кэширование только на уровне конфигурации, а в какой-нибудь обработке скорее ломает голову над запросом - как получить все данные за один заход... Хочется рассказать о том, как можно добиться хороших результатов с стратегией "разделяй и властвуй".

30.10.2017    21035    unichkin    17       

Разбираемся с настройками компоновки данных 159

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Краткая шпаргалка по программной работе с настройками СКД

29.10.2017    24012    json    9       

Работа с Excel 288

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Загрузка и выгрузка в Excel

Собрал различные полезности для работы с Excel из 1С. Иногда приходится форматировать документ Excel программно из 1С. Так вот, чтобы не искать постоянно на просторах интернета как сделать левое выравнивание в ячейке Excel из 1С и т.п. решил опубликовать это...

23.10.2017    24632    arakelyan    39       

Добавление команд печати в конфигурациях на БСП 2.4.3 (в частности, в самописных документах в Бухгалтерии 3.0 после релиза 3.0.52.35) 143

Статья Программист Нет файла v8 v8::БУ БП3.0 Россия Бесплатно (free) Печатные формы документов Практика программирования БСП (Библиотека стандартных подсистем)

В статье https://infostart.ru/public/237013/ пользователя nick max рассматривался список действий для подключения команд печати в Бухгалтерии 3.0, работающей на БСП 2.3.6. В новом релизе Бухгалтерии 3.0.52.35 от 15.09.2017г. стала использоваться БСП 2.4.3, из-за чего произошли изменения в процедурах общих модулей, связанных с механизмом печати, и в процедурах их вызова в формах документов и в формах списков. Рассмотрим их.

18.09.2017    46719    bugtester    43       

Отказ от работы с временными файлами при работе с двоичными данными или Потоки как простая замена ADODB.Stream и временным файлам 127

Статья Программист Нет файла v8 Россия Бесплатно (free) Практика программирования

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

12.09.2017    18199    vardeg    31       

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере 125

Статья Программист Нет файла v8 1cv8.cf Россия Бесплатно (free) Практика программирования

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    34196    tormozit    72       

Ускоряем 1С: модули с повторным использованием возвращаемых значений 136

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

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

04.09.2017    43100    m-rv    60       

Как просто запомнить алгоритм программного вывода в СКД 205

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования

Порой нужно быстро вывести на экран таблицу значений, используя СКД \ получить данные отчета в таблицу значений.. Несмотря на очевидность алгоритма - раньше мне проще было загуглить программный вывод, благо эта инфа есть везде. Но постепенно понял как его можно быстро вспомнить, и лишний раз ничего не искать. Конечно эта статья не для Гуру :) Но я думаю - что любой неопытный в СКД программист сделает для себя небольшое открытие...

01.09.2017    41477    unichkin    15