Кольцевые ссылки в скриптах 1С
Разработка - Механизмы типовых конфигураций
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Внимание! Нападки автора на Экспорт вызваны необъяснимой невнимательностью при исследовании казуса. К правильному пониманию явления подвигают комменты steban (поставил все-таки минус :))
Предлагаемая обработка иллюстрирует тезис. Просто отройте её и закройте.
Рис.1
Ничего страшного не произойдет (правда, правда, модуль открыт, можете убедиться сами).
Рис.2
Конечно, чтобы всё-таки избавиться от формы, придётся закрыть платформу (каламбурчик!), но перезагружать виндовс не надо.
Казус возникает, если экспортной переменной модуля (формы или объекта, все равно) присвоить значение самой формы. потому, что разработчики не стали решать существующую во "взрослых" средах проблему чистки мусора, а просто переложили ее на плечи скриптописателей.
Обнаруженные эффекты:
- если вызвать контекстное меню на кнопке окна предприятия в панели окон виндовса, форма затаится
Рис. 3
, но если не закрыть окно, продолжит виртуально быть.
- если открыть/закрыть форму еще раз, они будут в памяти обе две
Рис. 4
Можно было бы еще поковыряться, пофантазировать о полезном использовании фичи (или бага?), но с отличной от нуля вероятностью «взрослые дяди» могут подрихтовать свою продукцию, так что в сухом остатке публикации – только бесплатный совет:
Постарайтесь как можно меньше использовать в своей работе ключевое слово Экспорт.
Или убивайте их нах, чисто не там, где убирает 1с, а там, где не мусорят 1сники.
Вступайте в нашу телеграмм-группу Инфостарт
См. также
Инструментарий разработчика Механизмы типовых конфигураций Разработчик 1С 8.5 1С:Управление нашей фирмой 3.0 Абонемент ($m)
Кто ссылается на этот справочник, на что ссылается документ и какие регистры он двигает — обработка показывает это схемой прямо в базе. Выбранный объект — в центре, слева — кто ссылается на него, справа — на что ссылается он, под схемой — через какой реквизит; щелчок по соседу делает центром его. Много соседей — группы по видам, связи через составные типы — пунктиром и отключаются флажком. Для документации схему можно взять текстом PlantUML или сохранить файлом HTML вместе с таблицей связей. В статье я разбираю код: связи по типам реквизитов, движениям и владельцам, временное хранилище формы, схему в поле HTML и щелчок по узлу.
2 стартмани
30.09.2026 819 17 Petr_32 2
Механизмы типовых конфигураций Разработчик 1С:Предприятие 8 Абонемент ($m)
Использование переопределяемых процедур в 1С на управляемых формах.
1 стартмани
01.09.2026 4256 waider 3
Механизмы типовых конфигураций Разработчик 1С:Предприятие 8 1С:Управление торговлей 11 Россия Бесплатно (free)
С 1 сентября компании с выручкой от 120 миллионов обязаны принимать цифровой рубль, за отказ — штраф до 50 тысяч за каждый случай. Я снял выгрузку с актуального релиза «Управления торговлей» и пошёл смотреть, где это включается. Оказалось, что казначейский контур в типовой сделан подробно, а кассового нет вообще — и это не забывчивость, а решение, записанное в конфигурации прямым текстом.
31.08.2026 2373 G_100802897175107255412 6
Инструментарий разработчика БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Разработчик 1С 8.3 1С:ERP Управление предприятием 2 Абонемент ($m)
Данное расширение — это механизм, сделанный при помощи двух модулей из БСП (3.1.11.415), который позволяет динамически добавлять команды (кнопки и не только при желании) на формы управляемого приложения без изменения конфигурации. На примере данного механизма удобно рассмотреть некоторые возможности для расширения функционала объектов, которые подключены к механизму библиотеки стандартных подсистем.
1 стартмани
20.03.2026 5332 InFlach 0
Механизмы типовых конфигураций Разработчик Стажер 1С 8.3 1С:Зарплата и Управление Персоналом 3.x Бесплатно (free)
Интервальные регистры в 1С:ЗУП 3.1 заменяют тяжелые срезы последних, ускоряя отчеты по кадровым данным через интервалы ДатаНачала–ДатаОкончания. Разбираем отличия, примеры кода, плюсы и способы синхронизации.
12.03.2026 7153 AlexeyPROSTO_1C 5
Механизмы типовых конфигураций Разработчик Стажер 1С 8.3 1С:Зарплата и Управление Персоналом 3.x Бесплатно (free)
Как в ЗУП работает механизм расстановки времени в регистрах сведений с помощью подписки на события?Рассматривается логика сдвигов для разных типов документов (прием, увольнение, отпуск) и дается инструкция по подключению нового регистра к этому механизму.
03.03.2026 4575 YA_1100893639 1
Механизмы типовых конфигураций Разработчик 1С:Предприятие 8 1С:Зарплата и Управление Персоналом 3.x Бесплатно (free)
Описываю мой опыт подключения документа к подсистеме "Версионирование объектов" в ЗУП 3.1.
30.01.2026 4991 Mattakushi 2
Универсальные функции Механизмы типовых конфигураций Разработчик 1С:Предприятие 8 1С:Зарплата и Управление Персоналом 3.x 1С:Франчайзи, автоматизация бизнеса Россия Бесплатно (free)
В статье рассказывается, как программно получить наименование должности из классификаторов по коду ОКПДТР в ЗУП Корп.
31.10.2025 4296 Sardukar 0
Вот, думается, не потому ли конфигуратор время от времени схлопывается, что 1сина так же грязно работает и в этом режиме?
Сделаем в ПриЗакрытии
Фрм = "";
Допустим (не факт), это убъет ее циклы и даже созданные в ней локальные переменные.
Сама-то она останется в памяти как пустая строка (или нет?)!
Если же обращение к такой форме происходит достаточно часто (в большом цикле), то ссылки даже на пустую строку в конце концов забьют сколь угодно большой, но конечный, объем.
Важно то, что разработчик должен учитывать возможность появления мусора. А предупрежден - значит, вооружен.
Подсчёт ссылок. Алгоритм сборки мусора, ведущий для каждого объекта программы подсчёт текущего числа других объектов, которые на него ссылаются. Если это число становится равным нулю, память соответствующего объекта можно безопасно освободить, а общее число ссылок каждого из ссылающихся на него других объектов уменьшить на единицу. У этого алгоритма возникают проблемы с объектами, ссылающимися друг на друга по кольцу, так как у них число ссылок никогда не бывает меньше 1.
Локальные имена - имена, которым присвоено значение в данном блоке кода. Глобальные имена - имена, определяемые на уровне блока кода определения модуля или те, которые явно заданы в операторе global. Встроенные имена - имена из специального словаря __builtins__.
Области видимости имен могут быть вложенными друг в друга, например, внутри вызванной функции видны имена, определенные в вызывающем коде. Переменные, которые используются в блоке кода, но связаны со значением вне кода, называются свободными переменными.
Так как переменную можно связать с объектом в любом месте блока, важно, чтобы это произошло до ее использования, иначе будет возбуждено исключение NameError. Связывание имен со значениями происходит в операторах присваивания, for, import, в формальных аргументах функций, при определении функции или класса, во втором параметре части except оператора try-except.
С областями видимости и связыванием имен есть много нюансов, которые хорошо описаны в документации. Желательно, чтобы программы не зависели от таких нюансов, а для этого достаточно придерживаться следующих правил:
Всегда следует связывать переменную со значением (текстуально) до ее использования.
Необходимо избегать глобальных переменных и передавать все в качестве параметров. Глобальными на уровне модуля должны остаться только имена-константы, имена классов и функций.
Никогда не следует использовать from модуль import * - это может привести к затенению имен из других модулей, а внутри определения функции просто запрещено.
Предпочтительнее переделать код, нежели использовать глобальную переменную. Конечно, для программ, состоящих из одного модуля, это не так важно: ведь все определенные на уровне модуля переменные глобальны.
Убрать связь имени с объектом можно с помощью оператора del. В этом случае, если объект не имеет других ссылок на него, он будет удален. Для управления памятью в Python используется подсчет ссылок (reference counting), для удаления наборов объектов с зацикленными ссылками - сборка мусора (garbage collection).
Существующие методы сборки мусора делятся на трассирующие и использующие счетчики ссылок.
Трассирующие методы сборки мусора основаны на определении полного графа достижимости. Сборка начинается со сканирования исходного набора указателей, далее происходит обход графа с обработкой достижимых объектов. В конце обхода, когда все достижимые объекты определены, память, занятая недостижимыми объектами, считается свободной. Достижимые объекты считаются живыми, а недостижимые относят к множеству свободных.
Основной идеей сборщиков с подсчетом ссылок является отслеживание числа указателей на каждый объект в куче. Если в некоторый момент выполнения приложения счетчик ссылок объекта стал равным нулю, это означает, что такой объект больше не нужен приложению (на него не ссылается ни один другой), и место в памяти, которое он занимал, может быть отнесено к множеству свободных блоков. Основным недостатком такой схемы управления памятью является невозможность обработки циклических структур, какими, например, являются двусвязные списки, так как в таких структурах на каждый объект всегда существует хотя бы одна ссылка.
Перем Т;
Т=Новый ТаблицаЗначений();
Т.Колонки.Добавить("т");
Для Сч=1 По 1000000 Цикл
Стр=Т.Добавить();
Стр.Т=Т;
КонецЦикла; При каждом открытии обработки количество памяти, используемой процессом 1с, будет расти. Это является косвенным подтверждением того, что в 1с именно "подсчет ссылок", а не "сборка мусора"
после окончания цикла счетчик ссылок на Т будет равен 1000001 (переменная модуля ссылается на Т + миллион ссылок внутри самой Т).
При разрушении объекта обработки счетчик ссылок на Т будет уменьшен на 1, и т.к. он все еще положителен, то Т уничтожена не будет
2.
сомнительная рекомендация, основанная на ложных выводах
3. "Роскошный глюк" оказался ожидаемым поведением
1. Программеры камней (базовый ввод-вывод)
2. Программеры ОС (виндовс, люникс, etc)
3. Программеры "взрослых" языков (си, паскаль, ява,..)
4. Программеры прикладных пакетов (1с,..)
5. Программеры скриптов (веб-дизайнеры, 1сники,...)
Очевидно, проблема циклических ссылок органично существует на 3. уровне (может быть, и на 1.,2.)).
Но не менее очевидно, что на уровнях 3.-4. эта проблема ДОЛЖНА быть решена уже и НЕ транслироваться на уровень 5.
Но не менее очевидно, что на уровнях 3.-4. эта проблема ДОЛЖНА быть решена
Я бы не сказал, что она ДОЛЖНА быть решена.
Выбор между RC и GC - это выбор между накладными расходами на сборку мусора или возможными утечками памяти (которых можно избежать). Те, кто проектировал 1С, сделали свой выбор в пользу "возможных утечек".
Диск ИТС.
Методическая поддержка 1С:Предприятия 8.1 -> Методические рекомендации по конфигурированию -> Встроенный язык -> Особенности хранения значений в переменных модулей объектов и форм
значение счетчика на единицу уменьшается. Объект автоматически уничтожается, и память, занимаемая им, освобождается в момент, когда счетчик ссылок объекта становится равен нулю.
Особенностью подсчета ссылок на объекты является возможность организации "циклической ссылки". Циклическая ссылка возникает, когда объекты начинают ссылаться друг на друга. Это приводит к ситуации, при которой ни один из объектов, участвующих в циклической ссылке, не будет уничтожен. В свою очередь это является причиной возникновения утечек памяти (memory leaks).
Необходимо, по возможности, избегать появления циклических ссылок. Соблюдение достаточно простых правил при разработке конфигураций позволит избежать проблем связанных с циклическими ссылками. В случае появления подобной ссылки необходимо определить момент для ее разрыва, чтобы объекты могли быть уничтожены нормальным образом.
Полный перечень случаев возникновения циклической ссылки привести невозможно, приведем лишь некоторые примеры:
1 хранение в переменной модуля объекта (набора записей, формы) ссылки на данный объект (набор записей, форму) - ситуация приводит к появлению циклической ссылки - объект (набор записей, форма) никогда не будет уничтожен;
2 хранение ссылки на владеемый объект в объекте-владельце и ссылки на объект-владелец во владеемом объекте - оба объекта никогда не будут уничтожены.
Следует обратить внимание, что, помимо переменных модулей, ссылки на объекты могут образовываться при передаче их в методы встроенного языка. Например, добавление в список значений нового значения - этого же списка значений, приведет к появлению циклической ссылки.
За напоминание про циклические ссылки - спасибо.
Собственно разработчики (типа коллеги) как бы вне критики, ответственность за косяки несут потребители нераспределенной прибыли от продажи продукта ("правообладатели", если можно так выразиться). А уж разработчиков пусть пинают те самые потребители, работа у них такая.
Всегда поражало, то свойство большинства программистов под платформу 1с незнание основы основ, это печально. Нужно лишь знать мат часть.
Слава богу,что в свое время начинал с низкоуровневых языков, и использую 1с только для разработки решений в силу популярности платформы и соответственно монетизации. Не сочтите никто за оскорбление, просто мнение сформированное на фактах.
разработчики не стали (поленились, недопёрли) этого сделать. это плохо. в смысле - недостаток оболочки для 1снегов.
Соответственно, разработчики пошли по простейшему пути (что не удивительно для разработчиков 1С) и сделали подсчет ссылок "до победного" (пока таковых не останется вовсе - вот тогда объект и уничтожится).
Кто сможет так извернуться, что и владелец не "закроется", д еще и ссылки в цикле начнут плодится от него - ну, молодец значит, такое просто так не сделаешь, значит, так и задумывал изначально.
Посмотрите Win8 (специальные приложения на новом API) или Android - там память очищается всегда автоматически. Если не нужна программа, или форма программе, да и фиг с ней - пометили как не нужную и система сама заменит новыми данными, когда память нужна станет. И даже после закрытия программы, данные этой программы остаются в оперативной памяти. Зато при повторном запуске мгновенно открывается на том же месте, где закрыл. Сбор мусора - очень дорогостоящая и ни кому не нужная операция. Тем более сейчас даже на мобилках по 2 Гб оперативной памяти ставят, не говоря уж про десктопы. Мне кажется лет через пять программисты вообще забудут о том, что такое сборщик мусора, как о страшном сне. Так же, как когда-то забыли о необходимости встраивать драйвера для всех видео- и звуковых карт в свои приложения, когда вышел DirectX и OpenGL. А вы что думаете по этому поводу?
скажите об этом разработчикам 1С с их бесконечными утечками памяти.
После закрытия максимум, что останется от "программы" в ОП - это мусор, помеченный "на удаление".
Вы имеете весьма и весьма отдаленное представление о работе копмьютера, ОС, программ и 1С.
В данном случае - перепутали очистку памяти (сборку мусора) с кэшированием/загрузкой памяти.
Среди повсеместной деградации все равно останутся люди, которые будут писать встроенные уборщики, чтобы те "не светились" и делали свое дело в "гаджетах, ОС, мобилках.."
DirectX и OpenGL - это бибилиотеки API, к работе и взаимодействию самого устройства внутри/с другими устройствами (за что отвечает драйвер) отношения не имеющие. Названные графические API - отвечают за обработку изображения, и призваны унифицировать написание различнейших графических приложений.
А драйвера пишут те, кто занает, что это такое. Другое дело - многие драйвера все больше и больше встраиваются в ОС, а устройства - все больше унифицируются между собой в логике своей внутренней работы.
Имелось ввиду память не очищается приложением, а очищается самой системой.
Так же как в Java память очищается средой исполнения а не конечной программой. И 1С сама память очищает, за редким исключением)
(69) А про OpenGL имелось ввиду не разработка драйверов в принципе, а то что их не нужно стало включать в каждую игру. Помните под ДОСом чтобы что-то запустить сперва конфигурируешь настройки встроенных драйверов через setup.exe... Прописываешь IRQ и DMA каналы для звуковой карты и т.д. Я не про производителей оборудования говорил, что им не нужно будет драйвера писать, а про разработчиков конечных приложений для пользователей.
Так это и есть применение унификации через API, а не встройка драйверов устройств - в игры. Вы же пишите про драйвера к устройствам, а не к играм.
Только лишь потому, что плата не предоставляла такую информацию драйверу, и приходилось их размещать вручную. Сейчас - предоставляет, и драйвер настраивается на "все те же прерывания" автоматически.
унификация работы драйверов с API ведет к унификации работы конечных приложений с этими API.
Т.е. ничего, по сути, не изменилось, а только приложения стали автоматически через API и драйвер устройства взаимодействовать с устройством и настраиваться.
Посмотрите, что сами же и написали:
На самом деле, почему бы просто не написать:
- не пользуйте во внешних отчетах, обработках присвоение в переменной уровня модуля объекта - ссылки на какую-либо форму этой же обработки/отчета
Перем Форма; Форма = ПолучитьФорму("ДопФорма"); Форма.Открыть();- не пользуйте во внешних отчетах, обработках присвоение переменной уровня модуля объекта/реквизиту объекта - установку ссылки на саму себя "любимую", тем более - в цикле а-ля пример из ( 24) (а для реквизита внешней обработки/отчета - избегать присвоение ему ссылки на него самого, как в коде, так и в задании Типданных "вручную" в "Свойствах").
Так как 1С не осилила разработать механизм разрешения ссылочных конфликтов и отследить, что ссылка закольцевалась на саму себя, и указатель в подсчете ссылок - создан ей же самой, и также подлежит стиранию, как и создавший этот указатель "родительский" объект, то все возложено на конечных программистов: либо избегать такой ссылочности, либо вовремя принудительно уничтожать объект, содержашщий "указатель" на себя самого, например, явным присвоением "Форма = Неопределено".
А то на ИТС это занимает целую страницу "мелким почерком", да еще и в разных местах, да еще и не все варинаты и неполное описание....
Потому что изначально - "доступно и всериоз"
Потому что до сих пор предмет гордости - прибыль на количество сотрудников
"пипл схавает"
**
да, еще: "Проблемы индейцев вендора не...". Ну то есть клиентами для флагмана являются франи, а не конечные юзеры
Рейтинг: 553
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 63392
Создание 28.12.09 09:11
Обновление 18.02.10 00:00
Просмотры 22003
Загрузки 53
Рейтинг
22
Комментарии 75
Код открыт Не указано
Рубрики Механизмы типовых конфигураций
Кому Разработчик
Тип файла Внешняя обработка (ert,epf)
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)