1с динамический список объект не найден
Задача состояла в следующем. В форме динамического списка необходимо было показать итоговую информацию. К примеру, в журнале накладных вывести количество накладных и общую сумму. Получить необходимые данные не составляло труда - формировался запрос с условием, соответствующим текущему отбору списка и запускался на выполнение. Но неожиданно проблемой оказалось обеспечение "синхронности" между данными списка и итоговой информацией.
То есть, данные динамического списка могут изменяться по различным причинам:
1. Изменился отбор списка
2. Пользователь в текущем сеансе изменил или удалил объект из списка
3. Пользователь нажал в форме кнопку "Обновить" (либо настроено автоматическое обновление списка)
Соответственно, хотелось бы после каждого такого события сразу пересчитывать служебную информацию.
Варианты решения были следующие:
1. Использовать событие формы "ОбновлениеОтображения".
Это событие действительно реагирует на любое изменение динамического списка. Но оно также вызывается и во многих других случаях. В частности, при смене страницы формы, при активизации строки в списке (если назначена обработка этих событий) и т.д. Короче, использование этого варианта вызывало приличные тормоза из-за перерасчета итогов после каждого чиха пользователя.
2. Использовать событие табличного поля "ПриПолученииДанных".
Вариант имеет такие же недостатки, как и предыдущий, хотя и в меньшей степени. Т.е. событие (а значит, и перерасчет итогов) выполнялось не только когда данные списка действительно менялись, но и при прокрутке списка, и даже при изменении размеров формы.
3. Добавить в форму кнопочку "Рассчитать", чтобы пользователь жал на неё всякий раз, когда ему потребуются актуальные итоги по списку. Коряво, неудобно, но приходилось поступать именно так, пока не появился ВАРИАНТ 4.
Хотя решение немного через .опу
Суть: на форму добавляется скрытое табличное поле, источником данных которого служит нужный нам динамический список, и далее используется событие "ПриПолученииДанных" этого табличного поля. Так как данное табличное поле не прокручивается и не меняет размеров, то событие возникает только тогда, когда список реально требует обновления.
Правда, в процессе реализации этого варианта вылезло ещё несколько "особенностей" платформы, но почти все удалось обойти.
В результате, сервисный код упрятан в две процедуры общего модуля: ПодключитьОбработчикОбновленияСписка(. ) и ОтключитьОбработчикОбновленияСписка(. ). Первая назначает для обработки обновления списка процедуру модуля формы, вторая, соответственно, отключает обработчик. Выглядит всё это так:
Теперь ложка дёгтя.
Алгоритм не отрабатывает ситуацию, когда список полностью очищается. То есть, в списке были какие-то строки, а потом пользователь все строки удалил, либо задал такой отбор, при котором в список не попадает ни один объект. Как оказалось, 1С просто не вызывает событие "ПриПолученииДанных" для пустого списка.
Чтобы обойти эту проблему, пришлось погрузиться в .опу уже по локоть.
Используя событие "ПриАктивизацииСтроки" нашего вспомогательного табличного поля, можно отловить ситуацию, когда свойство ТекущаяСтрока табличного поля меняет значение на Неопределено, сигнализируя, что в списке больше нет ни одной строки. Но очередной сюрприз от платформы - приняв значение Неопределено, ТекущаяСтрока "фиксируется" на нем, и не меняется, даже когда в списке вновь появляются объекты. То есть, если не поменять значение текущей строки, второй раз событие "ПриАктивизацииСтроки" уже не сработает.
Трагедия в том, что узнать, что список вновь заполнен, можно только в "ПриПолученииДанных", а изменить текущую строку во время обработки данного события невозможно - 1С вылетает с критической ошибкой (желающие могут попробовать). Помогли только пляски с шаманским бубном вокруг компьютера.
В итоге, получилось следующее:
Замечание от Гений1С:
Можно попробовать подключить функцию изменения данных ПодключитьОбработчикИзмененияДанных на данные списка.
Замечание от clappa:
Мне удалось использовать ПодключитьОбработчикИзмененияДанных только для контроля за изменением отбора динамического списка. В других перечисленных случаях этот метод бесполезен. В частности, изменение порядка он "не ловит".
Добрый день! На системе заказчика сидит очень жёсткая RLS, в связи с чем у определенных пользователей список задач не загружается (вылетает скулёвая ошибка, прикладываю скрин). У некоторых пользователей журнал заданий открывается за 2-3 секунды, а у некоторых возникает вышеобъявленная ошибка. В связи с этим, как мне кажется, необходимо завернуть запрос динамического списка в привилегированный режим. Вопрос: как это сделать корректно?
(21)У формы есть несколько настроек, каждая из которых сбрасывается по разному, не зависимо от других.
В меню Еще - установить стандартные настройки.
В меню Еще - Настроить список - Еще - установить стандартные настройки.
В меню Еще - Изменить форму - установить стандартные настройки.
Если вы установили стандартные настройки во всех пунктах, и это не помогло, создайте нового пользователя.
(1)Нет, ничего заворачивать никуда не нужно. Необходимо максимально четко определять типы значений полей в соединения/условиях используя конструкцию ВЫРАЗИТЬ(ПОЛЕ КАК )
(3)Так это нужно еще запросы RLS смотреть, которые приводят к ошибке.
Ошибка означает, что происходит соединение/отбор по полю составного типа, например "Субконто", без указания конкретного типа значения для отбора/соединения. В результате этого платформа генерит соединения с множеством таблиц, хранящих данные, чтобы выполнить условие соединения/отбора.
(8) Да именно это и собираюсь делать. Хотел отделаться малой кровью, очень уж не хочу лезть в RLS, написанную не мною. :)
(9) вполне вероятно что когда то добавленные RLS работали, но структура растет и RLS либо не обновляли либо обновляли неправильно.
(10) Её выкатили вот только-только, но она в разработке была у разных исполнителей. Там кошмарный лес. Для неё применимо выражение "Натянуть ежа на глобус". :)
(1)Как альтернативный вариант - не использовать динамический список, а использовать Таблицу значений.
Заполнять ее уже в привилегированном режиме.
Например, сделать отдельную форму с таблицей и назначать ее только определенным пользователям.
(14) Да, но интересно если прав нет на какие то определенные данные, то есть не будет возможности смотреть ссылку какой то ячейки в таблице. Там что будет отображать: объект не найден или будет ошибка?
(15)Будет Объект не найден для ссылочных полей, если на них нет прав.
Поэтому можно в запросе для них получить представление, и это представление уже использовать для отображения, если нужно отображать такие данные.
Если же наоборот, такие данные отображать не нужно, т.к. на них не должно быть прав, то можно после выполнения запроса удалить строки с такими ссылками, где отображается "объект не найден".
(16) но при это заполнение само без ошибок пройдет - поэтому способ не плохой. но все равно ошибку выяснить не даст. хотя, посмотреть под ним зайти где объект не найден
(14) Будь моя воля, я бы перелопатил всю систему, но увы, работаем только в рамках договора, а эта ошибка ещё и попадает в спектр гарантийных. Т.е. мало того, что хрен его знает, где ошибка затаилась, так ещё и нам это делать бесплатно. Это боль.
Как говорится, связан по рукам и ногам. И совершенно не понятно, в какую сторону копать, ведь ошибка не отлавливается ни в отладке, ни в журнале регистрации. Просто факт, что у этого пользователя запрос получается слишком сложный. Другие пользователи с такими же правами открывают журнал заданий без проблем.
Может пользователь надобавлял себе колонок, на которые в свою очередь также распространяется РЛС. Попробуйте очистить настройки этого пользователя.
(19) Тоже не то. С первого взгляда показалось, что проблема именно в этом, однако возврат формы к настройкам по умолчанию не привёл ни к какому результату. Поглядели на логи SQL сервака, тоже ноль информации. Ошибка - призрак, не иначе.
(21)У формы есть несколько настроек, каждая из которых сбрасывается по разному, не зависимо от других.
В меню Еще - установить стандартные настройки.
В меню Еще - Настроить список - Еще - установить стандартные настройки.
В меню Еще - Изменить форму - установить стандартные настройки.
Если вы установили стандартные настройки во всех пунктах, и это не помогло, создайте нового пользователя.
(22) А вот эта подсказка дала свои плоды. У пользователя стояла сортировка по предмету задачи (а журнал заданий называется "Все задачи"). Сброс сортировки решает проблему. Благодарю Вас за наводку!
UPD. Предмет задачи имеет тип данных "ЛюбаяСсылка", соответственно немудрено, почему скуль скрипел, когда пытался собрать данные.
UPD. Предмет задачи имеет тип данных "ЛюбаяСсылка", соответственно немудрено, почему скуль скрипел, когда пытался собрать данные.
(24) Да это БСПшное же - подсистема бизнес процессы и задачи, в объекте задачи - любая ссылка.
Грязными тряпками можно за то что не отключили возможность в отчете сортировать по этому полю.
(23) ну сбросить сбросили, но если такую сортировку поставил значит надо было. Проблему решили, но причину надо тоже устранять. Права ему расширять или в отчете отключать сортировку, ну или может как то ограничить по возможным ссылкам).
(27) В данный момент это вопросы бизнес-аналитиков.) Сейчас функционал возвращен в работоспособное состояние, инициатор заявки может им пользоваться. А там уж какое из предложенных решений устроит заказчика.
(28) как это обычно бывает, через месяц эта же проблема прилетит, только уже не тебе фразами "а че вы не исправили то" мы же разговаривали про это) разговаривали? - ну жаловались же уже.
(29) А не волнует. :) Есть регламент, есть зафиксированные в документах разговоры об исправлениях? Нет? На нет и доработки нет. :) А что там на совещаниях обсуждалось вне протокола - это уже дело десятое.
UPD. Да и юзеры там не шибко умные, искренне говоря. Когда ты на пальцах раскидываешь отношение один ко многим и объясняешь, что в таком случае без группировки в отчете будет миллиард строк, а пользователь в упор этого не понимает. Впрочем, это уже отдельная тема.))
(30) Если ты на окладе или на договоре и тебе оплачивается любое взаимодействие - то да проблем нет.
Но если тебе платят сдельщину, но является ли гарантией обращение, и прочие доработки согласовываются и определяются не тобой - то это уже твои проблемы, денег же не получишь ты, а они там "наверху"! что угодно могут обсуждать.
Поэтому такой подход работает на фиксе, на сдельщине ты сам себе и консультант и евангелист и тех поддержка и переговорщик.
Но все зависит от компании. есть особо отбитые франчи в которых ты сам принимаешь задачу, сидишь на техподдержке, пишешь ТЗ, согласовываешь со всеми, обещаешь сроки, несешь ответственность за сроки, сам делаешь, сам сопровождаешь, сам потом дорабатываешь. и сам же едешь на своей машине подписывать акты) смехота конечно. но это как продажи - у кого то это получается и его это не парит. кому то продажи не идут илучше работать в коморке одному чем на людях)
(31) Какая сделка, увольте! Работаю не во франче, на сопровождении организации с полностью самописной системой (в хлам переписанная УТ-шка). Ни о какой сделке и речи не идёт, исключительно оклад + премия. Премия зависит от количества просрока заявок в СД. На сделку я не вернусь ни при каких обстоятельствах. Мне мои нервы дороже. :)
(32) Тогда все понятно, понятно ваше спокойствие и хорошее расположение духа)))
Но у оклада + премия своя проблема: захотите Вы допустим работать побольше, позадерживаться , поработать иногда по выходным - а никак, денег и мотивации работать больше нет.
Оклад + премия(которая зависит от выработки отдела вашего) + индивидуальная сделка - самое то. но проблема подсчета индивидуальной сделки и борьба за количество все сгубят)
Оклад + премия(которая зависит от выработки отдела вашего) + индивидуальная сделка - самое то. но проблема подсчета индивидуальной сделки и борьба за количество все сгубят)
Заказы на стороне полностью покрывают мои потребности.)))
В первую очередь я нахожусь на месте, на котором нахожусь только лишь потому, что получаю опыт.) Я работаю с 1С-кой около полутора лет, а здесь, ввиду того, что система, мягко выражаясь, архитектурно абсолютно в заднем проходе, возникает очень много интересных моментов. Я их решаю. Параллельно с этим учусь. Первичное для меня здесь - опыт.) А оклад + премия - это как гарантия, что если что-то пойдёт не так, денежка у меня всё равно будет (привет франчи с выплатами за час трудозатрат). Так что да, меня всё устраивает. :)
UPD. Хотя временами рука тянется, чтобы написать заявление по собственному, когда задача поставлена таким образом, что вынуждает применять рекурсию при формировании СКД.
(35) Здорово, рад за Вас. Тоже работаю за оклад в отделе на самописной конфигурации уже 5 год.
все хорошо, но чувствую что ослабел как разработчик. все те же таблицы значений и загрузки из экселя крутим туда сюда по кругу.
Имхо, вне зависимости от места работы рука будет временами тянуться в этом направлении. везде треша хватает.
Каждый раз себе так говорю когда смотрю вакансии на сайтах) как понять по вакансии тут сделка с кучей заказчиков или оклад с парой заказчиков)
Это круто, настолько очевидно что круто, вы вероятно не раз уже сталкивались с подобными причинами проблем.
когда то у Чистова в курсе слышал - он говорил что раньше половина созданных пользователями проблем решалось возвращением к стандартным настройкам.
Когда используете для вывода данных динамический список и произвольный запрос, то бывают ситуации когда надо указать параметр используемый в этом запросе. Ниже пример вывода данных регистра сведений в карточке клиента
Для вывода используется используется запрос:
Чтобы при открытии не отображалась информацию по другим клиентам, необходимо установить параметр динамического списка, сделаем это так:
Можно и просто настроить отбор через настройки, используя ЭлементОтбораКомпоновкиДанных
Похожие FAQ
Cодержимое указанного ниже веб-сайта в этом приложении блокируется. Aboutsecurity_1cv8c.exe 1
Проблема: После обновления на 1С:Бухгалтерию предприятия 3-й версии, при нажатии на закладку командного интерфейса 1С:предприятие, выскакивает ошибка: Aboutsecurity_1cv8c.exe или Aboutsecurity_1cv8.exe «Содержимое указанного ниже веб-узла в э Google maps : вывод точек на карту и режим панорамы 7
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора Ввод по строке - поиск по первым символам или в любом месте наименования 6
При разработке конфигурации, для упрощении ввода документов потребовалось настроить ввод номенклатуры по совпадению любой части наименования! В 1С 8.3 по умолчанию настройки справочника номенклатуры такие: При такой настройке, механизм поиска в Восстановление пароля с версии 8.3.17 1
Бывают случаи когда нужно восстановить доступ к 1С, но пароль утерян или прошлый программист уволился и прочее. Доступные методы в интернете не работают с версии 8.3.17, а некоторые методы полностью вычищают список пользователей. Данный метод позвол Вывод в поле Наименование справочника Штатное список значений из справочника Подразделения? 0
Есть два справочника Штатное и Подразделения. В справочнике Штатное есть автоматически генерируемое поле Наименование. Как программно сделать так чтобы в поле Наименование справочника Штатное выводились списком значений из поля Наименование справочн Посмотреть все результаты поиска похожих
Еще в этой же категории
2. Если Вы знаете что удалили, то можете сразу нажать кнопку Создать Объект Из GUID - Пункт 4.
3. Если Вы не знаете что удалили, тогда вам нужно поднять архивную копию базы, открыть там обработку и вставить полученный GUID в поле GUID.
далее нажать Ссылку -> и в правом поле отобразится необходимый Вам объект(в моем случае Попов Роман Владимирович).
Открыв его, узнаем что это справочник Сотрудники и всю содержащуюся в справочнике информацию. Возвращаемся в базу, где необходимо восстановить объект и жмем кнопку Создать Объект Из GUID
4. Из открывшегося списка выбираем Справочник Сотрудники, в открывшейся форме заполняем все поля данными из архивной базы и жмем OK. Все, данный объект восстановлен.
Для программиста:
Для получения уникального идентификатора объекта, используйте код вида:
Код 1C v 8.х
Для того чтобы преобразовать (84:bf5600145e3710ab11dda4c605dbe824) в УникальныйИдентификатор (GUID)
Код 1C v 8.х
Для получения ссылки по уникальному идентификатору, используйте код:
Код 1C v 8.х
Создать объект документ или справочник и установить ему свой Уникальный идентификатор
Код 1C v 8.х
еще можно получить ИдентификаторДокумента при OLE доступе:
Код 1C v 7.x
Еще посмотрите метод:
ЗначениеВСтрокуВнутр();
Синтаксис:
ЗначениеВСтрокуВнутр()
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
- значение объекта агрегатного типа данных которое нужно преобразовать.
Подробнее см. в документации, глава ''Системные процедуры и функции''
Похожие FAQ
Еще в этой же категории
Когда используете для вывода данных динамический список и произвольный запрос, то бывают ситуации когда надо указать параметр используемый в этом запросе. Ниже пример вывода данных регистра сведений в карточке клиента
Для вывода используется используется запрос:
Чтобы при открытии не отображалась информацию по другим клиентам, необходимо установить параметр динамического списка, сделаем это так:
Можно и просто настроить отбор через настройки, используя ЭлементОтбораКомпоновкиДанных
Похожие FAQ
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1С 7.x : Как получить курсы валют с сайта НБУ http://www.bank.gov.ua/ за любую дату ? 6
Функция ПолучитьТаблицуКурсовНБУ(ДатаКурса, Ежедневно = 1) // если в качестве второго параметра указать число отличное от 1 - получем валюты, которые котируются на ежемесячной основе Перем Reader, Url, Точки, HtmlTab, Строк, Р, НомСтроки, НомЯче Cклонения по падежам 6
НаКлиенте Процедура Команда1(Команда) ФИО = " Иванов Иван Иванович" ; Падеж = 2; Пол = 1; Результат = СклонениеФИО(ФИО, Падеж, пол); Сообщить(Результат); КонецПроцедуры НаСервере Функция СклонениеФИО(ФИО, Падеж, пол) Результат = " " ; Посмотреть все результаты поиска похожих
Еще в этой же категории
Как обновить динамический список или реквизит на форме клиента? 22
Если вы, открыв форму справочника или документа, выполнили некоторое действие, код который должен изменить состояние данных в динамических списках или значение реквизита. Данные изменены, но в открытой форме осталось все как было, можно конечно закр Динамический список ~ Как на управляемой форме разместить список регистра сведений с отбором? 18
Решение рассмотрено для элемента справочника (Контрагент и регистр КонтактнаяИнформация) 1. Создание реквизита: Добавляем новый реквизит формы (. не путать с реквизитом справочника . ) с типом " ДинамическийСписок" В поле " Основная табли Форма ~ Программное создание таблицы значений с условным оформлением 12
Как создать на форме таблицу и сделать для нее подсветку содержимого колонки в строке по условию? Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем ма Поле выбора ~ Заполнение списка значений в элементе поле выбора на форме 10
//Заполнение списка перебором данных // Элемент формы МетаданныеВыбор имеет тип - Произвольный, Использование - Режим выбора из Списка, кнопка списка Для Каждого Метаданное из Метаданные.РегламентныеЗадания Цикл ЭлементыФормы.МетаданныеВыбор.Спи Поле выбора ~ Как ограничить список выбора? 8
Ограничим список элементов, установив отбор в открываемой форме //Пример 1 Процедура СтатьяПДРНачалоВыбора(Элемент, СтандартнаяОбработка) ФормаВыбора = Справочники.ПрочиеДоходыИРасходы.ПолучитьФормуВыбора(, Элемент); ЭлементОтбораВидПДР = Форма Посмотреть все в категории Работа с Формой (Диалог) и её элементами
Читайте также: