1с найтипоидентификатору как работает
Табличное поле предоставляет свойства ТекущиеДанные и ТекущаяСтрока . Отличие между этими свойствами состоит в том, что свойство ТекущиеДанные содержит значения считанных данных текущей строки табличного поля, а свойство ТекущаяСтрока содержит значение, идентифицирующее строку.
Следует отметить, что свойство ТекущиеДанные содержит коллекцию значений текущей строки, соответствующую коллекции колонок отображаемого динамического списка, при этом если нужного поля нет в текущих данных, то его можно добавить в коллекцию полей списка используя метод Добавить() коллекции колонок списка.
Свойство ТекущиеДанные предназначено для получения значений колонок текущей строки, а свойство ТекущаяСтрока для получения и установки текущей строки табличного поля.
Следует понимать, что для объектных данных (Справочник, Документ и т.д.) в качестве значения свойства ТекущаяСтрока используется ссылка на объект базы данных. Соответственно при обращении к свойствам этого значения будет выполняться считывание объекта базы данных.
Типичной ошибкой является обращение к данным строки с использованием свойства ТекущаяСтрока . В этом случае будет выполняться считывание данных объекта из базы данных, что может существенно снизить производительность работы табличного поля. Например, приведенный ниже фрагмент текста программы является неэффективным:
Рекомендуется для обращения к данным объекта использовать свойство ТекущиеДанные . Правильный фрагмент приведен ниже:
Если есть идентификатор текущей строки (т.е. свойство ТекущаяСтрока ), можно получить ТекущиеДанные . И наоборот:
Выполняет поиск элемента списка значений по идентификатору.
Синтаксис
Метод НайтиПоИдентификатору() имеет следующий синтаксис:
А также альтернативный англоязычный синтаксис:
Параметры
Описание параметров метода НайтиПоИдентификатору() :
Имя параметра | Тип | Описание |
---|---|---|
Идентификатор | Число | Идентификатор элемента списка значений. |
Жирным шрифтом выделены обязательные параметры |
Возвращаемое значение
Описание
Метод НайтиПоИдентификатору() выполняет поиск элемента списка значений по идентификатору. Если элемент с указанным идентификатором в списке отсутствует, будет возвращено значение Неопределено .
Доступность
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Пример использования
Пример кода с использованием метода НайтиПоИдентификатору() :
В табличных частях объектов 8.2 имеется возможность создавать реквизиты типа ХранилищеЗначения но сохранеие этих реквизитов в тонком клиенте отрабатывается некорректно, разве что каждый раз после присваивания вызывать метод записи объекта Записать () , что не очень то удобно использовать каждый раз при изменении отдельной строки. Для корректной работы с реквизитами такого типа предлагаю сохранять значения в соответствия, которое в свой черед помещается в реквизит формы типа ХранилищеЗначения. Ключом соответствия является идентификатор строки табличной части
УдалитьДанныеИзСоответствия ( ДанныеСтроки . НомерСтроки );
КонецПроцедуры
Индекс = — 1 ;
Для Каждого Строка Из Объект . ПрикрепленныеФайлы Цикл
Индекс = Макс ( Индекс , Строка . ПолучитьИдентификатор ());
КонецЦикла;
КонецПроцедуры
Для Каждого Строка Из Объект . ПрикрепленныеФайлы Цикл
ИндексТекущейСтроки = Строка . ПолучитьИдентификатор ();
Если Не Соответствие [ ИндексТекущейСтроки ] = Неопределено Тогда
// Записать файл
ТекущийОбъект . ПрикрепленныеФайлы [ Строка . НомерСтроки — 1 ]. Файл = Соответствие [ ИндексТекущейСтроки ];
// Удаление соответствия
Соответствие . Удалить ( ИндексТекущейСтроки );
КонецЕсли;
КонецЦикла;
Хранилище = Новый ХранилищеЗначения ( Соответствие );
КонецПроцедуры
Соответствие = Хранилище . Получить ();
Соответствие . Вставить ( Индекс , Новый ХранилищеЗначения ( Файл ));
Хранилище = Новый ХранилищеЗначения ( Соответствие );
ЗначениеВРеквизитФормы ( СправочникОбъект , "Объект" );
КонецПроцедуры
&НаСервере
Процедура УдалитьДанныеИзСоответствия ( ТекущаяСтрока );
ИндексТекущейСтроки = Объект . ПрикрепленныеФайлы [ ТекущаяСтрока — 1 ]. ПолучитьИдентификатор ();
Соответствие = Хранилище . Получить ();
Соответствие . Удалить ( ИндексТекущейСтроки );
Хранилище = Новый ХранилищеЗначения ( Соответствие );
КонецПроцедуры .
Список значений — это программная коллекция (объект встроенного языка), содержащая пронумерованную последовательность элементов. Каждому элементу присваивается последовательный целочисленный номер — индекс, начинающийся с нуля. По индексу можно получить или установить элемент списка значений.
Элемент списка значений
Каждый элемент списка является программным объектом ЭлементСпискаЗначений встроенного языка и содержит следующие свойства:
- Значение (Произвольный тип) — хранимое значение произвольного типа
- Представление (Строка) — представление элемента списка для пользователя
- Пометка (Булево) — значение пометки элемента в списке
- Картинка (Картинка) — картинка элемента списка для пользователя
Создание списка значений
Создание пустого списка значений выполняется с помощью оператора Новый:
Для добавления элементов в список значений используется одноименный метод СписокЗначений.Добавить():
Каждый новый элемент помещается в конец списка. Для доступа к отдельным элементам списка значений применяется операция разыменования: указывается имя переменной, объявленной как список значений, а затем, в квадратных скобках, указывается индекс элемента. Свойства полученного элемента можно использовать как слева от оператора присваивания:
Так и справа: в выражениях и в качестве параметров процедур и функций:
Границы списка значений
Как было сказано выше, левая граница списка значений постоянна и всегда равно нулю (0). Верхняя граница напрямую связана с количеством элементов в списке значений. Получить ее можно с использованием метода СписокЗначений.Количество() с последующим вычитанием 1.
Давайте рассмотрим распространенные операции со списком значений.
Перебор элементов списка значений
Для перебора (обхода) всех элементов списка значений обычно используется оператор цикла Для :
Либо оператор цикла Для Каждого :
Второй способ больше подходит для ситуации, когда нужно только последовательно перебрать все значения списка. Его использование повышает «читабельность кода».
Поиск в списке значений
Для поиска значений в списке предназначен метод СписокЗначений.НайтиПоЗначению(). Он возвращает найденный элемент списка значений, либо Неопределено , если указанного значения в списке нет.
Сортировка списка значений
Сортировка элементов в списке значений может производиться двумя способами:
Необходимо в табличной части формы добавить реквизит и чтобы в момент ПослеЗаписи этот реквизит там смог сохранится.
Реквизит добавлен (булево) Имя: "РеквизитыИзменены" - этот параметр свидетельствует о том, что надо перезаписать элементы справочника именно измененных строк.
Почему послеЗаписи - потому как сам документ который записуется должен войти в реквизит Элемента справочника каждой строки ТЧ. А поскольку документ В ПередЗаписью еще не записался то не можем передать туда ссылку на него. и еще куча других строк из документа уходят в справочник.
Поэтому выбран метод послезаписи.
В реквизиты формы добавляю Реквизит с типом произвольный СтрокиРеквизитыИзменены
Перед записью запоминаю какие идентификаторы строк требуются.
После записи проверяю эти идентификаторы и в таблице формы взвожу флаги.
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
// Сохранение списка требующих перезаписи объектов характеристики
// поскольку метод ПослеЗаписи приводит к очистке реквизитов таблицы формы
СтрокиРеквизитыИзменены = Новый Структура("ИдентификаторыСтрок", Новый Массив);
МассивСтрок = Объект.Характеристики.НайтиСтроки(Новый Структура("РеквизитыИзменены", Истина));
Для Каждого СтрокаТЧ Из МассивСтрок Цикл
//Вызвана из процедуры ПоСлеЗаписиНаСервере
&НаСервере
Процедура ОбновитьРеквизитыХарактеристик()
// Возобновление флагов
Для каждого Индекс Из СтрокиРеквизитыИзменены.ИдентификаторыСтрок Цикл
СтрокаТЧ = Объект.Характеристики.НайтиПоИдентификатору(Индекс);
Если СтрокаТЧ = Неопределено Тогда
Продолжить;
КонецЕсли;
А проблема странная. Работает но с одним дефектом:
ВНИМАНИЕ! Тут реально важна последовательность:
Если открыть форму (объект уже записан) и сделать сдвиг строки - Трындец не находит его идентификатора. Последующая перезапись все нормально сдвигай сколько угодно.
Если открыть форму перезаписать (не сдвигая) все работает. Сдвигаешь - работает.
Именно проблема в первом открытии - ссдвиг - Запись.
(0) Дополню. Пробовал как угодно.
Открыл форму - Запись, а потом сдвиг (проблема не проявлятся).
и все проблема пропадает именно После первой записи. Можно сдвигать сколько угодно.
Если открыть - Сдвинуть - Записать (проблема). Последующие сдвиги и перезаписи нет проблем.
(1) Я думаю Вам следует открыть это! Потому как я не управляю Объектом и не создаю объект, а нахожусь в форме документа!
« Как стать программистом 1С » Язык 1С » Список значений 1С Найти по значению, Найти по идентификатору — поиск, проверка наличия значения
Список значений 1С Найти по значению, Найти по идентификатору — поиск, проверка наличия значения
Методы 1С СписокЗначений.НайтиПоЗначению(Значение) и 1С СписокЗначений.НайтиПоИдентификатору(Значение) возвращает элемент («ячейку») списка значений, у которого значение (или идентификатор) с нужным значением.
Обратите внимание – идентификатор это не то же самое, что и индекс. Индекс – это порядковый номер (число), которым пронумерованы все ячейки с начала и до конца списка значений. Идентификатор — это уникальный номер (число), который имеет каждая ячейка.
Поиск по идентификатору используется в тонком клиенте, при работе со списком значений на сервере. Имея идентификатор элемента списка значений, который расположен на форме (Элементы.ИмяСпискаЗначенийНаФорме.ТекущаяСтрока), Вы можете найти элемент в списке значений, вне зависимости от его текущего индекса и значения.
Поиска по «представлению» значения – в списке значений нет.
В отличие от поиска в массиве, который возвращает индекс найденного элемента или -1, если не найдено, поиск в списке значений возвращает сам элемент списка или НЕОПРЕДЕЛЕНО, если не найдено.
Пример поиска по значению с помощью 1С СписокЗначений.НайтиПоЗначению:
спРазрешенныхСтатусов = Новый СписокЗначений();
//добавляем в пустой список значений – все значения перечисления
//добавляем их «строковые пользовательские наименования» – которые при добавлении значений в конфигураторе записываются в свойствах значения перечисления в свойство «Синоним»
//Перечисления.СтатусыДокументов – это путь к нашему перечислению
//.ПустаяСсылка() – позволяет вызывать методы этого перечисления
//.Метаданные() – метод, который возвращает метаданные в том виде, как они заданы в конфигураторе и позволяет считывать свойства, заданные в метаданных
//.ЗначенияПеречисления – список значений у перечисления, заданные в конфигураторе, каждое значение, полученное через .Метаданные() содержит кроме значения свойства значения, заданные в конфигураторе
Для каждого Знч из Перечисления.СтатусыДокументов.ПустаяСсылка().Метаданные().ЗначенияПеречисления Цикл
спРазрешенныхСтатусов.Добавить(Знч.Синоним);
КонецЦикла;
Если спРазрешенныхСтатусов.НайтиПоЗначению(СтатусДокументаСтрокой) = Неопределено Тогда //Если поиск вернул Неопределено, то элемент с таким значением не найден
Сообщить("Ошибка: статус документа '" + СтатусДокументаСтрокой + "' не найден");
Пример поиска по индексу с помощью 1С СписокЗначений.НайтиПоИдентификатору:
Инструмент предназначен для получения расширенной информации о ссылочных значениях объектов информационной базы. Говоря простым языком - обработка позволяет получить уникальный идентификатор ссылки и еще расширенный набор информации. Вместе с такими инструментами как "Транслятор запросов 1С" и "Просмотр и анализ структуры базы данных (отчет на СКД)" (новая версия от 07.01.2020) позволяет выполнять анализ работы платформы 1С в части работы с базой данных, а также расследовать различные инциденты в ее работе.
Основными возможностями инструмента являются:
- Получение информации о ссылке на объект информационной базы:
- Уникальный идентификатор
- Навигационную ссылку
- Уникальный идентификатор в терминах SQL Server
- Уникальный идентификатор в терминах PostgreSQL
- Представление "битой" ссылки
- Уникальный идентификатор типа
- Числовой идентификатор типа ссылки
- Полное имя объекта метаданных
- Идентификатор типа ссылки в терминах SQL Server и PostgreSQL
- Дата создания ссылки из уникального идентификатора
- Поиск ссылки и уникальному идентификатору (в т.ч. в терминах SQL Server и PostgreSQL, навигационной ссылке и представлению "битой" ссылки.
- Поиск имя метаданных и числового идентификатора типа по уникальному идентификатору типа.
Требования к работе:
- Платформа 1С версии 8.3.5 и выше.
- Режим работы не имеет значения (клиент-серверный или файловая база. СУБД не имеет значения).
- Только управляемые формы. Для использования в обычном приложении используйте известные обходные пути.
Ниже в примерах мы разберем некоторые кейсы по использованию инструмента.
Принцип работы
Все реализовано штатными возможностями платформы 1С без каких-либо подключений к базе данных напрямую или внешних компонент.
Примеры использования
Рассмотрим несколько случаев применения обработки.
Получение уникального идентификатора
В некоторых задачах необходимо получить уникальный идентификатор ссылки на объект. Это может пригодиться при разборе ситуаций с обменом данных, поиска ссылки по GUID из кода встроенного языка и др. С помощью данного инструмента это делается проще простого.
GUID у Вас в кармане! причем есть также идентификаторы в терминах СУБД, которые можно использовать в прямых SQL-запросах к базе. В нашем примере запросы выглядели бы так.
Вот так можно использовать фильтр по ссылке для прямого запроса к базе SQL Server:
И практически также для PostgreSQL:
Все просто, не так ли?
Еще одной вишенкой на торт будет возможность получения уникального идентификатора для значений перечисления. Да, эти значения не имеют метод "УникальныйИдентификатор()", но есть другие пути его получения. А после можно его хоть в прямых SQL-запросах к базе начать использовать. Вот так выглядит получение GUID'а для значений перечисления.
Все это мне ни раз пригождалось, когда нужно было:
- Из ошибок от SQL Server найти значения из запроса по GUID'ам
- Поиск существующих элементов в базе для идентификатора. Например, для поиска причин ошибок с дублирующейся ссылкой.
- Изучение работы платформы 1С в некоторых ситуациях.
Изначально именно для этой функции эта обработка создавалась.
Поиск ссылок по GUID
Обратная ситуация - у Вас есть уникальный идентификатор, но при этом неизвестно какая ссылка за ним скрывается. С помощью обработки Вы можете найти все ссылки, которые имеют искомый GUID. Причем поиск можно выполнять как по стандартному GUID'у платформы 1С, так и по значениям идентификатора на стороне СУБД.
Пару кликов и все готово! Если будет найдено несколько ссылок, то просмотр переключится в режим списка.
Здесь Вы можете работать с полями также, как и в предыдущем случае.
Зачем идентификаторы типа
Инструмент содержит дополнительную информацию о типе ссылки: уникальный идентификатор типа, числовой идентификатор и имя метаданных. С именем метаданных все ясно, а по поводу остального нужно пояснить.
Числовой идентификатор - Вы могли его видеть в представлении бито ссылки. Например, вот здесь:
( 230 :51ed67a3-7220-11df-b336-0011955cba6b)
число 230 - это как-раз и есть числовой идентификатор типа. Но что это и зачем он нужен? Если мы посмотрим на структуру хранения в базе данных (например. с помощью отчета "Просмотр и анализ структуры базы данных (отчет на СКД)"), то увидим, что справочник "Организации" имеет имя таблицы "_REFERENCE230".
Вот как-раз число в имени таблицы и является числовым идентификатором типа. Он может пригодиться в разборе нестандартных ошибок платформы или для анализа структуры базы.
Что касается уникального идентификатора типа, то он также может пригодиться для диагностики сложных ситуация и ошибок. Например, ошибок вида "Неизвестный идентификатор типа и другое. Это уже совсем другая история.
В общем, информация дополнительная и может быть полезна в особых случаях.
Вместо заключения
Новый инструмент для специфических задач. Разве что получение уникального идентификатора ссылки дело обычное, но тоже используется не так часто.
А Вы сможете найти применение данной обработке? :)
23.08.20 - Добавлены доп. сведения о ссылках и небольшие улучшения
- Добавлена дата создания ссылки (спасибо за идею Евгению Люлюк)
- Добавлены идентификаторы ссылок для SQL Server и PostgreSQL (спасибо за идею Виталию Кислицину)
- Исправлены названия некоторых доп. полей (спасибо за замечание kuzyara)
- Обновлена версия обработки
24.01.20 - Добавлена первая версия инструмента.
Авторские разработки
Транслятор запросов 1С в SQL - инструмент для трансляции запросов платформы 1С в SQL, а также их диагностики.
Анализ производительности APDEX - отчет для просмотра и анализа замеров производительности в конфигурациях на базе БСП.
Путеводитель по истории релизов - отчет по истории выпуска релизов продуктов фирмы "1С" и анализа информации по обновлениям.
Просмотр и анализ структуры базы данных (отчет на СКД) - отчет для просмотра и анализа структуры базы данных с поддержкой файловых баз (ограниченный режим), а также баз на SQL Server и PostgreSQL.
Просмотр и анализ журнала регистрации (отчет на СКД) - отчет на базе системы компоновки данных (СКД) для просмотра записей журнала регистрации.
Обозреватель криптографии - отчет для просмотра доступных провайдеров и сертификатов криптографии на сервере и клиенте.
Пакетная выгрузка / загрузка внешних отчетов и обработок - пакетная выгрузка / загрузка внешних отчетов и обработок для массовый манипуляций с ними.
Командный интерпретатор для 1С - инструмент для выполнения команд CMD / PowerShell из 1С.
Другие ссылки
Специальные предложения
(2) Помимо даты там можно вытащить еще MAC адрес машины на которой была сгенерирована ссылка. Из пожеланий - открытие произвольной формы динамического списка объекта определенного типа, где одной из колонок была бы дата полученная из ссылки. Плюс к этому возможность автоматического открытия формы Журнала Регистрации с переданным отбором по этой дате и ссылке.
Такой инструмент здорово облегчит проведение расследований, чтобы установить автора/создателя объекта в базе.Версионирование дело хорошее, но оно не всегда включено или настроено. И не всегда оправдано с точки зрения производительности.
В качестве еще одного вариант добавления фишки - добавить на форму обработки события и переменные для работы с подключаемым оборудованием (БСП), чтобы отлаживать работу печатных форм на которых выводятся штрих-коды. У нас бывают ситуации, когда распечатанный документ есть, а в базе документа уже нет (помечают на удаление после распечатывания и подписи у руководителя). В таком случае как раз и приходится лезть в журнал регистрации для поиска того кто пометил документ на удаление. Если добавить функцию, которая будет получать штрих-код со сканера, определять дату по ссылке и делать снова отбор по ЖР, то это бы также облегчило проведение расследований.
Читайте также: