Освобождение переменных в 1С

07.02.11

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

Как практически на пустом месте получить ошибку блокировки по причине неверного использования переменной.

Думаю, многие из нас в буднях своих работы в качестве IT-бухгалтера за всеми этими дебетами, кредитами, ОСВ и прочими платёжками порой забывают, что 1С - это в первую очередь язык программирования и ничто сугубо техническое ему не чуждо :).

 

Вот так и я, увидев в один прекрасный день вот такую картинку

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


Через n-ное время причина была найдена, очищена от шелухи и минимизирована до очевидного примера. Достаточно написать вот такой простой код в модуле объекта справочника


перем Об;

Процедура
ПередЗаписью(Отказ)

   
Об = ЭтотОбъект;

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

чтобы, к примеру, при пометке и тут же распометке на удаление элемента справочника сразу возникала эта ошибка. Блокировка снимается секунд через 15-20.

 

Проблема решается освобождением переменной:


перем Об;

Процедура
ПередЗаписью(Отказ)

   
Об = ЭтотОбъект;

   .... 
    Об = неопределено;
КонецПроцедуры


Добавлено. Причины возникновения проблемы и более развернутое описание ситуации рассматриваются в комментариях:

- оригинальная ситуация - пост 22.

- вероятные причины проблемы - пост 78, 94, 99

Спасибо всем, кто участвовал в прениях.

 

См. также

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

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

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

1 стартмани

30.01.2024    1870    stopa85    12    

34

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

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

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

19.10.2023    4668    user1959478    50    

34

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

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

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

1 стартмани

09.06.2023    7660    4    SpaceOfMyHead    17    

56

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

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

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

1 стартмани

21.03.2022    7936    7    kalyaka    11    

44

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

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

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

16.12.2021    4548    fishca    13    

36

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

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

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

12.10.2021    8941    John_d    73    

46

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

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

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

31.08.2021    7961    dusha0020    8    

70
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. tango 540 07.02.11 20:49 Сейчас в теме
(0) 1С - это в первую очередь язык программирования
в мемориз

а чё за картинко-то? автар, ты ее сам-то разглядишь?

**
в каком месте втыкаешь
Проблема решается освобождением переменной:

Об = неопределено;
?

на самом деле сабж - в развитие темы блокировок.
разверни, пока что - тема не раскрыта
+
18. Abadonna 3958 08.02.11 21:26 Сейчас в теме
Кхм... "Очищенный от шелухи" пример становится совсем непонятным
(1)
перем Об;

Процедура ПередЗаписью(Отказ)

    Об = ЭтотОбъект;
   .... 
    Об = неопределено;
КонецПроцедуры

Как написано тут переменная выходит за границы процедуры только как "неопределено"
Поэтому код выше абсолютно равносилен
(2)
Процедура ПередЗаписью(Отказ)

  //  Об = ЭтотОбъект;
   .... 
    Об = неопределено;
КонецПроцедуры

ибо в других процедурах мы достучимся только до Об = неопределено, а на фиг оно нам такое надо?
А в сухом остатке, он вообще равносилен
(3)
//перем Об;

Процедура ПередЗаписью(Отказ)

    //Об = ЭтотОбъект;
   .... 
    //Об = неопределено;
КонецПроцедуры
CratosX; +1
19. romansun 193 08.02.11 21:43 Сейчас в теме
(18)

Хм... Таки да, нестыковка..

А если вариант описанный в (13), и из процедуры "ПриЗаписиПроверитьСтавкуНДС" вызывать еще ряд процедур (в них, в свою очередь, еще можно вызвать какие-то процедуры). И только в самой последней говорить "Об = неопределено" или в самой же процедуре "ПриЗаписиПроверитьСтавкуНДС" перед концом процедуры?

Даже и не знаю, какой пример сделать, чтобы он был и небольшим и понятным.

Мне кажется, варианты возможны всякие, даже самые бредовые, когда базу пишут поколения программистов, которые не сильно разбирают, что там дописано до них, а принимают всё это как абсолютно верно работающий черный ящик.
+
20. cool.vlad4 2 08.02.11 21:51 Сейчас в теме
(18) Ну елы палы я ему битый час об этом далдычил -
Точнее непонятно зачем Об объявлять в начале модуля
и т.д. в камментах
+
22. romansun 193 08.02.11 22:55 Сейчас в теме
(20)(21)
:) я сегодня подождите..

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

Abadonna пишет:
Ребята! Не запоминайте в глобальной переменной модуля объекта сам объект, если вам вдруг придет в голову такая бредовая идея! Чревато!


Дык в том-то и дело, что последний человек редактировавший код залез в сторонний модуль. Встретил какую-то там нужную ему переменную в какой-то нужной ему процедуре, для подстраховки скопировал её, объявил глобальной и заюзал в своих процедурах (это как мне сейчас видится ситуация). И всё. А на то, что с переменной, которую он скопировал, передался через n процедур сам объект - внимания не обратил. Новый код исправно работал, в ошибки не падал. Прошло время... :)
И пользователи нет-нет, да и стали обращать внимание, что иногда на разных справочниках появляется ошибка блокировки, причем там где по идее её быть не должно.

Вот, в общем, и всё история. Дальше дело поручили мне и я долго и нудно пытался выяснить, при каких действиях происходит ошибка, кто виноват и что делать. В итоге оказался вот такой баг, да.
+
23. Abadonna 3958 08.02.11 23:00 Сейчас в теме
(22) Что нашел - молодец, баг-то не особо очевидный. IMHO надо именно (22) и выложить в качестве текста статьи, а не
Об = неопределено;
+
2. Поручик 4674 07.02.11 22:13 Сейчас в теме
Гюльчатай, открой личи.., тьфу, автор, картинку-то покажи нормально. Или словами опиши, что за ошибка.
+
3. romansun 193 07.02.11 23:39 Сейчас в теме
Упс, прошу покорнейше простить :oops: Исправил картинку.

Об = неопределено; - например, в ПередЗаписью перед концом процедуры. Самый нормальный вариант. (Дописал в саму заметку)

Развитие темы? Ох. Я уже лет 8 ни на чем кроме 1С не кодил, могу слажать :). Может, более опытные товарищи напомнят, подскажут?

Ну, общая идея, думаю, примерно такая - выражение "Об = ЭтотОбъект;" определяет переменную указывающую на объект. При закрытии (при выходе из модуля объекта) объекта переменная еще некоторое время остаётся жить, тем самым блокируя объект (область памяти) - запись справочника.

Если переменную Об не делать глобальной, то она самостоятельно уничтожается при выходе из процедуры ПередЗаписью().
+
4. anton.fly7 173 08.02.11 08:36 Сейчас в теме
а зачем эта переменная Об вообще нужна?
+
5. cool.vlad4 2 08.02.11 10:14 Сейчас в теме
Название темы, конечно, отжигает - Освобождение переменных в 1С...из адского плена наверное...вообще даже не знаю, что и сказать...то ли автор начал подозревать о блокировках, то ли просто решил додумывать читателям самим...
ЗЫ И потом непонятно зачем переменной передавать ЭтотОбъект? Точнее непонятно зачем Об объявлять в начале модуля, подозреваю что таким образом вы передаете ее куда-то...хм...
ЗЫ Передавайте ЭтотОбъект.Ссылка, затем там где надо ПолучитьОбъект(), Записать() ....
+
6. Flashback1979SE 08.02.11 11:34 Сейчас в теме
"перем Об;

Процедура ПередЗаписью(Отказ)

Об = ЭтотОбъект;

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

осталось только объект в параметр сеанса загнать и вообще зачетный баг будет))), вообще фигасдва найдешь потом)

PS: пример учит правильно объявлять и использовать переменные - как предостережение)
w-divin; +1
8. romansun 193 08.02.11 11:37 Сейчас в теме
(6)

дададададада, совершенно верно :)
+
7. romansun 193 08.02.11 11:36 Сейчас в теме
Поясняю, что было в оригинале - в ПередЗаписью вызывается некая глобальная проверочная процедура, возвращающая статус отказа. Поскольку для нового объекта ссылки еще нет, то приходится оперировать объектом. И именно в том проверочном модуле происходит куча-куча всяких проверок, где в каком-то месте потребовалось объявить глобальную переменную.

Приведенный пример, конечно, вырожденный.
+
9. cool.vlad4 2 08.02.11 11:42 Сейчас в теме
(7) При чем здесь процедура, да еще и глобальная и объявление переменной...Я догадывался для чего это вы сделали, но теперь понял, что (6) прав - это не статья о блокировках, это просто глупый баг, передавать таким образом объекты...так никто не делает...
ЗЫ Советую тогда тему статьи поменять и развить ее в русло правильного и неправильного использования и передачи переменных
ЗЫ Можно всегда посмотреть как в типовых проверки огранизуют....
Из типовой ОбработкаТабличныхЧастей.ПриЗаписиПроверитьСтавкуНДС(ЭтотОбъект, Товары) нет там никаких переменных объявленных в модуле
+
10. romansun 193 08.02.11 14:20 Сейчас в теме
(9) Подправил чуть название, согласен, что слово "блокировка" может путать.

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

Насчет так никто не делает и объекты таким образом не передаёт: вот же и пример, собственно - "ОбработкаТабличныхЧастей.ПриЗаписиПроверитьСтавкуНДС(ЭтотОбъект, Товары);"

Про типовые конфы речи не идет, в моё случае конфа нетиповая и в разное время в неё вписывались разные люди.

Если отдельно взятый программист никогда не допустит такой ошибки (могущей быть абсолютно неочевидной ввиду наслоений кода), то честь ему и хвала. Тут я только пожму ему руку :).
+
11. cool.vlad4 2 08.02.11 14:29 Сейчас в теме
(10) Где вы видите Перем Об;
Об = ЭтотОбъект
в типовой?
Там передается в процедуру ЭтотОбъект, которая тут же отрабатывает и все, нет никакой после этого пресловутой блокировки
+
12. cool.vlad4 2 08.02.11 14:37 Сейчас в теме
Но вы наверное сделали бы по другому

Перем ЭтоМойОбъект;



Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
ЭтоМойОбъект = ЭтотОбъект;

ОбработкаТабличныхЧастей.ПриЗаписиПроверитьСтавкуНДС(ЭтоМойОбъект , Товары);



КонецПроцедуры
:D
+
13. romansun 193 08.02.11 15:11 Сейчас в теме
не совсем так :)

модуль объекта:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) 

  ОбработкаТабличныхЧастей.ПриЗаписиПроверитьСтавкуНДС(ЭтотОбъект , Товары); 

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


--------------------------------------------------------

модуль ОбработкаТабличныхЧастей:

Перем ЭтоМойОбъект;

Процедура ПриЗаписиПроверитьСтавкуНДС(ДокументОбъект , ТабличнаяЧасть)

  ЭтоМойОбъект = ДокументОбъект;

КонецПроцедуры
Показать


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

ЗЫ. Общий модуль тут плохой пример, поскольку там нельзя объявить переменную. Но в модуле обработки, к примеру, сделать это нам ничего не мешает.
+
14. cool.vlad4 2 08.02.11 15:47 Сейчас в теме
(13) Не совсем так или совсем не так, в (12) был сарказм....
Смысл в чем --- Если вы делаете что-то в объекте например - Справочник.Номенклатура - то нафига там объявлять переменную, если ЭтотОбъект грубо говоря виден там отовсюду, если вы передаете в процедуры за пределы справочника в общие модули например, то можно передавать ЭтотОбъект, а теперь вопрос - нафига делать Об = ЭтотОбъект;? Возможно имеет в каких-то случаях смысл передавать ссылку, когда объект есть - ЭтотОбъект.Ссылка(в конце концов реквизит тоже может быть ссылочным), тогда можно там где необходимо изменять объект. Но я не могу придумать случай, когда переменной надо присваивать ЭтотОбъект. Ведь никакого присвоения нет, он просто указывает участок памяти на этотобъект и создает ссылку на переменную, так, что в конечном счете это тотже ЭтотОбъект. Потому и блокировка происходит. Объявленная переменная сразу не уничтожается (по всей видимости только после того как сработает сборщик мусора), а режим блокировки, никто не отменял, ведь ЭтотОбъект все еще висит. Смысл Об = ЭтотОбъект?
+
15. cool.vlad4 2 08.02.11 16:21 Сейчас в теме
Да, возможны случаи, при рекурсивном вызове, когда проще сделать Об = ЭтотОбъект, но мне кажется лучше такой код переписать, хотя, конечно, можно сделать Об = ""
+
16. romansun 193 08.02.11 16:53 Сейчас в теме
cool.vlad4 пишет:
Объявленная переменная сразу не уничтожается (по всей видимости только после того как сработает сборщик мусора), а режим блокировки, никто не отменял, ведь ЭтотОбъект все еще висит. Смысл Об = ЭтотОбъект?


Да, всё так и есть :). Именно об этом я и писал, что дескать, если кто-то когда-то напишет где-то вот такой по смыслу код - то увидит такую ошибку, а если увидит такую ошибку - то проверьте, возможно что причина кроется в таком коде.

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

Далее пишет свои процедуры, всё работает, все довольны. Но иногда выскакивают труднообъяснимые ошибки блокировки...


В моём конкретном случае, действительно, переменная "Об = ЭтотОбъект;" и всё что с ней связано оказалось реально лишним и было мной просто стёрто.
+
17. tango 540 08.02.11 20:33 Сейчас в теме
(16) ок, теперь в (0) указать, что тема раскрыта в каментах, и плюсики будут заслуженными
+
21. Abadonna 3958 08.02.11 21:51 Сейчас в теме
Я б на твоем месте просто написал:
- Ребята! Не запоминайте в глобальной переменной модуля объекта сам объект, если вам вдруг придет в голову такая бредовая идея! Чревато!
:D
Rain88; Scag; +2
24. romansun 193 08.02.11 23:05 Сейчас в теме
Уфф, оказалось, что надо было сразу сказать всю правду, а не мутить воду вымыслами :)

Ок, спасибо, подумаю, как можно переписать текст статьи.

ЗЫ. Баг был и правду не очевиден - пользователи присылали скрины и говорили "вот, собственно... как так вышло, мы не знает, само как-то".
+
25. Abadonna 3958 08.02.11 23:23 Сейчас в теме
Все вышеизложенное подтверждает мои подозрения, что разработчики 1С как не умели толком чистить за собой память в 7.7, так и 8.х до сих пор не научились :(
+
26. romansun 193 08.02.11 23:43 Сейчас в теме
(25)
Ну, 1С сама в некотором роде "стимулирует" такое развитие. Ведь для написания простейшего учета пивного ларька даже и код писать не надо, всё на конструкторах - код, запросы. Многое 1С "додумывает" сама.

Плюс отсутствие серьёзной документации именно внутреннего технического характера. В основном только прикладная тематика.

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

Зато массовость и низкий порог вхождения в специальность... Мда..
+
27. Abadonna 3958 08.02.11 23:46 Сейчас в теме
(26)Под
разработчики 1С
я и имел в виду разработчиков самой 1С.
Потому как
по всей видимости только после того как сработает сборщик мусора
- это ж фигня!
А если он через полдня сработает?
+
28. Abadonna 3958 09.02.11 00:08 Сейчас в теме
Если уж совсем по честному, то тот чувак, который додумался объект в самом себе сделать глобальным, ничего особо криминального и не совершил.
Наверняка был уверен (и вполне обоснованно), что после использования объекта (то же интерактивное удаление) его деструктор (как во взрослых языках) сам за собой всё должен сразу же почистить.
+
29. artbear 1518 09.02.11 10:19 Сейчас в теме
(28) Если сборка мусора основана на подсчете ссылок на объект, как сделано в 77 (точно) и 8(подозреваю), то хранение в объекте ссылки на него самого как раз и приводит к багам к памятью.
Мы при разработке классов 1С++ на это много раз нарывались :(
+
30. cool.vlad4 2 09.02.11 10:43 Сейчас в теме
(29) Я подозреваю, что так оно и есть.
А как иначе они (1С) могли сделать. Конечно, они могли сделать, что-то такое мощное как C#, где таких проблем быть не может, но думается мне позиция 1С была сделать простой и доступный интерпретируемый язык, которым сможет пользоватся даже оператор и бухгалтер, которые вряд ли бы осилили кодинг в C#, зато там со сборкой мусора проблем таких нет. строго говоря и глобально объявляемых переменных нет. Да и типизация там строгая...В общем цель 1С была сделать простой и доступный процедурный язык, если бы они еще сделали нормальный сбощик мусора, мне кажется простого языка бы не получилось. Вывод - тупо не использовать такие дырявые конструкции, которые тем более, что ни к чему.
ЗЫ Текучка памяти у 1С постоянно. И это не значит, что 1С кривой, а то, что код где-то не совсем корректный. А поскольку за черными ящиками не всегда догадываешься, что происходит, то проблему можно искать очень долго.
+
31. AndrewEv 18 09.02.11 11:48 Сейчас в теме
я всегда об'являю переменные в НеОпределено
catNom = UnDefined;
Не сложно и проблем никогда не было
+
32. romansun 193 09.02.11 13:49 Сейчас в теме
(31)
хороший пример самоорганизации, да :)
+
33. Abadonna 3958 09.02.11 14:00 Сейчас в теме
(31), (32) Лично у меня нет никакой уверенности, что принудительное присвоение переменной значения = неопределено не может вызвать таких же глюков, как и изложенных с сабже. "Не то он украл, не то у него крали...." Где один глюк, там с таким же успехом может быть и другой.
В той же Дельфи иногда происходит глюк при неправильном использовании free, когда она своим деструктором пытается освободить память, которую программист уже освободил
markers; +1
34. cool.vlad4 2 09.02.11 14:57 Сейчас в теме
Соглашусь с (33) - из крайности в крайность. Потом появится статья о странных переменных, которые вдруг становятся неопределенными. Делать надо как все, в хорошем смысле этого слова.
+
35. alexqc 150 10.02.11 11:05 Сейчас в теме
(33) Почему? как раз все нормально. Механизм на подсчете ссылок, как artbear сказал. При присвоении Об=ЭтотОбъект увеличиваем счетчик у объекта, при "сбросе" (Об=ЧтоТоЕще) - уменьшаем. когда счетчик=0 - убиваем. И никаких глюков тут быть не должно.

И по поводу начального глюка - тоже ничего удивительного, оставили "висячую ссылку". Другой вариант например такой:

А=новый Массив;А.Добавить(А);

Либо так:
А=новый Массив;
Б=Новый Массив;
Б.добавить(А);
А.Добавить(Б);

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

На самом деле меня удивляет как раз то, что блокировка в конце-концов снимается. А это значит - что либо некий мусорщик все же есть, либо блокировка сама по таймауту сбрасывается, а объект остается.
markers; +1
36. Abadonna 3958 10.02.11 11:18 Сейчас в теме
(35)
И по поводу начального глюка - тоже ничего удивительного, оставили "висячую ссылку".

А мне как раз удивительно. Раз уж 1С позиционируется как (щас камнями закидают! :D ) язык для домохозяек, то разработчики были просто обязаны были предусмотреть защиту от дурака.
Одно дело, когда я самолично (на свой страх и риск так сказать) даю команду GetMem(Массив, Размер), тогда я и должен сам позаботиться потом о
FreeMem(Массив, Размер). А если я его задал как var b: array[0..1023] of char дальше уже не мое дело как среда будет его потом подчищать.
При присвоении Об=ЭтотОбъект увеличиваем счетчик у объекта, при "сбросе" (Об=ЧтоТоЕще) - уменьшаем

Это мы думаем, что так должно быть, а как оно на самом деле - хз :(
+
37. cool.vlad4 2 10.02.11 12:25 Сейчас в теме
(36) Абсолютно точно, что там происходит непонятно, или у кого-то исходники 1С появились? А писать то, что не всегда надо (Об = "" не всегда надо) считаю моветоном...да иногда это просто необходимо (например com), а насчет (35) сомневаюсь, что все там так просто (таймауты блокировок?), откройте объект(документ например) на целый день и он будет заблокирован на целый день, где тут таймаут. Сборщик видит, что на переменную нет ссылок и грубо говоря удаляет ее и все, затем просто перезаписываются участки памяти...
+
46. alexqc 150 10.02.11 13:30 Сейчас в теме
(37) Да, конечно _точно_ знать что там происходит можно только имея исходник, но по имеющимся данным, поведению системы и здравому смыслу можно предположить с _очень высокой вероятностью_. Ну ладно, это все лирика.

Я не проверял код автора, я ему поверил :). Автор пишет что блокировка снимается. Возможно, блокировка снимается по таймауту если объект никто не дергал, а открытая форма периодически стучит в рельсу "эй, я тут, открыт". Вот например что будет если присвоить переменной допустим допустим модуля какогото отчета объект (например элемент справочника), сделать ему Записать() и не закрывать этот отчет. Сколько провисит блокировка?

(39) Не понял, раскройте мысль плиз.

(42) А Абадона-ХХ франч или фри? Я почему-то считал что фри... Кстати, если вы таки работник франча, то уж наверно не тот кого там много и чей час стандартно в прайсе прописан, а наверно спец который итак дороже стоит?
+
49. cool.vlad4 2 10.02.11 13:58 Сейчас в теме
(46) что непонятного в (39)? То что мусорщик какой-то есть? Уж что, что - а уж это то из здравого смысла...
+
40. alexqc 150 10.02.11 12:51 Сейчас в теме
(36) А оно и очищает. время жизни локально переменной - до конца функции, вышли - умерла. Поэтому пишем А=новый Массив(), и спокойно ждем когда среда его очистит.

В данном же случае другое. Это не локальная переменная, а переменной модуля - и она живет пока живет модуль. Модуль, очевидно живет пока живет объект. объект живет пока на него есть ссылки - из переменной ли, из внутренности системы (например, из открытой формы). И если ты присвоишь переменной _модуля объекта_ сам же объект - получим циклическую ссылку, -> на каждого из участников ссылка есть -> никто не умирает.

Это все равно что в яве написать нечто типа this.a=this. Но в яве подобный прикол специально разруливается мусорщиком (хотя всегда можно найти вариант, который GC не сможет обработать, либо для его обработки алгоритм сборки мусора будет медленным/затратным).
В 77 это решалось тем, что Контекст у формы не был ссылкой на непосредственно объект, а лишь содержал в себе эту ссылку. А при закрытии формы контекст по-любому чистился (в т.ч. и с этой ссылкой) - и было совершенно не важно, что еще ссылается на него.

В классах 1С++ контекст класса был ссылкой на объект, но специально контролировалось присваивание его члену.

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

И на счет "язык для домохозяек" - именно 1С именно 8ку так не позиционирует, 8кой они замахиваются на "сурьезные" ERP-системы.
Собственно, у франчей 8рочники обычно "стОят" дороже 7рочников

А домохозяйкам по-идее должно хватить конструкторов :), и код руками типо писать не нужно.
+
41. cool.vlad4 2 10.02.11 12:53 Сейчас в теме
(40) Пожалуй, да
ЗЫ пытаюсь проделать фокус автора, нифига не получается....разные пользователи и никаких проблем...
+
47. alexqc 150 10.02.11 13:33 Сейчас в теме
(41) (44) А что именно вы проверяете? Если с "Об = неопределено" (как в 44 написали)- то ничего и не будет, мыж все за собой почистили... или вы в 44 нето привели?
+
48. cool.vlad4 2 10.02.11 13:56 Сейчас в теме
(47) Что я по вашему читать не умею? я в (44) скопипастил из статьи, естессно не то...вы сами то хоть проверяли?
+
55. alexqc 150 10.02.11 14:40 Сейчас в теме
(48) Ну мало-ли, всяко бывает. Точно так же как в пост, с налету код вставили в модуль, и "замыленым" глазом не заметили что там лишняя строчка в конце стоит.

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

Ели об объектах языка "Запрос" - то тут все то же самое - объект живет пока на него есть ссылки, т.е. вот переменные ушли погулять, количество ссылок стало =0 - и Запрос автоматически умер. Специально выделенной сборки мусора тут не требуется. И значит ничего явно не говорит о том что тут есть GC.

На всякий случай (вдруг мы о разном говорим) - во всем контексте нашего обсуждения под "сборкой мусора" я понимаю _отдельный_ механизм, (периодически) проверяющий память на предмет нахождения и уничтожения ненужных объектов. Подсчет количества ссылок с самоуничтожением объектов я сюда не отношу.
+
56. cool.vlad4 2 10.02.11 14:42 Сейчас в теме
(55) Да я не про 1С-ные запросы... а к памяти...Подсчет количества ссылок с самоуничтожением объектов - я же отношу. Вот поэтому у нас нестыковка...Если не относить - тогда, да, я соглашусь.
+
57. cool.vlad4 2 10.02.11 14:49 Сейчас в теме
педивикия не аргумент, но тем не менее - (55) http://en.wikipedia.org/wiki/Reference_counting

In computer science, reference counting is a technique of storing the number of references, pointers, or handles to a resource such as an object, block of memory, disk space or other resource. It may also refer, more specifically, to a garbage collection algorithm that uses these reference counts to deallocate objects which are no longer referenced.
+
39. cool.vlad4 2 10.02.11 12:38 Сейчас в теме
(35) Только сейчас заметил
что либо некий мусорщик все же есть
дык, конечно, есть...а иначе как? n-ное количество запросов бы иначе повесили систему моментально...
+
38. cool.vlad4 2 10.02.11 12:31 Сейчас в теме
В конце концов процедуру можно написать Деструкция(Объект) --> Объект = "";
PS скоро умельцы напишут сборщик мусора на 1С :D
markers; +1
42. Abadonna 3958 10.02.11 12:54 Сейчас в теме
Собственно, у франчей 8рочники обычно "стОят" дороже 7рочников

У нас одинаково. ;)
Абадона-77 получает столько же, сколько Абадонна-8х :D
+
43. cool.vlad4 2 10.02.11 12:59 Сейчас в теме
Нифига не получается сделать тоже самое....
+
44. cool.vlad4 2 10.02.11 13:07 Сейчас в теме
перем Об;

Процедура ПередЗаписью(Отказ)

Об = ЭтотОбъект;

....
Об = неопределено;
КонецПроцедуры

Подозреваю, что дело связано еще с .... из этого кода - поскольку попытки воспроизвести на скульной базе, на файловой, с одного компьютера, с нескольких, с одним пользователем, с несколькими, в модуле формы, модуле, у меня провалились. Никаких блокировок.
+
45. cool.vlad4 2 10.02.11 13:17 Сейчас в теме
(0) Автор признавайся...ты хоть сам пробовал те куски кода, которые в статье...Нет никакой блокировки...либо приводи реальный код, где есть реальная блокировка...терзают смутные сомнения, что там еще более кривой код из-за которого вся петрушка...
+
64. romansun 193 10.02.11 15:31 Сейчас в теме
ничо себе вы тут развернули!!

(45)
признаюсь :)
Abadonna получил верный скрин, да :)

(54) таки да, вроде не на всех доках блочилось. Попробую проверить и уточнить.

В целом - там возможны комбинации. Я игрался часа полтора с этим косяком: как можно поставить блок, как снять, возможна ли редакция при блоке, снимается ли блокировка редакцией и пр. и пр. В некоторых случаях блок снимался просто открывая форму, редактируя что-нить (получая модифицированность) и не записывая, закрывая. В других - даже не давало редактировать поля на форме, сразу ругалось.
+
50. alexqc 150 10.02.11 13:59 Сейчас в теме
Проверил сам (правда не на справочнике, на документе, но думаю это не важно) - не срабатывает. И даже при явном указании Блокировка() - тоже не срабатывает. 1С:Предприятие 8.1 (8.1.15.14), режим блокировки - автоматический. Похоже, автор действительно чтото недоговариваеь.
+
51. Abadonna 3958 10.02.11 14:18 Сейчас в теме
А Абадона-ХХ франч или фри? Я почему-то считал что фри

Абадонна с любыми префиксами - сотрудник аутсорсинговой компании, имеющей кроме прочего права франча.
Сервис-М

А вот сюда всех приглашаю на огонек ;)
1С: пользователям и программистам
+
52. Abadonna 3958 10.02.11 14:23 Сейчас в теме
Нет никакой блокировки..

Есть! Лично проверил на справочнике Номенклатура. После "пометить на удаление" интерактивно в форме списка, "распометка" следом выдает "фигвам, блокировка". Правда не стал дожидаться потом разблокирует или нет? Щас тоже проверю
Прикрепленные файлы:
+
53. Abadonna 3958 10.02.11 14:36 Сейчас в теме
+(52)
Модуль объекта:

Перем Об;

Процедура ПередЗаписью(Отказ)

Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
//.....................................

Об=ЭтотОбъект;
КонецПроцедуры // ПередЗаписью()
И нифига не снялась самостоятельно. Висит с момента предыдущего поста
+
54. cool.vlad4 2 10.02.11 14:39 Сейчас в теме
(53) Что я, что Alexqc - делали в документе, выходит есть разница...
+
58. Abadonna 3958 10.02.11 15:13 Сейчас в теме
Кстати, я понял откуда взялось так называемое "потом саморазблокируется".
Ничего оно не саморазблокируется, просто если потом поработать с другим элементом справочника, тем же кодом (Об=ЭтотОбъект) блокирнется уже он, а прежний "отпустит"
cool.vlad4; +1
59. cool.vlad4 2 10.02.11 15:15 Сейчас в теме
(58) Я сразу начал чего-то подозревать, что дело нечисто...Но у меня нивкакую не получается ни со справочником ни с чем воспроизвести....
+
60. Abadonna 3958 10.02.11 15:24 Сейчас в теме
(59)
Но у меня нивкакую не получается

Движок 8.2 (8.2.13.202)
Та же фигня. А ты, сорри,в каком модуле код вставляешь?
Надо именно в модуле всего объекта: Действия - Открыть модуль объекта в Конфигураторе
А по поводу
блокирнется уже он, а прежний "отпустит"
это я соврал :( В смысле я тут начал эсперементировать когда Об воообще глобальная Экспорт.
В эксперименте с 8.2 оба элемента благополучно блокирнулись
+
61. cool.vlad4 2 10.02.11 15:25 Сейчас в теме
(60) Именно в этом...получилось при распометке - пометке удаления, в консоли сервера можно посмотреть висячие блокировки - призаписи видать блокировки не возникает - потому как передзаписью вызывается опять Об = ЭтотОбъект. В общем сабж в "кровосмешении" блокировок и кривого кода.
PS Про запись и я соврал, то он блокирует, то нет.
+
62. cool.vlad4 2 10.02.11 15:30 Сейчас в теме
:D Новое чудо техники 1С - запрет на любое редактирование -- консервирование объектов, называется прощай память....
+
63. alexqc 150 10.02.11 15:31 Сейчас в теме
А почемму по английски, там и русская статья есть, практически такая же?

Короче, резюмируя: _сборка_ мусора - механизм, обеспечивающий удаление ненужных объектов; одним из вариантов реализации является _сборщик_ мусора - процесс, ищущий эти самые объекты. Автоподсчет ссылок с автоудалением - другой механизм, при этом сам _сборщик мусора_ ("мусорщик") отсутствует (или так - каждый объект сам себе мусорщик). Допускаю что теоретически м.б. вариант и с тем и с тем, но ИМХО он избыточен.

Фсе, завязываем с философией :)
+
65. Abadonna 3958 10.02.11 15:32 Сейчас в теме
(63) А философия простая: лопухнулись разработчики, не предусмотрели такого дикого варианта, а надо бы...
+
66. alexqc 150 10.02.11 15:35 Сейчас в теме
Слушайте, уже интересно. У меня на 81 ну никак не хочет блокироваться. может это только на 82?
+
67. Abadonna 3958 10.02.11 15:36 Сейчас в теме
(66) Картинка (52) - 1С:Предприятие 8.1 (8.1.15.14)
Уточню - файловый вариант. Ибо я дома
+
68. cool.vlad4 2 10.02.11 15:37 Сейчас в теме
(66) Не - у меня 81,...есть у меня подозрения...надо обдуматьь
+
78. cool.vlad4 2 10.02.11 22:26 Сейчас в теме
Эх все молчат...все таки не постесняюсь и озвучу свои подозрения в (68). Как мне кажется все достаточно тривиально. Сборщики не причем и свою работу они выполняют прекрасно. Я уже намекнул в (74) (Разблокировать()) в чем как мне кажется проблема. При оперировании формой включается свой атрибут контекста и ЭтотОбъект.Заблокирован() тупо затирается, почему этот трюк и не прокатывает (так по идее и должно быть) - срабатывает событие формы, оно и затирает значение заблокирован() (еще бы - пользователь открыл и закрыл, соответственно усе - это если один пользователь). Модуль же срабатывает в случаях когда форма не нужна/не причем - хитрая пометка удаления. Он при каждой записи проверяет ЭтотОбъект.Заблокирован() или нет. И соответственно решает, что делать. При пометке удаления срабатывает две записи (грубо говоря, событие то все равно одно) - первая изменяет значение пометки, второе это обработчик события ПередЗаписью в модуле. И вот здесь он присваивает переменной (фактически это ссылка, сначала думал указатель, возможно, но тогда почему не затирается другими данными) ЭтотОбъект со всеми потрохами, в том числе ЭтотОбъект.Заблокирован()(Истина в момент записи), после записи естессно удаляется переменная (ссылка) - иначе бы контекст на нее существовал, но менеджер записи (ЭтотОбъект) все еще висит. ЭтотОбъект.Заблокирован() все еще истина. К примеру я создал глобальную (для того чтобы в отладчике на нее поглядеть) переменную и вот. Но этот фокус срабатывает не только передзаписью еще и в самом модуле. Видать все по тем же причинам. Т.е. все это из-за хитрости ЭтотОбъект. Который оперирует в частности Заблокирован() в зависимости от контекста. Если пользователь первый открыл форму, то у него свой контекст, если другой пользователь, то у него естессно заблокировано.
Прикрепленные файлы:
+
86. romansun 193 11.02.11 00:50 Сейчас в теме
(78)
Сидел на работе и тыкал в Del. Работу забросил :(

Выяснил, что открытие формы заблоченного объекта и закрытие по "ОК" иногда снимает блок (просто "Записать" не снимает никогда). А иногда - не снимает, и в этом случае снять удаётся только перезапуском сеанса. На обработки прямой перезаписи реквизита блок не влияет вообще. Даже если перезаписывать "реквизит" "ПометкаУдаления" )) .

Если это в чем-то поможет теории из 78 поста - буду рад ))

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

(85)
широка страна моя родная... а ведь потребовалось некоторое время, чтоб понять почему три ночи, када у меня половина двенадцатого (почему-то подумалось "холодно у них наверно..." :) )
+
87. Abadonna 3958 11.02.11 06:42 Сейчас в теме
(86) Насчет холодно - не особо, минус 10 сейчас. Вообще-то мы точно на широте Москвы находимся.
А вот что вчера...землетрясение было, это да;)
Землетрясение
Лично я ни фига не почувствовал.
+
88. Арчибальд 2707 11.02.11 08:43 Сейчас в теме
(87)
Лично я ни фига не почувствовал.
А не поучаствовал?
+
89. Abadonna 3958 11.02.11 08:46 Сейчас в теме
(88) Поспособствовал
+
69. Abadonna 3958 10.02.11 15:40 Сейчас в теме
(66) Еще нюанс
Если у тебя просто Об=ЭтотОбъект - и не блокирнется никогда, ибо такой Об сразу чистится при выходе из процедуры
Надо, чтобы было именно вверху модуля
Перем Об;
+
70. cool.vlad4 2 10.02.11 15:45 Сейчас в теме
Обязательно заблокируется , после изменения любого реквизита, к примеру пометки удаления, ан нет только пометки удаления...забавно...
+
71. Abadonna 3958 10.02.11 15:52 Сейчас в теме
(70) Во, а мы тут слышим речи про "увеличили счетчик ссылок" :D
Подтверждаю - после изменения (например, наименования) и записи элемента ни фига не блокируется, хотя, по логике, вызывается та же ПередЗаписью() и так же должна увеличивать счетчик ссылок. Вывод: когда закрывается форма - она таки за собой все чистит, а вот если она и не вызывалась (пометка) - тогда ничего и не чистится.
Так что - косяк разработчиков, кто бы мне какие теории не выдвигал ;)
+
72. cool.vlad4 2 10.02.11 15:57 Сейчас в теме
(71) Согласен полностью...уже дошло до меня...потому молчу..
+
74. cool.vlad4 2 10.02.11 16:11 Сейчас в теме
(71) Плюс там еще другой косяк - при установке пометки удаления, она устанавливается до события передзаписью (в отладчике можно посмотреть) Именно поэтому она всегда срабатывает. Потому как объект еще заблокирован, после Об = ЭтотОбъект, он снова блокируется.
Первое, что приходит на ум для проверки
ПередЗаписью

Попытка
ЭтотОбъект.Разблокировать();
Исключение
Сообщить("ни фига");
КонецПопытки;


_______
и т.д.

Новое событие ПометкаПриИзменении() :D передпередзаписью()
+
73. tango 540 10.02.11 16:09 Сейчас в теме
здесь это немного обсуждалось
http://infostart.ru/public/63392/
+
75. cool.vlad4 2 10.02.11 16:24 Сейчас в теме
Кто не верит код передзаписью() Если ПометкаУдаления Тогда ПометкаУдаления = Ложь; КонецЕсли; пометка будет всегда ложь.опечатался в первый раз
+
76. romansun 193 10.02.11 16:30 Сейчас в теме
Попробовал внешней обработкой прямого изменения реквизитов - залоченный контрагент редактируется успешно. Интерактивно - фиг, сразу ошибка. Ни даётся ни один реквизит.
+
77. cool.vlad4 2 10.02.11 16:42 Сейчас в теме
Не все таки 1С прогерам респект - они же не могли все предусмотреть...как например такой перл ПередЗаписью ЭтотОбъект.Записать() КонецПро... :D
ЗЫ Зато я теперь знаю как 1С того...сломить...
ЗЫ Скорее всего поэтому они пометку сделали до передзаписью - поскольку пометку надо делать без проверки, соответственно Записать() и тогда естессно до передзаписью. Т.е. при изменении пометки в списке, он записывает без событий передзаписью и т.д.
+
79. Abadonna 3958 10.02.11 22:33 Сейчас в теме
Эх все молчат..

Ясно дело ;) Я тут уже с BASS.DLL разбираюсь да графические эквалайзеры строю, а ты все про глюки 1С :D
+
80. cool.vlad4 2 10.02.11 22:35 Сейчас в теме
(79) Вообще-то я уже почти 2 сайта распарсил :D ну и фильмец поглядываю...
+
81. Abadonna 3958 10.02.11 22:39 Сейчас в теме
OFF: давно хотел плейер замутить с графикой по спектру (посмотрю, может в Miracle засуну)
+
82. cool.vlad4 2 10.02.11 22:40 Сейчас в теме
(81) А эквалайзер будет?
офф то ли я сработы уставший, то ли два с половиной человека действительно смешной сериал
ЗЫ AIMP 1C Copyrigt Abadonna :D прикольно будет
+
83. Abadonna 3958 10.02.11 22:44 Сейчас в теме
вот однако ;)
) А эквалайзер будет?

Да вот оно: BASS_SetEAXParameters
теперь только что обезьяна не приделает ;)
Прикрепленные файлы:
+
93. Abadonna 3958 12.02.11 07:51 Сейчас в теме
off: + (83)
Дурачок любит красненький клочок ;)
Таки домутил я почти плейер. Теперь думаю - на фига? :D
Прикрепленные файлы:
+
84. CheBurator 3119 10.02.11 23:10 Сейчас в теме
Аркадий, занялись бы вы полезным делом.. ;-)
+
85. Abadonna 3958 10.02.11 23:21 Сейчас в теме
Кому полезным? Да еще и в три ночи? :D
+
90. artbear 1518 11.02.11 15:43 Сейчас в теме
Лично я уверен на 99,9%, что 1С использует именно подсчет ссылок, а спец.сборщик мусора - давно известные примеры с зацикливанием это только подтверждают.
Подсчет ссылок довольно удобен, если не ошибаться с циклическими ссылками, и просто в эксплуатации и разработке.
+
91. Abadonna 3958 11.02.11 15:46 Сейчас в теме
(90) А (71) читал? Там куда ссылки подевались?
+
92. cool.vlad4 2 11.02.11 16:38 Сейчас в теме
(90) Может это и так, да в общем никто этого и не отрицал, но здесь не тот случай. Проблема обмусолена - вывод - блокировка объекта из-за неправильного использования ЭтотОбъект. Решается проблема Об = Неопределенно(и то я уверен не во всех случаях) не из-за проблем, связанных со сборщиком, а из-за того что освобождается атрибут контекста ЭтотОбъект и объект разблокируется.
+
94. USER--1C 60 12.02.11 11:00 Сейчас в теме
В переменную записан объект в процедуре ПередЗаписью.
Читаем букварь: 1С:Предприятие 8.2 Практическое пособие разработчика,
стр. 442, 3 абзац:
"Если обращение происходит в пределах 20 секунд после поступления данных в кэш, данные считаются верными (валидными). Если превысил 20 секунд, будет выполняться проверка на соответствие версии данных, хранящихся в кэше, версии данных, находящихся в базе данных".

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

Т.е. пытается считать объект, заблокированный в транзакции, после 20 сек. "отпускает".
+
95. Abadonna 3958 12.02.11 11:18 Сейчас в теме
(94)
В переменную записан объект в процедуре ПередЗаписью.

Блин, читайте (71)
после изменения (например, наименования) и записи элемента ни фига не блокируется, хотя, по логике, вызывается та же ПередЗаписью()

Изменяем наименование, записываем, точно так же
В переменную записан объект в процедуре ПередЗаписью.

НЕ БЛОКИРУЕТСЯ! Блокируется только в том случае, когда форма вообще не вызывалась, т.е. при установке пометки в списке.
Не так все тут однозначно, как мечталось бы...
+
96. cool.vlad4 2 12.02.11 11:53 Сейчас в теме
(94)Офф Какие книжки ты еще знаешь?(риторический вопрос)
Ты хоть сам пробовал сделать, что описано в (0) - какие нафиг 20 секунд, полдня висеть будет, если не больше. Почитай, что было написано выше, может чего поймешь.
+
97. tango 540 12.02.11 12:16 Сейчас в теме
господа, пианист играет как может.
+
98. Abadonna 3958 12.02.11 13:28 Сейчас в теме
господа, пианист играет как может.

Во-первых, в оригинале - "тапёр"
Во-вторых,никто в него и не стрелял ;)
+
99. alexqc 150 14.02.11 11:04 Сейчас в теме
(98) Счас я с своим ворчливым характером выстрелю.

---
"Если обращение происходит в пределах 20 секунд после поступления данных в кэш, данные считаются верными (валидными)."
- Здесь речь идет о ЧТЕНИИ. Т.е. если у нас объект прожил более 20 сек - мы его еще раз перечитываем. К блокировке отношения ну никакого.

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

- Здесь речь о ТРАНЗАКЦИИ. Транзакционная блокировка (скорее всего, она и делается средствами сервера БД а не сервера 1С) умрет с окончанием/отменой транзакции, и никакие 20 сек тут ни при чем: транзакция может закончится быстро ( и блокировка снимется) или провисеть хоть час - тогда и блокировка час висеть будет.

Тапер, по ходу, ноты знает, да с ритма сбивается.
+
Внимание! Тема сдана в архив